這個僅 7M 大小的人臉監測模型幾乎監測出了世界最大自拍照中的所有人像!

模型僅有7M:輕量級高精度人臉檢測方法DBFace

專案簡介

之前機器之心報道過一個跨平臺人臉檢測專案,在 CPU 上就能輕鬆跑出 1000FPS。這次介紹的專案也是一個輕量級人臉檢測專案。不同的是,該專案在保持較小引數量的前提下,檢測精度要高很多,並且只需要 OpenCV 和 PyTorch 就能執行。

DBFace 是一個輕量級的實時人臉檢測方法,其有著更快的檢測速度與更高的精度。下圖展示了多種人臉檢測方法在 WiderFace 資料集上的測試效果。可以看到不僅 DBFace 模型的大小最小,其在 Easy、medium、Hard 三個測試任務中均取得了最高的檢測精度。

模型僅有7M:輕量級高精度人臉檢測方法DBFace

專案地址:

https://

github。com/dlunion/DBFa

ce

WiderFace 是一個關於人臉檢測的基準跑分資料集,其中包含 32,203 張圖片以及在各方面劇烈的 393,703 張人臉,資料集具有從簡單到困難等不同難度的任務。下圖是改資料集中一些樣本的展示,可以看到,要想準確地檢測出圖中所有人臉還是很有挑戰的。DBFace 在該資料集的不同任務上分別取得 0。925、0。920、0。847 的準確率,實屬不易。

模型僅有7M:輕量級高精度人臉檢測方法DBFace

有關 WiderFace 的詳細介紹請讀者移步其官網:

http://

shuoyang1213。me/WIDERFA

CE/

效果展示

下圖展示了不同人臉檢測方法在 WiderFace 資料集上的 P-R 曲線。P-R 曲線可以較直觀地展示二分類器的 Precision 和 Recall。當需要對不同演算法進行比較時,若某個二分類器的 P-R 曲線被另一個二分類器的 P-R 曲線完全包住,即表明後者的效能優於前者。從圖中可以看到,DBFace 包圍的面積在三個任務中均相對較大。

模型僅有7M:輕量級高精度人臉檢測方法DBFace

當閾值設定為 0。2 時,DBFace 對這張世界最大的自拍照檢測效果如下圖所示:

模型僅有7M:輕量級高精度人臉檢測方法DBFace

可以看到,DBFace 的檢測準確率非常高,圖中很多人臉甚至放大後單憑肉眼也很難分辨,DBFace 卻仍然能夠檢測出來,並且模型大小僅 7M,完全能夠在邊緣裝置上實時執行。於是,機器之心也上手測試了一番。

專案實測

專案作者提供的程式碼示例中包含對靜態圖片的檢測,同時也有一個呼叫電腦攝像頭的 GUI。值得注意的是,該專案並不需要太多依賴項,只要有 PyTorch、Numpy 和 OpenCV 即可執行。由於以上依賴環境都是非常常用的擴充套件庫,網上有大量相應安裝教程,這裡就略過其安裝步驟。

在 main。py 中,image_demo() 與 camera_demo() 分別對應靜態圖片檢測與呼叫攝像頭進行檢測。靜態圖片檢測程式碼為:

def image_demo():

dbface = DBFace()

dbface。eval()

if HAS_CUDA:

dbface。cuda()

dbface。load(“model/dbface。pth”)

detect_image(dbface, “datas/selfie。jpg”)

以上程式碼將會讀取訓練後的模型,對圖片datas/selfie。jpg進行檢測,並將結果儲存到 detect_result/selfie。draw。jpg。

讓我們來看一下檢測效果:

模型僅有7M:輕量級高精度人臉檢測方法DBFace

從上圖可以看到,即使在室內燈光顏色、明暗差別較大的環境下,DBFace 也檢測出了圖中幾乎所有的人,甚至是中間那個一邊畫彩虹,一邊指向閃耀燈球戴頭盔的人也難逃其「魔掌」。當然,由於這裡設定的檢測閾值較低,存在一些誤分類的現象。圖中一些人的手和右上角的燈球就被誤檢測為了人臉。適當調高閾值即可消除此現象。

呼叫電腦攝像頭檢測的程式碼為:

def camera_demo():

dbface = DBFace()

dbface。eval()

if HAS_CUDA:

dbface。cuda()

dbface。load(“model/dbface。pth”)

cap = cv2。VideoCapture(0)

cap。set(cv2。CAP_PROP_FRAME_WIDTH, 640)

cap。set(cv2。CAP_PROP_FRAME_HEIGHT, 480)

ok, frame = cap。read()

while ok:

objs = detect(dbface, frame)

for obj in objs:

common。drawbbox(frame, obj)

cv2。imshow(“demo DBFace”, frame)

key = cv2。waitKey(1) & 0xFF

if key == ord(‘q’):

break

ok, frame = cap。read()

執行以上程式碼將會生成一個 640x480 的 GUI 介面,呼叫攝像頭實時進行人臉檢測。

感興趣的小夥伴趕快將本專案 git clone 到本地測試一下吧!