分类器训练翻译

介绍

本文介绍了怎样使用和训练 adaboost 分类器,以快速检测物体。一组过完备的 haar-like 特征提供了简单分类器基础。典型的物体检测任务是人脸、眼睛和鼻子检测,同样还有 logo 检测。 本文例子是 logo 检测,因为 logo 检测不需要大量的标记物体样本,相反,从一个原始样本模型可以导出许多派生物体(见下面 createsamples 工具)。 详细的训练/评估算法描述见文献[1][2]。

产生样本

必须先收集训练样本,有两种样本模型:正样本和负样本。负样本不包含物体,正样本包含待检测的物体。

负样本

负样本取自任意图片,不能包含待检测物体。负样本由背景描述文件记录,这是一个文本文件,每行包含负样本文件(包含相对描述文件的路径)。这个文件需要手工制作。注意:负样本、负样本图、背景样本或背景样本图,在本文中通用)。 负样本描述文件例子:

#目录结构
/img
    img1.jpg
    img2.jpg
    
bg.txt

File bg.txt
  img/img1.jpg
  img/img2.jpg

正样本

正样本使用 createsamples 工具创建。可创建于单个待检物体图像或之前标记图像集 ,单个物体图像可包含诸如公司 logo 等,可通过改变检测物体的任意旋转、变色或变换背景等创制大量正样本。 可以通过命令行参数设置数量和范围。 命令参数:

-vec    <vec-file-name>     输出文件名,包含代训正样本
-img    <image-file-name>   源物体图像,如公司 logo
-bg     <back-ground-file-name> 背景描述文件,包含任意变换的待检测正样本
-num    <number-of-sample>  产生的样本数
-bgcolor    <background-color>
 背景颜色(默认灰色);即透明颜色,因为可能有压缩文件,颜色容差可通过
 _bgthresh 指定,bgcolor-bgthresh 和 bgcolor + bgthresh
 中的所有像素认为是透明的。
-bgthresh   <background-color-threshold>
-inv    若指定,颜色将转置(倒置)
-randinv    若指定,颜色将随意翻转
-maxindev   <max-intensity-deviation>   样本前景像素最大灰度偏差
-maxxangle  <max-x-rotation-angle>  最大旋转角度  用randians
-maxyangle  <max-y-rotation-angle>
-maxzangle  <max-z-rotation-angle>
-show   若指定,显示每个样本,按 esc 将不再显示,很有用的 debug 选项
-w      <sample-width>  输出样本宽度
-h      <sample-height> 输出样本高度

通过以下步骤产生样本:源图像三轴任意旋转,角度通过 max?angle 指定,然后 [bg-color - bg-color-threashold] [bg-color- + bg-color-threshold] 间的灰度认为透明,前景加入白噪声。如果 -inv 指定,翻转前景像素值;如果指定 -randinv ,可以任意选择是否翻转。最后,获得的图像将放在背景描述文件的背景中。若指定了 -w -h,将变为指定大小。存储在 -vec 参数文件中,正样本也可以从标记图像集获得,于背景描述文件类似,每行包含标记图像。第一行是目录名,然后是物体数量,然后是边界矩形坐标。 例如:

/img
    img1.jpg
    img2.jpg
    
info.txt
file info.txt
  img/img1.jpg 1 140 100 45 45
  img/img2.jpg 2 100 200 50 50 50 30 25 25

图像 img1.jpg 含有一个物体边界矩形(140,100,45,45)。图像 img2.jpg 包含两个物体。 为从中创建正样本,需指定 -info 参数,而不是 -img

-info   <collection-file-name>  标记图像集的描述文件

这种情况创建样本方法如下。检测实体取自图片,归一化到样本大小,保存在输出文件中。如果没有失真,所以仅有的相关参数是 -w -h -show createsamples 工具可用于检测正样本文件中的样本。若用于此用途,只有 -vec -w -h 参数指定。 注:对于训练来说,正样本文件怎样产生无所谓,因为 createsamples 工具仅是一种收集/穿件正样本响亮文件(.vec)的方式。

训练

样本创建之后下一步是训练分类器,由 haartrainning 工具完成 命令行参数:

-data   <dir-name>  分类器文件目录
-vec    <vec-file-name>     正样本文件名(createsamples或其他创建)
-bg     <background-file-name>  背景描述文件
-npos   <number-of-positive-samples>
-nneg   <number-of-negative-samples>
    训练每一级分类器所用的正负样本数,推荐 npos=7000 nneg=3000
-nstages    <number-of-stages>  训练的分类器级数
-nsplits    <number-of-stages>
 决定分类器的弱分类器,如果是1,用简单的阈值分类器,如果>=2,CART分类器(分
 number-ofsplites 节点)
-mem    <memory-in-MB>  可用的内存,越多训练越快
-sym    (defaule)
-nonsym     指定物体是否垂直对称,垂直对称加快训练过程,例如脸
-minhitrate <min-hit-rate>  每级分类器最小正确率,总体正确率估计为
         min-hit-rate^number-of-stage
-maxfalsealarm  <max-false-alarm-rate>  每层最大错误率,总错误率估计为
         max-false-alarm-rate^number-of-stages
-weighttrimming <weight-trimming>   指定是否和多重修建比例,0.9很好
-eqw
-mode <BASIC (default) | CORE | ALL >   选择 haar-like 特征集,BASIC
 只有上下特征,ALL 使用搜有上下和45度旋转特征
-w  <sample-width>
-h  <sample-heigth>
    训练样本大小(像素),必须和创建的训练样本的大小一致(trainningsamples)

注:为使用多核处理器,需使用支持 openmp 标准的编译器

应用

可使用 opencv cvHaarDeteObject()函数,特别是 haarFaceDetect demo

测试例子

为检测训练出的分类器性能,需要一组标记图像。若没有测试图像,可通过 cveatesamples 工具操作单个图像检测图。创建测试图步骤与创建训练样本过程相似,因为每个测试图像都是任意扭曲、比例缩放的任意变换位置的物体放在背景图中。 如果 -img 和 -info 参数被指定,那么 createsamples 将创建测试样本。测试样本将如描述文件的那样任意扭曲,放在任意位置。相应的描述行加到 -info 参数文件中。 -w 和 -h 命令指定纺织物体最小图片 测试图像文件格式为: imageOrderNumber_x_y_width_height.jpg x y width height 是物体坐标,需与训练时背景图不同

性能评估

可以通过 performance 工具评估分类器性能,需要一组标记图像,应用分类输出性能,如检测到的物体、漏检物体、错误个数和其他信息 命令行参数:

-data   <dia-name>  训练的分类器存储目录
-info   <collection-file-name>  测试样本描述文件
-maxSizeDiff    <max-size-diff>
-maxPosDiff     <max-pos-diff>
        指定参考和检测到的矩形一致评判标准,默认分别为1.5和0.3
-sf <scale-factor>  指定参数,默认是1.2
-w  <sample-width>  训练图像大小,必须与训练时一致,使用 haartraining
-h  <sample-height>

参考文献

[1] an exended set of haar-like feature for rapid object detection. [2] an empircal analysis of boosting alogrithms for rapid object with an extend set of haar-like features.