點擊下方卡片,關注“OpenCV與AI深度學習”
視覺/影像重磅干貨,第一時間送達
導讀
本文主要介紹OpenCV4.5.4中人臉識別模塊的使用和簡易人臉識別系統的搭建,供大家參考,
背景介紹
前幾天剛剛更新的OpenCV4.5.4版本將基于DNN的人臉檢測和人臉識別添加到modules/objdetect中,具體更新介紹如下:
OpenCV4.5.4更新了!看看都有哪些新功能?
人臉檢測使用的是于仕琪老師團隊開源的人臉檢測庫,具體使用可參考往期文章,檢測速度和準確率都很不錯,
OpenCV DNN人臉檢測模塊使用步驟演示(基于OpenCV4.5.4)
效果如下:

同時OpenCV4.5.4 新增了DNN人臉識別模塊,人臉識別部分的模型是由下面幾位貢獻者訓練提供:

在不同資料集下的準確率和推薦閾值設定:

人臉識別模塊使用介紹
DNN人臉識別例程位置:
OpenCV4.5.4_Release\opencv\sources\samples\dnn\face_match.cpp
使用步驟:
① 下載模型檔案:
人臉檢測模型下載地址:https://github.com/ShiqiYu/libfacedetection.train/tree/master/tasks/task1/onnx
人臉識別模型下載地址:
https://drive.google.com/file/d/1ClK9WiB492c5OZFKveF3XiHCejoOxINW/view
下載好了就是下面兩個檔案:

② 人臉檢測(對人臉圖片1和人臉圖片2分別做人臉檢測):
String det_onnx_path = "./yunet.onnx";// Initialize FaceDetectorPtr<FaceDetectorYN> faceDetector;faceDetector = FaceDetectorYN::create(det_onnx_path, "", image1.size(), score_thresh, nms_thresh, top_k);Mat faces_1;faceDetector->detect(image1, faces_1);if (faces_1.rows < 1){std::cerr << "Cannot find a face in " << image1_path << "\n";return -1;}faceDetector = FaceDetectorYN::create(det_onnx_path, "", image2.size(), score_thresh, nms_thresh, top_k);Mat faces_2;faceDetector->detect(image2, faces_2);if (faces_2.rows < 1){std::cerr << "Cannot find a face in " << image2_path << "\n";return -1;}
人臉檢測效果(獲得人臉區域和5點landmark):

③ 人臉裁剪對齊+提取特征:
// Initialize FaceRecognizerSFString reg_onnx_path = "./face_recognizer_fast.onnx";Ptr<FaceRecognizerSF> faceRecognizer = FaceRecognizerSF::create(reg_onnx_path, "");Mat aligned_face1, aligned_face2;faceRecognizer->alignCrop(image1, faces_1.row(0), aligned_face1);faceRecognizer->alignCrop(image2, faces_2.row(0), aligned_face2);Mat feature1, feature2;faceRecognizer->feature(aligned_face1, feature1);feature1 = feature1.clone();faceRecognizer->feature(aligned_face2, feature2);feature2 = feature2.clone();
④ 比對人臉特征相似度,判斷是否為同一個人:
double cos_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_COSINE);double L2_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_NORM_L2);if(cos_score >= cosine_similar_thresh){std::cout << "They have the same identity;";}else{std::cout << "They have different identities;";}std::cout << " Cosine Similarity: " << cos_score << ", threshold: " << cosine_similar_thresh << ". (higher value means higher similarity, max 1.0)\n";if(L2_score <= l2norm_similar_thresh){std::cout << "They have the same identity;";}else{std::cout << "They have different identities.";}std::cout << " NormL2 Distance: " << L2_score << ", threshold: " << l2norm_similar_thresh << ". (lower value means higher similarity, min 0.0)\n";
人臉特征相似度度量有normL2和cosine方法,對應的判斷是否為同一人的閾值分別為1.128和0.363,normL2方法小于閾值1.128判定為同一人,cosine方法大于閾值0.363判定為同一人,
float score_thresh = 0.9f;float nms_thresh = 0.3f;double cosine_similar_thresh = 0.363;double l2norm_similar_thresh = 1.128;int top_k = 5000;
依照上面步驟,我們很快就可以搭建一個類似下面的人臉對比應用程式:
OpenCV DNN人臉識別匹配應用效果展示
匹配準確率已足以應對一般應用,比OpenCV原有的FisherFaceRecognizer、LBPHFaceRecognizer和EigenFaceRecognizer準確率都要好,
人臉識別系統搭建
上面介紹的是搭建一個人臉比對應用,那么如何搭建一個人臉識別系統?步驟又是什么?
我們首先要知道人臉識別一般分為1:1和1:N人臉識別,
1:1人臉識別核心就是人臉比對,比如典型的刷卡人臉識別系統,需要在刷卡(比如工牌,包含姓名等資訊)后做人臉識別,其實就是去找對應路徑下的人臉圖片或人臉特征和當前的人臉特征做比對,來校驗卡和人是否一致,常用于公司的考勤打卡系統,這種系統相對來說比較簡單,前期資料錄入是也只需要采集員工資訊和圖片就可以完成,用上面的人臉比對思路就可以做一個,
1:N人臉識別相較而言就要復雜一些,對演算法的準確率和速度都有很高的要求,在拍照的同時,需要完成資料庫內大量人臉特征的對比,如果用上述OpenCV DNN人臉比對方法可能有些困難,檢測時間問題可以嘗試多執行緒和硬體加速方法,1:N人臉識別常見于小區門禁的人臉識別系統,目前商用系統已較為成熟,
下面是使用OpenCV DNN人臉識別模塊做的一個簡單視頻人臉識別應用,截取舌戰群儒片段,選擇張昭和諸葛亮圖片先提取特征,然后每一幀取比對,判斷相似度,標注識別結果:
OpenCV DNN人臉識別實體之舌戰群儒
原始碼素材與其他應用內容討論,如有需要可加入知識星球中獲取,

同時歡迎大家加入OpenCV與AI深度學習官方微信群一起學習交流:

—THE END—

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323273.html
標籤:其他
上一篇:基于二軸云臺目標跟蹤系統設計
