最近需要熟悉一下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;
}