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

sub*_*b_o 6 opencv machine-learning computer-vision sliding-window

所以我一直在编写自己的HoG代码及其变体来处理深度图像.但是,我仍然坚持在检测窗口部分测试训练有素的SVM.

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

这是一个视频截图:http://youtu.be/3cNFOd7Aigc

现在问题是我得到的误报比我预期的要多.

有没有办法可以消除所有这些误报(除了训练更多的图像)?到目前为止,我可以从SVM获得"得分",这是与边距本身的距离.我如何使用它来利用我的结果?

有没有人对实现良好的滑动窗口算法有任何见解?

Ant*_*ine 8

你可以做的是添加一个处理步骤,以从SVM中找到本地最强的响应.让我解释.

你现在看起来在做什么:

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

硬判决意味着它返回一个布尔或整数,对于2类别分类可以这样写:

hardDecision(W) = bool( softDecision(W) > 0 )
Run Code Online (Sandbox Code Playgroud)

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

returnDFVal - 指定返回值的类型.如果为true且问题是2级分类,则该方法返回与边距签名距离的决策函数值,否则该函数返回类标签(分类)或估计函数值(回归).

来自文档.

你能做的是:

  1. 对于每个滑动窗口W,记录score[W] = SVM.softDecision(W)
  2. 对于每个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.
  3. 对于每个人W,你有一个积极的iflocal[W] && powerful[W]

由于您的分类器对Windows布(在空间和/或外观上)对您的真实积极有积极的反应,我们的想法是记录每个窗口的分数,然后只保留积极的

  • 是本地最高分(大于其邻居) - > local
  • 足够强大 - > powerful

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

  • 关于秤的好问题!你确实可以在附近包括比例(左/右/上/下/小/大),但它在很大程度上取决于你的数据和最终目标 - 你会得到很多多尺度误报吗?不幸的是,反复试验是计算机视觉中最好的实用方法.关于非最大抑制,我所描述的是一种非最大抑制(你只保留局部最大值). (2认同)