java 虹軟ArcFace 2.0,java SDK使用、人臉識別-抽取人臉特征並做比對


java人臉識別 虹軟ArcFace 2.0,java SDK使用、人臉識別-抽取人臉特征並做比對

虹軟產品地址:http://ai.arcsoft.com.cn/product/arcface.html
虹軟ArcFace功能簡介

人臉檢測
人臉跟蹤
人臉屬性檢測(性別、年齡)
人臉三維角度檢測
人臉對比
本文使用到的SDK為本人自己使用JNA做的封裝,2.0的使用比1.x的版本使用更方便,api更集中更科學
人臉識別:

人臉特征值抽取
人臉特征值比對獲得相似度介於 0.0~1.0之間
【相似度越接近1.0兩個人臉特征數據越有可能是一個人】

 

人臉特征值抽取的步驟:

1,對圖片或者視頻流中的人臉位置進行識別
2,對人臉特征值進行抽取(里面算法比較專業,我們就知道有這么回事就行)
3,保存人臉特征值入特征庫

  

此處的demo,僅僅為了演示,直接進行兩張圖的特征抽取,並進行比對

素材,兩張“朱莉”的照片
![在這里插入圖片描述](https://upload-images.jianshu.io/upload_images/14756949-5e8969535bfacf66.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![在這里插入圖片描述](https://upload-images.jianshu.io/upload_images/14756949-060943b79c715252.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
首先,編寫抽取人臉特征值的代碼,此處需要注意最后一行代碼,返回的時候去new 了一個新的FaceFeature,此處的目的是對FaceFeature做深度copy,因為虹軟對內存做了一些優化,FaceFeature的內存會被重復使用,如果不做深度copy,反復調用該方法,FaceFeature中的特征數據會被覆蓋

 

/**
* 
* @param ins FaceEngine ins = FaceEngine.INSTANCE
* @param hEngine 初始化之後的引擎實例
* @param imgPath 圖片路徑
* @return 人臉特征
*/
public static FaceFeature getFeature(FaceEngine ins,Pointer hEngine,String imgPath) {
IplImage img = cvLoadImage(imgPath);
MultiFaceInfo detectedFaces = new MultiFaceInfo();
BytePointer bp = img.arrayData();
byte[] imgData = new byte[img.arraySize()];
bp.get(imgData);
ins.ASFDetectFaces(hEngine, img.width(), img.height(), ASVL_COLOR_FORMAT.ASVL_PAF_RGB24_B8G8R8,imgData, detectedFaces);
SingleFaceInfo faceInfo = new SingleFaceInfo();
faceInfo.faceRect = detectedFaces.getFaceRects()[0];
faceInfo.faceOrient = detectedFaces.getFaceOriends()[0];
FaceFeature feature = new FaceFeature();
ins.ASFFaceFeatureExtract(hEngine, img.width(), img.height(), ASVL_COLOR_FORMAT.ASVL_PAF_RGB24_B8G8R8, imgData, faceInfo, feature);

return new FaceFeature(feature.getFeatureData());
}

  


有了人臉特征抽取的方法,我們再做人臉比對就很容易了,代碼就幾行:

FaceFeature feature1 = FeatureExtractTest.getFeature(ins,hEngine, "zl1.jpg"); FaceFeature feature2 = FeatureExtractTest.getFeature(ins,hEngine, "zl3.jpg");

FloatByReference confidenceLevel = new FloatByReference();
ins.ASFFaceFeatureCompare(hEngine, feature1, feature2, confidenceLevel);
System.out.println(confidenceLevel.getValue());

  

 

執行后,獲得兩張圖片的人臉相似度值為

0.9412362

  


一般只要相似度超過0.8,就可以認為是一個人。這兩張照片中人臉的相似度高達0.94,應該確定是一個人!!!!

使用已經封裝好的SDK進行人臉識別
https://www.jianshu.com/p/96636db03792
使用已經封裝好的SDK進行人臉識別【人臉特征提取比對】
https://www.jianshu.com/p/ab64464571da
虹軟ArcFace 2.0,java SDK使用、人臉信息識別(年齡、性別)
https://www.jianshu.com/p/cfe90f82be97


免責聲明!

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



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