您可以做的是添加一个处理步骤以从 SVM 中找到本地最强的响应。让我解释。
你现在似乎在做什么:
对于每个滑动窗口W
,记录category[W] = SVM.hardDecision(W)
硬决策意味着它返回一个布尔值或整数,对于 2 类分类可以这样写:
hardDecision(W) = bool( softDecision(W) > 0 )
既然你提到了 OpenCV,CvSVM::predict
你应该设置returnDFVal
为 true :
returnDFVal – 指定返回值的类型。如果为真并且问题是 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]
由于您的分类器将对窗户布(在空间和/或外观上)对您的真实正面做出正面响应,因此想法是记录每个窗口的分数,然后只保留正面
- 是局部最大分数(大于其邻居)-->
local
- 足够强大-->
powerful
您可以将阈值设置为 0 并对其进行调整,直到获得满意的结果。或者您可以使用您的训练集自动校准它。