利用opencv提供的adaboost级联分类器训练模型进行物体检测

前言

在...\opencv\build\x64\vc14\bin的目录下存在opencv_traincascade.exe和opencv_createsamples.exe两个程序,我们能利用它们来进行机器学习,并实现物体检测。下面来说说具体实现步骤。

架构如下:

利用opencv提供的adaboost级联分类器训练模型进行物体检测_第1张图片

源码:https://github.com/YingjieZhang31/Cascade-Classifier

一、提供负样本图片集并得到其索引文件neg.txt

例如:我们将负样本保存到neg文件夹内,如下:

利用opencv提供的adaboost级联分类器训练模型进行物体检测_第2张图片

之后,需要写一个脚本得到负样本的索引位置,效果如下:

利用opencv提供的adaboost级联分类器训练模型进行物体检测_第3张图片

二、提供正样本图片并保存到pos文件夹下

将预处理好的正样本移动到pos文件夹下,提供的正样本越多越好。如果正样本数量不够也可以通过在cmd下输入opencv_createsamples.exe-img sample.jpg -bg neg.txt -info pos.txt -maxxangle 0.5 -maxyangle -0.5 -maxzangle 0.5 -num XXXX(需要的正样本数量)来制作正样本集,具体原理网上资料很多,但需要注意的是这种方法提供的正样本效果很差,难以训练得到比较好的*.xml模型。所以推荐第一种方法。

关于正样本的预处理:首先将正样本从原图中抠出来,并重新调整大小,一定要resize到20*20像素左右,太大的话会严重影响训练速度。

三、得到正样本集的索引文件pos.txt

写一个脚本生成pos.txt,要求如下图:

利用opencv提供的adaboost级联分类器训练模型进行物体检测_第4张图片

详细说明下其意义:正样本由于保存在pos文件夹下,所以为pos/*.jpg , 之后的1 0 0 20 20 分别代表每张图中含有待训练物体的数量,以及其位置(left top width height),因为在第二步里,我们已经将物体抠出来并resize到20*20,所以每张图含一个物体,并占满整张图片。

四、向量化正样本集

cmd中输入opencv_createsamples -info pos.txt -num 2950 -w 20 -h 20 -vec pos.vec 

-num 后的数字代表正样本数量。-w,-h 代表样本的尺寸,这里用的20*20,所以为-w 20 -h 20。这样就在根目录下创建了pos.vec

五、训练模型

cmd里输入opencv_traincascade -data data -vec pos.vec -bg neg.txt -numPos 1000 -numNeg 2000 -numStages 15 -w 20 -h 20

参数意义:-numPos :每个Stage所用的正样本数。

                -numNeg :每个Stage所用的负样本数。

                -numStages :训练层数

numPos最好为numNeg的一半左右为宜。

训练完毕后可以在data文件夹内找到cascade.xml模型。

六、测试模型

见github工程里test.py。

你可能感兴趣的:(原创)