定向梯度直方图与目标检测(翻译)
原文链接:Histogram of Oriented Gradients and Object Detection - PyImageSearch
https://www.pyimagesearch.com/2014/11/10/histogram-oriented-gradients-object-detection/
定向梯度直方图与目标检测
by Adrian Rosebrock on November 10, 2014 in Machine Learning, Tutorials
如果你关注我新近的Twitter帐户,你可能注意到我正在研究的一、两个问题 –- 一个Python 框架/包,用于快速构成目标检测器,其中采用定向梯度直方图(Histogram of Oriented Gradients)和线性支持向量机(Linear Support Vector Machines)。
老实说,我真的不能忍受由OpenCV提供的Haar级联分类器(即Viola-Jones检测器) -- 这就是为什么我要在自己的分类器上工作。虽然级联方法非常快,但它存在许多值得期待的东西。如果你已经用过OpenCV对于检测脸部方面的工作,你应当确切知道我在说什么。
图1:错误检测到一幅图象中一个面孔的实例。这是利用cv2.detectMultiScale的普遍问题。
为了在OpenCV中检测面孔/人/对象/其它什么(以及删除假阳性),你会花费大量时间对cv2.detectMultiScale 进行参数微调。同时并不能担保从图象到图象会有准确相同的工作参数。这样对于面部检测要做批处理大数据集是非常乏味的工作,因为你要非常关注(1)错误的面孔检测或(2)完全丢失面孔,原因很简单,在每个图象中的参数选择都很差。
还有个问题是Viola-Jones检测器存在近15年了。如果这个检测器是一瓶Cabernet Sauvignon美酒,现在我会为之振奋。然而在那以后这个领域有了巨大进步。在2001年时期Viola-Jones检测器是顶尖技术,它肯定是其后今天我们在目标检测领域新的进步的巨大推动力。
现在,Viola-Jones检测器不是我们在目标检测器方面的唯一选择。我们可以利用关键点,局部不变量描述,以及视频字模型包。
我们拥有定向梯度直方图。我们有了可变形的部件模型,标本模型。而且现在我们应用深度学习,以金字塔去认知不同大小的目标!
所有这一切表明,即便定向梯度直方图描述器用于目标认知虽然接近十年时间,但至今仍在大量应用 –- 拥有极好的效果。定向梯度直方图方法是由Dalal 和 Triggs在他们的有创意的2005论文 Histogram of Oriented Gradients for Human Detection 中提出,文中展示定向梯度直方图(HOG)以及Linear Support Vector Machine (SVM)能够用于培训高精度目标分类 –- 或者在他们的部分研究中,做人的检测器。
定向梯度直方图与目标检测
我不打算评述有关利用定向梯度直方图训练目标检测器的所有细节,就是因为每步都是相当详细。
但是我想花一分钟讨论关于用定向梯度直方图训练一个目标器的通用算法。大概是这样:
从你想要检测的目标(一个或多个)的训练数据中抽取P个阳性样本,并从这些样本中抽取HOG描述语。
Sample N negative samples from a negative training set that does not contain any of the objects you want to detect and extract HOG descriptors from these samples as well. In practice N >> P.
在不包含任何你想要检测和提取HOG描述语的目标中,从阴性训练组中提取N个阴性样本,实际上 N >> P。
在你的阳性和阴性样品中训练Linear Support Vector Machine。
图2:滑动窗口方法示例,这里从左到右和从上到下滑动一个窗口。注:这里只显示单一尺寸。实际上此窗口将运用到多个尺寸图象。
Apply hard-negative mining. For each image and each possible scale of each image in your negative training set, apply the sliding window technique and slide your window across the image. At each window compute your HOG descriptors and apply your classifier. If your classifier (incorrectly) classifies a given window as an object (and it will, there will absolutely be false-positives), record the feature vector associated with the false-positive patch along with the probability of the classification. This approach is called hard-negative mining.
施加难分阴性样本挖掘。在你的阴性训练组中,对于每个图象以及每个图象可能的尺寸大小,施加滑动窗口技术,并且滑动你的窗口通过图象。在每个窗口上计算你的HOG描述语,施加分类。要是你的分类(不正确的)认为一个窗口是目标(绝对是假阳性)。记录此假阳性碎片的特征向量,同时记录分类概率。这种方法叫做施加难分阴性样本挖掘。
取在难分阴性样本挖掘阶段找到的假阳性样本,将它们按它们的信任度(即概率)排序,并利用这些难分阴性样本挖掘重新训练你的分类器。(注:你可以反复运用4-5步,但实际上一个难分阴性样本阶段就够了[也不总是]。在随后的难分阴性样本挖掘中精度提高是很少的)。
现在你的分类器得到训练,并能够应用到你的检测数据集。又,正如步骤4一样,对于你的测试集中的每幅图象以及图象的各种大小,应用滑动窗口技术。在每个窗口中抽取HOG描述信息块并运用你的分类器。如果你的分类器以足够在的概率检测一个目标,记录窗口的边界框。在你完成图象扫描后,运用非极大抑制去删除冗余和重复边界框。
这些是最小步骤要求,但通过利用这6步过程,你应当可以训练和构筑你自己的目标检测分类器!这种方法的扩展包括deformable parts model 和Exemplar SVMs,在那里,你训练每个正的实例,而不是收集它们。
然而,如果你在图象目标检测方面工作,你可能会遇到要检测多个边界框的问题,当然这些边界框是围绕在你想要在图象中进行检测的目标周围。
这里是重叠边界框问题的例子:
图3:(左)检测到多个相叠加的围绕在我们要检测的面孔上的边界框。(右)应用非最大抑制移除冗余边界框。
Notice on the left we have 6 overlapping bounding boxes that have correctly detected Audrey Hepburn’s face. However, these 6 bounding boxes all refer to the same face — we need a method to suppress the 5 smallest bounding boxes in the region, keeping only the largest one, as seen on the right.
This is a common problem, no matter if you are using the Viola-Jones based method or following the Dalal-Triggs paper.
注意左图上有6个相叠加的边界框,均正确地检测到Audrey Hepburn的面孔。然而,这6个边界框都涉及到同一张面孔 --- 我们需要一种方法去废除5个最小的区域上的边界框,保持最大一个,在右图中看到。
这是一个共性问题,无论你利用基于Viola-Jones的方法还是按照Dalal-Triggs论文。
There are multiple ways to remedy this problem. Triggs et al. suggests to use the Mean-Shift algorithm to detect multiple modes in the bounding box space by utilizing the (x, y) coordinates of the bounding box as well as the logarithm of the current scale of the image.
有许多方法去补救这个问题。Triggs等人建议用 Mean-Shift algorithm(均值偏移算法)去检测处于边界框空间内中的多个模型,这时要利用边界框的(x, y) 坐标以及此图象当前尺寸的对数。
我尝试过这一方法,对(x, y) 结果不满意。作为替代,你最好依赖一个更强大的带有更高精度(意味着有很少的假阳性)分类器,并施加非最大抑制到边界框。
我花了一些时间寻找一个好的Python中的非最大抑制(有时叫做非最大化抑制)的实现。在我找不到的时候,我跟我的朋友 Dr. Tomasz Malisiewicz闲谈,他的全部职业生涯就是从事目标检测算法和HOG信息描述。我认识的人中没有一个人的这方面的经验能与Tomasz相比。如果你读过任何他的论文,你就会知道为什么他的工作是了不起的。
无论如何,在与他闲聊之后,他向我指出两个MATLAB实现。第一个是在Felzenszwalb 等人工作的基础上,以及他们的可变形的部件模型。第二个是由Tomasz本人在他的Exemplar SVM项目中实现,也即他在他的学术论文和他的ICCV 2011 论文Ensemble of Exemplar-SVMs for Object Detection and Beyond中用到。特别重要的是应当看到Tomasz方法较 Felzenszwalb 等人的方法要快100倍。当你百万次执行非最大抑制功能时,100倍加速太重要了。我实现过 Felzenszwalb等人的方法,也实现过Tomasz等的方法,并从MATLAB将它们移置到Python。
下周我将讨论 Felzenszwalb方法,接下去我会涉及Tomasz方法。虽然Tomasz方法是相当快,我认为重要的是看到两种操作,从而我们可以很好的理解为什么他的方法是如此的快。
请确保留住并检验此帖子!这里是构筑你自己的目标检测器的关键步骤!
总结
在本博客文章中,我们涉及了一些有关目标检测器的历史课程。我们还偷偷看了一下我正在从事的图象目标检测方面的Python框架。
从这里,我们快速地讨论了定向梯度直方图与Linear SVM是怎样相结合,用来训练一台粗浅的目标检测器的。
当然,无论你采用什么方法实现目标检测,你会喜欢围绕你想要检测的目标不会出现多个边界框。为了删除那些冗余框子,你需要应用非最大抑制。
今后两周时间我将告诉你非最大抑制的两种操作,你可以用在你自己的检测项目中。
请将你的邮箱地址填入下表,以便博客发布后你能收到公告!非最大抑制对HOG系统获得精确而又强大的目标检测系统是十分重要的,你肯定不想失去这些博客!