公司項目需要人臉識別登錄,需要支持離線識別,所以無法使用在線的人臉識別的API,於是使用到了離線SDK來對比識別人臉相識度.
獲取人臉抓拍的圖片需要對接設備,這里不做記錄,假設我們已經獲取到了人臉圖片,只調用SDK將抓拍的人臉圖片與已有的進行人臉庫圖片對比,具體步驟如下:
1. 注冊賬號,實名認證
https://ai.arcsoft.com.cn/ucenter/user/userlogin
2. 創建應用,在我的應用里面添加SDK,下載sdk到本地
3. 解壓SDK,將SDK下的libs文件夾的庫文件放到jdk下的lib文件夾下
4. 將SDK libs文件夾下的jar文件導入項目,然后buildpath
5. 編寫測試代碼,進行人臉比對
package net.nblh.faceRecognition.util.faceCompare; import static com.arcsoft.face.toolkit.ImageFactory.getRGBData; import java.io.File; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import com.arcsoft.face.EngineConfiguration; import com.arcsoft.face.FaceEngine; import com.arcsoft.face.FaceFeature; import com.arcsoft.face.FaceInfo; import com.arcsoft.face.FaceSimilar; import com.arcsoft.face.FunctionConfiguration; import com.arcsoft.face.enums.DetectMode; import com.arcsoft.face.enums.DetectOrient; import com.arcsoft.face.enums.ErrorInfo; import com.arcsoft.face.enums.ImageFormat; import com.arcsoft.face.toolkit.ImageInfo; /** * 使用虹軟SDK 進行人臉比對 * @author qxl */ public class ArcFaceCompare { /** * 初始化引擎 * @param appId * @param sdkKey * @return */ public static FaceEngine initFaceEngine(String appId,String sdkKey) { FaceEngine faceEngine = new FaceEngine(); // 激活引擎 int activeCode = faceEngine.activeOnline(appId, sdkKey); if (activeCode != ErrorInfo.MOK.getValue() && activeCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { System.out.println("引擎激活失敗"); return null; } // 引擎配置 EngineConfiguration engineConfiguration = new EngineConfiguration(); engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE); engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY); // 功能配置 FunctionConfiguration functionConfiguration = new FunctionConfiguration(); functionConfiguration.setSupportAge(true); functionConfiguration.setSupportFace3dAngle(true); functionConfiguration.setSupportFaceDetect(true); functionConfiguration.setSupportFaceRecognition(true); functionConfiguration.setSupportGender(true); functionConfiguration.setSupportLiveness(true); functionConfiguration.setSupportIRLiveness(true); engineConfiguration.setFunctionConfiguration(functionConfiguration); // 初始化引擎 int initCode = faceEngine.init(engineConfiguration); if (initCode != ErrorInfo.MOK.getValue()) { System.out.println("初始化引擎失敗"); return null; } return faceEngine; } /** * 人臉圖片比對 * @param faceEngine 人臉識別引擎對象 * @param picPath1 人臉圖片1路徑 * @param picPath2 人臉圖片2路徑 * @return */ public static float faceCompare(FaceEngine faceEngine,String picPath1,String picPath2) { // 人臉檢測 ImageInfo imageInfo = getRGBData(new File(picPath1)); List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>(); int detectCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList); //System.out.println(faceInfoList); // 特征提取 FaceFeature faceFeature = new FaceFeature(); int extractCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList.get(0), faceFeature); //System.out.println("特征值大小:" + faceFeature.getFeatureData().length); // 人臉檢測2 ImageInfo imageInfo2 = getRGBData(new File(picPath2)); List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>(); int detectCode2 = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList2); //System.out.println(faceInfoList); // 特征提取2 FaceFeature faceFeature2 = new FaceFeature(); int extractCode2 = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList2.get(0), faceFeature2); //System.out.println("特征值大小:" + faceFeature.getFeatureData().length); // 特征比對 FaceFeature targetFaceFeature = new FaceFeature(); targetFaceFeature.setFeatureData(faceFeature.getFeatureData()); FaceFeature sourceFaceFeature = new FaceFeature(); sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData()); FaceSimilar faceSimilar = new FaceSimilar(); int compareCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar); float score = faceSimilar.getScore(); BigDecimal b = new BigDecimal(score); //四舍五入,保留四位小數 float similarity =b.setScale(4,BigDecimal.ROUND_HALF_UP).floatValue(); System.out.println("相似度:" + similarity); return similarity; } /** * 卸載引擎 * @param faceEngine */ public static void uninstall(FaceEngine faceEngine) { faceEngine.unInit(); } public static void main(String[] args) { String appId = "圖2創建應用的APP ID"; String sdkKey = "圖2創建應用的SDK Key"; //初始化引擎 FaceEngine faceEngine = initFaceEngine(appId,sdkKey); //進行人臉比對 String picPath1 = "F:\\qxlTest\\1.jpg"; String picPath2 = "F:\\qxlTest\\9.jpg"; float similarity = faceCompare(faceEngine, picPath1, picPath2); //卸載引擎 uninstall(faceEngine); } }
6.運行main方法測試
注意事項:
A: 虹軟人臉識別離線 SDK 每台機器對應一個SDK,第一次激活SDK會與機器綁定,不同的機器需要下載新的SDK
B: 離線 SDK自下載之日起,有效期一年,一年使用時間過后,需要重新下載最新版,同時更新對應的 dll文件, appid 和sdkkey,更新之后請更新以上的APP ID 和 SDK KEY
C: 具體詳見官網 https://ai.arcsoft.com.cn/