
opencv_traincascade and opencv_haartraining 所输出的分类器文件格式并不相同。注意,新的级联检测接口(参考 objdetect 模块中的 CascadeClassifier 类)支持这两种格式。 opencv_traincascade 可以旧格式导出训练好的级联分类器。但是在训练过程被中断后再重启训练过程, opencv_traincascade and opencv_haartraining 不能装载与中断前不同的文件格式。
opencv_traincascade 程序使用TBB来处理多线程。如果希望使用多核并行运算加速,请使用TBB来编译OpenCV。还有一些与训练相关的辅助程序。
opencv_createsamples 用来准备训练用的正样本数据和测试数据。 opencv_createsamples 能够生成能被 opencv_haartraining 和 opencv_traincascade 程序支持的正样本数据。它的输出为以 *.vec 为扩展名的文件,该文件以二进制方式存储图像。
opencv_performance 可以用来评估分类器的质量。它读入一组标注好的图像,运行分类器并报告性能,如检测到物体的数目,漏检的数目,误检的数目,以及其他信息。
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
http://blog.csdn.net/delltdk/article/details/9186875
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
输入图像沿着三个轴进行旋转,旋转角度由上述3个值限定。
-show 如果指定,每个样本都将被显示,按下Esc键,程序将继续创建样本而不在显示,默认为0(不显示)
-scale显示图像的缩放比例,默认4.0
-w 输出样本宽度,默认24
-h 输出样本高度,默认24
-vec输出用于训练的.vec文件,默认NULL
将正样本描述文件中的正样本转换为灰度图像并缩放到-w-h尺寸存入vec文件中。
(1)如果设置-img和-vec
调用cvCreateTrainingSamples,采用一张图像创建训练样本
(2)如果设置-img、-bg和-info
调用cvCreateTestSamples,采用一张图像创建测试样本。-bg在这里又有什么作用?目的是作为背景创建测试图像。
(3)如果设置-info和-vec(采用正样本描述文件中的图像创建训练样本)
调用cvCreateTrainingSamplesFromInfo,在cvCreateTrainingSamplesFromInfo中将读取样本,并resize后调用icvWriteVecHeader和icvWriteVecSample创建vec文件。
(4)如果只设置-vec(只显示vec文件中的样本)
调用cvShowVecSamples查看和检查保存在vec文件中正样本
上述参数在create.dat中设置好,最后有一个pause,等待显示结果:Done.Created num samples
正样本是指属于某一类别的样本,负样本是指不属于某一类别的样本。可以通过估计你所有样本特征的分布,新的样本出现时,利用分布估计该样本的出现概率,若是概率太小则认为是负样本。要想用这个方法很好的去解决问题,需要所选的特征的分布在正样本和负样本有较大差异才比较有效。
首先将这个问题分为分类问题与检测问题两个方面进行理解:
在分类问题中,这个问题相对好理解,比如人脸识别中的例子,正样本很好理解,就是人脸的图片,负样本的选取就与问题场景相关,具体而言,如果你要进行教室中学生的人脸识别,那么负样本就是教室的窗子、墙等等。
也就是说,不能是与你要研究的问题毫不相关的乱七八糟的场景,这样的负样本并没有意义。
在检测的问题中,理解着就不是那么简单了,因为检测问题需要做的事情是指出哪里有什么,也就是既要给出框,又要说明框中是什么。
在这种情况下,所具备的数据就是一些人工标注的图片,这些图片上有框,并且会给出框中的物体类别,需要运用这些数据生成训练中的正负样本数据,参考了faster以及SSD两种检测框架中对于正负样本的选取准则,理解如下:
首先,检测问题中的正负样本并非人工标注的那些框框,而是程序中(网络)生成出来的框框,也就是faster rcnn中的anchor boxes以及SSD中在不同分辨率的feature map中的默认框,这些框中的一部分被选为正样本,一部分被选为负样本,另外一部分被当作背景或者不参与运算。
不同的框架有不同的策略,大致都是根据IOU的值,选取个阈值范围进行判定,在训练的过程中还需要注意均衡正负样本之间的比例。
1.正样本:目标图像块
2.负样本:图像背景区域
3.易分正样本
4.易分负样本:实际情况中该类占的比重非常高。
5.难分正样本:这部分样本在训练过程中单个样本的损失函数较高,但是该类占总体样本的比例较小。
6.难分负样本
1.OHEM:在线难例挖掘:主要针对训练过程中的困难样本自动选择;核心思想是根据输入样本的损失进行筛选。
2.S-OHEM:基于Loss分布采样的在线困难样本挖掘
3.Focal loss:专注难样本,改善了分类过程中的交叉熵函数,提出了可以动态调整权重的损失函数。
4.GHM:损失函数梯度均衡化机制,从样本的梯度范数出发,根据梯度范数所占比例进行动态加权。
1.ATSS:通过实验分析对比来说明正负样本分配的重要性,设计了一种mean IoU的方法。
2.SAPD:设计了一种利用注意力来软加权的训练策略,减少了对背景信息的锚点关注。
3.AutoAssign:将标签对齐看作一种连续问题,没有真正意义上的正负样本之分,每个特征图上都有正样本和负样本属性。只是权重不同而已。
4.DETR:将目标检测任务视为一个图像到集合的问题,使用Hungarian algorithm来实现预测值与真值实现最大的匹配,并且是一一对应。
1.上采样和下采样的方法,增加少类别数目或者降低密集类别数量。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)