所以我一直在编写自己的HoG代码及其变体来处理深度图像。但是,我仍然坚持在检测窗口部分测试训练有素的SVM。
我现在所做的就是首先从原始图像中创建图像金字塔,然后从左上角到右下角运行一个64x128大小的滑动窗口。
以下是视频捕捉:http://youtu.be/3cNFOd7Aigc
现在的问题是,我得到的误报比我预期的要多。
有没有办法可以删除所有这些误报(除了训练更多图像)?到目前为止,我可以从SVM获得“得分”,这是与边距本身的距离。我如何使用它来利用我的结果?
有没有人对实现良好的滑动窗口算法有任何见解?
答案 0 :(得分:8)
您可以做的是添加一个处理步骤,以便从SVM中找到本地最强的响应。让我解释一下。
你现在看起来在做什么:
每个滑动窗口W
,记录
category[W] = SVM.hardDecision(W)
硬判决意味着它返回一个布尔或整数,对于2类别分类可以这样写:
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]
由于您的分类器对Windows布(空间和/或外观)的积极响应与您的真实积极,因此想法是记录每个窗口的分数,然后只保留正面
local
powerful
您可以将阈值设置为0并进行调整,直到获得满意的结果。或者您可以使用训练集自动校准它。