作者:馮遠(yuǎn)滔(OpenCV China),王成瑞(北京郵電大學(xué)),鐘瑤瑤(北京郵電大學(xué)) 最新發(fā)布的OpenCV 4.5.4版本收錄了一個(gè)基于深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的人臉模塊(以下稱“OpenCV DNN Face”),包括人臉檢測(使用模型YuNet,由OpenCV China團(tuán)隊(duì)貢獻(xiàn))和人臉識(shí)別(使用模型SFace,由北京郵電大學(xué)鄧偉洪教授課題組貢獻(xiàn))。 使用OpenCV DNN Face的API,只需幾行代碼便可以完成整個(gè)人臉檢測和人臉識(shí)別處理,極大的方便了開發(fā)。 # 人臉檢測 在相應(yīng)的數(shù)據(jù)集上對(duì)OpenCV DNN Face的兩個(gè)模型分別進(jìn)行測試:
根據(jù)OpenCV最新公開的OpenCV Zoo(https://github.com/opencv/opencv_zoo)的基準(zhǔn)測試結(jié)果:
YuNet僅為337K,SFace為37MB,二者均為輕量模型,非常適合移動(dòng)端應(yīng)用。 OpenCV DNN Face的實(shí)現(xiàn)代碼: https://github.com/opencv/opencv/tree/master/modules/objdetect C++和Python的例子face_detect和face_match: https://github.com/opencv/opencv/tree/master/samples/dnn 下面筆者分別介紹一下OpenCV DNN Face中的人臉檢測和人臉識(shí)別。 OpenCV基于深度學(xué)習(xí)的人臉檢測FaceDetectorYN人臉檢測是返回一張圖像中人臉的位置(x1, y1)和大小(w, h),如下圖所示(原圖片來自于WIDER Face數(shù)據(jù)集)。 YuNet是廣受好評(píng)的人臉檢測庫libfacedetection所使用的模型。它的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)參考了經(jīng)典的SSD[1]以及MobileNet[2],其結(jié)構(gòu)示意圖可以在 https://netron.app/?url=https://raw./ShiqiYu/libfacedetection.train/master/tasks/task1/onnx/yunet.onnx查看。 YuNet是基于anchor的人臉檢測器,分別在4種尺度的特征圖上生成正方形anchor,可檢測的最小人臉是10x10,最大人臉是256x256。參考MobileNet,我們使用了Depth-wise卷積代替部分卷積,從而減少模型參數(shù)和模型體積。我們使用人臉檢測數(shù)據(jù)集WIDER Face[3]作為訓(xùn)練和測試數(shù)據(jù)集,使用EIoU損失函數(shù)[4]作為訓(xùn)練YuNet的損失函數(shù),從而提高對(duì)人臉的定位能力。除了人臉的定位之外,我們還額外標(biāo)注了人臉的5個(gè)關(guān)鍵點(diǎn)(左右眼,鼻尖,左右嘴角),為模型增加了關(guān)鍵點(diǎn)檢測的多任務(wù)能力。 上圖展示了FaceDetectorYN的使用流程。如果輸入圖像的尺寸是一致的,例如視頻輸入流,那么實(shí)例化FaceDetectorYN時(shí)指定尺寸(width, height),即可使用detect()方法檢測人臉。如果輸入圖像的尺寸不一致,例如網(wǎng)上搜集的圖片,那么實(shí)例化FaceDetectorYN時(shí)可任意指定尺寸,在使用detect()方法前需要調(diào)用setInputSize()方法先指定正確的輸入圖像尺寸。 C++下人臉檢測API(FaceDetectorYN類)的使用方式:
Python下人臉檢測API的使用方式: 1import numpy as np # 請(qǐng)?jiān)趇mport cv2前先import numpy以避免一些問題 OpenCV基于深度學(xué)習(xí)的人臉識(shí)別FaceRecognizerSF人臉識(shí)別是利用人的臉部特征信息進(jìn)行身份鑒別的技術(shù)。廣義的人臉識(shí)別包括人臉圖像采集與檢測、人臉圖像預(yù)處理、人臉特征提取、特征比對(duì)與分類等一系列技術(shù)。 人臉預(yù)處理 將檢測到的人臉輸入人臉識(shí)別模型前,通常需要先進(jìn)行人臉對(duì)齊。人臉對(duì)齊利用檢測部分提取到的關(guān)鍵點(diǎn),與給定關(guān)鍵點(diǎn)之間計(jì)算變換矩陣,使用仿射變換對(duì)人臉進(jìn)行變換,以減輕人臉尺度、姿態(tài)等對(duì)人臉特征提取的性能的影響。 C++下人臉對(duì)齊部分API(FaceRecognizerSF類)的使用方式:
Python下人臉對(duì)齊部分API的使用方式: # 初始化FaceRecognizerSF 人臉特征提取 狹義的人臉識(shí)別模型僅作用于人臉特征提取過程。近年來,深度學(xué)習(xí)促進(jìn)了人臉識(shí)別的發(fā)展,深度人臉識(shí)別模型也因其優(yōu)越的性能得到了廣泛應(yīng)用[5]。深度人臉識(shí)別模型的訓(xùn)練離不開大規(guī)模訓(xùn)練集、高效的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練損失函數(shù)。深度人臉識(shí)別模型在經(jīng)過良好訓(xùn)練后,可以將預(yù)處理過的人臉圖像轉(zhuǎn)換為深度人臉特征用于后續(xù)的特征匹配。 OpenCV DNN Face所集成的深度人臉識(shí)別模型是由超球面損失函數(shù)監(jiān)督、在百萬名人數(shù)據(jù)集上訓(xùn)練的MobileNet輕量模型。將百萬名人數(shù)據(jù)集[6],在使用基于元學(xué)習(xí)的自適應(yīng)標(biāo)簽噪聲清洗算法[7]進(jìn)行數(shù)據(jù)清洗后,用于訓(xùn)練人臉識(shí)別模型,提高了人臉識(shí)別模型的性能。 模型結(jié)構(gòu)使用了MobileNet[8],其利用深度可分離卷積減小了模型體積與計(jì)算量,是一種適用于移動(dòng)設(shè)備的輕量級(jí)深度卷積神經(jīng)網(wǎng)絡(luò)。訓(xùn)練損失函數(shù)使用了SFace[9], SFace在超球面上施加由S型曲線控制的類內(nèi)和類間約束以有裕度地減小類內(nèi)距離而增大類間距離,從而訓(xùn)練出對(duì)訓(xùn)練噪聲魯棒的深度人臉模型,提高了人臉識(shí)別模型的性能。 人臉識(shí)別模型以尺寸為3*112*112的人臉圖像對(duì)齊作為輸入,輸出維度為128維的人臉特征。 C++下特征提取部分API(FaceRecognizerSF類)的使用方式:
Python下特征提取部分API的使用方式: # 在上文的基礎(chǔ)上, 獲取對(duì)齊人臉的特征feature。 人臉特征比對(duì) 對(duì)于不同人臉圖像的人臉特征,經(jīng)過人臉特征比對(duì)求出特征之間的距離,以確定不同人臉圖像是否屬于同一身份。當(dāng)使用consine距離時(shí),值越大,則人臉越相似身份越接近;當(dāng)使用normL2距離時(shí),值越小,則人臉越相似身份越接近。 C++下特征比對(duì)部分API(FaceRecognizerSF類)的使用方式:
Python下特征比對(duì)部分API的使用方式: # 在上文的基礎(chǔ)上, 比對(duì)兩張人臉的特征feature1,feature2以確認(rèn)身份。 參考文獻(xiàn) [1] Liu, Wei, Dragomir, Anguelov, Dumitru, Erhan, Christian, Szegedy, Scott, Reed, Cheng-Yang, Fu, and Alexander C, Berg. 'Ssd: Single shot multibox detector.' . In ECCV, 2016. [2] Howard, Andrew G, Menglong, Zhu, Bo, Chen, Dmitry, Kalenichenko, Weijun, Wang, Tobias, Weyand, Marco, Andreetto, and Hartwig, Adam. 'Mobilenets: Efficient convolutional neural networks for mobile vision applications'. In arXiv:1704.04861, 2017. [3] Yang, Shuo, Ping, Luo, Chen Change, Loy, and Xiaoou, Tang. 'WIDER FACE: A Face Detection Benchmark.' . In CVPR, 2016. [4] Peng, Hanyang, and Shiqi, Yu. 'A Systematic IoU-Related Method: Beyond Simplified Regression for Better Localization'. In TIP, 2021. [5] Mei Wang and Weihong Deng. Deep face recognition: A survey. In Neurocomputing, 2021. [6] Yandong Guo, Lei Zhang, Yuxiao Hu, Xiaodong He, and Jianfeng Gao. Ms-celeb-1m: A dataset and benchmark for large-scale face recognition. In ECCV, 2016. [7] Yaobin Zhang, Weihong Deng, Yaoyao Zhong, Jiani Hu, Xian Li, Dongyue Zhao, and Dongchao Wen. Adaptive Label Noise Cleaning with Meta-Supervision for Deep Face Recognition. In ICCV, 2021. [8] Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto and Hartwig Adam. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. In arXiv:1704.04861, 2017. [9] Yaoyao Zhong, Weihong Deng, Jiani Hu, Dongyue Zhao, Xian Li, and Dongchao Wen. SFace: sigmoid-constrained hypersphere loss for robust face recognition. In TIP, 2021. |
|