原创,转载请注明出处。
1.正样本,负样本
---为了效率就不自己采集了。选用MIT人脸库,正样本2706个,负样本4381个
2.创建正样本的描述文件。
2.1创建批处理create_filename.bat:
@echo off
dir/s/b *.*>filename.txt
pause
exit
2.2创建批处理pos_vec.bat,添加每张图像的参数信息:
@echo off
set c= 1 0 0 20 20
for /f "tokens=* delims= " %%i in (pos.txt) do echo %%i%c%>>"pos5.txt"
pause
2.3创建批处理opencv_createsamples.bat,以vec格式保存正样本的样本描述符:
@echo off
D:\OpenCV\FaceDetect\MITface\MITface
opencv_createsamples.exe -info pos5.txt -vec pos.vec -w 20 -h 20 -num 2706
pause
3.分类器训练
创建批处理文件flq_create_classify_new.bat
D:\OpenCV\FaceDetect\MITface\MITface
opencv_haartraining.exe -data d:\OpenCV\FaceDetect\MITface\MITface -vec D:\OpenCV\FaceDetect\MITface\MITface\pos.vec -bg D:\OpenCV\FaceDetect\MITface\MITface\nonfaces\neg_pure_all.txt -npos1000 -nneg 2000 -nsplits 2 -mem 512 -nonsym -w 20 -h 20
pause
开始进行分类
4.可能出现的问题:
4.1.分类器训练时找不到负样本
原因及解决办法:
原因是找不到bg
负样本描述符路径为:D:\OpenCV\FaceDetect\MITface\MITface\nonfaces\neg_pure_all.txt
负样本格式为
002549.bmp
002831.bmp
003621.bmp
004901.bmp
006151.bmp
即可解决
4.2.样本训练中出现如下错误:
OpenCV Error: Assertion failed (elements_read == 1) in icvGetHaarTraininDataFrom VecCallback,
原因及解决办法:
npos与nneg 设置过大导致。
-npos的意思是每次训练从.vec文件中随机选取npos个正样本。由于存在虚警,在每一次训练一个强分类器之后,会把那些分类错误的从整个样本库中剔除掉,总的样本就剩下 CountVec = CountVec - (1 - minhitrate)* npos,在第二个强分类器的训练过程中就是从剩下的Countvec抽样,一直这样进行nstage次,所以就有CountVec >= (npos + (nstages - 1)*(1 -minhitrate) * npos ) + nneg 。当把npos设置与vec中总样本数相同时,第二个强分类器训练时,必然就会报错,提示样本数不足。故将npos和nneg都减少,改成1000和2000即可。