最近在做识别的过程中发现sift与surf的特征并不容易筛选,想找一下有没有比较好筛选特征的方法,在检索的过程中发现了基于haar特征的级联adboost的方法,这个方法能有效的筛选哪些是更好的haar特征。虽然暂时还没有相处关联的思路,但用这个可以做基于传统方法的目标识别,所以就在网上学习了一下怎么训练这个级联分类器。网上训练这个分类器基本上是基于opencv2中的open_haartraining.exe,这是一个封装好了的训练算法,只要把文件格式弄好,参数输入进去,就可以训练出来级联分类器了,但是我用的是opencv3,很苦恼,没有这个open_haartraining.exe,只有opencv_traincascade,索性就开始使用了(open_haartraining.exe只能训练haar特征的分类器,但是opencv_traincascade可训练多种特征的分类器,比如haar,hog,lbp等等)。
opencv_traincascade的原理暂时没有详细的探查过,之后回来补上。接下来详细的讲一下整个级联分类器的整个训练过程。
训练过程主要分为以下四步:
1.配置训练环境
2.制作训练数据集
3.生成正样本描述文件(.vec文件)
4.训练样本分类器
5.常见错误
配置训练环境
opencv的源代码是用c++写的,但是提供了其他主流语言的接口,但是这个训练的过程需要调用opencv自带的两个可执行程序open_createsample.exe和opencv_traincascade.exe来训练分类器里面的参数,并保存在xml文件中,这样你的其他语言就可以调用了。
首先需要找到open_createsample.exe和opencv_traincascade.exe这两个程序在计算机中的位置,比如我的在C:\Users\lowkeybin\Anaconda3\pkgs\opencv-3.3.1-py36h20b85fd_1\Library\bin(如果找不到,在搜索栏直接搜索这两个程序)
这是我这个地址里面的文件目录,我只截取了很小一段内容,其实还有很多dll文件和很多其他的文件,但是我们现在不需要那些
xml:用于存放训练好的分类器的参数,这个文件夹不是自带的,需要创建
negdata:存放负样本的文件夹,这个文件不是自带的,需要创建
posdata:存放正样本的文件夹,这个文件不是自带的,需要创建
negdata.txt:负样本的文件路径,这个文件不是自带的,需要创建,创建过程下面会提到
posdata24x16.txt:正样本的文件路径,这个文件不是自带的,需要创建,创建过成下面会提到
posdata24x16.vec:生成的正样本描述文件,这个文件不是自带的,需要创建,创建过程下面会提到
opencv_createsamples.exe:生成正样本描述文件的可执行程序,这个是文opencv中自带的
opencv_haartraining.exe:训练样本的可执行程序,这个也是opencv中自带的
制作训练数据集
首先将要训练的正类样本和负类样本放入posdata这个文件夹中,这里的样本图片需要是灰度图片,且不要大于100*100。备注:负样本的数量要大于正样本的数量,我用的是正负样本数量比为1:3,这个会影响大训练效果,具体需要怎样的比例需要自己把控,但负样本过少会出现错误。
接下来需要生成正负样本的文件路径,使得训练中可以顺利的找到每个样本。先进入正样本目录,新建一个txt文件,并在中输入如下内容
dir /b/s/p/w *.jpg > num.txt
然后关掉这个txt,把这个txt的后缀名改为bat,他会变成下面这个样子
双击这个bat文件,会生成这样一个txt文件
我们现在需要通过记事本的替换功能修改一下这个txt文件的内容
替换好之后应该是这个样子
posdata是样本的相对路径,最后的1 0 0 64 64,最后两位数代表你的样本图像的大小,需要根据自己的样本图片改写,由于文件中指出的位置是相对路径,所以我们需要把这个txt文件放到与open_createsample.exe和opencv_traincascade.exe这两个程序的同一级文件当中,并把这个txt文件的名字改为posdata
以上给出了正样本文件路径的生成方法,负样本的方法也相同,但是负样本的绝对路径不用改为相对路径,也不需要在最后加1 0 0 64 64,且名字改为negdata就可以了,negdata.txt内应该是这样的
生成正样本描述文件
打开cmd.exe输入以下内容进入open_createsample.exe和opencv_traincascade.exe这两个程序的文件地址(以下是我的)
cd C:\Users\lowkeybin\Anaconda3\pkgs\opencv-3.3.1-py36h20b85fd_1\Library\bin
再继续输入以下内容(num后是正样本数,w和h代表样本图片的大小)
opencv_createsamples.exe -info posdata.txt -vec pos.vec -num 100 -w 64 -h 64
运行成功是这样的
-info 样本的说明文件
-vec 正样本描述文件的名字以及路径
-num 正样本数量
-w-h样本图片的大小
程序成功运行后会生成posdata.vec
训练样本分类器
打开cmd.exe输入以下内容进入open_createsample.exe和opencv_traincascade.exe这两个程序的文件地址(以下是我的)
cd C:\Users\lowkeybin\Anaconda3\pkgs\opencv-3.3.1-py36h20b85fd_1\Library\bin
再继续输入以下内容(numPos后是正样本数,numNeg后是负样本数,w和h代表样本图片的大小)
opencv_traincascade.exe -data xml -vec pos.vec -bg negdata.txt -numPos 100 -numNeg 226 numStages 20 -featureType LBP -w 64 -h 64
运行成功是这样的(会迭代很多轮,直到达到阈值或者训练完二十轮)
常见错误
posdata.txt中的路径需要是相对路径,而negdata.txt中的路径需要是绝对路径,如果路径写错会出现下面的情况
在创建训练数据集和训练样本分类器是代码中的空格不能少,如果少了会出现下面的情况
最后正样本集中的样本需要只包含目标物体,尽量不要包含其他物体,如果要识别人脸,那就整张图都只有脸。否则训练效果会很差。另外正样本的尺寸必须小于等于负样本的尺寸