利用Opencv中的Haartraining训练特征的经验谈.....

最近需要熟悉一下haar特征,带着一个师妹熟悉一下从特征提取到训练的整个过程。

第一次接触,熟悉玩haar特征和adaboost原理后。实验开始了

试验中采用了MIT CACL人脸的数据库。

实验中产生样本数据的命令如下:

char order0[1024] = "opencv_createsamples.exe \
-vec pos.vec \
-info faces\\faces.txt \
-w 20 \
-h 20 \
-num 2000";
这一步一般都没有问题

之后就是数据训练了,命令如下:

char order[1024] = "opencv_haartraining.exe \
-data test \
-vec pos.vec \
-bg nonfaces\\nonfaces.txt \
-minhitrate 0.995 \
-maxfalsealarm 0.45 \
-nstages 15\
-npos 2000 \
-nneg 3000 \
-w 20 \
-h 20 \
-nonsym \
-mem 1024 \
-mode basic \
-noeqw";

这里默认的nstegas为14,因此minhitrate一般最好大于0.99

训练中总是在运行到7或8层的时候停住,有时候等上一上午也不见进展

翻阅很多网友的报告后,总结如下:

1、正负样本比例

2、反例样本的质量

3、内存的大小

分析了半天,有看了看adaboost原理

如果负样本质量不高,也就是说负样本跟正样本的相似度不大,那么在训练的过程中:

正检测率为1,负检测率为0,程序金辉进入死循环。

因为每一层的训练,都会有新的负样本补充进来,形成新的训练样本。

而越是进行到后面的迭代负样本的质量要求越高

要是相似度太大或者负样本少了,都有可能造成死循环。

因此我修改了负样本,加入了很多差别比较大的突破,最终达到了8000+

训练很快就完成了(用服务器跑的)

最后实验的效果也不错,检测速率和效果也说不错的。

实验的程序给大家贴出来,就不用老进dos了。

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

char order[1024] = "opencv_haartraining.exe \
-data test \
-vec pos.vec \
-bg nonfaces\\nonfaces.txt \
-minhitrate 0.95 \
-maxfalsealarm 0.45 \
-nstages 15\
-npos 2000 \
-nneg 3000 \
-w 20 \
-h 20 \
-nonsym \
-mem 1024 \
-mode basic \
-noeqw";

char order0[1024] = "opencv_createsamples.exe \
-vec pos.vec \
-info faces\\faces.txt \
-w 20 \
-h 20 \
-num 100";

int main()
{
	//cout<


你可能感兴趣的:(OpenCv)