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 ); }
       else
       { 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);

  }
  //-- 显示结果图像
  imshow( window_name, frame );
 }