最近各种事情耽搁,OpenCV的学习也没有进展。
因为项目需求,所以自己做了这样一个基于Haar特征级联分类器的鸟类检测模型,记录下来。
OpenCV官方文档中有一个Haar级联分类器做的人脸检测例程,自行参阅文档。
做一个鸟类检测模型首先需要训练出一个识别用的.xml文件,下面就开始进行训练。
一、准备样本集
样本集需要正样本集和负样本集。
正样本集:正样本集为包含“鸟类”的灰度图,一般大于等于2000张,尺寸不能太大(20*40),尺寸太大会导致训练时间过长。
负样本集:负样本集为不含“鸟类”的任何图片,一般大于等于5000张,尺寸比正样本集稍大(60*60)。
由于项目要求不高,所有的样本集都是我自己在网上找的图片,然后用python脚本对尺寸进行了调整,全部为灰度图。
左边是正样本集(40*40),右边是负样本集(100*100)。PS:由于自己做的样本集数量不大,所有尺寸稍大
二、准备文件夹
将正负样本集分别放入pos和neg文件夹,存放在路径D:\Anaconda\pkgs\opencv-3.3.0-py35_200\Library\bin(PS:个人的安装环境不同,路径有差异)。
在该路径下新建xml文件夹。
三、cmd打开dos命令窗口,进入pos路径下
输入以下命令,创建pos.txt文件
dir/b >pos.txt
打开pos.txt,将jpg全部替换为jpg 1 0 0 40 40
删除最后一行路径pos.txt
保存
"1"为图片数量,“0,0”为坐标(Left,Top),“40,40”为图片尺寸(width, height)。
同理,进入neg文件夹,输入以下命令生成neg.txt
dir/b >neg.txt
打开neg.txt,将图片名前面加入路径:
neg/
删除最后一行路径neg.txt
四、生成pos.vec
dos窗口进入路径D:\Anaconda\pkgs\opencv-3.3.0-py35_200\Library\bin,及pos、neg、xml文件夹所在的路径,输入下列命令生成pos.vec文件。
opencv_createsamples.exe -info pos\pos.txt -vec pos.vec -bg neg\neg.txt -num 50 -w 40 -h 40
-bg 作为背景
-num 正样本数量
-w 正样本宽度
-h 正样本高度
生成成功后出现如下界面:
五、开始训练
接下来输入以下命令,开始进行训练
opencv_traincascade.exe -data xml -vec pos.vec -bg neg\neg.txt -numPos 50 -numNeg 100 -numStages 20 -featureType HAAR -w 40 -h 40
-data 后面跟文件夹名
-vec vec文件
-bg 作为背景的文件
-numPos 正样本数量
-numNeg 负样本数量
-numStages 级数
-featureType 特征类型,可以跟HAAR、LBP、HOG
接下来就是等待训练结果的过程。
训练完成后会在xml文件夹中出现一个***.xml文件,这就是我们需要的东西。检验过程类似人脸检测(官方教程中可以找到),只是将haarcascade_frontalface_default.xml换成了我们自己训练的***.xml文件。
在上面这些过程中可能会遇到各种问题,各个论坛的大神都给出了解答,这里就不献丑了。
补:
昨天又将样本扩大进行了训练,识别正确率有了明显提升。不过训练过程中也遇到了更多细节问题,比如因为minhirateh(最小正确测试率)和maxfalsealarm(最大错误接受率)设置得不恰当,导致训练提前结束,还有根据HAAR特征、LBP特征、HOG特征各自的特性,似乎HOG更适合做此类检测。下面给出一个链接,可以参考:
参考链接