我司最近要作和人臉識別相關的產品,原來使用的是其餘的在線平臺,識別率和識別速度很滿意,可是隨着量起來的話,成本也是愈來愈不能接受(目前該功能咱們是免費給用戶使用的),並且一旦咱們的設備掉線了就沒法使用人臉識別功能。基於這些考慮,我司須要尋找其餘的方案。
經過搜索,目前發現,開源或免費支持離線的方案也有很多。目前初步考慮虹軟 ArcFace 戳這裏查看詳情和Dlib。經過官方的demo 和 網上的資料,寫了個工程,也能夠在這裏看。
這裏說一下要注意的java
// 轉換圖片矩陣 這個也是主要使用 <span style="background-color: rgb(255, 255, 255);">OpenCV 來處理的</span> private Mat rotateMat(Mat srcMat){ int _cameraDisplayRotation = cameraDisplayRotation; if(mCameraIndex == CAMERA_ID_BACK){ // 後置攝像頭 _cameraDisplayRotation = 180 + _cameraDisplayRotation; } Point center = new Point(srcMat.cols()/2,srcMat.rows()/2); Mat dstMat = srcMat; Mat rotImage = Imgproc.getRotationMatrix2D(center, _cameraDisplayRotation, 1); // 獲取旋轉矩陣 逆時針旋轉。參數說明 center:表示旋轉的中心點;angle:表示旋轉的角度 ;scale:圖像縮放因子 Imgproc.warpAffine(srcMat, dstMat, rotImage, dstMat.size()); // 實現座標系仿射變換。參數說明 src: 輸入源圖像;dst: 輸出圖像;M: 仿射變換矩陣;dsize: 輸出圖像的尺寸 if(mCameraIndex == CAMERA_ID_FRONT){ Core.flip(dstMat,dstMat,1);//整理表示水平翻轉,0表示垂直翻轉,負數表示既有水平也有垂直翻轉 } if(rotImage!=null)rotImage.release(); return dstMat; }
// data 圖片數據 注意數據格式是NV21的,目前虹軟只支持這種格式,能夠經過攝像頭參數設置,也能夠經過相關工具轉換獲得 // width 圖片寬 // height 圖片高 // AFD_FSDKEngine.CP_PAF_NV21 圖片數據格式 目前虹軟只支持這種格式 // faceDB 個人人臉特徵庫 List<AFD_FSDKFace> result_FD = new ArrayList<>(); // 用來存放檢測到的人臉信息列表 AFD_FSDKError error_FD = engine_detection.AFD_FSDK_StillImageFaceDetection(data, width, height, AFD_FSDKEngine.CP_PAF_NV21, result_FD); // 檢測人臉 AFR_FSDKFace face = new AFR_FSDKFace(); // 用來存放提取到的人臉信息 AFR_FSDKMatching score = new AFR_FSDKMatching(); //score用於存放人臉對比的類似度值 for(int i=0; i < result_FD.size(); i++){ AFD_FSDKFace item = result_FD.get(i); Rect itemRect = item.getRect(); // 人臉位置 int degree = item.getDegree(); // 人臉方向 這個比 Dlib 好的地方 AFR_FSDKError error_FR = engine_recognition.AFR_FSDK_ExtractFRFeature(data, width, height, AFR_FSDKEngine.CP_PAF_NV21, itemRect, degree, face); // 提取人臉信息 error_FR = engine_recognition.AFR_FSDK_FacePairMatching(face, item, score); for(int j=0; j<faceDB.getFaceList().size(); j++ ){ AFR_FSDKFace itemFace = faceDB.getFaceList().get(j); error_FR = engine_recognition.AFR_FSDK_FacePairMatching(face, itemFace, score); // 人臉對比 if(score.getScore() > myThreshold){ // 找到類似的人臉 。。。 } } }
測試結果:git
Dlib測試結果
github
機型 | 一次人臉檢測耗時 | 一次一我的臉特徵提取耗時 | 一次人臉特徵比對耗時 |
堅果 U1 | 280毫秒左右 | 6800毫秒左右 | 0.03毫秒左右 |
堅果 pro2 | 93毫秒左右 | 1060毫秒左右 | 0.002毫秒左右 |
虹軟測試結果
工具
機型 | 一次人臉檢測耗時 | 一次一我的臉特徵提取耗時 | 一次人臉特徵比對耗時 |
堅果 U1 | 43毫秒左右 | 943毫秒左右 | 0.883毫秒左右 |
堅果 pro2 | 20毫秒左右 | 314毫秒左右 | 0.308毫秒左右 |