Android集成虹軟人臉、人證對比,活體檢測

img.png

本文是基于人臉識別v1.2版本進行封裝;虹軟的活體檢測是有問題的,打印的照片無法檢測出非活體

最近虹軟新增了人證識別、活體檢測的功能,好像之前的人臉識別也更新過版本,之前一篇文章用虹軟Android SDK做人臉識別,寫過虹軟人臉識別的用法,最近把人臉識別、人證識別,活體檢測功能都簡單的封裝了一下,使用起來可以更簡單一點;但是由于appkey是和so庫綁定的,所以不能直接依賴,需要下載項目換成自己的so庫就能使用或者發(fā)布了,還是挺方便的

虹軟人臉識別庫的介紹

so庫和appkey是綁定的

以人臉識別為例,它包括人臉檢測、人臉追蹤、人臉識別、年齡識別、性別識別這5種引擎,每個引擎都有一個so庫和jar包,申請的5種AppKeyAPPID是和自己下載的so庫是綁定的,不能混淆使用

人臉檢測(FD)

用于獲取靜態(tài)圖片的人臉的位置和角度,傳入格式為NV21的圖片數(shù)據(jù)(byte[]),返回一個AFD_FSDKFace對象的集合,AFD_FSDKFace只儲存了一個位置和角度;如果用于視頻流里面好像也不報錯

public class AFD_FSDKFace {
    Rect mRect;
    int mDegree;
    ...

人臉追蹤(FT)

和人臉檢測一樣,也是用來獲取人臉的位置和角度,不過只適用于獲取視頻流的人臉,也就是在相機的onPreviewFrame方法里面使用,返回的是AFT_FSDKFace對象的集合,也只儲存了一個位置和角度;如果用于靜態(tài)圖片好像是會報錯的

public class AFT_FSDKFace {
    Rect mRect;
    int mDegree;
    ...

人臉識別(FR)

用于獲取人臉特征和對比人臉特征的
獲取人臉特征,需要傳入格式為NV21的圖片數(shù)據(jù)(byte[])和人臉的位置、人臉的角度,所以需要先用前面的引擎獲取到人臉的信息,返回一個AFR_FSDKFace對象,這個對象也只保存了人臉特征(byte[])
對比人臉,需要傳入兩個AFR_FSDKFace對象,返回一個AFR_FSDKMatching對象,只保存了相似度

public class AFR_FSDKFace {
    public static final int FEATURE_SIZE = 22020;
    byte[] mFeatureData;
    ...
    
public class AFR_FSDKMatching {
    float mScore = 0.0F;
    ...

活體檢測

活體檢測是檢測是不是活人的,也是傳入人臉的位置、人臉的角度,又是一個新的FaceInfo對象,傳入的是FaceInfo的集合,返回LivenessInfo集合,但是目前只支持單人臉我們只管第一個數(shù)據(jù),LivenessInfo里面保存的返回的結(jié)果,活體、非活體、人臉超過一個、未知錯誤(經(jīng)常返回,問題不大)

人證對比

用來對比人臉和身份證的,傳入傳入格式為NV21的證件照片(byte[])和人臉的照片,還有各自的圖片大小和比對閾值;返回一個CompareResult對象,包括相似度、是否成功等信息

public class CompareResult {
    private boolean isSuccess;
    private double result;
    ...

人證識別其實是人臉識別的那幾個引擎(FD,F(xiàn)T,F(xiàn)R)的集合,所以有同時集成肯定包沖突了,可以使用人臉識別的so庫,然后把人臉識別的jar包都刪了,使用人證的jar包,人證的激活碼使用FR的激活碼就行了

屏幕快照 2018-10-11 下午3.41.05.png-15.5kB
屏幕快照 2018-10-11 下午3.41.05.png-15.5kB

其他的年齡、性別的引擎應該都差不多

封裝后的部分功能的展示

初始化AppKey和APPID

new AcrFaceManagerBuilder().setContext(this)
                .setFreeSdkAppId(Constants.FREESDKAPPID)
                .setFdSdkKey(Constants.FDSDKKEY)
                .setFtSdkKey(Constants.FTSDKKEY)
                .setFrSdkKey(Constants.FRSDKKEY)
                .setLivenessAppId(Constants.LIVENESSAPPID)
                .setLivenessSdkKey(Constants.LIVENESSSDKKEY)
                .create();
    }

相機預覽追蹤人臉位置

//初始化人臉追蹤引擎
FaceTrackService faceTrackService = new FaceTrackService();
//設置傳入的圖片的大小
faceTrackService.setSize(previewSize.width, previewSize.height);
 camera.setPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    //獲取人臉的位置信息
                    List<AFT_FSDKFace> fsdkFaces = faceTrackService.getFtfaces(data);
                    //畫出人臉的位置
                    drawFaceRect(fsdkFaces);
                    //輸出數(shù)據(jù)進行其他處理
                    cameraPreviewListener.onPreviewData(data.clone(), fsdkFaces);
                    ...
                }
            });

相機自己實現(xiàn),獲取人臉位置的代碼非常簡單,就一句代碼,畫出人臉的位置實現(xiàn)是用了兩個surfaceView,一個用于相機畫面展示,另一個畫出人臉的位置

畫出人臉的位置

值得注意的是獲取的人臉的位置Rect是傳入的圖片的相對位置,圖片大小是相機預覽設置的大小,畫的時候是畫在了surfaceView上面,surfaceView一般和預覽大小是不一樣的,而且還要考慮畫面是否旋轉(zhuǎn)、相機的位置等,所以需要先進行轉(zhuǎn)換

Rect rect1=DrawUtils.adjustRect(rect, previewSizeX, previewSizeY,canvas.getWidth(), canvas.getHeight(), cameraOri, cameraId);

獲取人臉特征進行注冊

//初始化人臉識別引擎
FaceRecognitionService faceRecognitionService = new FaceRecognitionService();
faceRecognitionService.setSize(width, height);
//獲取人臉特征
AFR_FSDKFace afr_fsdkFace =faceRecognitionService.faceData(data, aft_fsdkFace.getRect(), aft_fsdkFace.getDegree());
tv_status.setText("人臉特征為:" + afr_fsdkFace.getFeatureData());

aft_fsdkFace為上一步獲取的人臉的位置信息

相機獲取的人臉和已保存的人臉進行對比

//獲取保存的人臉特征
byte[] faceData=faces.get(0).getData();
//對比人臉特征
float socre=faceRecognitionService.faceRecognition(afr_fsdkFace.getFeatureData(),faceData);
tv_status.setText("相似度為:" + sorce);

afr_fsdkFace為上一步獲取的人臉的特征,faceData為已保存的人臉特征,也有提供一個人臉和多個對比獲取相似度最高的一個的方法

活體檢測

