如何用
OpenCV
训练自己的分类器
2009-09-04 22:15
最近要做一个性别识别的项目,在人脸检测与五官定位上我采用
OPENCV
的
haartraining
进行定位,
这里介绍下这两天我学习的如何用
opencv
训练自己的
分类器。在这两天的学习里,我遇到了不少问题,不过我遇到了几
个好心的大
侠帮我解决了不少问题,特别是无忌,在这里我再次感谢他的帮助。
一、简介
目标检测方法最初由
Paul Viola [Viola01]
提出,并由
Rainer Lienhart
[Lienhart02]
对这一方法进行了改善。该方法的基本步骤为:
首先,利用样本
(大约几百幅样本图片)的
harr
特征进行分类器训练,得到一个级联的
boosted
分类器。
分类器中的
"
级联
"
是指最终的分类器是由几个简单分类器级联组成。
在图像检测
中,被检窗口依次通过每一级分类器,
这样在前面几层的检测中大部分的候选
区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。
分类器训练完以后,
就可以应用于输入图像中的感兴趣区域的检测。
检测到目标
区域分类器输出为
1
,否则输出为
0
。为了检测整副图像,可以在图像中移动搜
索窗
口,检测每一个位置来确定可能的目标。
为了搜索不同大小的目标物体,
分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。
所以,为了在图像中检测未知大小的目标物体,扫描
程序通常需要用不同比例
大小的搜索窗口对图片进行几次扫描。
目前支持这种分类器的
boosting
技术有四种:
Discrete Adaboost, Real
Adaboost, Gentle Adaboost and Logitboost
。
"boosted"
即指级联分类器的每一层都可以从中选取一个
boosting
算法
(
权重
投票
)
,并利用基础分类器的自我训练得到。
根据上面的分析,目标检测分为三个步骤:
1
、
样本的创建
2
、
训练分类器
3
、
利用训练好的分类器进行目标检测。
二、样本创建
训练样本分为正例样本和反例样本,
其中正例样本是指待检目标样本,
反例样本
指其它任意图片。
负样本
负样本可以来自于任意的图片,
但这些图片不能包含目标特征。
负样本由背景描
述文件来描述。
背景描述文件是一个文本文件,
每一行包含了一个负样本图片的
文件
名(基于描述文件的相对路径)。该文件创建方法如下:
采用
Dos
命令生成样本描述文件。具体方法是在
Dos
下的进入你的图片目录,
比如我
的图片放在
D:\face\posdata
下,则:
按
Ctrl+R
打开
Windows
运行程序,输入
cmd
打开
DOS
命令窗口,输入
d:
回车,
再输入
cd D:\face\negdata
进入图片路径,再次输入
dir /b > negdata.dat
,
则会图片路径下生成一个
negdata.dat
文件,打开该文件将最后一行的