一、准备知识
网上其它教程训练分类器所采用的是基于opencv2.x中的open_haartraining.exe,为训练haar特征的分类器,现在新版本已被弃用;
因此本文的级联分类器是基于OpenCV3.x版本制作,所用程序为opencv_traincascade.exe和opencv_createsamples.exe。
1、opencv_traincascade.exe(生成正样本描述文件的可执行程序)
OpenCV3.x版本没有open_haartraining.exe,而是加强了opencv_traincascade.exe的功能,是可训练haar、hog、lbp等多种特征的分类器
2、opencv_traincascade.exe(训练样本的可执行程序)
opencv_createsamples.exe用来准备训练用的正样本数据和测试数据。该程序能够生成能被opencv_haartraining和opencv_traincascade程序支持的正样本数据。它会输出以 *.vec 为扩展名的文件,该文件以二进制方式存储图像。
3、其它准备文件
xml:用于存放训练好的分类器的参数,这个文件夹不是自带的,先创建空文件夹
negdata:存放负样本的文件夹,这个文件不是自带的,需要创建
posdata:存放正样本的文件夹,这个文件不是自带的,需要创建
negdata.txt:负样本的文件路径,这个文件不是自带的,先在negdata文件夹中创建
posdata.txt:正样本的文件路径,这个文件不是自带的,先在posdata文件夹中创建
二、准备训练数据
1、正样本和负样本
1.1、正样本
保证正样本图片的分辨率大小一致(最好为官方推荐的20x20,不易过大),并且按顺序编号,存放在posdata文件夹中
在待检测是人脸的情况下,需要几百甚至几千个正样本,考虑所有的人种、年龄、表情甚至胡子的样式。保证整张图都只有脸,否则训练效果会很差。
在待检测是物体的情况下,如果只有一张包含物体的图像,如一个公司的标志,那么可以通过对物体图像的随机旋转、改变标志亮度以及将标志放在任意的背景上而获得大量的正样本。
1.2、负样本
负样本可以是任意图像,但要保证分辨率和正样本一致,并且这些图像中不能包含待检测的物体。按顺序编号。存放在negdata文件夹中
负样本的尺寸必须大于等于正样本的尺寸。
负样本的数量必须大于正样本的数量。比例的多少会影响大训练效果,具体需要怎样的比例需要自己把控,但负样本过少会出现错误。
2、制作训练数据集
2.1、正样本集
修改posdata文件夹中的posdata.txt文本的内容为
dir /b/s/p/w *.jpg > num.txt
将posdata.txt的后缀改为bat,即posdata.bat。双击运行,生成num.txt文本。
打开num.txt,按Ctrl+h批量修改替换两处内容:("1 0 0 204 285"中的204、285为图片的宽和高,根据自己的样本大小填写)
修改后为
将num.txt改回为posdata.txt,由于文件中指出的位置是相对路径,所以需要移动到与exe程序同级的文件夹内
2.2、 负样本集
前面采用与2.1正样本集的相同步骤,得到num.txt
这里需要注意的是, 生成之后,负样本的绝对路径不用改为相对路径,也不需要在最后加1 0 0 64 64,内容保持原样即可。
将名字改回为negdata.txt,移动到与exe程序同级的文件夹内
三、生成正样本描述文件
(提前注意,复制粘贴时,代码前不要有空格 ,不然无法执行)
打开电脑的cmd命令指示符,输入exe所在的文件夹(以本人的为例)
cd C:\Users\JAY\Desktop\OpenCV_train
再输入以下内容(num后是正样本数,w和h代表样本图片的大小)
opencv_createsamples.exe -info posdata.txt -vec pos.vec -num 66 -w 20 -h 20
生成的正样本描述文件pos.vec
四、 训练样本分类器
(提前注意,保证负样本分辨率和正样本一致,否则会报错)
打开电脑的cmd命令指示符,输入exe所在的文件夹(以本人的为例)
cd C:\Users\JAY\Desktop\OpenCV_train
再继续输入以下内容(numPos后是正样本数,numNeg后是负样本数,w和h代表样本图片的大小)
opencv_traincascade.exe -data xml -vec pos.vec -bg negdata.txt -numPos 66 -numNeg 200 numStages 20 -featureType LBP -w 20 -h 20
开始训练(保持xml文件夹是一个空文件夹,否则会报错)
训练好之后(会迭代很多轮,直到达到阈值或者训练完二十轮),在xml文件夹中找到名为cascade.xml的文件,这就是训练好的分类器。
完成!!!
ps:本文样本数量过少,主要是做个教程,最好以千为数量级,识别效果才好
其它错误,参考https://blog.csdn.net/u010402786/article/details/52298833
五、调用
在unity里调用,参考https://blog.csdn.net/weixin_42872122/article/details/103232865
六、参考文献
https://www.jianshu.com/p/17d7d4700df2
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
https://blog.csdn.net/qq_32502511/article/details/79010509
https://blog.csdn.net/coulson_zhao/article/details/80980408
https://blog.csdn.net/nienelong3319/article/details/79287546