 //激活活體檢測
LivenessService.activeEngine(new LivenessActiveListener() {
    @Override
    public void activeSucceed() {
        toast("激活成功");
    }

    @Override
    public void activeFail(String massage) {
        LogUtils.log(massage);
        toast("激活失敗:" + massage);
    }
});
LivenessService livenessService = new LivenessService();
//
List<FaceInfo> faceInfos = new ArrayList<>();
faceInfos.add(new FaceInfo(aft_fsdkFace.getRect(), aft_fsdkFace.getDegree()));
//判斷是否是活體
boolean isLive=livenessService.isLive(faceInfos,data);

aft_fsdkFace為上一步獲取的人臉的位置信息,第一次激活好像需要聯(lián)網(wǎng)

人證對比

//初始化
IdCardVerifyManager.getInstance().init(Constants.IDCARDAPPID, Constants.FRSDKKEY);
//bitmap轉(zhuǎn)NV21數(shù)據(jù)
byte[] nv21Data = ImageUtils.getNV21(bitmap.getWidth(), bitmap.getHeight(), bitmap);
//傳入證件照片
DetectFaceResult result = IdCardVerifyManager.getInstance().inputIdCardData(nv21Data, bitmap.getWidth(), bitmap.getHeight());
//傳入相機獲取的人臉數(shù)據(jù)
DetectFaceResult result = IdCardVerifyManager.getInstance().onPreviewData(data, mWidth, mHeight, true);
//對比相似度
CompareResult compareResult = IdCardVerifyManager.getInstance().compareFeature(THRESHOLD);
if (compareResult.isSuccess()) {
    tv_status.setText("相似度為:" + compareResult.getResult());
}

證件圖片是本地的,轉(zhuǎn)成了NV21的格式的byte數(shù)組,方法也集成了

圖片獲取人臉特征

//先把bitmap轉(zhuǎn)NV21格式
byte[] photoData = ImageUtils.getNV21(bitmap1.getWidth(), bitmap1.getHeight(), bitmap1);
//獲取人臉位置信息
List<AFD_FSDKFace> afd_fsdkFaces = faceFindService.findFace(photoData);
for (AFD_FSDKFace afdFsdkFace : afd_fsdkFaces) {
//獲取每一個人臉的特征
AFR_FSDKFace afr_fsdkFace = faceRecognitionService.faceData(photoData, afdFsdkFace.getRect(), afdFsdkFace.getDegree());
}

引擎釋放

livenessService.destoryEngine();
faceTrackService.destoryEngine();
faceRecognitionService.destroyEngine();
IdCardVerifyManager.getInstance().unInit();

效果都還不錯,主要是全部免費,源碼下載可以直接運行,可以查看所有功能

屏幕快照 2018-10-11 下午4.50.30.png-32.4kB
屏幕快照 2018-10-11 下午4.50.30.png-32.4kB

demo下載地址:http://lc-fgtnb2h8.cn-n1.lcfile.com/1e5588481efc19352e52.apk
項目地址:https://github.com/tyhjh/Arcface

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容