opencv之级联分类器训练属于自己的xml文件

            基础知识这里就不讲了,最近在做车牌识别系统中的车牌定位算法,只讲讲自己训练的可以进行车牌定位的xml文件。这里我是用的是opencv2.4.4版的opencv_createsamples.exe和opencv_haartraining.exe,实验发现车牌定位效果并不是特别理想,当然,这跟训练集有关系,也跟测试集车牌图像中车牌所占比例大小不一有关系。明天再试试别的方法吧。

        训练属于自己的xml文件,需以下几个步骤:

        1、准备数据集,分为正样本集和负样本集;

        2、第二是下载opencv_createsamples.exe和opencv_haartraining.exe;

        3、生成路径,将正样本集的路径要存成 *.vec格式;负样本集的路径不做要求,*.txt就可以;

        4、训练xml文件

下面拿车牌定位来举例:

        一、准备数据集

正样本集:就是已经定位好的车牌样本;我这里有100张,大小归一化为44*14,且为灰度图,存在d:/chepai/chepai/pos文件夹下。

         

        

        负样本集:所有不包含车牌照片的图像均可当做负样本集,不可重复,个数为正样本集的3倍左右,大小可以不归一化;我自己是从网上下载的,从中随机选择了315张,存在了d:/chepai/chepai/neg文件夹下。下载地址:点击打开链接

         二、准备exe文件

         下载地址:点击打开链接

               此时文件夹下有以下几个部分:

         

        

        三、生成路径

        在e:/chepai/chepai/pos文件夹下编写一个bat程序,get route.bat,程序内容如下:

dir /b > pos.txt

        双击运行后,会出现pos.txt文件出现,然后将txt文件里面非图片的路径都删掉,如下图中的头两行:


 

再然后将get route.bat和pos.txt都剪切到上一级文件目录(d:/chepai/chepai)下,最后将pos.txt中的图片路径改成相对路径,并且在图像后面加上:样本图片中目标的个数 目标所在的坐标;

完成后格式如下图:

其中,1 0 0 44 14中的1表示目标个数,后面四个数字代表left top width height;

同样的,得到neg.txt文件,格式如下:

        

完成以上这些以后,得到如下的文件夹:

        

下面将正样本的路径pos.txt用CreateSamples.exe转成pos.vec

        在d:/chepai/chepai文件夹下新建createsamples.bat,内容如下:

CreateSamples.exe -vec pos.vec  -info pos.txt -num 100 -w 44 -h 14 pause

其中,-num后面的数字是正样本个数,-w后面的数字是正样本图片的长,-h后面的数字是正样本图片的高;

双击createsamples.bat后出现pos.vec即为运行成功;

         完成以上准备步骤后,文件夹为:


 

       

        四、训练生成xml

        在d:/chepai/chepai文件夹下新建train.dat;内容如下:

haartraining.exe -data xml -vec pos.vec -bg neg.txt -nstages 5 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 100 -nneg 315 -w 44 -h 14 -mem 1024 -mode ALL pause


其中,

        -nstages表示的是训练分类器的级数,不能太大也不能太小,太大的话会出现下图的情况:

程序走到POS后不再出现NEG:,就是指找不到误检的neg样本,没法跳出循环;将nstages设置小一点儿就可以啦~

当然,如果太小的话,得到的xml文件分类效果可能就会不好。

        -nsplits

        -minhitrate 分类器每一级希望得到的最小检测率;

        -maxfalsealarm 分类器每一级希望得到的最大误检率;

        -w -h 必不可少,否则会报错;

运行成功后会得到一个xml文件夹和一个xml.xml文件;如下图:

将xml.xml修改名称为chepai.xml,然后用python或者C++调用自己训练出来的chepai.xml来进行车牌定位吧~

python调用xml参考代码:点击打开链接

C++调用xml参考代码:点击打开链接

最近做人脸检测,用深度学习做肯定是没有问题的,已经做出来了,效果非常棒,就是在1080Ti上跑MRCNN【自己做了一些优化】,仍然要200ms左右,还达不到实时,最近想研究研究安防摄像头,于是先试试opencv的分类器 人脸识别,效果一般,但是速度还是可以的。

猜你喜欢

转载自blog.csdn.net/qq_25439417/article/details/82532696