您的位置:首页 > 其它

实用图像处理入门 - 3 - 训练自己的识别器

2013-07-26 16:06 288 查看
body,td,p { // 这对大括号里描述网页的背景
margin-left:40px;
margin-right:40px;
font-size: 10pt;
}

div.vim { width:800px, font-family: monospace; color: #ffffff; background-color: #333333; }
.lnr { color: #ffff00; }
.constant { color: #ffa0a0; }
.identifier { color: #98fb98; }
.comment { color: #87ceeb; }

div.cnblogs_code
{
width:800px;
}

h1 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 26px;
font-weight: bold;
color: #820918;
}

h2 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 20px;
font-weight: bold;
color: #820918;
}

h3 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 16px;
font-weight: bold;
color: #820918;
}
h4 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 16px;
font-weight: bold;
color: #820918;
}
h5 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 14px;
font-weight: bold;
color: #820918;
}
h6 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 12px;
font-weight: bold;
color: #820918;
}
h7 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 10px;
font-weight: bold;
color: #820918;
}

b,strong
{
color: #820918;
} [align=left]作者: 知明所以 • Milo [/align]
[align=left]博客: http://www.cnblogs.com/jhzhu [/align]
[align=left]邮箱: jhzhuustc@gmail.com [/align]
[align=left]日期: 2013年7月27日 [/align]

1 环境准备

1.1 基本工具:

[align=left]Visual Studio 2012 必装 [/align]
[align=left]opencv 2.4+ 必装 ( 目前是2.4.6, 下载链接 ). ( 假设已安装完毕, opencv安装目录以下用 {opencv} 表示 ) [/align]
[align=left]cygwin 必装 ( 安装教程, 网上一抓一大把, 就不贴链接了. 记得安装 perl ) [/align]
[align=left]CMake 必装 ( 下载链接, 用来编译 opencv ) [/align]
 

1.2 辅助工具:

[align=left]imageclipper 工具. 此工具能快速的从原始图片中截取待识别区域, 生成只包含待识别区域的图片. ( 下载地址 ) [/align]
[align=left]opencv_createsamples 工具. 在文件夹 {cvbuild}/bin/Release/opencv_createsamples.exe 中. [/align]
[align=left]mergevec 工具. 用来把多个 *.vec 文件生成一个 *.vec 文件. ( 下载地址 ) [/align]
[align=left]createtrainsamples 工具, 用来快速生成大量测试样本. ( 下载地址 ) [/align]
[align=left]如果以上地址无法打开, 这里有以上工具的合集. ( 百度网盘下载 ) [/align]
[align=left]此文中用到的所有命令, 均以sh脚本文件保存在这里( 百度网盘下载, 下文用 “脚本附件”表示此附件 ). 您可以省去很多编写脚本的麻烦 [/align]
 

1.3 项目文件结构如下:





2 详细步骤

2.1 编译 opencv

因为这一步骤比较长, 被我单独开贴到这里了.

此步骤务必完成, 否则后续步骤无法执行

编译 opencv 的目标位置, 在下文中用 {cvbuild} 表示

2.2 制作样本

2.2.1 负样本

目标: 生成 背景描述文件 bg.txt

步骤:

[align=left]下载负样本文件. ( 忘记从哪里下载的了, 事先申明这图片库不是我制作的, 请大家不要用于商业用途. 百度盘下载 ) [/align]
[align=left]解压文件到某处. 进入文件夹, 执行以下命令: [/align] ?
得到 bg.txt. 即为负样本文件. ( 脚本附件/S2-fetchNegtiveImage.sh )

 

2.2.2 正样本

目标: 生成正样本的 *.vec 样本描述文件

2.2.2.1 用 imageclipper 截取待识别区域 运行命令:(  假设源图片放在 ./samples/positive/src/ 文件夹中 )

如果没有特殊说明, 文中所有的命令均在 cygwin 终端中执行.

[align=left] ?[/align]
( 脚本附件/S1-clipPositiveImage.sh )

在命令行中输入

[align=left] ?[/align]
可以看到 imageclipper 的使用说明. 咱们主要关心一下 –o 参数:

[align=left] ?[/align]
-o 参数主要来控制生成图片的文件名.

比如咱们这里的 –o 参数为 “%i__%x__%y__%w__%h__.png”.

就表示生成文件的文件名为 “原文件名__x坐标__y坐标__宽度__高度__.png”.

生成文件在文件夹:./samples/positive/ 中:





 

2.2.2.2 用 opencv_createsamples 对截取出的区域生成样本描述文件 *.vec opencv 官方文档中对 opencv_createsamples 的使用描述见这里

在终端中输入 opencv_createsamples 不加任何参数, 查看使用帮助:

[align=left] ?[/align]
我们需要用到的参数有:

[align=left] ?[/align]
下面使用 openc_createasamples 工具来对每一个目标文件生成对应的 *.vec 样本描述文件

新建 ./S3-createsamples.sh 文件. 内容如下: ( 脚本附件/S3-createsamples.sh )

[align=left] ?[/align]
如果需要, 根据 1.3 中本项目的文件结构图, 将上面的文件路径改成你需要的路径.

执行命令:

[align=left] ?[/align]
打开文件夹, 看到一列 *.vec 文件就对啦~~





2.2.2.3 用 mergevec 工具合并 *.vec 文件 细心的您执行完 步骤2.2.2.2 之后, 就会发现上图已经有合并后的 target.vec 了.

为了方便, 我已经把合并 vec 的步骤写到 S3-createsamples.sh 文件里去了. 看看这个文件的最后两行就知道啦.

输入以下命令可以看到 mergevec 的使用帮助:

[align=left] ?[/align]
 

 

2.2.3 测试样本

目标: 生成大量带有待识别区域的测试图片, 在这些图片中, 待识别区域的位置都已知.

方法: 把证样本图片中的待识别区域, 经过缩放拉伸翻转后, 按随机位置贴在背景图片上, 并记录下待识别区域在背景图片上的位置.

假设我们想训练一个识别嘴巴的识别器. 生成的测试样本如下:





利用我们训练的识别器, 对这些图片进行识别. 得到的结果, 跟实际情况相比较, 即可知道识别器的识别率和性能.

创建 S5-createTestSample.sh 内容如下: ( 脚本附件/S5-createTestSample.sh )

?
运行脚本文件 S5-createTestSample.sh . 查看 ./samples/test/tests 文件夹, 就能看到各种样本图片啦~~

样本图片列表存放在:

./samples/test/tests.dat

里. 如果内容如下:

?
证明你成功的创建了测试样本!

2.3 训练过程

目标: 利用 opencv_haartraining 工具训练识别器

执行以下命令来训练识别器:

[align=left] ?[/align]
( 脚本附件/S4-training.sh )

注意: 此步骤可能因为正样本过少或者负样本过少而导致错误. 如果出现错误, 请使用更多样本进行尝试.

训练过程可能要持续好几天, 请耐心等待.

opencv_haartraining 的官方使用说明见这里

输入以下命令可查看简要参数说明:

[align=left] ?[/align]
 

2.4 测试性能

目标: 通过用大量测试数据进行实际测试, 得到识别器的识别率和识别性能

原理: 已在 2.3.3 讲过. 可回看参考.

执行命令:

?
( 脚本附件/S6-test.sh )

3 参考

3.1 Tutorial: OpenCV haartraining

3.2 Rapid Object Detection With A Cascade of Boosted Classifiers Based on Haar-like Features Introduction

3.3 Merge vec files created by createsamples

3.4 Cascade Classifier Training ( opencv offical document )

3.5 imageclipper ( A tool to crop images manually fast )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