原文地址:http://blog.youkuaiyun.com/ariesjzj/article/details/8639208
http://blog.youkuaiyun.com/jinzhuojun/article/details/8639208
物体检测方法大体可分为两类,基于知识的方法和基于统计的方法。前者如template matching, surf/sift detector等等。这些方法都基于我们对于识别目标已有比较清晰的刻画。虽然有些特征能抗一定的形变,但总体泛化性不够强。如果检测目标比较固定且对时间要求不高,可以考虑用这类方法。但有些应用是没法提供模板的,或者说模板太多(一一匹配的话检测时间无法接受),又或者说我们需要容忍更大程度或更多样的形变(如人脸,行人等)。这时候就要考虑用基于统计的方法了。既然是基于统计,就得有大量的样本,分类器对这些样本进行学习来获得参数。得到目标分类器后,要进行检测时就很快了。OpenCV中带的Haar特征级联分类器就是这样一种方法,它位于app目录下,该目录下有两个实现,一个是老的实现haartraining,只支持Haar特征。另一个是新的traincascade,支持更多特征(LBP,HOG)和boosted分类器,更易于扩展。除此之外OpenCV的data目录下有很多训练好的级联分类器(如人脸,眼睛检测等),load进来就可以用,无需训练。官方例程中的objectdetection,facedetect等例子就是直接用了这些训练好的分类器,如自带的face detection程序:
当然了,作为有理想有抱负的码农,用现成的分类器是不会满足的。现实使用中我们经常需要训练针对各种应用的分类器。下面介绍如何训练一个自己的级联分类器。整个过程大致可分为以下几步(基于OpenCV 2.4.4):
1. 收集数据
数据可分为正样本和负样本。正样本即要检测的目标,负样本则不包含目标。
首先我们要生成正负样本的索引(或称描述文件)。正样本描述文件官方文档中给了例子:
img/img1.jpg 1 140 100 45 45
img/img2.jpg 2 100 200 50 50 50 30 25 25
依次为文件名,目标个数,目标坐标。既然是基于统计的方法,样本自然要求很多(一般以千为单位),因此很多时候这一步是劳力活。当然,勤劳勇敢的码农们写了各种工具来解放生产力。这