小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

使用OpenCV內(nèi)置深度學(xué)習(xí)人臉模塊,幾行代碼輕松完成人臉檢測和識(shí)別

 awoziji 2021-10-20

作者:馮遠(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ā)。

# 人臉檢測
img = cv.imread('path/to/image')
faceDetector = cv.FaceDetectorYN.create('/path/to/model''', img.shape[:2])
faces = faceDetector.detect(image)
# 人臉識(shí)別
recognizer = cv.FaceRecognizerSF.create(recog_model_path, '' )
aligned_face = recognizer.alignCrop(img, faces[1][0])
feature = recognizer.feature(aligned_face)
cosine_score = recognizer.match(feature1, feature2, 0)

    在相應(yīng)的數(shù)據(jù)集上對(duì)OpenCV DNN Face的兩個(gè)模型分別進(jìn)行測試:

  • 人臉檢測模型YuNet在WIDER Face數(shù)據(jù)集的驗(yàn)證集中達(dá)到了0.856(AP_easy),0.842(AP_medium),0.727(AP_hard);

  • 人臉識(shí)別模型SFace在LFW數(shù)據(jù)集上達(dá)到了99.60%的準(zhǔn)確率 (https://docs./master/d0/dd4/tutorial_dnn_face.html中有更詳細(xì)的測試結(jié)果,以及此人臉模塊的一些使用說明)。

     根據(jù)OpenCV最新公開的OpenCV Zoohttps://github.com/opencv/opencv_zoo的基準(zhǔn)測試結(jié)果:

  • 當(dāng)輸入圖像尺寸為160x120時(shí),YuNet在i7-5930K@3.50GHz上達(dá)到689FPS,在樹莓派4B上可達(dá)160FPS;

  • SFace在輸入圖像尺寸為112x112,同樣的平臺(tái)下分別為115FPS和10FPS。

    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類)的使用方式:

 1// 第一步:導(dǎo)入相關(guān)頭文件
2#include <opencv2/imgproc.hpp> // cv::imread
3#include <opencv2/objdetect.hpp>  // cv::FaceDetectorYN & cv::FaceRecognizerSF
4using namespace cv;
5
6int main()
7
{
8// 第二步:讀取圖像
9Mat img = imread('path/to/image');
10// 第三步:初始化FaceDetectorYN
11Ptr<FaceDetectorYN> faceDetector = FaceDetectorYN::create(modelPath, '', img.size());
12// 第四步:檢測人臉并將結(jié)果保存到一個(gè)Mat中
13Mat faces;
14faceDetector->detect(image, faces);
15// faces是一個(gè)nx15的二維Mat,每一行分別是:
16// [x1, y1, w, h, x_re, y_re, x_le, y_le, x_nt, y_nt, x_rcm, y_rcm, x_lcm, y_lcm, score]
17// 其中,x1, y1是人臉框左上角坐標(biāo),w和h分別是人臉框的寬和高;{x, y}_{re, le, nt, rcm, lcm}分別是人臉右眼瞳孔、左眼瞳孔、鼻尖、右嘴角和左嘴角的坐標(biāo);score是該人臉的得分。
18}

Python下人臉檢測API的使用方式:

1import numpy as np # 請(qǐng)?jiān)趇mport cv2前先import numpy以避免一些問題
2import cv2 as cv
3
4img = cv.imread('path/to/image')
5faceDetector = cv.FaceDetectorYN.create('/path/to/model''', img.shape[:2])
6
7faces = faceDetector.detect(image)
8# 如果沒有檢測出人臉,則faces為NoneType而非一個(gè)空的numpy數(shù)組。這是由于OpenCV的Python bindings導(dǎo)致的。
9# 如果檢測出人臉,則faces為一個(gè)len=2的Tuple,其中faces[1]為nx15的二維numpy數(shù)組(排列方式同上)。

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類)的使用方式:

// 初始化FaceRecognizerSF
Ptr<FaceRecognizerSF> faceRecognizer = FaceRecognizerSF::create(recog_model_path, '');

// 在人臉檢測部分的基礎(chǔ)上, 對(duì)齊檢測到的首個(gè)人臉(faces.row(0)), 保存至aligned_face。
Mat aligned_face;
faceRecognizer->alignCrop(image, faces.row(0), aligned_face);

Python下人臉對(duì)齊部分API的使用方式:

# 初始化FaceRecognizerSF
recognizer = cv.FaceRecognizerSF.create(recog_model_path, '' )

# 在人臉檢測部分的基礎(chǔ)上, 對(duì)齊檢測到的首個(gè)人臉(faces[1][0]), 保存至aligned_face。
aligned_face = recognizer.alignCrop(img, faces[1][0])

人臉特征提取

    狹義的人臉識(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類)的使用方式:

// 在上文的基礎(chǔ)上, 獲取對(duì)齊人臉的特征feature。
Mat feature;
faceRecognizer->feature(aligned_face, feature);

Python下特征提取部分API的使用方式:

# 在上文的基礎(chǔ)上, 獲取對(duì)齊人臉的特征feature。
feature = recognizer.feature(aligned_face)

人臉特征比對(duì)

    對(duì)于不同人臉圖像的人臉特征,經(jīng)過人臉特征比對(duì)求出特征之間的距離,以確定不同人臉圖像是否屬于同一身份。當(dāng)使用consine距離時(shí),值越大,則人臉越相似身份越接近;當(dāng)使用normL2距離時(shí),值越小,則人臉越相似身份越接近。

C++下特征比對(duì)部分API(FaceRecognizerSF類)的使用方式:

// 在上文的基礎(chǔ)上, 比對(duì)兩張人臉的特征feature1,feature2以確認(rèn)身份。
// 使用consine距離作為指標(biāo)

double cos_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_COSINE);
if(cos_score >= cosine_similar_thresh) { 
    // the same identity 
else {
    // different identities


// 使用normL2距離作為指標(biāo)
double L2_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_NORM_L2);
if(L2_score <= l2norm_similar_thresh) {
    // the same identity 
else {
    // different identities

Python下特征比對(duì)部分API的使用方式:

# 在上文的基礎(chǔ)上, 比對(duì)兩張人臉的特征feature1,feature2以確認(rèn)身份。
# 使用consine距離作為指標(biāo)

cosine_similarity_threshold = 0.363
cosine_score = recognizer.match(feature1, feature2, 0) 
if cosine_score >= cosine_similarity_threshold: 
    # 'the same identity'
else:
    # 'different identities' 

# 使用normL2距離作為指標(biāo)
l2_similarity_threshold = 1.128
l2_score = recognizer.match(feature1, feature2, 1)
if l2_score <= l2_similarity_threshold: 
    # 'the same identity'
else:
    # 'different identities' 

參考文獻(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.


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多