使用OpenCV训练一个分类器全纪录

毕业设计是一个扣件缺陷检测的项目,打算利用OpenCV训练一个检测扣件的分类器,现在已完成。为了防止操作很快的忘记,也想梳理一下操作步骤,就有了以下这些文字。
首先就是创建一个训练专用文件夹,用来存放此次训练相关的文件,我的文件夹名称是“xl”。

(一)
找出opencv_createsamples.exe和opencv_traincascade.exe这两个可执行文件。其位置一般都是在OpenCV安装的根目录中。

找不到文件位置可以直接在搜索框搜索,也很快。然后复制和这两个文件放入xl文件夹中,第一步就完成了。下面说一些需要注意的问题:
opencv_createsamples.exe是为了创建一个正样本的.vec文件,而这个文件是能够被opencv_traincascade.exe识别的。还有就是无论OpenCV版本是2.还是3.,这两个可执行文件的使用方式都是一样的。

(二)
准备训练数据,训练数据分为正样本和负样本,可以在xl文件夹中创建两个文件夹,“pos”和“neg”,pos用来存放正样本,neg用来存放负样本。
准备正样本,正样本是指只含有你要识别的物体的图片(利用分割算法,提取出图片内的扣件),可以准备200张,也可以更多,样本越多,级联层数越多,识别率越高。这里以200张为例,在把这些图片放入pos文件夹之前,还需对这些图片进行尺寸统一化处理(可以使用resize()函数)。比如把图片大小都统一成5050,官方建议是2020,但是暂时没有发现区别,所以这里只要统一就好,但是注意不能大于负样本的尺寸。
把这些统一好的图片放入pos文件夹中,然后在pos文件夹路径中进入命令窗口(在路径中输入cmd)。
在这里插入图片描述
在命令窗口输入“dir/b>pos.dat”,生成文件名列表,然后通过记事本打开这个.dat文件,删除所有空行和与图片无关的文件名(这个很重要),再修改文件格式。格式如下:
在这里插入图片描述
比如文件是bmp格式,就可以在记事本里把bmp替换成bmp 1 0 0 50 50,1 0 0都是不变的,50 50是正样本的宽度和高度,这里选择的是统一成50*50。统一成其他的尺寸就要改成相应的数字。到这里正样本就准备完毕了。
准备负样本,负样本要选取与正样本有关联,但又不含有正样本的图片,且要比统一化之后的正样本尺寸大(训练分类器的时候要从负样本之中扣取与正样本一样大的样本进行训练),数量最好大于正样本数量。负样本不需要统一尺寸,就直接放在neg文件夹中,然后在neg文件夹路径中进入命令窗口(操作与正样本部分相同),在命令窗口输入“dir/b>neg.dat”生成neg.dat文件,再在neg.dat文件中删除所有空行和与图片无关的文件名,负样本准备完毕。

(三)
训练分类器,首先利用opencv_createsamples.exe文件生成描述正样本的向量文件。在xl文件夹路径中进入命令窗口,输入:
“opencv_createsamples.exe” -info “pos\pos.dat” -vec pos.vec -num 200 -w 50 -h 50
各参数解释如下:
-info:描述样本位置及大小的描述文件,不用修改。
pos\pos.dat:正样本文件夹及描述正样本的.dat文件,根据各人设置修改。
-vec:向量文件,不用修改。
pos.vec:描述正样本的向量文件,根据各人设置修改。
-num 200:正样本数量,根据各人设置修改。
-w 50 -h 50:正样本的宽和高,根据各人设置修改。
运行之后就会在xl文件夹中生成pos.vec文件。
在这里插入图片描述
在xl文件中创建一个文件夹比如data,保存训练好的xml文件。
继续在xl文件路径中进入命令窗口,输入以下命令:
“opencv_traincascade.exe” -data data -vec pos.vec -bg neg\neg.dat -numpos 30 -numneg 50 -numStages 10 -featureType HAAR -w 50 -h 50 -minHitRate 0.9995 -mode ALL
参数解释如下:
-data data:创建保存训练结果的文件夹,根据各人设置修改。
-vec pos.vec:描述正样本的向量文件名,根据各人设置修改。
-bg neg\neg.dat:描述负样本的文件名,根据各人设置修改。
-numpos:参与每层训练的正样本的数目,根据各人设置修改。
-numneg:参与每层训练的负样本的数目,根据各人设置修改。
-numStages:训练分类器级联的层数,根据各人设置修改。
-featureType:特征提取的特征类型,默认为HAAR,可选LBP,根据各人设置修改。
-minHitRate:每一级需要达到的命中率,默认为0.995,根据各人设置修改。
-mode:使用HAAR-like特征时使用,可选BASIC、CORE、ALL。
开始运行,就开始了训练过程。
在这里插入图片描述
在这里插入图片描述

训练结束后,在data文件夹会生成XML文件。

Cascade.xml即为最终的训练器,可以用来进行目标检测,程序可以参考
Cv::cascadeclassfier。

(四)
训练过程中出现的问题及解决方法。
训练过程中出现的问题及解决方法。
训练样本太少已经达到了训练器的最大潜力,适当减少numpos数。
过度拟合,减少numstage数。
还有几个问题,但是记不起来了。按照这个步骤,可以训练出一个XML文件并且可以用来进行目标识别。
识别效果与正负样本的选取有关,比如数量,最好能够保持正:负为1:3,还有与numpos和numneg有关,总之影响因素很多,慢慢试验。
毕业设计期间遇到了很多问题,也有困难,训练分类器只是其中一部分,但总算是做完了,效果也不错。
以上文字纯手打,有问题的话恳请各位大佬指正!邮箱[email protected]
对以上操作有不懂的同学也可以来信哟!欢迎!

发布了1 篇原创文章 · 获赞 0 · 访问量 7

猜你喜欢

转载自blog.csdn.net/shui_ci/article/details/105139392