使用虹軟ArcFac,java 離線SDK 進行人臉識別


   公司項目需要人臉識別登錄,需要支持離線識別,所以無法使用在線的人臉識別的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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM