利用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 <windows.h>
#include <cstring>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

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<<order<<endl;
	system(order0);
	system(order);
	
	return 0;
}


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值