- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
下面描述的目标检测器最初由保罗·维奥拉[280]提出,并由莱纳·连哈特[163]改进。
首先,使用几百个特定对象(例如人脸或汽车)的样本视图(称为正样本),这些样本被缩放到相同大小(比如20x20像素),以及负样本——即相同大小的任意图像,训练一个分类器(具体来说,是一个基于Haar-like特征工作的增强分类器级联)。
训练完分类器后,它可以应用于输入图像中感兴趣区域(与训练时使用的大小相同)。如果该区域可能显示对象(即人脸/汽车),则分类器输出“1”;否则输出“0”。要在整个图像中搜索对象,可以通过在图像上移动搜索窗口并使用分类器检查每个位置。设计分类器以便它可以很容易地“调整大小”,以不同尺寸找到感兴趣的物体,这比调整图像本身的大小更有效。因此,为了在图像中找到未知大小的对象,应该在不同的尺度上多次执行扫描过程。
分类器名称中的“cascade(级联)”一词意味着最终的分类器由几个简单的分类器(阶段)组成,这些分类器依次应用于感兴趣区域,直到候选对象在某个阶段被拒绝或者通过了所有阶段。“boosted(增强)”这个词意味着级联中每个阶段的分类器本身都很复杂,它们是通过四种不同的增强技术之一(加权投票)从基本分类器构建出来的。目前支持的技术有离散Adaboost、实数Adaboost、温和Adaboost和Logitboost。基本分类器是至少有两个叶子的决策树分类器,Haar-like特征作为基本分类器的输入,其计算方式如下所述。当前算法使用以下Haar-like特征:
这段直译解释了基于Haar-like特征的目标检测器的工作原理,包括如何训练这样一个分类器,以及它是如何应用于实际图像中的目标检测任务的。它还介绍了术语“cascade”和“boosted”的含义,以及所涉及的基本分类器类型和技术。请注意,原文提到的具体Haar-like特征列表未在此段落中给出,但通常指的是各种类型的边缘、线和中心对比度等特征。
特定分类器中使用的特征由其形状(1a、2b等)、感兴趣区域内的位置及其尺度指定(需要注意的是,这里的尺度与检测阶段使用的尺度不同,但这两个尺度会相乘)。例如,在第三行特征(2c)的情况下,响应是通过计算覆盖整个特征(包括两个白色条纹和中间的黑色条纹)的矩形下的图像像素之和与黑色条纹下的图像像素之和乘以3之间的差来确定的,这样做是为了补偿不同区域大小上的差异。通过使用积分图像可以快速计算矩形区域上的像素值总和(见下文及积分图描述)。
请参阅相应的教程以获取更多详细信息。
以下参考仅适用于检测部分。还有一个名为opencv_traincascade的独立应用程序,可以从一组样本中训练级联增强分类器。
注意:
在新的C++接口中,除了Haar-like特征外,还可以使用LBP(局部二进制模式)特征。…
[Viola01] Paul Viola 和 Michael J. Jones. Rapid Object Detection using a Boosted Cascade of Simple Features. IEEE CVPR, 2001. 该论文可在线访问于 https://github.com/SvHey/thesis/blob/master/Literature/ObjectDetection/violaJones_CVPR2001.pdf