让opencv输出人脸检测的得分(置信率),找出一些和脸比较像但是不是脸的负样本
最近项目略多,其中一个需要找出一些和脸比较像但是不是脸的负样本,想用opencv的人脸检测器检测到的错误脸作为这样的负样本。
但是国内(包括国外)居然几乎没有相关的资料如何输出detectMultiScale()的置信率或者说是人脸得分
所以写一篇小小的总结供有相关需求的人参考。
转载需注明:http://www.cnblogs.com/sciencefans/
看了下人脸识别函数的opencv的源码
\sources\modules\objdetect\src\cascadedetect.cpp
中detectMultiScale有两个重载,第二个重载在opencv的开发文档里居然只字未提:
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 )
发现他有个rejectLevels和levelWeight这两个引用参数,看名字感觉是一种得分输出。
google了一下发现国外问的人不少但是基本没啥解释(或者是我没认真找?)
然后看了下它调用的cvHaarDetectObjectsForROC()的源码实现,大概懂了这俩vectors是在干什么的。
先上结论:确实和人脸得分有关。
首先应该明白一点detectMultiScale()这个方法是一个级联分类器,使用了boosting的方法。所以输入图像要经过层层(级级)选拔,留到最后的才是真汉子(正样本)
rejectLevels就是代表在第几层被out的。如果是最后一层(在lbpcascade_frontalface.xml中是20,具体要看xml中的叙述)被out,则说明很可能是正样本。
为啥说很可能呢?
因为还有个参数:levelWeight。即使是在最后一层被out的,levelWeight很小甚至是负数,也可以看成是负样本。
实际上很多负样本正是在最后一层被out的。
见下图:
我这里只截取了level在20才out的框。输出了他们的levelWeight。是脸的地方最大是4.23多,其他的就很小。不用过多解释了吧~
所以这个函数的原理是这样的(个人理解,有错误请指教):
首先一个level一个level地测试样本,然后每一个level给一个对应的得分,也就是levelWeight,如果这个weight低于或者高于对应level的threshold,则被抛弃。
坚持到最后一个level并且在最后一个level仍然满足threshold的框就是正确的脸(正样本)。
所以,人脸的分应该是这样:level越大,分数越高,在相同的level,levelWeight越大分数越高。
但是实际上真正的人脸都是能坚持到level20(最后一个level)的,所以只比对最后一个level的所有大于1的框的levelWeight进行比对就可以知道脸的得分啦~
这里给出所有level被gg的框的图:
最后给出灰常短小精悍的demo的源代码:
1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <vector> 4 #include <fstream> 5 #include <math.h> 6 using namespace std; 7 using namespace cv; 8 const string xmlpath = "lbpcascade_frontalface.xml"; 9 CascadeClassifier face_cc; 10 11 int tic = 0; 12 13 void detect(Mat img){ 14 vector<Rect> faces; 15 vector<int> rejLevel; 16 vector<double> levelW; 17 Mat grayimg; 18 cvtColor(img, grayimg, CV_RGB2GRAY); 19 equalizeHist(grayimg, grayimg); 20 int minl = min(img.rows, img.cols); 21 face_cc.detectMultiScale(grayimg, faces, rejLevel, levelW, 1.1, 3, 0, Size(), Size(), true); 22 //face_cc.detectMultiScale(grayimg, faces, 1.1); 23 for ( int i = 0; i < faces.size(); i++ ) 24 { 25 if ( rejLevel[i] < 00 ) 26 { 27 continue; 28 } 29 stringstream text1, text2; 30 text1 << "rejLevel:" << rejLevel[ i ]; 31 text2 << "levelW:" << levelW[ i ]; 32 string ttt = text1.str(); 33 rectangle(img, faces[ i ], Scalar(255, 255, 0), 2, 8, 0); 34 putText(img, ttt, cvPoint(faces[ i ].x, faces[ i ].y - 3), 1, 1, Scalar(0,255,255)); 35 ttt = text2.str(); 36 putText(img, ttt, cvPoint(faces[ i ].x, faces[ i ].y + 12), 1, 1, Scalar(255, 0, 255)); 37 } 38 imshow("IMG", img); 39 waitKey(0); 40 } 41 42 int main(){ 43 if ( !face_cc.load(xmlpath) ) 44 { 45 cout << "load error!\n"; 46 return -1; 47 } 48 ifstream pathin; 49 pathin.open("imgpath.txt"); 50 string t; 51 while ( pathin >> t && tic < 10000) 52 { 53 Mat img = imread(t); 54 detect(img); 55 } 56 pathin.close(); 57 return 0; 58 }
让opencv输出人脸检测的得分(置信率),找出一些和脸比较像但是不是脸的负样本相关推荐
- java 人脸检测_Java+OpenCV实现人脸检测并自动拍照
java+opencv实现人脸检测,调用笔记本摄像头实时抓拍,人脸会用红色边框标识出来,并且将抓拍的目录存放在src下,图片名称是时间戳. 环境配置:win7 64位,jdk1.8 CameraBas ...
- OpenCV实现人脸检测和68点定位
人脸对比是现在比较常用的功能,比如出租车司机人脸与司机驾照照片对比,门禁系统中进入者的人脸与人脸库中的人脸进行对比.要实现人脸对比,首先要实现的是人脸检测,在摄像头拍摄到的一张图片中,正确的检测到人脸 ...
- Python图像处理,cv2模块,OpenCV实现人脸检测蔡徐坤
前言 利用Python实现OpenCV实现人脸检测,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 ...
- flutter 人脸检测_【转载】opencv实现人脸检测
全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下 http://blog.csdn.net/lsq2902101015/article ...
- opencv实现人脸检测、性别和年龄预测
opencv实现人脸检测.性别和年龄预测 文章目录: 一.下载预训练的模型 1.下载模型 2.模型说明 二.实现步骤 1.加载模型 2.人脸检测 3.性别与年龄预测 4.完整代码 主要是通过openc ...
- 使用OpenCV进行人脸检测(Viola-Jones人脸检测方法)
扩展阅读: OpenCV用于人脸检测 参考文献:Paul Viola, Michael J. Jones. Robust Real-Time Face Detection[J]. Internatio ...
- OpenCV Dbt人脸检测Dbt face detection的实例(附完整代码)
OpenCV相 Dbt人脸检测Dbt face detection的实例 OpenCV Dbt人脸检测Dbt face detection的实例 OpenCV Dbt人脸检测Dbt face dete ...
- 利用OpenCV实现人脸检测
如何在一副图片中检测到人脸,这涉及到计算机图形学中一些非常复杂的计算,如果这些计算都靠程序员自己来编程,那么工作量就相当大.OpenCV全称是Open Computer Vision,是指开放的计算机 ...
- 【opencv】人脸检测(图片实时)
■ 人脸检测(图片) 原图像: 在使用OpenCV的人脸检测之前,需要一个人脸训练模型,格式是xml的,我们这里使用OpenCV提供好的人脸分类模型xml,下载地址:https://g ...
最新文章
- 邬贺铨院士:边缘计算“新十问”
- 安卓手机可以用python编程软件-可以在手机上进行Java,Python的编程软件,你用过么?...
- [deviceone开发]-do_QRCode的简单示例
- AndroidService 深度分析(2)
- springboot判断有没有库_Springboot 使用JPA @Query 注解 查询语句条件 有可能为空,Oracle数据库...
- 解码(四):avcodec_send_packet和avcodec_receive_frame函数讲解
- Python——itertools.chain.from_iterable将多个迭代器连接成一个统一的迭代器的最高效的方法
- 安装CocoaPods常见命令
- OSChina 周日乱弹 ——可以囤硬盘了
- GCD介绍(二): 多核心的性能
- Android NDK学习(1) 简介
- 77. PHP 文件读取
- 摄影测量学之共线方程的应用
- php adodb类库下载,PHP中 ADOdb 类库介绍(二)
- 极化码的巴氏参数构造算法
- 天正电气2014的安装
- 连接摄像头拍照并识别图片中二维码
- Win10系统 禁止某个程序\软件联网
- Problem L: 最简分式
- android谷歌人脸识别,谷歌发布Android 4.0系统 支持人脸识别功能
热门文章
- Spring Security认证_Remember Me
- 2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 问题一python代码实现(更新完毕)
- 致敬最美逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载
- [转载]AP_INVOICES_ALL应付发票表详解
- java中的集合详解
- html圈c转义符,C 实用教程
- H5与其他平台交互框架
- Java中创建对象的六个步骤 细分后(new关键字)对象头详细介绍
- 余承东硬刚iPhone11;苹果推送正式版iOS 13;Facebook总部发生员工跳楼自杀事件 | EA周报...
- 免费午餐 20个梦幻级开源免费软件