你可以做的是添加一个处理步骤来查找来自SVM的本地最强的响应。让我解释。
你看起来是被现在在做什么:
每个滑动窗口W
,记录category[W] = SVM.hardDecision(W)
硬判决意味着它返回一个布尔值或整数,2类分类的做法写成这样:
hardDecision(W) = bool(softDecision(W) > 0)
既然你提到OpenCV,在CvSVM::predict
您应该将returnDFVal
设置为true:
returnDFVal - 指定返回值的类型。如果为真并且问题是2类分类,则该方法返回与边界有符号距离的判定函数值,否则函数返回类标签(分类)或估计函数值(回归)。
从the documentation。
你可以做的是:
- 每个滑动窗口
W
,每个W,计算记录score[W] = SVM.softDecision(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,并调整它,直到你得到满意的结果。或者你可以使用你的训练集自动校准它。
很好的答案,但如果您或其他人不介意,我还有其他几个问题。如何将它与缩放空间一起使用?我是否将另一个尺度的检测窗口视为另一个邻居? Non Nonimal Suppression如何发挥作用?无论如何,仍然,非常感谢您的明确答案。 – 2013-04-08 10:24:24
关于体重秤的好问题!你确实可以在社区中包含规模(左/右/上/下/更小/更大),但这取决于你的数据和最终目标 - 你是否会得到大量的多尺度误报?不幸的是,反复试验是计算机视觉中最好的实用方法。关于非最大抑制,我所描述的是非最大抑制的一种形式(只保留局部最大值)。 – Antoine 2013-04-08 12:54:27