正样本的选取原则
正样本的尺寸不是必须一致的,但是要和生成的正样本矢量文件中的宽高有相同的比例(训练过程中,会根据矢量文件中设置的宽高,自动对正样本进行缩放,比如我在用程序标注时,框选目标尺寸为30X30,但生产vec文件时填的尺寸为64X64,训练时会自动将框选图像做等比例缩放);
正样本图片应该尽可能包含少的干扰背景信息。在训练过程中这些背景信息也会成为正样本的一个局部特征,使得特征值的计算包含干扰信息。
数据来源尽可能做到多样化,比如样本为车,车的姿态场景应稍丰富些。同一正样本目标的图像太多会使局部特征过于明显,造成这个目标的训练过拟合,影响检测精度,不利于训练器泛化使用。
1、采集正样本图片
正样本最后需要大小归一化,采集样本时可直接把它从原图里抠出来以便缩放;但是我是保留了原图,且在一张图上对多个目标做位置标注了,即保存了它的框个数和框位置信息;我在裁剪时将裁剪框做了比例约束,使得裁剪出来的框和最后需要归一化尺寸等比例。比如要归一化成64 X 64,在裁剪样本的时候,我按长宽等比例裁剪(如32X32,48X48);也可以是非1:1的长宽比,具体看你目标对象的尺寸比例而定。
2、获取正样本路径列表
运行bat文件,就会生成如下dat文件:
把这个dat文件中的所有非图片的路径都删掉,比如上图的头两行,由于我不是裁剪的,所以txt中的目标位置我都是通过一个objectMaker小程序生产的框和尺寸坐标位置:
(pos.txt文件内容中:图像格式后面的数字代表个数(可不只是1),后四个分别对应框的 left top width height,我不是把样本裁剪下来的,那txt中是xxx. jpg 3 1 3 24 24 26 28 25 25 60 80 26 26,xxx. jpg是原图,3为该图上的框数量,后面的数是每个框的信息)
3、获取正样本矢量集vec文件
利用opencv里的一个程序叫opencv_createsamples.exe,把它拷贝出来,放在当前目录下。针对它的命令输入也是写成bat文件,因为cascade训练的时候用的是vec。如下:可通过加-show显示某个正样本图像。可以根据自己需求更改num数,-w和-h
运行bat,就在我们得pos文件夹里生成了如下vec文件:
就此正样本东西准备结束。
注意:
样本矢量库的宽和高设置太大会使样本在训练过程中占用内存较大,可能出现内存分配失败的错误,根据实际情况适当更改。.
创建vec命令行参数:
-vec 输出文件,内含有用于训练的正样本
-img 输入图片文件名
-bg 背景描述文件,文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景
-num 生成正样本的数目
bgcolor 背景颜色(目前为灰度图),背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差可以由 -bgthresh 指定。所有处于 bgcolor-bgthresh 和bgcolor+bgthresh 之间的像素都被设置为透明像素。
-bgthresh
-inv 如果指定该标志,前景图像的颜色将翻转。
-randinv 如果指定该标志,颜色将随机地翻转。
-maxidev 前景样本里像素的亮度梯度的最大值。
-maxxangle X轴最大旋转角度,必须以弧度为单位。
-maxyangle Y轴最大旋转角度,必须以弧度为单位。
-maxzangle Z轴最大旋转角度,必须以弧度为单位。
-show 很有用的调试选项。如果指定该选项,每个样本都将被显示。如果按下 Esc 键,程序将继续创建样本但不再显示。
-w 输出样本的宽度(以像素为单位)。
-h 输出样本的高度(以像素为单位)。
创建样本的流程如下:
输入图像沿着三个轴随机旋转。
旋转的角度由 -max?angle 限定。然后像素的亮度值位于 [bg_color-bg_color_threshold;bg_color+bg_color_threshold]范围的像素被设置为透明像素。将白噪声加到前景图像上。
如果指定了-inv ,那么前景图像的颜色将被翻转。如果指定了-randinv ,程序将随机选择是否将颜色进行翻转。
任选背景图像,将获得的前景图像放到背景图像上,并将图像调整到-w 和-h 指定的大小。最后将图像存入vec文件,vec文件名由命令行参数-vec 指定。
正样本也可从一系列事先标记好的图像中创建。标记信息可以存储于一个文本文件,与背景描述文件类似。文件中的每行对应一个图像文件。每行的第一个元素为图像文件名,后面是物体的数目,最后是物体位置和大小的描述 (x, y, width, height)。
二、关于负样本的准备
负样本的选取原则:
在负样本图片中不能包含正样本目标;
每个负样本之间是各不相同的,即确保负样本的多样性;
每个负样本的尺寸不是必须相同的,但负样本的尺寸不能小于正样本矢量集图像的宽和高,本文设置的尺寸都大于等于64*64;
这个特别简单,直接拿原始图,不需要裁剪抠图,也不需要保存框,只要保证比正样本尺寸大就可以了,只要把路径保存下来。同正样本类似,同理也可以是.cmd文件,内容如:dir neg /b > neg.txt 其中neg为负样本所在的图像文件夹名。neg.txt中内容不含框和位置信息。图如下:
至此有关负样本的也准备完成。
opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.txt -numPos 20000 -numNeg 50000 -numStages 16 -featureType HOG -w 64 -h 64
pause
双击运行即可开始训练。
注意:numPos *2 < numNeg < numPos*4
需要的文件都在这里列出: