在网上找了好多相关信息,有几篇写的很好的:
http://blog.csdn.net/tyt2222008/article/details/5838389
http://www.jb51.cc/article/p-zlgbtpmd-za.html
http://www.jb51.cc/article/p-nhrijrjc-da.html
通过这几篇以及我之前的学习,将今天实践的过程分享一下:
首先再次说一下整体生成的流程:
1:收集需要训练的正、负样本。
2:对正样品归一化处理,负样本不处理,但是保证负像素尺寸 >=正样品像素尺寸(或者有的人也称作缩放处理,不过我感觉还是归一化处理比较好听)。
4:样本训练。
详细总结:
1:收集样品。
刚开始仅仅是做个小实验,所以数量暂时不用太多,我选择的正样品是45个,负样品是60个,一般情况下负样品尽量比正样品多,毕竟当想寻找一个东西的时候,先找到其他东西的概率更大,如果负样品比正样品少,那么就会造成“卡死”始终不出结果(详细解释http://hi.baidu.com/spmno/item/039899fe88ea0e5dc9f337f9),要想详细计划一下正负样品的数量,这个网址里边(http://bbs.csdn.net/topics/390388465)最下边一段英文或许能够帮助你,我今天没有时间具体看了,明天再看。
今天看完了这个数量介绍,纠正我之前的错误,正样品貌似经过计算比负样品多:
vec-file has to contain >= (numPos + (numStages-1) * (1 - minHitRate) * numPos) + S,where S is a count of samples from vec-file that can be recognized as background right away.
例子:
It worked for me. I also had same problem,I was following the famous tutorial on HAAR training but wanted to try the newer training utility
with -npos 7000 -nneg 2973
so i did following calcs:
vec-file has to contain >= (numPos + (numStages-1) * (1 - minHitRate) * numPos) + S
7000 >= (numPos + (20-1) * (1 - 0.999) * numPos) + 2973
(7000 - 2973)/(1 + 19*0.001) >= numPos
numPos <= 4027/1.019
numPos <= 3951 ~~ 3950
and used:
-npos 3950 -nneg 2973
It works.
2:归一化处理。
这个是一个必要条件,当分类器在你想要检测的图片上寻找目标的时候,它不能所有位置、所有大小都各种乱找,那样一张图片的执行次数就会相当的巨大,而且如果正样品的大小不统一,那么彼此之间也就没有太大的可比性和联系性了,所谓归一化处理,就是让所有图片的像素尺寸一样,比如我的正样品全部是64*64像素的,处理方法,可以看看该大神的文章:http://www.cnblogs.com/tornadomeet/archive/2012/03/27/2420088.html
3:正负描述文件。
这个很简单,仅仅需要手动弄一下,用到了CMD的dir命令(详细http://blog.csdn.net/tyt2222008/article/details/5838389)
正:
跟这里一样,第一列表示图片的名字,第二列表示该图片中有多少个正样例,一般为1,如果有很多(比如在人群中有很多人脸),那么有多少个这个参数就写几,比如是K个,那么接下来就要有4*k个数据,也就是k组数据,每组数据是这样的:x y width height。
负:
仅仅需要图片名字,不需要参数:
4:训练。
首先需要创建正样例的文件:a.vec。
命令行:opencv_createsamples.exe -info C:/Users/rockyli/Desktop/expression/anger/info.txt -vec a.vec -num 45 -w 64 -h 64
之后,再执行个命令就哦了:
opencv_haartraining.exe -data xml -vec a.vec -bg C:\Users\rockyli\Desktop\expression\other\other.txt -npos 45 -nneg 60 -nstages 4 -nsplits 1 -sym -w 64 -h 64 -mode all -mem 1024
结果:
由于样本数量以及质量很少、以及训练使用的参数设置,检测效果很一般:
我的文档可以在这下载:http://download.csdn.net/detail/duhaomin/5988683
我也是初学者,望大神看到有什么错误的地方多多指教。
要是谁有什么不解的可以随时留言,大家一起交流才会更快的成长嘛。