我正在尝试使用Android中的OpenCV HOGDescriptor在静态图像中检测人类的存在。

这是Android Java代码,我无法在Android在线上找到示例,我试图将peopledetect.cpp中C++的示例移植到该示例。

mHOGDescriptor = new HOGDescriptor();
mHOGDescriptor.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());
Mat img = Highgui.imread(path);
final MatOfRect foundLocations = new MatOfRect();
final MatOfDouble foundWeights = new MatOfDouble();
final Size winStride = new Size(8, 8);
final Size padding = new Size(32, 32);

mHOGDescriptor.detectMultiScale(img, foundLocations, foundWeights, 0.0, winStride, padding, 1.05, 2.0, false);
Boolean withFace = false;
Rect[] array = foundLocations.toArray();
for (int j = 0; j < array.length; j++) {
    Rect rect = array[j];
    Log.i("TEST", "Height " + rect.height + ", Width " + rect.width);
}

当我再次测试一组30张照片时,我发现误报的次数非常多。一些没有明显人物特征的照片也被标记为与人物相同。 (在上面的foundLocation数组中,矩形的高度和宽度都很高)。例如,一张有几朵花的照片被标记为里面有2个人。很明显是错误的。

我有什么可以改善的吗?

最佳答案

简短的回答是,是的。

如果我理解正确,您已经训练了30张照片上的描述符?这是一个非常低的数字,通过增加训练数据量,可以增加检测量。

以防万一,如果您要测试的是与在c++代码中使用过的描述符相同的描述符,那么这里是一个稍微有些替代的答案。

即使使用非常好的HOG检测器,也很难掌握功能检测,这很可能会导致许多误报。您无需提及您的真实阳性率是如何做的,而是假设其不太差。想象一朵花看起来像是什么东西,经过训练可以检测到人,它是一个细长的东西,顶部有一个大圆圈。很像一个人...

10-08 17:11