对于级联分类器(使用类似哈尔的功能),我总是会读到像AdaBoosting这样的方法用于选择“最佳”功能进行检测。但是,只有在有一些初始功能开始提升时,这才有效。
鉴于24x24像素图像,有162,336种可能的haar功能。我可能在这里错了,但我不认为像openCV这样的库最初会测试所有这些功能。
所以我的问题是如何选择初始功能或如何生成它们?有关最初功能数量的指南吗?
如果最初使用所有162,336个功能。它们是如何产生的?
答案 0 :(得分:5)
根据您的问题,我能够理解您想知道什么是1,62,336个功能。
来自4个原始中提琴功能(http://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework)
我们可以通过改变4个原始特征的大小及其在24 * 24输入图像上的位置来生成1,62,336个特征。
例如,考虑原始特征之一,其具有彼此相邻的两个矩形。 让我们考虑每个矩形的大小是1个像素。最初,如果在24 * 24图像的(0,0)上存在一个矩形,则将其视为一个特征&现在如果你将它水平移动一个像素(到(1,0)),那么它被认为是第二个特征,因为它的位置变为(1,0)。通过这种方式,你可以将它水平移动到(22,0),产生23个特征。同样,如果沿垂直轴从(0,0)向上移动到(0,23),那么你可以生成24个特征。现在,如果您移动覆盖每个位置的图像(例如(1,1),(1,2).....(22,23)),那么您可以生成24 * 23 = 552个特征。
现在,如果我们考虑每个矩形的宽度是2个像素,高度是1个像素。最初如果在(0,0)上存在一个矩形并且如上所述沿水平轴移动到(20,0)那么我们可以具有21个特征,因为如果我们沿着垂直轴从(0, 0)到(0,23)我们可以有24个功能。因此,如果我们移动以覆盖图像上的每个位置,那么我们可以具有24 * 21 = 504个特征。
这样,如果我们将每个矩形的宽度增加一个像素,每次覆盖完整图像时保持每个矩形的高度为1个像素,那么它的宽度从1个像素变为24个像素,我们得不到。特征= 24 *(23 + 21 + 19 ..... 3 + 1)
现在,如果我们考虑每个矩形的宽度是1像素,高度是2像素。最初如果在(0,0)上存在一个矩形并且沿着水平轴移动到(23,0)那么我们可以有23个特征,因为它的宽度是1个像素,因为如果我们沿着垂直轴移动它的高度是2个像素从(0,0)到(0,22)然后我们可以有23个功能。因此,如果我们移动以覆盖图像上的每个位置,那么我们可以具有23 * 23 = 529个特征。
类似地,如果我们将每个矩形的宽度增加一个像素,每次覆盖完整图像时将每个矩形的高度保持为2个像素,那么它的宽度从1个像素变为24个像素,我们得不到。特征= 23 *(23 + 21 + 19 ..... 3 + 1)
现在,如果我们在将每个矩形的宽度从1个像素改为24个像素之后将每个矩形的高度增加1个像素,直到每个矩形的高度变为24个像素,那么
没有。特征= 24 *(23 + 21 + 19 ..... 3 + 1)+ 23 *(23 + 21 + 19 ..... 3 + 1)+ 22 *(23 + 21 + 19 ...... ..3 + 1)+ ................. + 2 *(23 + 21 + 19 ..... 3 + 1)+ 1 *(23 + 21 + 19 ..... 3 + 1)
= 43,200 features
现在,如果我们考虑第二个中提琴琼斯原始特征,其中有两个矩形,其中一个矩形高于其他矩形(即矩形垂直排列),因为这类似于第一中提琴的原始特征,它也将具有
没有。功能= 43,400
同样地,如果我们按照上述过程,从第3个原始中提琴琼斯特征,其中有3个沿水平方向排列的矩形,我们得到
没有。特征= 24 *(22 + 19 + 16 + .... + 4 + 1)+ 23 *(22 + 19 + 16 + .... + 4 + 1)+ 22 *(22 + 19 + 16 + .... + 4 + 1)+ ................ + 2 *(22 + 19 + 16 + .... + 4 + 1)+ 1 *(22 + 19 + 16 + ... + 4 + 1)
=27,600
现在,如果我们考虑另一个有3个垂直排列的矩形(即一个矩形在另一个上),那么我们得到
没有。功能= 27,600(因为它类似于第3原始中提琴琼斯功能)
最后,如果我们考虑具有4个矩形的第4个原始中提琴琼斯特征,我们得到
no.of features = 23 *(23 + 21 + 19 + ...... 3 + 1)+ 21 *(23 + 21 + 19 + ...... 3 + 1)+ 19 * (23 + 21 + 19 + ...... 3 + 1).................. + 3 *(23 + 21 + 19 + ..... .3 + 1)+ 1 *(23 + 21 + 19 + ...... 3 + 1)
= 20,736
现在我们总结所有这些功能= 43,400 + 43,400 + 27,600 + 27,600 + 20,736
= 1,62,336 features
因此,从大约1,62,336个特征中,Adaboost选择其中一些特征来形成强大的分类器。
答案 1 :(得分:2)
我认为,你对Viola / Jones'original work的这个主题很熟悉。
首先手动选择要素类型(例如矩形A)。这为您提供了一个面具,您可以使用它来训练您的弱分类器。为了避免逐个像素地移动掩模并重新训练(这将花费大量时间而不是更好的精度),您可以指定特征在每个训练的弱分类器的x和y方向上移动了多少。跳转的大小取决于您的数据大小。目标是使掩模能够移入和移出检测到的对象。特征的大小也可以变化。
在您使用相应的功能(即面具位置)训练多个分类器后,您可以照常进行AdaBoost和Cascade训练。
特征/弱分类器的数量在很大程度上取决于您的数据和实验设置(即您使用的分类器的类型)。您需要可扩展地测试参数以了解哪种类型的功能最佳(矩形/圆形/类似于tetris的对象等)。我在2年前做过这个工作,花了很长时间来评估哪些功能和特征生成 - 启发式产生了最好的结果。
如果你想从某个地方开始,只需取4个原始的Viola / Jones特征中的一个并训练一个分类器应用它锚定到(0,0)。用(x,0)训练下一个分类器。下一个是(2x,0)....(0,y),(0,2y),(0,4y),..(x,y),(x,2y)等...... 看看会发生什么。很可能你会发现可以使用较弱的分类器,即你可以继续增加x / y步长值来确定掩码的滑动方式。你也可以让面具成长或做其他事情来节省时间。这个“懒惰”特征生成工作的原因是AdaBoost:只要这些特征使分类器略好于随机,AdaBoost就会将这些分类器组合成一个有意义的分类器。
答案 2 :(得分:0)
我想指出2015年2月发表的关于这一主题的最新着作。工作是:
CésarCobos-May,VíctorUc-Cetina,Carlos Brito-Loeza和Anabel Martin-Gonzalez,一种基于凸集的自动算法 生成Haar-Like功能,Comput。科学。 Appl.Volume 2,Number 2, pp.64-70,2015。
它被展示为“朝向类Haar特征设计自动化的第一步”。
提出了一种算法,该算法应该能够在给定表示需要检测的对象的分割图像的情况下“提取”类Haar特征。基本思想在于尝试找到完全包含在凸区域中的最大区域矩形。
首先,使用K均值算法(K = 2)选择并处理感兴趣对象的代表图像。然后,将得到的分割图像输入算法,找到分割图像中每个(一些?)凸区域的最大矩形,以获得最终特征。
实际上,引用论文:
稍后 [分割后] ,我们的方法自动创建 模板 [类Haar特征] 被应用于区域 分段图像。
所以,如果我没有弄错的话,仍然必须采取一些主观决策来衡量分割图像的哪些区域被选为算法的输入。
请注意,以这种方式获得的功能往往比传统功能稍微复杂一些。
该方法在针对传统特征的特定案例研究中进行了测试,给出了看似良好的结果。
答案 3 :(得分:0)
在我看来,这里有一点混乱
即使是接受的答案对我来说也不正确(也许我说得不好)。
原始的Viola-Jones算法,作为Lienhart-Maydt算法的主要后期改进,以及Opencv实现,所有这些算法依次评估特征集的每个特征。
您可以查看Opencv的source code(以及您喜欢的任何实现)
函数void CvHaarEvaluator :: generateFeatures()的末尾有numFeatures,BASIC模式只有162,336,大小为24x24。
当所有功能集以featureEvaluator(source)的形式提供时,所有这些功能都会被轮流检查:
bool isStageTrained = tempStage->train( (CvFeatureEvaluator*)featureEvaluator, curNumSamples,
_precalcValBufSize, _precalcIdxBufSize, *((CvCascadeBoostParams*)stageParams) );
通过检查每个特征并选择在该点产生最佳结果的特征来构造每个弱分类器(在决策树的情况下,过程类似)。
在该选择之后,相应地改变样本的权重,使得在下一轮中将再次选择来自所有特征集的不同特征。
单个特征评估在计算上很便宜,但乘以numFeatures可能要求很高
级联的整个培训可能需要数周时间,但瓶颈不是特征评估过程,而是最新阶段的负面样本采集。
从您提供的维基百科链接中我读到:
在标准的24x24像素子窗口中,总共有M = 162,336 可能的功能,评估成本过高 在测试图像时都是这些。
不要被误导,这意味着比长时间的训练过程后你的检测算法应该非常快,只需要检查一些功能(只是训练期间选择的功能)。