cascadetrain进行训练的步骤及注意事项

OpenCV中有两个程序可以训练级联分类器: opencv_haartraining 和opencv_traincascade。opencv_traincascade是一个新程序,使用OpenCV 2.x API 以C++ 编写。这二者主要的区别是opencv_traincascade支持 Haar、Hog和 LBP(Local Binary Patterns) 三种特征,并易于增加其他的特征。与Haar特征相比,LBP特征是整数特征,因此训练和检测过程都会比Haar特征快几倍。LBP和Haar特征用于检测的准确率,是依赖训练过程中的训练数据的质量和训练参数。训练一个与基于Haar特征同样准确度的LBP的分类器是可能的。

opencv_traincascadeandopencv_haartraining所输出的分类器文件格式并不相同。注意,新的级联检测接口(参考objdetect模块中的CascadeClassifier类)支持这两种格式。opencv_traincascade可以旧格式导出训练好的级联分类器。但是在训练过程被中断后再重启训练过程,opencv_traincascade andopencv_haartraining不能装载与中断前不同的文件格式。

opencv_traincascade程序使用TBB来处理多线程。如果希望使用多核并行运算加速,请使用TBB来编译OpenCV。还有一些与训练相关的辅助程序。

opencv_createsamples用来准备训练用的正样本数据和测试数据。opencv_createsamples能够生成能被opencv_haartraining和opencv_traincascade程序支持的正样本数据。它的输出为以 *.vec 为扩展名的文件,该文件以二进制方式存储图像。

opencv_performance可以用来评估分类器的质量。它读入一组标注好的图像,运行分类器并报告性能,如检测到物体的数目,漏检的数目,误检的数目,以及其他信息。

1 建立样本集pos和neg

pos中存放正样本的图像,可以是一张图像或多张图像。neg中存放包含负样本的图像,可以是任意图像,但是这些图像中不能包含待检测的物体。

注意:

一般需要一个很大的负样本库送给训练程序进行训练。如果是绝对刚性的物体,如OpenCV的标志,只有一张正样本图像,那么可以通过对物体图像的随机旋转、改变标志亮度以及将标志放在任意的背景上而获得大量的正样本;如果是人脸,需要几百甚至几千个正样本。在待检测物体是人脸的情况下,需要考虑所有的人种、年龄、表情甚至胡子的样式。

2 生成正\负样本描述文件negdata.txt

(1)负样本描述文件negdata.txt

在命令行窗口输入“cd d:\%….%\pos”路径切换到neg文件夹下,输入“dir/b>negdata.txt”就会在neg文件夹下生成描述文件negdata.txt,存放neg中所有图片的文件名,注意要去掉最后的negdata.txt。

注意:

如果把negdata.txt保存在neg文件夹外面,需要在每一行外面添加相对路径或绝对路径来指出样本的所在位置。一种方法是将negdata.txt文件中的内容复制到word中,使用替换功能实现快速修改。neg替换为neg\neg

(2)正样本描述文件posdata.txt

与建立negdata.txt一样建立posdata.txt,只不过在正样本描述文件中需要指出目标在每个样本中的数量和位置如pos\1.bmp 1 x1 y1 x2 y2,其中(x1,y1,x2,y2)为目标所在的矩形框,又如pos\1.bmp2 x1 y1 x2 y2 x1’ y1’ x2’ y2’

因为我们准备的正样本基本都是目标,因此只需在文件名后增加1 0 0 width height即可。

注意:

1若正样本图像是不同尺寸的,一方面可以使用ImageResize或matlab将图像统一成同一尺寸在生成posdata.txt,或程序ImageToTxt直接生成具有不同尺寸图像的正样本描述文件。在此阶段不归一化的话,后续生成.vec文件的时候在程序中自动归一化。

2样本描述文件与图像要一致,可以存在图像但没有写在描述文件中,即有多余的图像,但千万不要在描述文件中写不存在的图像。

问题:

归一化尺寸的方法是否对训练结果有影响?opencv_createsamples采用何种方法进行归一化?

sample = cvCreateImage( cvSize(winwidth, winheight ), IPL_DEPTH_8U, 1 );

fscanf( info, "%d %d %d%d", &x, &y, &width, &height )

cvSetImageROI( src, cvRect( x, y, width,height ) );

cvResize( src, sample,

width >=sample->width && height >= sample->height ? CV_INTER_AREA :CV_INTER_LINEAR );

CV_INTER_NN 最近邻插值

CV_INTER_LINER 双线性插值,缺省情况

CV_INTER_AREA 使用像素关系重采样,当图像缩小时候可以避免波纹出现,当图像方法时类似CV_INTER_NN

CV_INTER_CUBIC 立方插值

3 生成.vec文件

生成的正样本数目以及随机的程度都可以通过opencv_createsamples的命令行参数控制。

使用create.dat调用%Opencv%\vs2008\bin\Release\ opencv_createsamples.exe

在createsamples.cpp中查阅参数设置

-info 输入正样本描述文件,默认NULL

-img 输入图像文件名,默认NULL

-bg 负样本描述文件,文件中包含一系列的被随机选作物体背景的图像文件名,默认NULL

-num 生成正样本的数目,默认1000

-bgcolor 背景颜色,表示透明颜色,默认0

-bgthresh 颜色容差,所有处于bgcolor-bgthresh和bgcolor+bgthresh之间的像素被置为透明像素,也就是将白噪声加到前景图像上,默认80

-inv 前景图像颜色翻转标志,如果指定颜色翻转,默认0(不翻转)

-randinv 如果指定颜色将随机翻转,默认0

-maxidev 前景图像中像素的亮度梯度最大值,默认40

-maxxangle X轴最大旋转角度,以弧度为单位,默认1.1

-maxyangle Y轴最大旋转角度,以弧度为单位,默认1.1

-maxzangle Z轴最大旋转角度,以弧度为单位,默认0.5

拿望远镜看别人,拿放大镜看自己。

cascadetrain进行训练的步骤及注意事项

相关文章:

你感兴趣的文章:

标签云: