使用OpenCV的Haar人脸检测时,是否有一种方法可以获取置信度的度量?

10

我使用OpenCV的HAAR级联人脸检测算法开发了一款人脸检测应用程序。该算法工作正常,但偶尔会在墙壁或其他不是人脸的物体上找到模式。
我想对被怀疑为人脸的对象运行额外的检查,但我只想对我不确定它们是否为人脸的对象进行检查。是否有一种方法可以为HAAR级联人脸检测检测到的人脸获取“置信度”水平?

5个回答

8

OpenCV提供了通过CascadeClassifier类中的detectMultiScale函数的权重参数来提高检测准确性,您需要将outputRejectLevels标志设置为true。


1
这个参数在openCV C++ API中可用吗?我只在python API中看到了它!例如,是否有未记录的方法可以使用flags参数来实现此目的? - Micka
显然,在C++ API中也有一个未记录的函数。void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects, vector<int>& rejectLevels, vector<double>& levelWeights, double scaleFactor, int minNeighbors, int flags, Size minObjectSize, Size maxObjectSize, bool outputRejectLevels ) - sietschie
较新的OpenCV版本已经将此公开并记录在文档中 - https://docs.opencv.org/4.0.1/d1/de5/classcv_1_1CascadeClassifier.html#accf96d130d9f3cf4c58bf445b7861c19 - Gabi Lee
使用此 Haar 级联检测人脸时,如何获取置信值? - Bryan Lumbantobing

3

OpenCV 实际上会为每个特定的物体找到一个以上的结果,每个检测到的区域大部分重叠在一起;然后将其分组并形成“邻居数量”的计数。这个计数就是所谓的置信度。

当你执行目标检测时,其中一个参数是返回一个命中之前需要的最小邻居数。增加它可以减少误报,但也会减少可能检测到的人脸数量。


1
为什么不对同一图像运行多个经过不同训练的haar级联分类器,看它们是否产生相似的结果?让它们投票。因此,如果只有一个级联分类器找到了给定的人脸而其他人没有,那么你对该给定的人脸的信心就会降低。
我能够在iPhone视频实时数据上同时运行3个级联分类器,因此在许多正常情况下性能不应该是一个问题。更多信息请参见:http://rwoodley.org/?p=417

0

虽然这不是你问题的直接答案,但这可能有助于减少误检。

通过调整MinNeibhbours、CV_HAAR_FIND_BIGGEST_OBJECT和Size值,可以减少误检。

int MinNeighbours = 7;

face_cascade.detectMultiScale( frame_gray, faces, 1.1, MinNeighbours, CV_HAAR_FIND_BIGGEST_OBJECT, Size(60, 60) );


0

OpenCV的HAAR级联人脸检测非常弱。

我建议您使用可教授机器进行个人训练,并使用TensorFlow选项检索代码。

在我的编码中,我使用了TensorFlow,并且它给了我置信参数。

   probabilities = model.predict_proba(x)

我用过这个。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接