opencv实战从0到N (10)—— adboost训练分类器
Adboost级联分类器
1,Adboost级联分类器可以用来训练一个目标检测器,级联分类器包括多个强分类器,每个强分类器又包含多个弱分类器,
通过将非目标样本一层层的排除,保证了目标检测的准确性。
2,如何利用Adboost训练目标检测器?
opencv提供了训练的工具opencv_traincascade.exe。通过收集和标注样本,使用
opencv_createsamples.exe生成训练所需的数据格式.vec文件,然后使用opencv_traincascade.exe设置相应的参数
运行训练。
指令如下:
(1)opencv_createsamples.exe -info pos.txt -bg neg.txt -vec pos.vec -num 2018 -w 30 -h 20
参数说明:
-info 输入正样本描述文件,默认NULL
-img 输入图像文件名,默认NULL
-bg 负样本描述文件,文件中包含一系列的被随机选作物体背景的图像文件名,默认NULL
-num 生成正样本的数目,默认1000
-bgcolor 背景颜色,表示透明颜色,默认0
-bgthresh 颜色容差,所有处于bgcolor-bgthresh和bgcolor+bgthresh之间的像素被置为透明像素,也就是将白噪声加到前景图像上,默认80
-inv 前景图像颜色翻转标志,如果指定颜色翻转,默认0(不翻转)
-randinv 如果指定颜色将随机翻转,默认0
-maxidev 前景图像中像素的亮度梯度最大值,默认40
-maxxangle X轴最大旋转角度,以弧度为单位,默认1.1
-maxyangle Y轴最大旋转角度,以弧度为单位,默认1.1
-maxzangle Z轴最大旋转角度,以弧度为单位,默认0.5
输入图像沿着三个轴进行旋转,旋转角度由上述3个值限定。
-show 如果指定,每个样本都将被显示,按下Esc键,程序将继续创建样本而不在显示,默认为0(不显示)
-scale 显示图像的缩放比例,默认4.0
-w 输出样本宽度,默认24
-h 输出样本高度,默认24
-vec 输出用于训练的.vec文件,默认NULL
(2)opencv_traincascade.exe -data "J:\train_model\data" -vec pos.vec -bg neg.txt -numPos 2000 -numNeg 2500
-numStages 15 -precalcValBufSize 5000 -precalcIdxBufSize 5000 -w 30 -h 20
-maxWeakCount 150 -minHitRate 0.9995 -maxFalseAlarmRate 0.20
参数说明:
-data 目录名xml,存放训练好的分类器,如果不存在训练程序自行创建
-vec pos.vec文件,由opencv_createsamples生成
-bg 负样本描述文件, neg\neg.txt
-numPos 每级分类器训练时所用到的正样本数目
-numNeg 每级分类器训练时所用到的负样本数目,可以大于-bg指定的图片数目
-numStages 训练分类器的级数,默认20级,一般在14-25层之间均可。
如果层数过多,分类器的fals alarm就更小,但是产生级联分类器的时间更长,分类器的hitrate就更小,检测速度就慢。如果正负样本较少,层数没必要设置很多。
-precalcValBufSize 缓存大小,用于存储预先计算的特征值,单位MB
-precalcIdxBufSize 缓存大小,用于存储预先计算的特征索引,单位M币
-baseFormatSave 仅在使用Haar特征时有效,如果指定,级联分类器将以老格式存储
-stageType 级联类型,staticconst char* stageTypes[] = { CC_BOOST };
-featureType 特征类型,staticconst char* featureTypes[] = { CC_HAAR, CC_LBP, CC_HOG };
-w
-h 训练样本的尺寸,必须跟使用opencv_createsamples创建的训练样本尺寸保持一致
-bt Boosted分类器类型
DAB-discrete Adaboost, RAB-RealAdaboost, LB-LogiBoost, GAB-Gentle Adaboost
-minHitRate 分类器的每一级希望得到的最小检测率,总的最大检测率大约为min_hit_rate^number_of_stages
-maxFalseAlarmRate 分类器的每一级希望得到的最大误检率,总的误检率大约为max_false_rate^number_of_stages
-weightTrimRate Specifies whether trimming should beused and its weight. 一个还不错的数值是0.95
-maxDepth 弱分类器的最大深度,一个不错数值是1,二叉树
-maxWeightCount 每一级中弱分类器的最大数目
-mode 训练过程使用的Haar特征类型,CORE-Allupright ALL-All Features BASIC-Viola
3,级联分类器测试:
/** 函数声明 */
void detectAndDisplay( Mat frame );
/** 全局变量 */
string face_cascade_name = "haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
string window_name = "Capture - Face detection";
/** @主函数 */
int main( int argc, const char** argv )
CvCapture* capture;
Mat frame;
//-- 1. 加载级联分类器文件
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
//-- 2. 打开内置摄像头视频流
capture = cvCaptureFromCAM( -1 );
if( capture )
while( true )
frame = cvQueryFrame( capture );
//-- 3. 对当前帧使用分类器进行检测
if( !frame.empty() )
{ detectAndDisplay( frame ); }
{ printf(" --(!) No captured frame -- Break!"); break; }
int c = waitKey(10);
if( (char)c == 'c' ) { break; }
return 0;
/** @函数 detectAndDisplay */
void detectAndDisplay( Mat frame )
std::vector<Rect> faces;
Mat frame_gray;
cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );
//-- 多尺寸检测人脸
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
for( int i = 0; i < faces.size(); i++ )
rectangle(frame, Rect(faces[i].x, faces[i].y,faces[i].width,faces[i].height),
Scalar(255,0,0),
10);