2013-04-08 37 views
6

因此,我一直在为HoG及其变体编写我自己的代码以处理深度图像。但是,我坚持在检测窗口部分测试训练好的SVM。如何实现更好的滑动窗口算法?

我现在所做的所有事情都是先从原始图像中创建图像金字塔,然后从左上角到右下角运行64x128大小的滑动窗口。

下面是它的视频拍摄:http://youtu.be/3cNFOd7Aigc

现在的问题是,我得到更多的误报比我的预期。

有没有一种方法可以消除所有这些误报(除了使用更多图像进行训练)?到目前为止,我可以从SVM中获得'分数',这是距边距本身的距离。我怎样才能利用我的结果?

有没有人有任何洞察实施一个良好的滑动窗口算法?

回答

7

你可以做的是添加一个处理步骤来查找来自SVM的本地最强的响应。让我解释。

你看起来是被现在在做什么:

每个滑动窗口W,记录category[W] = SVM.hardDecision(W)

硬判决意味着它返回一个布尔值或整数,2类分类的做法写成这样:

hardDecision(W) = bool(softDecision(W) > 0) 

既然你提到OpenCV,在CvSVM::predict您应该将returnDFVal设置为true:

returnDFVal - 指定返回值的类型。如果为真并且问题是2类分类,则该方法返回与边界有符号距离的判定函数值,否则函数返回类标签(分类)或估计函数值(回归)。

the documentation

你可以做的是:

  1. 每个滑动窗口W,每个W,计算记录score[W] = SVM.softDecision(W)
  2. 和记录:
    • neighbors = max(score[W_left], score[W_right], score[W_up], score[W_bottom])
    • local[W] = score[W] > neighbors
    • powerful[W] = score[W] > threshold
  3. 每个W,你有一个正面的,如果local[W] && powerful[W]

由于您的分类将有窗布到你的真阳性,这个想法的积极响应(在空间和/或外观)是记录每个窗口的得分,然后只保留其阳性

  • 是当地最大得分(大于它的邻居) - >local
  • 是足够强大 - >powerful

您可以设置阈值0,并调整它,直到你得到满意的结果。或者你可以使用你的训练集自动校准它。

+0

很好的答案,但如果您或其他人不介意,我还有其他几个问题。如何将它与缩放空间一起使用?我是否将另一个尺度的检测窗口视为另一个邻居? Non Nonimal Suppression如何发挥作用?无论如何,仍然,非常感谢您的明确答案。 – 2013-04-08 10:24:24

+2

关于体重秤的好问题!你确实可以在社区中包含规模(左/右/上/下/更小/更大),但这取决于你的数据和最终目标 - 你是否会得到大量的多尺度误报?不幸的是,反复试验是计算机视觉中最好的实用方法。关于非最大抑制,我所描述的是非最大抑制的一种形式(只保留局部最大值)。 – Antoine 2013-04-08 12:54:27