第一步:在win7的命令框输入cmd,进入dos命令窗口
第二步:新建一个文件夹trainXML用于存放所需的样本和程序;在trainXML文件夹下创建文件夹pos用于存放正样本的人脸图片、文件夹neg用于存放负样本的图片、xml用于存放训练的模型;将opencv中的opencv_createsamples.exe、opencv_traincascade.exe和opencv_world341.dll放入trainXML文件夹下备用。
第三步:正样本的尺寸不能设置太大,否则容易内存泄漏,一般为20*20、30*30、50*50大小;将调整好大小的人脸样本放入pos文件夹中。
第四步:负样本的尺寸必须要大于正样本的6倍及以上;因为首先我们要知道训练程序中写的numNeg参数表示每级训练用到的负样本数,本人把它设置为1500。其实这个numNeg的大小和原始负样本数量没有任何关联, 因为numNeg是通过滑动窗口在原始负样本上不断滑动采集,得到的预处理负样本图像的数量(滑动窗口的大小就是正样本的大小,这里是50*50);
负样本的尺寸如果不够大,或者和正样本一样大,滑动窗口就无法在原始负样本上滑动来采集足够多的训练图像,再加上如果收集到的原始负样本的数量可能并不比正样本多多少,也许就是3、4倍。这样的话就会导致( 执行opencv_traincascade训练程序过程中中断 )的错误,同时会报(Train dataset for temp stage can not be filled. Branch training terminated。)这时我们发现训练图中的FA( FalseAlarm,虚警率 )为0,表示负样本已全部被正确分类了,也就不会有负样本继续参与下一轮的训练了,所以就退出了。所以在准备原始负样本的时候一定要保证尺寸足够大,同时包含的内容足够复杂。
在DOS窗口中输入命令cd G:\img\trainXML\pos 和G:进入pos文件夹,再输入命令dir /b >pos.txt生成路径文件;

注:1 :该样本数目为1;0 0 :表示样本起始坐标;50 50 : 表示样本宽高
第六步:生成负样本的路径文件neg.txt。
在Dos窗口中输入命令cd G:\img\trainXML\neg 和G:进入neg文件夹,再输入命令dir /b >neg.txt生成路径文件;
同样的,用Notepad打开文件并删除最后一行的 ,再用Notepad的模块编辑将路径文件批量修改为如下格式:
将pos.txt和neg.txt都复制到文件夹trainXML下
第七步:获取供训练的vec文件
新建文本文件并将以下指令输入:
opencv_createsamples.exe -vec pos.vec -info pos.txt -num 188 -bg neg.txt -w 50 -h 50 pause
然后将文件保存为vec.bat,然后双击该文件生成pos.vec文件;
注:
-vec : 输出生成的文件路径
-info : 正样本的路径txt文件
-num : 正样本的数量
-w -h : 样本宽高
第八步:训练
将以下指令输入,编写train.bat文件;
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 188 -numNeg 600 -numStages 20 -w 50 -h 50 -minHitRate 0.9999 -precalcValBufSize 1024 -maxFalseAlarmRate 0.5 -mode ALL
-data : 存放xml文件的目录
-vec : 正样本vec文件源
-bg : 负样本路径txt文件
-numPos : 正样本数量
-numNeg : 负样本数量
numStages:训练分类器的级数
-w -h : 样本宽高
-minHitRate :分类器的每一级希望得到最小检测率(即正样本被判断有效的比例)
-maxFalseAlarmRate:分类器的每一级希望的最大误检率(负样本判定为正样本的概率)
-mode: 选择训练中使用的Haar特征类型。BASIC只使用右上特征,ALL使用所有右上特征及45度旋转特征
双击train.bat开始训练。
参考文献:https://www.jianshu.com/p/0afa9712c6d5
https://www.jianshu.com/p/e35260f7cbf0?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
https://blog.csdn.net/fuck487/article/details/81567428