参考:
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/roslei/article/details/65444719
首先,opencv目前仅支持三种特征的训练检测, HAAR、LBP、HOG,选择哪个特征就去补充哪个吧。opencv的这个训练算法是基于adaboost而来的,所以需要先对adaboost进行基础知识补充啊,网上一大堆资料,同志们速度去查阅。我的资源里也有,大家去下载吧,这些我想都不是大家能直接拿来用的,我下面将直接手把手告诉大家训练怎么操作,以及要注意哪些细节。
一、前期准备
正样本:300张
负样本:1000张
注意:正负样本的比例网上说是1:3,量越多越好),正样本采集越多,识别的时候越准确,同时负样本也要更多,本人300张正样本识别不是很准,但还行
opencv_createsamples.exe 版本3.2
opencv_createsamples.exe 版本3.2
刚开始网上下载的2.x的版本,老报错不行,后来重新下载3.2的版本就可以正常训练生成xml
二、关于正样本的准备
1、采集正样本图片
用python摄像头截图人脸,并且统一全部缩放成50px*50px的图片,因为刚开始用500px*500px,生成pos.vec时会报错。
2、获取正样本路径列表
进入到正样本图片的文件夹,打开cmd命令行,输入
dir /b >pos.txt
生成pos.txt文件,删除最后一行不是图片的路径
然后用notepad++等文本工具,批量修改路径数据,格式如下
1 :该样本数目为1;
0 0 :表示样本起始坐标x,y;
500 500 : 表示样本宽w高h
最后,把修改好的pos.txt文件,拷贝到opencv_createsamples.exe同目录下
3、获取供训练的vec文件
这里,我们得利用opencv里的一个程序叫opencv_createsamples.exe,可以把它拷贝出来。针对它的命令输入也是写成bat文件啦,因为cascade训练的时候用的是vec。如下:
编写bat文件
opencv_createsamples.exe -vec pos.vec -info pos.txt -num 300 -bg neg.txt -w 50 -h 50 pause
-vec : 输出生成的文件路径
-info : 正样本的路径txt文件
-num : 正样本的数量
-w -h : 样本宽高
运行bat,就在我们得pos文件夹里生成了如下vec文件:
就此有关正样本的东西准备结束。
运行时报错提示少了opencv_world320.dll,网上下载,放到同一目录下就行了
(vec中其实就是保存的每一个sample图,并且已经统一w、h大小了,如果你想看所有的sample,也可以通过调用opencv_createsamples.exe)
三、关于负样本的准备
这个特别简单,直接拿原始图,不需要裁剪抠图(不裁剪还能保证样本的多样性),也不需要保存框(网上说只要保证比正样本大小大哈,大家就保证吧),只要把路径保存下来。同正样本类似,步骤图如下:
同样生成路径文件,格式跟之前的不太一样
四、开始训练
编写bat文件执行开始训练
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 100 -numNeg 1000 -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度旋转特征
其中-numPos不能设置太大,不然也会报错
Traincascade Error: Bad argument (Can not get new positive sample. Themost possible reason is insufficient count of samples in given vec-file.)
这个帖子里面说的:https://blog.csdn.net/xiao_lxl/article/details/40429363
可能我的样本集不多,训练到第二层级就已经提示识别度已达到了
Required leaf false alarm rate achieved. Branch training terminated.