Rapid Object Detection using a Boosted Cascade of Simple Features 部分翻译
Rapid ObjectDetection using a Boosted Cascade of Simple Features
使用简单特征级联分类器的快速目标检测
注:部分翻译不准处以红色字体给出
https://tony4ai-1251394096.cos.ap-hongkong.myqcloud.com/blog_images/weixingongzhonghao.jpg
翻译,Tony,tony.sheng.tan@gmail.co
摘要:
本文介绍一种机器学习在目标检测中的视觉应用,其能够迅速的处理图像,并能达到一个较高的识别率。这项工作之所以有成就是因为存在以下三个关键特点:第一介绍一种新型的图像表示,我们称之为“积分图像”,其允许我们探测器使用的特征可以快速的计算。第二,是一个基于Adaboost的学习算法,其能从一个大的集合中选择出少量关键的视觉特征,并产生一个及其有效的分类器【5】。第三个贡献是,将一些越来越复杂的分类器连接成一个“级联”(cascade),它能够允许的图像的背景区域迅速被丢弃,而花费更多的计算在有前途的对象地区上。“级联”可以被当看做一个物体明确关注焦点的机制,它不同于以前的方法,来提供丢弃的地区不可能包含感兴趣的对象的统计性保证。在人脸检测领域,该系统产生的检出率媲美于以前最好的系统。在实时应用中,检测器运行为15帧每秒,且不需要图像差分和肤色检测。
Abstract
This paper describes a machine learningapproach for visual object detection which is capable of processing images extremelyrapidly and achieving high detection rates. This work is distinguished by threekey contributions. The first is the introduction of a new image representationcalled the “Integral Image” which allows the features used by our detector tobe computed very quickly. The second is a learning algorithm, based onAdaBoost, which selects a small number of critical visual features from alarger set and yields extremely efficient classifiers[6]. The thirdcontribution is a method for combining increasingly more complex classifiers ina “cascade” which allows background regions of the image to be quicklydiscarded while spending more computation on promising object-like regions. Thecascade can be viewed as an object specific focus-of-attention mechanism whichunlike previous approaches provides statistical guarantees that discardedregions are unlikely to contain the object of interest. In the domain of facedetection the system yields detection rates comparable to the best previoussystems. Used in real-time applications, the detector runs at 15 frames persecond without resorting to image differencing or skin color detection.
1.说明
本文汇集了新的算法和领悟,来建立一种鲁棒,快速的物体检测框架。这个框架被人脸检测任务证明了。为此目的我们建立了一个正面的人脸检测系统,实现检测,并且误报率相当于公布的最好结果【16,12,15,11,1】。这个人脸检测系统在其检测能力方面可以以其非常快的速度区别于以前的系统。在384x288像素的图像上进行操作,人脸以每秒15帧的速度被检测出来,在一个传统奔腾3,700MHz的机器上。在其他人脸检测系统中,需要辅助信息,例如帧差,彩色图像中的像素颜色,已经被用到高帧率检测中。而我们的系统的高帧率只建立在单一的灰度图像信息中。那些其他的辅助信息也可以加入到我们的系统来实现一个更高的检测帧率。
我们的目标检测框架有三个主要的贡献。我们将介绍这些思路简要介绍下然后在随后的章节中详细描述。本文的第一个贡献是一种新的图像表示为积分图像,可以非常快的进行特征计算。思路部分出于Papageorgiou的等人的工作。我们的检测系统不直接在图像强度上进行操作【10】。与这些作者相同我们使用一组特征,这会让人联想到的Haar的基础功能(虽然我们也会使用相关的过滤器,但其比Haar滤波器更复杂)。为了在多尺度能非常迅速的计算这些特征,我们引入对于图象积分图像表示。积分图像可以对每个像素进行少量操作得到。一旦计算完成,这些在任何尺度空间任何位置的类Haar特征中的任意一个可以以常数时间计算完成。
本文的第二贡献是提出构造一个分类器的方法,该方法使用AdaBoost 【6】选择小数量的重要特征来构造分类器。任何图像子窗口内Harr-like特征总的数量是非常大的,远远大于像素数。为了确保快速分类,学习过程必须排除大部分可用的特征,并集中在一个小的关键特征。出于Tieu和Viola的工作,特征选择是通过一个简单的修改AdaBoost的程序实现。弱学习是受约束的因此,每个弱分类器的返回能只依靠单一的特征【2】。作为每个阶段提升(Boosting)处理的结果,其选择一个新的分类器,可以被看作是一个特征选择的过程。AdaBoost算法提供了一种有效的学习算法和泛化性能的强界限【13,9,10】。
本文的第三个主要贡献是一种依次连接一些复杂的分类成级联结构方法,这大大提高了检测器的速度,通过集中注意到图像有希望(为目标)的区域。关注焦点的方法的背后思想是:通常可以迅速确定目标在图像中可能会被发现的位置。进一步更复杂的处理,只保留这些有可能的区域。这种方法注意的关键指标是过程中的“错误判错”(false negative把目标当成非目标)率。其要求是,全部目标(及大部分)必须顺利通过关注滤波器(the attentional filter)。
我们将描述这样一个过程,训练极端例子,和有效的分类器,作为关注操作(attention operator)的监督。术语监督是指关注操作被训练来检测特定类的实例。在人脸检测领域有可能实现少于1%的“错误判错”(false negative把目标当成非目标)率和40%误报率,通过使用两个Harr-like特征构造的分类器。该滤波器的效果是减少了超过一半探测器必须进行计算最终的位置。
没有被初始化滤波器排除的子窗口将会被一系列滤波器处理,每一个滤波器都比前一个更复杂。一旦子窗口被滤波器拒绝,将不会被进一步处理。级联结构识别检测过程本质上是一个退化的决策树,与Geman和其同事的工作有关【1,4】。
一个非常快速的人脸检测器将有广阔的实际应用。这些包括用户界面,图像数据库,和电话会议。在快速帧速率不是必要的应用程序中,我们的系统将允许大量的额外后处理和分析。此外,我们的系统可以在一个广泛的小型低功率器件实现,包括手持设备和嵌入式处理器。在我们的实验室,我们已经在Compaq iPAQ手持设备(该器件具有低功耗200 MIPS的强大ARM处理器,此处理器缺乏浮点运算)上执行这个人脸检测器,并取得了两帧每秒的结果。
在本文的其余部分描述我们的贡献和一些实验结果,包括详细描述我们的实验方法。紧密相关的工作在每节结束的地方。
2.特征
我们的目标检测程序,将图像分类基于简单的特征的值。有很多理由来使我们使用特征值而不是直接使用像素值。最常见的原因就是特征可以进行编码成点对点的结构到领域的知识,这种知识是使用有限数量的训练数据很难学习的。这个系统也有第二个使用特征点关键理由:使用特征的系统将比基于像素的系统更快。被使用的简单的特征会使人联想到Haar为基础的功能(functions),其被Papageorgiou等人在【10】中使用。更具体地说,我们使用三种特征。2-个矩形特征值是两个矩形区域内的像素的总和之间的差。区域具有相同的大小和形状,水平或垂直相邻的(see Figure 1). 3-矩形的特征计算两个外侧矩形的和减去中间矩形的和。最后4-矩形特征计算矩形对角线之间的差。
考虑到探测器的基础分辨率24x24,矩形特征完整的集是相当大的,超过180000。需要注意的是不同于Haar基础算法,矩形特征集是过完备的。
2.1积分图像
矩形特征可以非常迅速地计算使用我们称之为积分图像的中间表示。积分图像在(x,y)处的值为该点左侧和上部所有像素的和,概括为:
其中ii(x,y)为积分图像,i(x,y)为原始图像。使用下面两个方程来再现:
其中表示行的累计和。,,计算积分图像只需要计算一遍原始图像。
利用积分图像通过参考附近四个阵列可以计算任何位置的矩形和(如图2)。两个矩形的差可以通过参考八个阵列来求得。由于2-矩形特征定义上涉及相邻的矩形的和,其可以通过六个相关阵列计算,3-矩形特征需要8个相关阵列,4-矩形特征需要9个。
2.2个特征的探讨
与其他的替代如方向可调滤波器相比,矩形特征有些原始【5,7】。可调滤波器,及其派生,是优秀的边界分析,图像压缩,纹理分析工具。相反矩形特征相当粗糙,虽然其对边缘的存在,条型,和其他简单的图像结构敏感。不同于方向可调滤波器,矩形特征只有唯一可用的的方向,或者是垂直的,或者是水平的,或者是对角线。矩形特征集却提供了丰富的图像表示,并支持有效的学习。与积分图像相结合,矩形特征集的高效率为其有限的灵活性提供了补偿。
3.学习分类功能
给定一个特征集,包括正训练集(目标)和负训练集(非目标),任何数量的机器学习的方法,可以用来学习一个分类函数。在我们的系统中,一个变种AdaBoost是同时用来选择一个小特点集合和训练分类器的【6】。Adaboost的最初形式,是提升一些简单的学习算法(有时称为弱学习算法)的分类性能。还有由AdaBoost学习程序提供一些正式保障(formal guarantees),Freund和Schapire证明各级的强分类器的训练误差以指数级的速度趋于零。更重要的是一些结果后来被证明具有泛化性能【14】。关键的发现是,泛化性能和样本的边缘有关,并且AdaBoost实现了大幅度的提速。
上面提到,与每个图像子窗口关联的矩形特征有超过180000个,远大于像素数。尽管每个功能可以非常有效地计算,但一套完整的计算是耗时的。我们由实验总结出的假设是,这些特征中的一小部分就能够形成一个有效的分类器。而我们的最大挑战就是找到这一小部分特征。为了实现这一目标,弱学习算法的设计来选择单一的矩形特征,这个特征能够最好的分离的正负样本(这是类似于图像数据库检索领域的方法【2】)。对于每一个特征,弱学习器确定最优的阈值分类功能,以最小化样本的错误分类数量。若分类器包含一个特征,一个阈值,和一个正负校验来指示不等式方向:
这里使用一个24x24的图像子窗口,表格1中显示了提升过程。
在实践中,没有一个单一的特征可以在较低的错误率的前提下进行分类的任务。在提升过程中,最初几轮的特征选择错误率为0.1到0.3。在后几轮的特征选择时,由于其任务难度加大,错误率为0.4到0.5 。
3.1学习讨论
许多普通特征选择程序已经被提出( 【18】中第8章综述)。我们最终的应用要求有一个激进的丢弃的绝大多数特征的方法。一个类似的识别问题,由Papageorgiou等人提出,他们提出了使用特征方差来选择特征的方案【10】。从1734个特征中选择37个特征的,其表现出了良好的效果。
Roth等人提出了一种基于Winnow指数感知器学习规则的特征选择过程【11】。Winnow学习过程收敛到一个许多这些权重为零的解。然而,大量的特征被保留(也许几百或者几千)。
3.2学习结果
虽然关于训练的细节和最终系统的表现在第五部分描述,单几个简单的结果是值得探讨的。实验结果表明,由200个特征组成的正面人脸分类器识别率为95%,错检率为1%,在14084个图像中。这些结果是令人信服的,但没有在真实情况下进行测试。在计算方面,该分类器可能比任何其他已发表的系统更快,需要0.7秒扫描一个384×288像素的图像。不幸的是,提高检测性能的最简单的方法,即添加新的特征到分类器,却直接增加了计算时间。用于人脸检测的任务,选择的AdaBoost的初始矩形特征是有意义的和容易理解的。第一个特征选择似乎强制放在这样一些特征,比如位置的眼睛往往比鼻子和脸颊区域深(见图3)。这种特征在检测子窗口相比相对较大,并且这种特征对人脸的大小和位置不敏感。第二特征选择的依赖于属性眼睛比鼻梁暗。
4.级联的注意事项
本节描述了构建一个级联分类器的算法,达到提高检测性能的同时,从根本上减少计算时间。关键关注点是较小的,然而更有效的提升分类器可以被构成,这种分类器能拒绝很多非目标子窗口,同时检测出几乎所有的目标。(例如:提升分类器的阈值可以进行调整,使误检率接近于零。)简单的分类器被用来去掉大多数非目标子窗口。而在被接受之后,更复杂的分类器将被调用来达低的误报率(false positive rates)。在检测过程中的整体形态是一个退化的决策树,我们所说的“瀑布(cascade)”(见图4)第一个分类器获得一个正样本检测结果,触发第二个分类器一个评估结果,第二个分类器也被调整,以得出高检测率。从第二个分类器检测为正样本的继续触发第三个分类器,以此类推。任何一个判断为非目标的将使子窗口马上被拒绝。级联阶段通过使用AdaBoost训练分类器来组成,然后调整阈值是漏报率最小。注意,默认的AdaBoost阈值的设计目的是训练集上产生低的错误率。一般来说一个较低的阈值产生较高的检测率和误报率高。例如,一个出色的一级分类器可以从一个2-特征的强分类器的构建,通过降低阈值来减少漏报率。对训练集进行验证,可以调节阈值使其检测通过100%的人脸和40%非人脸。图3描述了对两种特征进行分类。
这两个特征分类器使用总计约60个微处理器的指令的计算量。似乎很难想象,任何其他简单的滤波器可以实现如此高的拒绝率。通过比较在每个子窗口扫描一个简单的形象的模板,或一个单层感知器,将需要至少20倍的操作。
级联的结构反映了一个事实,任一单一的图像子窗口内的绝大多数是非目标的。因此级连结构试图尽可能早的拒绝尽可能多的非目标部分。当一个真正的目标进入级联结构,将会触发每一层分类器的正结果,这将极其罕见。
就像一个决策树,随后的分类器使用这些通过之前的所有阶段的例子来进行训练。结果是,第二分类器面临一个比前一个分类器更艰巨的任务。通过第一个分类器的例子将比典型的例子更加困难。更深层的分类器面临的更困难的例子,推动整体ROC曲线向下。在一个给定的检出率的情况下,更深层次的分类器有较高的误报率。
4.1训练的级联分类器
级联的训练过程中,涉及到两种类型的权衡。在大多数情况下分类器使用更多的特征将达到较高的检测率和较低的误报率。同时,使用更多特征的分类器将会产生更多的计算量,在原则上可以定义为一个优化框架:
i) 分类器的级数。
ii) 每级中使用特征的数量。
iii) 每级的阈值。
以尽量减少特征的预期数量。不幸的是,找到最佳的是一个非常困难的问题。
在实践中,一个非常简单的框架是用来产生一种高效的分类器是。级联中的每个阶段降低了误报率但降低了检测率。判断为正目标是需要一个较高的识别率和较低的误报率。每个阶段的训练通过添加特征直到目标的检测和误报率满足要求(这些比率是在验证集检测器检测确定)。添加级联分类器的级数,直到误检率和检出率达到标准。
4.2检测器级联的讨论
完整的人脸检测的有38个阶段,超过6000的特征。不过级联结构产生了快速的平均检测时间。在一个困难的数据集,包含507个面和75000000个子窗口,人脸脸使用10的特征,人脸被检测出来,每个子窗口使用平均10个特征评价(feature evaluations)。相比较而言,该系统比Rowley等【12】构建的检测系统实现快15倍。
与级联类似的概念在人脸检测系统中出现是由Rowley等人提出的,其使用了两个探测器网络【12】。Rowley等人用更快的但不精确的网络进行预审来找到可能为人脸的区域,再用慢的,但是精确的网络进行处理。尽管难以准确确认,但Rowley等人的双网络人脸系统在已知人脸检测器中最快的。
级联结构检测处理本质上是退化的决策树。Amit和Geman提出的相关理论也是如此。不同于使用固定的检测器的技术,Amit和Geman提出另一种观点,在简单图像共同出现的不同寻常的特征被用来触发一个更复杂的检测进行评价。这样完整的检测过程中不需要在许多潜在位置和尺度的图像进行评价。而这一基本观点是非常有价值的,在他们的实施中首先必须在每个位置进行一些特征检测器的评估。这些特征将被分组,来找到“不同寻常”的出现。在实践中,由于我们的探测器的形式和功能,使得其非常有效,我们的探测器的摊销成本在每个尺度和位置的评估远远快于基于图像的边缘寻找和分组。
的误报。
Rapid Object Detection using a Boosted Cascade of Simple Features 部分翻译的更多相关文章
- Viola–Jones object detection framework--Rapid Object Detection using a Boosted Cascade of Simple Features中文翻译 及 matlab实现(见文末链接)
ACCEPTED CONFERENCE ON COMPUTER VISION AND PATTERN RECOGNITION 2001 Rapid Object Detection using a B ...
- Object Detection: Face Detection using Haar Cascades
目录 利用基于Haar特征的级联分类器实现人脸检测:官方教程 目标 学习基于Haar特征的级联分类器(Cascade Callifiers)实现人脸检测: 扩展到人眼检测: 基础知识 Paul V ...
- 目标检测 | 经典算法 Cascade R-CNN: Delving into High Quality Object Detection
作者从detector的overfitting at training/quality mismatch at inference问题入手,提出了基于multi-stage的Cascade R-CNN ...
- (转)Awesome Object Detection
Awesome Object Detection 2018-08-10 09:30:40 This blog is copied from: https://github.com/amusi/awes ...
- Object Detection︱RCNN、faster-RCNN框架的浅读与延伸内容笔记
一.RCNN,fast-RCNN.faster-RCNN进化史 本节由CDA深度学习课堂,唐宇迪老师教课,非常感谢唐老师课程中的论文解读,很有帮助. . 1.Selective search 如何寻找 ...
- 论文阅读笔记五十三:Libra R-CNN: Towards Balanced Learning for Object Detection(CVPR2019)
论文原址:https://arxiv.org/pdf/1904.02701.pdf github:https://github.com/OceanPang/Libra_R-CNN 摘要 相比模型的结构 ...
- 论文阅读笔记五十二:CornerNet-Lite: Efficient Keypoint Based Object Detection(CVPR2019)
论文原址:https://arxiv.org/pdf/1904.08900.pdf github:https://github.com/princeton-vl/CornerNet-Lite 摘要 基 ...
- 论文阅读笔记五十一:CenterNet: Keypoint Triplets for Object Detection(CVPR2019)
论文链接:https://arxiv.org/abs/1904.08189 github:https://github.com/Duankaiwen/CenterNet 摘要 目标检测中,基于关键点的 ...
- 论文阅读笔记四十八:Bounding Box Regression with Uncertainty for Accurate Object Detection(CVPR2019)
论文原址:https://arxiv.org/pdf/1809.08545.pdf github:https://github.com/yihui-he/KL-Loss 摘要 大规模的目标检测数据集在 ...
随机推荐
- Python基础 第三章 使用字符串(1)精简版
所有标准序列操作(索引,切片,乘法,成员资格检查,长度,最小值,最大值)都适于字符串. 但,字符串是不可变得,故所有得元素赋值和切片赋值都是非法的. 1. %s 转换说明符 设置字符串格式 %左边指定 ...
- opencv实现人脸识别(三) 训练图片模块
现在我们已经拍好了需要训练的图片,接下来就是进行训练 流程图: 我们在这里用到了numpy库,NumPy是一个功能强大的Python库,主要用于对多维数组执行计算. 使用numpy的目的是减少pyth ...
- django API返回中文乱码
renturn HttpResponse(json.dumps(data,ensure_ascii=False))
- 图像识别tesseract-ocr
下载地址 https://github.com/tesseract-ocr/tesseract/wiki/Data-Files. https://github.com/tesseract-ocr/te ...
- WebStorm使用码云插件问题
由于项目需求,需要在WebStorm中使用码云插件,在下载安装的过程中出现一系列的问题,现总结出现的问题和解决方法. 先说一下码云是什么?码云有什么作用? 码云的主要功能: 码云除了提供最基础的 Gi ...
- [转载]PyTorch上的contiguous
[转载]PyTorch上的contiguous 来源:https://zhuanlan.zhihu.com/p/64551412 这篇文章写的非常好,我这里就不复制粘贴了,有兴趣的同学可以去看原文,我 ...
- DSN 建立达梦7(DM)连接
(DSN)Data Source Name 数据源名称 “ODBC数据源管理器”提供了三种DSN,分别为用户DSN.系统DSN和文件DSN.其中: 用户DSN会把相应的配置信息保存在Wind ...
- C# 关键字 virtual、override和new的用法
代码如下: class A { public void foo() { Console.WriteLine("A::foo()"); } public virtual void b ...
- C语言——指针总结
在创建指针时,我们首先要做的是先初始化它,没有初始化的指针是很危险的,因为指针可以指向一个地址后直接改变它的值,所以为了避免我们的指针在创建后指向一个危险区域(即可能指向系统文件等),我们会先给它一个 ...
- 9.动态SQL
动态 SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查 询条件进行查询. 提交的查询条件不同,执行的 SQL 语句不同.若将每种可能的情况均逐一 列出,对所有条件进行排列组合 ...