1. 程式人生 > >讓opencv輸出人臉檢測的得分(置信率)

讓opencv輸出人臉檢測的得分(置信率)

最近專案略多,其中一個需要找出一些和臉比較像但是不是臉的負樣本,想用opencv的人臉檢測器檢測到的錯誤臉作為這樣的負樣本。

但是國內(包括國外)居然幾乎沒有相關的資料如何輸出detectMultiScale()的置信率或者說是人臉得分

所以寫一篇小小的總結供有相關需求的人蔘考。

看了下人臉識別函式的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輸出人臉檢測得分置信

讓opencv輸出人臉檢測的得分(置信率) 最近專案略多,其中一個需要找出一些和臉比較像但是不是臉的負樣本,想用opencv的人臉檢測器檢測到的錯誤臉作為這樣的負樣本。 但是國內(包括國外)居然幾乎沒有相關的資料如何輸出detectMultiScale()

opencv輸出人臉檢測得分置信

最近專案略多,其中一個需要找出一些和臉比較像但是不是臉的負樣本,想用opencv的人臉檢測器檢測到的錯誤臉作為這樣的負樣本。 但是國內(包括國外)居然幾乎沒有相關的資料如何輸出detectMultiScale()的置信率或者說是人臉得分 所以寫一篇小小的總結供有相關需求的人蔘考。 看了下人臉識別函式

實踐案例:使用開源工具從視訊中構建人臉檢測模型Python實現

介紹 近年來,計算機視覺這個奇妙的領域已經發展到獨樹一幟的地步。在世界各地已經有大量的應用程式在廣泛使用。 我在這個領域最喜歡的事情之一是我們的社群擁抱開源概念的想法。即使是大型科技巨頭也願意與每個人分享新的突破和創新,這樣技術就不會成為“富人的專利”。 其中一種技術是人臉檢測,它在實際

利用opencv實現人臉檢測C++版

小編所有的帖子都是基於unbuntu系統的,當然稍作修改同樣試用於windows的,經過小編的絞盡腦汁,把剛剛發的那篇python 實現人臉和眼睛的檢測的程式用C++ 實現了,當然,也參考了不少大神的部落格,下面我們就一起來看看: Linux系統下安裝open

使用OpenCV進行人臉檢測Viola-Jones人臉檢測方法

擴充套件閱讀:  參考文獻:Paul Viola, Michael J. Jones. Robust Real-Time Face Detection[J]. International Journal of Computer Vision,2004,57(2):13

AI新時代-大神教你使用python+Opencv完成人臉解鎖附源碼

判斷 剛才 src 學習 需要 亂七八糟 很多 request mbx 好吧,夥計們,我回來了。說我拖更不寫文章的可以過來用你的小拳拳狠命地捶我胸口.... 那麽今天我們來講關於使用python+opencv+face++來實現人臉驗證及人臉解鎖。代碼量同樣不多,你可以將這

微信控制家庭智慧小管家機器人技術解析附語音聊天、人臉檢測、自主巡航等

微信控制家庭智慧小管家機器人技術解析(附語音聊天、人臉檢測、自主巡航等) 今天分享微信控制家庭智慧小管家機器人(附語音聊天、人臉檢測、自主巡航等)的資料,內容比較多,這邊文章不夠放,更詳細資料到闖客網技術論壇下載,或加群獲取:81328832 下載地址:https://bbs.usoftchina.com

Java+opencv實現人臉檢測

版本 Java1.8 opencv3.4 程式碼: import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; imp

【機器學習】最容易實現的基於OpenCV人臉檢測程式碼、檢測器及檢測效果

基於opencv自帶的人臉檢測模型,實現簡單的人臉檢測功能,可作為機器學習初學者練手使用。簡單易學,具體的方法及程式碼如下。 1、執行結果 輸入原圖 輸出結果 2、工程需要載入的opencv庫如下: 3、用到的人臉檢測器 4、具體實現程式碼 #

OpenCV簡單粗糙的指尖檢測方法FingerTips Detection

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

opencv(11)-人臉檢測

人臉檢測 Haar級聯實現人臉檢測: 靜態影象: 程式碼: import cv2 import numpy as np file_path = './cascades/haarcascade_frontalface_default.xml' # 人臉檢測 def

樹莓派基於OpenCV人臉檢測和處理

對圖片&視訊進行人臉檢測和處理 一、Windows下使用opencv採集視訊 二、基於opencv對視訊中人臉進行檢測 (一)Windows(VS2015) 1. 對圖片中檢測出的人臉畫一個矩形框或圓圈

C++下使用OpenCV實現人臉檢測

沒有安裝OpenCV的可以找個教程安裝一下,然後安裝一下visual studio2015或2017 人臉識別主要有三個步驟: 人臉影象採集及檢測 人臉影象預處理 人臉影象特徵提取以及匹配與識別 以下程式碼實現了讀取本地影象,進行人臉檢測 #include

OpenCV 繪製人臉檢測框和關鍵點

在做人臉檢測時,我們需要將檢測的結果繪製到圖片上檢視效果,這時可以利用 OpenCV 的基本繪圖函式將人臉檢測框和人臉關鍵點繪製到原圖上。 關鍵程式碼如下: // TODO FaceDetectEngine 初始化 cv::Mat image = cv::im

OpenCV特徵點檢測------Surf特徵點篇

Surf(Speed Up Robust Feature)Surf演算法的原理                                                                          1.構建Hessian矩陣構造高斯金字塔尺度空間其

Linux系統下利用OpenCV實現人臉檢測和基於LBPH演算法的人臉識別

        本文主要的目的是進行人臉檢測和人臉識別。實驗環境為Ubuntu16.04 LTS虛擬機器版,技術為OpenCV,語言為c++。其中人臉檢測的主要過程是從一張圖片中檢測出人臉可以是一個或者是多個,然後用矩形或者圓形線圈標註出來。人臉識別是基於LBPH演算法實現

Mtcnn人臉檢測實踐

放寒假了,閒來無事就開始搗鼓人臉識別了。這次看了一篇2016年的論文,算是比較新的了。論文提到一種名為“基於多工級聯卷積神經網路進行人臉檢測和對齊”的演算法,英文名 Joint Face Detection and Alignment using Multi-t

Matlab人臉檢測方法Face Parts Detection詳解

  今天同學讓我幫忙製作一個人臉表情識別的樣本庫,其中主要是對人臉進行裁剪,這裡用到了一個相對較新的Matlab人臉檢測方法Face Parts Detection,網上百度了一下發現關於Matlab人臉檢測的程式碼和資源並不多,故此專門撰寫一篇部落格來詳細介紹這個人臉檢測方

基於openCV實現人臉檢測

openCV的人臉識別主要通過Haar分類器實現,當然,這是在已有訓練資料的基礎上。openCV安裝在 opencv/opencv/sources/data/haarcascades_cuda(或haarcascades)中存在預先訓練好的物體檢測器(xml格式),包括正臉

python+opencv實現人臉檢測

前言 計算機視覺是人工智慧領域中的一個重要分之,傳統的安防監控越來越智慧化,不僅僅要求簡單的移動偵測,還要求能檢測人臉。目前實現人臉檢測解決方案主要分為兩種,一種是依靠大型伺服器來實現,它的特點是計算能力強,同時依賴強大的人臉資料庫可以執行相關演算法將捕獲到的人臉進行精準識別;另一種是依賴於嵌入