如何实现更好的滑动窗口算法?
Posted
技术标签:
【中文标题】如何实现更好的滑动窗口算法?【英文标题】:How to implement a better sliding window algorithm? 【发布时间】:2013-03-30 06:14:37 【问题描述】:所以我一直在为 HoG 及其变体编写自己的代码来处理深度图像。但是,我坚持在检测窗口部分测试我训练有素的 SVM。
我现在所做的只是首先从原始图像创建图像金字塔,然后从左上角到右下角运行一个 64x128 大小的滑动窗口。
这是它的视频截图:http://youtu.be/3cNFOd7Aigc
现在的问题是我得到的误报比我预期的要多。
有没有办法可以消除所有这些误报(除了使用更多图像进行训练)?到目前为止,我可以从 SVM 获得“分数”,即到边距本身的距离。我如何利用它来利用我的结果?
有人对实现一个好的滑动窗口算法有任何见解吗?
【问题讨论】:
【参考方案1】:您可以做的是添加一个处理步骤以从 SVM 中找到本地最强的响应。让我解释一下。
你现在正在做什么:
对于每个滑动窗口
W
,记录category[W] = SVM.hardDecision(W)
硬决策意味着它返回一个布尔值或整数,对于 2 类分类可以这样写:
hardDecision(W) = bool( softDecision(W) > 0 )
既然你提到了 OpenCV,那么在 CvSVM::predict
中你应该将 returnDFVal
设置为 true :
returnDFVal – 指定返回值的类型。如果为 true 并且问题是 2 类分类,则该方法返回决策函数值,即到边缘的有符号距离,否则该函数返回类标签(分类)或估计的函数值(回归)。
来自the documentation。
你可以做的是:
对于每个滑动窗口
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 并进行调整,直到获得满意的结果。或者您可以使用您的训练集自动校准它。
【讨论】:
很好的答案,但如果您或其他任何人不介意,我还有几个问题。我如何将它与比例空间一起使用?我是否将在另一个范围内检测到的窗口视为另一个邻居?非最大抑制是如何发挥作用的?无论如何,仍然非常感谢您的明确回答。 关于秤的好问题!您确实可以包括附近的规模(左/右/上/下/更小/更大),但这在很大程度上取决于您的数据和最终目标 - 您是否得到很多多尺度误报?不幸的是,试错法是计算机视觉中最好的实用方法。关于非最大抑制,我所描述的是一种非最大抑制(你只保留局部最大值)。以上是关于如何实现更好的滑动窗口算法?的主要内容,如果未能解决你的问题,请参考以下文章
算法学习——剑指 Offer II 041. 滑动窗口的平均值(Java实现)