我使用OpenCV的HAAR级联人脸检测算法开发了一款人脸检测应用程序。该算法工作正常,但偶尔会在墙壁或其他不是人脸的物体上找到模式。
我想对被怀疑为人脸的对象运行额外的检查,但我只想对我不确定它们是否为人脸的对象进行检查。是否有一种方法可以为HAAR级联人脸检测检测到的人脸获取“置信度”水平?
我使用OpenCV的HAAR级联人脸检测算法开发了一款人脸检测应用程序。该算法工作正常,但偶尔会在墙壁或其他不是人脸的物体上找到模式。
我想对被怀疑为人脸的对象运行额外的检查,但我只想对我不确定它们是否为人脸的对象进行检查。是否有一种方法可以为HAAR级联人脸检测检测到的人脸获取“置信度”水平?
OpenCV提供了通过CascadeClassifier类中的detectMultiScale函数的权重参数来提高检测准确性,您需要将outputRejectLevels标志设置为true。
OpenCV 实际上会为每个特定的物体找到一个以上的结果,每个检测到的区域大部分重叠在一起;然后将其分组并形成“邻居数量”的计数。这个计数就是所谓的置信度。
当你执行目标检测时,其中一个参数是返回一个命中之前需要的最小邻居数。增加它可以减少误报,但也会减少可能检测到的人脸数量。
虽然这不是你问题的直接答案,但这可能有助于减少误检。
通过调整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) );
OpenCV的HAAR级联人脸检测非常弱。
我建议您使用可教授机器进行个人训练,并使用TensorFlow选项检索代码。
在我的编码中,我使用了TensorFlow,并且它给了我置信参数。
probabilities = model.predict_proba(x)
我用过这个。
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