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

2022-05-07 09:03:09 字數 2913 閱讀 1517

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

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

看了下人臉識別函式的opencv的原始碼

\sources\modules\objdetect\src\cascadedetect.cpp
中detectmultiscale有兩個過載,第二個過載在opencv的開發文件裡居然隻字未提:

void cascadeclassifier::detectmultiscale( const mat& image, vector&objects,

vector

&rejectlevels,

vector

&levelweights,

double scalefactor, int

minneighbors,

intflags, 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 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7using

namespace

cv;8

const

string xmlpath = "

lbpcascade_frontalface.xml";

9cascadeclassifier face_cc;

1011

int tic = 0;12

13void

detect(mat img)

29stringstream text1, text2;

30 text1 << "

rejlevel:

"<

31 text2 << "

levelw:

"<

32string 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

42int

main()

48ifstream pathin;

49 pathin.open("

imgpath.txt");

50string

t;51

while ( pathin >> t && tic < 10000)52

56pathin.close();

57return0;

58 }

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

最近專案略多,其中乙個需要找出一些和臉比較像但是不是臉的負樣本,想用opencv的人臉檢測器檢測到的錯誤臉作為這樣的負樣本。但是國內 包括國外 居然幾乎沒有相關的資料如何輸出detectmultiscale 的置信率或者說是人臉得分 看了下人臉識別函式的opencv的原始碼 sources modu...

opencv人臉檢測輸出的置信率

最近專案略多,其中乙個需要找出一些和臉比較像但是不是臉的負樣本,想用opencv的人臉檢測器檢測到的錯誤臉作為這樣的負樣本。但是國內 包括國外 居然幾乎沒有相關的資料如何輸出detectmultiscale 的置信率或者說是人臉得分 看了下人臉識別函式的opencv的原始碼 sources modu...

基於Python的OpenCV人臉檢測

注意 本文只是人臉檢測,人臉識別的實現請參見本人另一篇部落格 基於opencv tensorflow keras實現人臉識別 提前做的準備 1 和說明 import cv2 as cv import numpy as np defface detect demo 人臉檢測函式 gray cv.cvt...