OpenCV 之 HaarTraining 算法剖析

OpenCV 之 HaarTraining 算法剖析

1.引言
通过前段时间阅读 OpenCV 的 HaarTraining 代码,基本掌握了 HaarTraining 算法。现将
其中的算法作一梳理,同时对 HaarTraining 的使用方法做一简要说明。
 HaarTraining 算法总体上以 Friedman, J. H 等人的“Additive Logistic Regression: a
Statistical View of Boosting”为出发点,实现了其中 2 类分类问题的 4 种Boost算法: Discrete
AdaBoost, Real AdaBoost, LogitBoost 和 Gentle AdaBoost。同时实现了文中第 8 节 Additive
Logistic Trees 和第 9 节 Weight Trimming.
 Friedman, J. H等人只描述了如何训练一个强分类器,对于训练级联的强分类器(Cascade
of Classifiers),OpenCV 采用的是 Paul Viola 等人的“Robust Real-Time Face Detection”中所
述方法。
 HaarTraining 采用的是 OpenCV 扩展的Haar特征,具体描述可参考 Rainer Lienhart 等人
的“An Extended Set of Haar-like Features for Rapid Object Detection”。
 
2.总体框架
  要训练一个 Haar分类器,总体上包括 3 步:1)准备正负样本;2)用 CreateSamples 程序
建正样本集;3)用 HaarTraining 程序训练,得到最终的分类器模型(xml 文件) 。
 
 3.  样本准备
 HaarTraining 需要使用正样本和负样本进行训练。下面分别进行描述。
3.1正样本
对于正样本,通常的做法是先把所有正样本裁切好,并对尺寸做规整(即缩放至指定大
小)
 
  由于 HaarTraining 训练时输入的正样本是 vec 文件,所以需要使用 OpenCV 自带的
CreateSamples程序将准备好的正样本转换为 vec文件。转换的步骤如下:
1)  制作一个正样本描述文件,用于描述正样本文件名(包括绝对路径或相对路径) ,
正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:
face_100/face00001.bmp 1 0 0 20 20
face_100/face00002.bmp 1 0 0 20 20
face_100/face00003.bmp 1 0 0 20 20

可采用 Dos命令结合 EditPlus 软件生成样本描述文件。具体方法是在 Dos下的恰当
目录敲入 dir face_100 /b > samples.dat,则会生成一个 samples.dat,里面包含所有正
样本文件名列表,但没有相对路径名和正样本位置信息。在 samples.dat 文件各行行
首增加“face _100/”的方法是使用 EditPlus,先选中所有行,然后按 Tab键为每行
增加一个制表位,然后将制表位全部替换为“face _100/”即可。通过将“bmp”替
换为“bmp 1 0 0 20 20”即可在每行添加“1 0 0 20 20”。
 
2)  运行CreateSamples程序。如果直接在VC环境下运行,可以在Project/Settings/Debug
属性页的 Program arguments栏设置运行参数。下面是一个运行参数示例:
-info F:/FaceDetect/samples.dat -vec F:/FaceDetect/samples.vec -num 200 -w 20 -h 20
表示有 200 个样本,样本宽 20,高 20,正样本描述文件为 samples.dat,结果输出
到 samples.vec。
 
3)  运行完了会生成一个*.vec 的文件。该文件包含正样本数目,宽高以及所有样本图像数据。
 
3.2负样本
  负样本图像可以是不含有正样本模式的任何图像,比如一些风景照等。训练时, OpenCV
需要一个负样本描述文件,该文件只需包含所有负样本的文件名及绝对(或相对)路径名。
以下是一个负样本描述文件内容示例:
 nonface_200/00001.bmp
nonface_200/00002.bmp
nonface_200/00003.bmp
 …
  负样本描述文件的生成方法可参照正样本描述文件生成方法。
 
负样本图像的大小只要不小于正样本就可以,在使用负样本时,OpenCV 自动从负样本
图像中抠出一块和正样本同样大小的区域作为负样本,具体可查看函数
icvGetNextFromBackgroundData() 。具体抠图过程为:
1)  确定抠图区域的左上角坐标(Point.x, Point.y)
2)  确定一个最小缩放比例,使得原负样本图像缩放后恰好包含选中负样本区域
3)  对原负样本图象按计算好的缩放比例进行缩放
4)  在缩放后的图像上抠出负样本, 

4.  训练
  准备好正样本集(即 samples.vec 文件),负样本集及其描述文件后,就可以看是训练了。
从下面的代码中可以看出训练时命令行参数

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值