6

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

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

这是它的视频截图:http: //youtu.be/3cNFOd7Aigc

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

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

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

4

1 回答 1

8

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

你现在似乎在做什么:

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

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

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

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

returnDFVal – 指定返回值的类型。如果为真并且问题是 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,如果local[W] && powerful[W]

由于您的分类器将对窗户布(在空间和/或外观上)对您的真实正面做出正面响应,因此想法是记录每个窗口的分数,然后只保留正面

  • 是局部最大分数(大于其邻居)-->local
  • 足够强大-->powerful

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

于 2013-04-08T09:03:34.747 回答