最近需要熟悉一下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";
训练中总是在运行到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; }