我第一次实现了一个用于静态图像对象检测的软件。我的第一个目标是检测简单的圆圈,然后我将转向更复杂的对象。不幸的是,在验证我的分类器时似乎我遇到了问题。
我的选择是使用 HOG 描述符(使用 OpenCv)和 svm 作为分类器(使用 svmlight)。代码可以编译并且可以工作,但我觉得有些奇怪,可能与 svm 有关。
我有:
- 一个训练集,由 5 个 48x48 像素的不同圆圈图像和 5 个 48x48 像素的非圆圈图像组成(我知道它们太少了,无法拥有一个可靠的分类器,但据了解,这是为了测试一切正常)
- 一个测试集,由 4 个 48x48px 的图像(圆圈与训练所用的一样大)和 1 个更大的图像(765x600px)组成,具有多个尺寸的圆圈和其他几何形式。
会发生什么:
- 当图像为 48x48 时,测试集中的圆圈未被检测到,即使在测试集中有一些图像用于训练阶段。
- 在图像 765x800(包含任意大小的圆圈)中,正确识别出与训练集大小相同或更大的圆圈。
我正在使用以下参数:
- 猪:winSize=48x48px,winStride=4x4px,cellSize=4px,blockSize=8px,blockStride=4x4px
- 分类器:带有线性分类器的 svm 回归,C=0.01。(RBF结果比线性差)
这是使用我正在使用的参数执行检测的 api。
vector<Rect> found;
double hitThreshold = 0.; // tolerance
Size padding(Size(32, 32));
double scale = 1.05;
int groupThreshold = 2;
hog.detectMultiScale(testImg, found, hitThreshold, win_stride, padding, scale, groupThreshold);
为什么没有检测到 48x48px 图像中的圆圈并且检测到更大图像中的圆圈?我希望正确分类 48x48px 图像以验证分类器。当在 48x48px 图像中没有检测到任何内容时,我添加了更大的图像。
此外,听起来很奇怪的是,在 48x48ps 的测试集中,有一些图像用于训练集中,我认为它们必须被识别,而不是它们!(我知道训练集和测试集一定是不同的,但我在没有检测到任何东西时这样做了。)
这是我对 hog 描述符和 svm 的第一次体验,因此它可能由于配置错误或图像选择而无法工作。
欢迎任何帮助!
提前致谢 :)