如何实现更好的滑动窗口算法?

6

我一直在编写自己的代码,使HoG及其变体能够与深度图像配合使用。但是,在测试训练好的SVM中的检测窗口部分时,我遇到了困难。

目前为止,我所做的一切都是先从原始图像创建图像金字塔,然后从左上角到右下角运行一个64x128大小的滑动窗口。

以下是一个视频演示:http://youtu.be/3cNFOd7Aigc

现在的问题是,我得到的假阳性比我预期的要多。

除了使用更多的图像进行训练外,是否有办法可以消除所有这些假阳性?到目前为止,我可以获得SVM的“分数”,即与边界距离。我如何利用它来提高我的结果?

是否有人了解实现良好的滑动窗口算法的见解?

1个回答

8
你可以添加一个处理步骤来查找SVM中的最强本地响应。让我解释一下。
你现在似乎正在做的事情是:
对于每个滑动窗口W,记录category[W] = SVM.hardDecision(W)
硬决策意味着它返回一个布尔值或整数,并且对于二分类问题可以写成这样:
hardDecision(W) = bool( softDecision(W) > 0 )

由于您提到了OpenCV,在CvSVM::predict中,您应该将returnDFVal设置为true:

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

来自文档

您可以这样做:

对于每个滑动窗口W,记录score[W] = SVM.softDecision(W)。 对于每个W,计算并记录:
  • neighbors = max(score[W_left], score[W_right], score[W_up], score[W_bottom])
  • local[W] = score[W] > neighbors
  • powerful[W] = score[W] > threshold
对于每个W,如果local[W] && powerful[W],则为正面。 由于分类器对于与真正的正面相似的窗口(在空间和/或外观上)会有一个正面反应,因此想法是记录每个窗口的分数,然后仅保留以下正面:
  • 是局部最大分数(大于其邻居)- > local
  • 足够强 - > powerful
您可以将阈值设置为0,并进行调整,直到获得令人满意的结果。 或者您可以使用训练集自动校准它。

很棒的回答,但是我还有几个问题,如果你或者其他人不介意的话。我如何与尺度空间一起使用它?在另一个尺度中处理检测到的窗口时,我是否将其视为另一个邻居?非极大值抑制又如何发挥作用?无论如何,还是非常感谢你清晰的回答。 - sub_o
2
关于比例尺的好问题!您确实可以在邻域(左/右/上/下/较小/较大)中包含比例尺,但这在很大程度上取决于您的数据和最终目标 - 您是否会得到许多多尺度的假阳性?不幸的是,在计算机视觉中试错法是最佳的实用方法论。关于非极大值抑制,我所描述的就是一种非极大值抑制形式(您只保留局部最大值)。 - Antoine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接