From ba92b976c7fb9f8bbe4a1bf9d06fa8468d26be58 Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期一, 15 十二月 2025 18:01:13 +0800
Subject: [PATCH] 指纹钥匙柜人脸报错
---
keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java | 1631 +++++++++++++++++++++++++++++-----------------------------
1 files changed, 815 insertions(+), 816 deletions(-)
diff --git a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
index cd1a90f..21befa4 100644
--- a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
+++ b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
@@ -55,6 +55,7 @@
private int mLastFaceId;
private float threholdScore;
+ private String groupId;
public static volatile int initStatus = SDK_UNACTIVATION;
public static volatile boolean initModelSuccess = false;
@@ -87,6 +88,14 @@
faceAuth.setCoreConfigure(BDFaceSDKCommon.BDFaceCoreRunMode.BDFACE_LITE_POWER_NO_BIND, 2);
}
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
public void setActiveLog(boolean isLog) {
if (faceAuth != null) {
if (isLog) {
@@ -96,7 +105,11 @@
}
}
}
-
+ public void destroy(){
+ /*if(rgbInstance!=null){
+ rgbInstance = null;
+ }*/
+ }
public void setCheckMouthMask(boolean checkMouthMask) {
this.checkMouthMask = checkMouthMask;
}
@@ -118,7 +131,7 @@
}
public void initModel(
- final Context context, BDFaceSDKConfig config, boolean isLog, final SdkInitListener listener) {
+ final Context context, BDFaceSDKConfig config, boolean isLog, final SdkInitListener listener) {
setActiveLog(isLog);
initModel(context, config, listener);
}
@@ -144,12 +157,6 @@
startInitModelTime = System.currentTimeMillis();
}
- public void destroy(){
- if(rgbInstance!=null){
- rgbInstance = null;
- }
- }
-
public FaceCrop getFaceCrop() {
return faceModel.getFaceCrop();
}
@@ -168,7 +175,7 @@
public void initDataBases(Context context) {
if (FaceApi.getInstance().getmUserNum() != 0) {
- //ToastUtils.toast(context, "浜鸿劯搴撳姞杞戒腑");
+ ToastUtils.toast(context, "浜鸿劯搴撳姞杞戒腑");
}
emptyFrame();
// 鍒濆鍖栨暟鎹簱
@@ -187,23 +194,23 @@
}
future3 =
- es3.submit(
- new Runnable() {
- @Override
- public void run() {
- faceModel.getFaceSearch().featureClear();
- synchronized (faceModel.getFaceSearch()) {
- List<User> users = FaceApi.getInstance().getAllUserList();
- for (int i = 0; i < users.size(); i++) {
- User user = users.get(i);
- faceModel.getFaceSearch().pushPersonById(user.getId(), user.getFeature());
+ es3.submit(
+ new Runnable() {
+ @Override
+ public void run() {
+ faceModel.getFaceSearch().featureClear();
+ synchronized (faceModel.getFaceSearch()) {
+ List<User> users = FaceApi.getInstance().getAllUserList();
+ for (int i = 0; i < users.size(); i++) {
+ User user = users.get(i);
+ faceModel.getFaceSearch().pushPersonById(user.getId(), user.getFeature());
+ }
+ if (FaceApi.getInstance().getmUserNum() != 0) {
+ ToastUtils.toast(context, "浜鸿劯搴撳姞杞芥垚鍔�");
+ }
+ }
}
- if (FaceApi.getInstance().getmUserNum() != 0) {
- //ToastUtils.toast(context, "浜鸿劯搴撳姞杞芥垚鍔�");
- }
- }
- }
- });
+ });
}
private void setFail(LivenessModel livenessModel) {
@@ -235,12 +242,12 @@
// 蹇�熸娴嬭幏鍙栦汉鑴镐俊鎭紝浠呯敤浜庣粯鍒朵汉鑴告锛岃缁嗕汉鑴告暟鎹悗缁幏鍙�
FaceInfo[] faceInfos =
- faceModel
- .getFaceTrack()
- .track(
- BDFaceSDKCommon.DetectType.DETECT_VIS,
- BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_RGB_FAST,
- rgbInstance);
+ faceModel
+ .getFaceTrack()
+ .track(
+ BDFaceSDKCommon.DetectType.DETECT_VIS,
+ BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_RGB_FAST,
+ rgbInstance);
return faceInfos;
}
@@ -254,18 +261,18 @@
private BDFaceImageInstance getBdImage(BDFaceImageConfig bdFaceImageConfig, boolean darkEnhance) {
BDFaceImageInstance rgbInstance =
- new BDFaceImageInstance(
- bdFaceImageConfig.data,
- bdFaceImageConfig.srcHeight,
- bdFaceImageConfig.srcWidth,
- bdFaceImageConfig.bdFaceImageType,
- bdFaceImageConfig.direction,
- bdFaceImageConfig.mirror);
+ new BDFaceImageInstance(
+ bdFaceImageConfig.data,
+ bdFaceImageConfig.srcHeight,
+ bdFaceImageConfig.srcWidth,
+ bdFaceImageConfig.bdFaceImageType,
+ bdFaceImageConfig.direction,
+ bdFaceImageConfig.mirror);
BDFaceImageInstance rgbInstanceOne;
// 鍒ゆ柇鏆楀厜鎭㈠
if (darkEnhance) {
rgbInstanceOne = faceModel.getDark().faceDarkEnhance(rgbInstance);
-
+ rgbInstance.destory();
} else {
rgbInstanceOne = rgbInstance;
}
@@ -303,22 +310,10 @@
}
AtomicInteger isOutoBoundary = new AtomicInteger();
BDFaceImageInstance cropInstance =
- faceModel.getFaceCrop().cropFaceByLandmark(imageInstance, landmarks, 2.0f, false, isOutoBoundary);
+ faceModel.getFaceCrop().cropFaceByLandmark(imageInstance, landmarks, 2.0f, false, isOutoBoundary);
return cropInstance;
}
- private static BDFaceImageInstance rgbInstance =null;
- private LivenessModel livenessModel;
-
- /**
- * 0:绠$悊鍛橈紝1锛氱敤鎴�
- * @param groupId
- */
- public void setGroupId(String groupId){
- if(livenessModel!=null){
- livenessModel.setGroupId(groupId);
- }
- }
/**
* 妫�娴�-娲讳綋-鐗瑰緛-浜鸿劯妫�绱㈡祦绋�
*
@@ -329,101 +324,98 @@
* @param faceDetectCallBack
*/
public void onDetectCheck(
- final BDFaceImageConfig bdFaceImageConfig,
- final BDFaceImageConfig bdNirFaceImageConfig,
- final BDFaceImageConfig bdDepthFaceImageConfig,
- final BDFaceCheckConfig bdFaceCheckConfig,
- final FaceDetectCallBack faceDetectCallBack) {
+ final BDFaceImageConfig bdFaceImageConfig,
+ final BDFaceImageConfig bdNirFaceImageConfig,
+ final BDFaceImageConfig bdDepthFaceImageConfig,
+ final BDFaceCheckConfig bdFaceCheckConfig,
+ final FaceDetectCallBack faceDetectCallBack) {
if (!FaceSDKManager.initModelSuccess) {
return;
}
long startTime = System.currentTimeMillis();
// 鍒涘缓妫�娴嬬粨鏋滃瓨鍌ㄦ暟鎹�
- livenessModel = new LivenessModel();
+ LivenessModel livenessModel = new LivenessModel();
// 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
// TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
- //System.out.println("==rgbInstance==>鍒濆鍖�");
- if(rgbInstance!=null){
- rgbInstance.destory();
- }
- rgbInstance = getBdImage(bdFaceImageConfig, bdFaceCheckConfig.darkEnhance);
+ BDFaceImageInstance rgbInstance = getBdImage(bdFaceImageConfig, bdFaceCheckConfig.darkEnhance);
livenessModel.setTestBDFaceImageInstanceDuration(System.currentTimeMillis() - startTime);
onTrack(
- rgbInstance,
- livenessModel,
- new DetectListener() {
- @Override
- public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
- // 澶氬抚鍒ゆ柇
- if (!frameSelect(faceInfos[0])) {
- livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
- if (faceDetectCallBack != null && faceAdoptModel != null) {
- //System.out.println("==isOk==>澶氬抚鍒ゆ柇");
- faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
- faceDetectCallBack.onFaceDetectCallback(faceAdoptModel);
- }
+ rgbInstance,
+ livenessModel,
+ new DetectListener() {
+ @Override
+ public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
+ // 澶氬抚鍒ゆ柇
+ if (!frameSelect(faceInfos[0])) {
+ livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
+ if (faceDetectCallBack != null && faceAdoptModel != null) {
+ faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
+ faceDetectCallBack.onFaceDetectCallback(faceAdoptModel);
+ }
+ rgbInstance.destory();
- return;
- }
- // 淇濆瓨浜鸿劯鐗瑰緛鐐�
- livenessModel.setLandmarks(faceInfos[0].landmarks);
- // 淇濆瓨浜鸿劯鍥剧墖
- livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
- // 鍙g僵妫�娴嬫暟鎹�
- if (checkMouthMask) {
- FaceMouthMask mouthMask = getFaceMouthMask();
- if (mouthMask != null) {
- float[] maskScores = mouthMask.checkMask(rgbInstance, faceInfos);
- if (maskScores != null && maskScores.length > 0) {
- float maskResult = maskScores[0];
- Log.d("mouth_mask", "mask_score:" + maskResult);
- if (livenessModel != null) {
- livenessModel.setMouthMaskArray(maskScores);
+ return;
+ }
+ // 淇濆瓨浜鸿劯鐗瑰緛鐐�
+ livenessModel.setLandmarks(faceInfos[0].landmarks);
+ // 淇濆瓨浜鸿劯鍥剧墖
+ livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
+ // 鍙g僵妫�娴嬫暟鎹�
+ if (checkMouthMask) {
+ FaceMouthMask mouthMask = getFaceMouthMask();
+ if (mouthMask != null) {
+ float[] maskScores = mouthMask.checkMask(rgbInstance, faceInfos);
+ if (maskScores != null && maskScores.length > 0) {
+ float maskResult = maskScores[0];
+ Log.d("mouth_mask", "mask_score:" + maskResult);
+ if (livenessModel != null) {
+ livenessModel.setMouthMaskArray(maskScores);
+ }
}
}
}
+
+ // 璋冪敤缁樺埗浜鸿劯妗嗘帴鍙�
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
+ }
+
+ // 閫佹璇嗗埆
+ onLivenessCheck(
+ rgbInstance,
+ bdNirFaceImageConfig,
+ bdDepthFaceImageConfig,
+ bdFaceCheckConfig,
+ livenessModel,
+ startTime,
+ faceDetectCallBack,
+ faceInfos);
}
- // 璋冪敤缁樺埗浜鸿劯妗嗘帴鍙�
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
- }
+ @Override
+ public void onDetectFail() {
- // 閫佹璇嗗埆
- onLivenessCheck(
- rgbInstance,
- bdNirFaceImageConfig,
- bdDepthFaceImageConfig,
- bdFaceCheckConfig,
- livenessModel,
- startTime,
- faceDetectCallBack,
- faceInfos);
- }
+ emptyFrame();
+ // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(null);
+ livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
- @Override
- public void onDetectFail() {
-
- emptyFrame();
- // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(null);
- livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
- //System.out.println("==isOk==>娴佺▼缁撴潫");
// SaveImageManager.getInstance().saveImage(livenessModel, bdFaceCheckConfig.bdLiveConfig);
- faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
- faceDetectCallBack.onTip(0, "鏈娴嬪埌浜鸿劯");
+ faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
+ faceDetectCallBack.onTip(0, "鏈娴嬪埌浜鸿劯");
+ }
+ rgbInstance.destory();
}
- }
- });
+ });
}
private float silentLive(
- BDFaceImageInstance rgbInstance,
- BDFaceSDKCommon.LiveType type,
- float[] landmarks,
- List<Boolean> list,
- float liveScore) {
+ BDFaceImageInstance rgbInstance,
+ BDFaceSDKCommon.LiveType type,
+ float[] landmarks,
+ List<Boolean> list,
+ float liveScore) {
float score = 0;
if (landmarks != null) {
synchronized (faceModel.getFaceLive()) {
@@ -466,11 +458,11 @@
* @return
*/
private float[] silentLives(
- BDFaceImageInstance rgbInstance,
- BDFaceSDKCommon.LiveType type,
- FaceInfo[] faceInfos,
- List<Boolean> list,
- float liveScore) {
+ BDFaceImageInstance rgbInstance,
+ BDFaceSDKCommon.LiveType type,
+ FaceInfo[] faceInfos,
+ List<Boolean> list,
+ float liveScore) {
float[] scores = {0, 0, 0}; // 鏈�澶氭娴�3涓汉鑴�
if (faceInfos != null) {
synchronized (faceModel.getFaceLive()) {
@@ -479,7 +471,7 @@
for (int i = 0; i < size; i++) {
scores[i] =
- faceModel.getFaceLive().silentLive(type, rgbInstance, faceInfos[i].landmarks, liveScore);
+ faceModel.getFaceLive().silentLive(type, rgbInstance, faceInfos[i].landmarks, liveScore);
}
}
}
@@ -487,11 +479,11 @@
}
private void onDetect(
- BDFaceCheckConfig bdFaceCheckConfig,
- BDFaceImageInstance rgbInstance,
- FaceInfo[] fastFaceInfos,
- LivenessModel livenessModel,
- DetectListener detectListener) {
+ BDFaceCheckConfig bdFaceCheckConfig,
+ BDFaceImageInstance rgbInstance,
+ FaceInfo[] fastFaceInfos,
+ LivenessModel livenessModel,
+ DetectListener detectListener) {
long accurateTime = System.currentTimeMillis();
FaceInfo[] faceInfos;
@@ -499,14 +491,14 @@
if (bdFaceCheckConfig != null) {
bdFaceCheckConfig.bdFaceDetectListConfig.usingQuality = true;
faceInfos =
- faceModel
- .getFaceDetect()
- .detect(
- BDFaceSDKCommon.DetectType.DETECT_VIS,
- BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_RGB_ACCURATE,
- rgbInstance,
- fastFaceInfos,
- bdFaceCheckConfig.bdFaceDetectListConfig);
+ faceModel
+ .getFaceDetect()
+ .detect(
+ BDFaceSDKCommon.DetectType.DETECT_VIS,
+ BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_RGB_ACCURATE,
+ rgbInstance,
+ fastFaceInfos,
+ bdFaceCheckConfig.bdFaceDetectListConfig);
} else {
faceInfos = faceModel.getFaceDetect().detect(BDFaceSDKCommon.DetectType.DETECT_VIS, rgbInstance);
@@ -515,7 +507,7 @@
livenessModel.setAccurateTime(System.currentTimeMillis() - accurateTime);
if (faceInfos == null || faceInfos.length <= 0) {
-
+ rgbInstance.destory();
detectListener.onDetectFail();
return;
}
@@ -544,100 +536,101 @@
* @param faceDetectCallBack
*/
public void onLivenessCheck(
- final BDFaceImageInstance rgbInstance,
- final BDFaceImageConfig nirBDFaceImageConfig,
- final BDFaceImageConfig depthBDFaceImageConfig,
- final BDFaceCheckConfig bdFaceCheckConfig,
- final LivenessModel livenessModel,
- final long startTime,
- final FaceDetectCallBack faceDetectCallBack,
- final FaceInfo[] fastFaceInfos) {
+ final BDFaceImageInstance rgbInstance,
+ final BDFaceImageConfig nirBDFaceImageConfig,
+ final BDFaceImageConfig depthBDFaceImageConfig,
+ final BDFaceCheckConfig bdFaceCheckConfig,
+ final LivenessModel livenessModel,
+ final long startTime,
+ final FaceDetectCallBack faceDetectCallBack,
+ final FaceInfo[] fastFaceInfos) {
+
if (future2 != null && !future2.isDone()) {
// 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
- //future2.cancel(true);
-
- //System.out.println("==isOk==>涔嬪墠娌$粨鏉�");
+ rgbInstance.destory();
return;
}
future2 =
- es2.submit(
- new Runnable() {
+ es2.submit(
+ new Runnable() {
- @Override
- public void run() {
+ @Override
+ public void run() {
- // 鑾峰彇BDFaceCheckConfig閰嶇疆淇℃伅
- if (bdFaceCheckConfig == null) {
+ // 鑾峰彇BDFaceCheckConfig閰嶇疆淇℃伅
+ if (bdFaceCheckConfig == null) {
+ rgbInstance.destory();
- return;
- }
- onDetect(
- bdFaceCheckConfig,
- rgbInstance,
- fastFaceInfos,
- livenessModel,
- new DetectListener() {
+ return;
+ }
+ onDetect(
+ bdFaceCheckConfig,
+ rgbInstance,
+ fastFaceInfos,
+ livenessModel,
+ new DetectListener() {
- @Override
- public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
+ @Override
+ public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
- // 浜鸿劯id璧嬪��
- if (mLastFaceId != fastFaceInfos[0].faceID) {
- mLastFaceId = fastFaceInfos[0].faceID;
- mRgbLiveList.clear();
- mNirLiveList.clear();
- }
+ // 浜鸿劯id璧嬪��
+ if (mLastFaceId != fastFaceInfos[0].faceID) {
+ mLastFaceId = fastFaceInfos[0].faceID;
+ mRgbLiveList.clear();
+ mNirLiveList.clear();
+ }
- if (bdFaceCheckConfig == null) {
+ if (bdFaceCheckConfig == null) {
+ rgbInstance.destory();
+ livenessModel.clearIdentifyResults();
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ return;
+ }
- livenessModel.clearIdentifyResults();
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
+ // 鏈�浼樹汉鑴告帶鍒�
+ if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
+ livenessModel.setQualityCheck(true);
+ livenessModel.clearIdentifyResults();
+ rgbInstance.destory();
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ return;
+ }
- // 鏈�浼樹汉鑴告帶鍒�
- if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
- livenessModel.setQualityCheck(true);
- livenessModel.clearIdentifyResults();
+ // 璐ㄩ噺妫�娴嬫湭閫氳繃,閿�姣丅DFaceImageInstance锛岀粨鏉熷嚱鏁�
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
+ if (!onQualityCheck(
+ faceInfos, bdFaceCheckConfig.bdQualityConfig, faceDetectCallBack)) {
+ livenessModel.setQualityCheck(true);
+ livenessModel.clearIdentifyResults();
+ rgbInstance.destory();
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
- // 璐ㄩ噺妫�娴嬫湭閫氳繃,閿�姣丅DFaceImageInstance锛岀粨鏉熷嚱鏁�
+ return;
+ }
- if (!onQualityCheck(
- faceInfos, bdFaceCheckConfig.bdQualityConfig, faceDetectCallBack)) {
- livenessModel.setQualityCheck(true);
- livenessModel.clearIdentifyResults();
+ livenessModel.setQualityCheck(false);
+ // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
+ // TODO 娲讳綋妫�娴�
+ float[] rgbScores = {-1};
+ BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
+ boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
-
- livenessModel.setQualityCheck(false);
- // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
- // TODO 娲讳綋妫�娴�
- float[] rgbScores = {-1};
- BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
- boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
-
- if (isLiveCheck) {
- long startRgbTime = System.currentTimeMillis();
- rgbScores =
- silentLives(
- rgbInstance,
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
- faceInfos,
- mRgbLiveList,
- bdLiveConfig.rgbLiveScore);
+ if (isLiveCheck) {
+ long startRgbTime = System.currentTimeMillis();
+ rgbScores =
+ silentLives(
+ rgbInstance,
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
+ faceInfos,
+ mRgbLiveList,
+ bdLiveConfig.rgbLiveScore);
/* if (rgbScores != null){
int size = rgbScores.length;
Log.d("Attend", "score size:" + size);
@@ -646,222 +639,223 @@
}
} */
- if (faceInfos.length == 1) {
- livenessModel.setRgbLivenessScore(rgbScores[0]);
- }
- livenessModel.setRgbLivenessScores(rgbScores);
- livenessModel.setRgbLivenessDuration(System.currentTimeMillis() - startRgbTime);
- }
+ if (faceInfos.length == 1) {
+ livenessModel.setRgbLivenessScore(rgbScores[0]);
+ }
+ livenessModel.setRgbLivenessScores(rgbScores);
+ livenessModel.setRgbLivenessDuration(System.currentTimeMillis() - startRgbTime);
+ }
- // TODO nir娲讳綋妫�娴�
- float nirScore = -1;
- FaceInfo[] faceInfosIr = null;
- BDFaceImageInstance nirInstance = null;
- boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
- if (isHaveNirImage) {
- // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
- // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
- long nirInstanceTime = System.currentTimeMillis();
- nirInstance = getBdImage(nirBDFaceImageConfig, false);
+ // TODO nir娲讳綋妫�娴�
+ float nirScore = -1;
+ FaceInfo[] faceInfosIr = null;
+ BDFaceImageInstance nirInstance = null;
+ boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
+ if (isHaveNirImage) {
+ // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
+ // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
+ long nirInstanceTime = System.currentTimeMillis();
+ nirInstance = getBdImage(nirBDFaceImageConfig, false);
- livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
- livenessModel.setNirInstanceTime(System.currentTimeMillis() - nirInstanceTime);
+ livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
+ livenessModel.setNirInstanceTime(System.currentTimeMillis() - nirInstanceTime);
- // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
- long startIrDetectTime = System.currentTimeMillis();
- BDFaceDetectListConf bdFaceDetectListConf = new BDFaceDetectListConf();
- bdFaceDetectListConf.usingDetect = true;
- faceInfosIr =
- faceModel
- .getFaceNirDetect()
- .detect(
- BDFaceSDKCommon.DetectType.DETECT_NIR,
- BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_NIR_ACCURATE,
- nirInstance,
- null,
- bdFaceDetectListConf);
- livenessModel.setIrLivenessDuration(
- System.currentTimeMillis() - startIrDetectTime);
- // LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
- if (faceInfosIr != null && faceInfosIr.length > 0) {
- FaceInfo faceInfoIr = faceInfosIr[0];
- nirScore =
- silentLive(
- nirInstance,
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_NIR,
- faceInfoIr.landmarks,
- mNirLiveList,
- bdLiveConfig.nirLiveScore);
- livenessModel.setIrLivenessScore(nirScore);
- // LogUtils.e(TIME_TAG, "live ir time = " + livenessModel.getIrLivenessDuration());
- }
- }
+ // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
+ long startIrDetectTime = System.currentTimeMillis();
+ BDFaceDetectListConf bdFaceDetectListConf = new BDFaceDetectListConf();
+ bdFaceDetectListConf.usingDetect = true;
+ faceInfosIr =
+ faceModel
+ .getFaceNirDetect()
+ .detect(
+ BDFaceSDKCommon.DetectType.DETECT_NIR,
+ BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_NIR_ACCURATE,
+ nirInstance,
+ null,
+ bdFaceDetectListConf);
+ livenessModel.setIrLivenessDuration(
+ System.currentTimeMillis() - startIrDetectTime);
+ // LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
+ if (faceInfosIr != null && faceInfosIr.length > 0) {
+ FaceInfo faceInfoIr = faceInfosIr[0];
+ nirScore =
+ silentLive(
+ nirInstance,
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_NIR,
+ faceInfoIr.landmarks,
+ mNirLiveList,
+ bdLiveConfig.nirLiveScore);
+ livenessModel.setIrLivenessScore(nirScore);
+ // LogUtils.e(TIME_TAG, "live ir time = " + livenessModel.getIrLivenessDuration());
+ }
+ }
- // TODO depth娲讳綋妫�娴�
- float depthScore = -1;
- boolean isHaveDepthImage = depthBDFaceImageConfig != null && isLiveCheck;
- if (depthBDFaceImageConfig != null) {
- // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
- float[] depthLandmark = new float[faceInfos[0].landmarks.length];
- BDFaceImageInstance depthInstance;
- if (bdFaceCheckConfig.cameraType == 1) {
- System.arraycopy(
- faceInfos[0].landmarks,
- 0,
- depthLandmark,
- 0,
- faceInfos[0].landmarks.length);
- for (int i = 0; i < 144; i = i + 2) {
- depthLandmark[i] -= 80;
- }
- } else {
- depthLandmark = faceInfos[0].landmarks;
- }
- depthInstance = getBdImage(depthBDFaceImageConfig, false);
- livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
- // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
- long startDepthTime = System.currentTimeMillis();
- depthScore =
- faceModel
- .getFaceLive()
- .silentLive(
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
- depthInstance,
- depthLandmark);
- livenessModel.setDepthLivenessScore(depthScore);
- livenessModel.setDepthtLivenessDuration(
- System.currentTimeMillis() - startDepthTime);
- // LogUtils.e(TIME_TAG, "live depth time = " + livenessModel.getDepthtLivenessDuration());
- depthInstance.destory();
- }
+ // TODO depth娲讳綋妫�娴�
+ float depthScore = -1;
+ boolean isHaveDepthImage = depthBDFaceImageConfig != null && isLiveCheck;
+ if (depthBDFaceImageConfig != null) {
+ // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
+ float[] depthLandmark = new float[faceInfos[0].landmarks.length];
+ BDFaceImageInstance depthInstance;
+ if (bdFaceCheckConfig.cameraType == 1) {
+ System.arraycopy(
+ faceInfos[0].landmarks,
+ 0,
+ depthLandmark,
+ 0,
+ faceInfos[0].landmarks.length);
+ for (int i = 0; i < 144; i = i + 2) {
+ depthLandmark[i] -= 80;
+ }
+ } else {
+ depthLandmark = faceInfos[0].landmarks;
+ }
+ depthInstance = getBdImage(depthBDFaceImageConfig, false);
+ livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
+ // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
+ long startDepthTime = System.currentTimeMillis();
+ depthScore =
+ faceModel
+ .getFaceLive()
+ .silentLive(
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
+ depthInstance,
+ depthLandmark);
+ livenessModel.setDepthLivenessScore(depthScore);
+ livenessModel.setDepthtLivenessDuration(
+ System.currentTimeMillis() - startDepthTime);
+ // LogUtils.e(TIME_TAG, "live depth time = " + livenessModel.getDepthtLivenessDuration());
+ depthInstance.destory();
+ }
- boolean isRgbScoreCheck = false;
- boolean isNirScoreCheck = false;
- boolean isDepthScoreCheck = false;
- if (isLiveCheck) {
- int size = rgbScores.length;
- for (int i = 0; i < size; i++) {
- if (rgbScores[i] > bdLiveConfig.rgbLiveScore) {
- isRgbScoreCheck = true;
- }
- }
- // isRgbScoreCheck = true; // liujinhui for test
- // isRgbScoreCheck = (rgbScores[0] > bdLiveConfig.rgbLiveScore);
- isNirScoreCheck =
- (isHaveNirImage ? nirScore > bdLiveConfig.nirLiveScore : true);
- isDepthScoreCheck =
- (isHaveDepthImage ? depthScore > bdLiveConfig.depthLiveScore : true);
- }
+ boolean isRgbScoreCheck = false;
+ boolean isNirScoreCheck = false;
+ boolean isDepthScoreCheck = false;
+ if (isLiveCheck) {
+ int size = rgbScores.length;
+ for (int i = 0; i < size; i++) {
+ if (rgbScores[i] > bdLiveConfig.rgbLiveScore) {
+ isRgbScoreCheck = true;
+ }
+ }
+ // isRgbScoreCheck = true; // liujinhui for test
+ // isRgbScoreCheck = (rgbScores[0] > bdLiveConfig.rgbLiveScore);
+ isNirScoreCheck =
+ (isHaveNirImage ? nirScore > bdLiveConfig.nirLiveScore : true);
+ isDepthScoreCheck =
+ (isHaveDepthImage ? depthScore > bdLiveConfig.depthLiveScore : true);
+ }
- // 濡傛灉璁剧疆涓轰笉杩涜娲讳綋妫�娴�
- int liveCheckMode = livenessModel.getLiveType();
- if (liveCheckMode == 0){
- isRgbScoreCheck = true;
- }
- // TODO 鐗瑰緛鎻愬彇+浜鸿劯妫�绱�
- if (!isLiveCheck || (isRgbScoreCheck && isNirScoreCheck && isDepthScoreCheck)) {
- if (livenessModel != null) {
- livenessModel.clearIdentifyResults();
- livenessModel.setUser(null);
- }
-
- synchronized (faceModel.getFaceSearch()) {
- if (faceInfos != null) {
- int size = faceInfos.length;
-
- for (int i = 0; i < size; i++) {
- // 鐗瑰緛鎻愬彇
- // 妯$硦缁撴灉杩囨护,鎴村彛缃╂椂鍊欙紝涓嶈繘琛岃繃婊�
- if (!checkMouthMask) {
- float blur = faceInfos[i].bluriness;
- BDFaceOcclusion occlusion = faceInfos[i].occlusion;
- float leftEye = occlusion.leftEye;
- // "宸︾溂閬尅"
- float rightEye = occlusion.rightEye;
- // "鍙崇溂閬尅"
- float nose = occlusion.nose;
- // "榧诲瓙閬尅缃俊搴�"
- float mouth = occlusion.mouth;
- // "鍢村反閬尅缃俊搴�"
- float leftCheek = occlusion.leftCheek;
- // "宸﹁劯閬尅"
- float rightCheek = occlusion.rightCheek;
- // "鍙宠劯閬尅"
- float chin = occlusion.chin;
- // 鍔ㄦ�佸簳搴撻檺鍒�
- faceModel
- .getFaceSearch()
- .setNeedJoinDB(
- selectQuality(
- blur,
- leftEye,
- rightEye,
- nose,
- mouth,
- leftCheek,
- rightCheek,
- chin));
+ // 濡傛灉璁剧疆涓轰笉杩涜娲讳綋妫�娴�
+ int liveCheckMode = livenessModel.getLiveType();
+ if (liveCheckMode == 0){
+ isRgbScoreCheck = true;
+ }
+ // TODO 鐗瑰緛鎻愬彇+浜鸿劯妫�绱�
+ if (!isLiveCheck || (isRgbScoreCheck && isNirScoreCheck && isDepthScoreCheck)) {
+ if (livenessModel != null) {
+ livenessModel.clearIdentifyResults();
+ livenessModel.setUser(null);
}
- if (bdLiveConfig != null){
- onFeatureChecks(
- i,
- rgbInstance,
- bdFaceCheckConfig,
- faceInfos,
- faceInfosIr,
- nirInstance,
- livenessModel,
- bdFaceCheckConfig.secondFeature,
- bdFaceCheckConfig.featureCheckMode,
- bdFaceCheckConfig.activeModel,
- rgbScores,
- bdLiveConfig.rgbLiveScore);
- } else{
- onFeatureChecks(
- i,
- rgbInstance,
- bdFaceCheckConfig,
- faceInfos,
- faceInfosIr,
- nirInstance,
- livenessModel,
- bdFaceCheckConfig.secondFeature,
- bdFaceCheckConfig.featureCheckMode,
- bdFaceCheckConfig.activeModel,
- rgbScores,
- -1);
- }
+ synchronized (faceModel.getFaceSearch()) {
+ if (faceInfos != null) {
+ int size = faceInfos.length;
+ for (int i = 0; i < size; i++) {
+ // 鐗瑰緛鎻愬彇
+ // 妯$硦缁撴灉杩囨护,鎴村彛缃╂椂鍊欙紝涓嶈繘琛岃繃婊�
+ if (!checkMouthMask) {
+ float blur = faceInfos[i].bluriness;
+ BDFaceOcclusion occlusion = faceInfos[i].occlusion;
+ float leftEye = occlusion.leftEye;
+ // "宸︾溂閬尅"
+ float rightEye = occlusion.rightEye;
+ // "鍙崇溂閬尅"
+ float nose = occlusion.nose;
+ // "榧诲瓙閬尅缃俊搴�"
+ float mouth = occlusion.mouth;
+ // "鍢村反閬尅缃俊搴�"
+ float leftCheek = occlusion.leftCheek;
+ // "宸﹁劯閬尅"
+ float rightCheek = occlusion.rightCheek;
+ // "鍙宠劯閬尅"
+ float chin = occlusion.chin;
+ // 鍔ㄦ�佸簳搴撻檺鍒�
+ faceModel
+ .getFaceSearch()
+ .setNeedJoinDB(
+ selectQuality(
+ blur,
+ leftEye,
+ rightEye,
+ nose,
+ mouth,
+ leftCheek,
+ rightCheek,
+ chin));
+ }
+
+ if (bdLiveConfig != null){
+ onFeatureChecks(
+ i,
+ rgbInstance,
+ bdFaceCheckConfig,
+ faceInfos,
+ faceInfosIr,
+ nirInstance,
+ livenessModel,
+ bdFaceCheckConfig.secondFeature,
+ bdFaceCheckConfig.featureCheckMode,
+ bdFaceCheckConfig.activeModel,
+ rgbScores,
+ bdLiveConfig.rgbLiveScore);
+ }
+ else{
+ onFeatureChecks(
+ i,
+ rgbInstance,
+ bdFaceCheckConfig,
+ faceInfos,
+ faceInfosIr,
+ nirInstance,
+ livenessModel,
+ bdFaceCheckConfig.secondFeature,
+ bdFaceCheckConfig.featureCheckMode,
+ bdFaceCheckConfig.activeModel,
+ rgbScores,
+ -1);
+ }
+
+ }
+ }
+ }
+ }
+
+ // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
+ livenessModel.setAllDetectDuration(System.currentTimeMillis() - startTime);
+ // LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
+ // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+ rgbInstance.destory();
+ if (nirInstance != null) {
+ nirInstance.destory();
+ }
+ // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
}
}
- }
- }
- // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
- livenessModel.setAllDetectDuration(System.currentTimeMillis() - startTime);
- // LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
- // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+ @Override
+ public void onDetectFail() {
- if (nirInstance != null) {
- nirInstance.destory();
- }
- // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- }
-
- @Override
- public void onDetectFail() {
-
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- }
- });
- }
- });
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ }
+ });
+ }
+ });
}
/**
@@ -872,7 +866,7 @@
* @return
*/
public boolean onBestImageCheck(
- LivenessModel livenessModel, BDFaceCheckConfig bdFaceCheckConfig, FaceDetectCallBack faceDetectCallBack) {
+ LivenessModel livenessModel, BDFaceCheckConfig bdFaceCheckConfig, FaceDetectCallBack faceDetectCallBack) {
boolean isBestImageCheck = false;
if (livenessModel != null && livenessModel.getFaceInfos() != null) {
FaceInfo[] faceInfos = livenessModel.getFaceInfos();
@@ -899,15 +893,15 @@
* @param featureType 鐗瑰緛鎶藉彇妯℃�佹墽琛� 銆愮敓娲荤収锛�1銆戯紱銆愯瘉浠剁収锛�2銆戯紱銆愭贩鍚堟ā鎬侊細3銆戯紱
*/
private void onFeatureCheck(
- BDFaceImageInstance rgbInstance,
- BDFaceCheckConfig bdFaceCheckConfig,
- float[] landmark,
- FaceInfo[] faceInfos,
- BDFaceImageInstance nirInstance,
- LivenessModel livenessModel,
- byte[] secondFeature,
- final int featureCheckMode,
- final int featureType) {
+ BDFaceImageInstance rgbInstance,
+ BDFaceCheckConfig bdFaceCheckConfig,
+ float[] landmark,
+ FaceInfo[] faceInfos,
+ BDFaceImageInstance nirInstance,
+ LivenessModel livenessModel,
+ byte[] secondFeature,
+ final int featureCheckMode,
+ final int featureType) {
// 濡傛灉涓嶆娊鍙栫壒寰侊紝鐩存帴杩斿洖
if (featureCheckMode == 1) {
return;
@@ -921,9 +915,9 @@
BDQualityConfig bdQualityConfig = bdFaceCheckConfig.bdQualityConfig;
boolean isIllum = bdQualityConfig != null ? illumScore < bdQualityConfig.illum : false;
BDFaceSDKCommon.FeatureType type =
- isIllum
- ? BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_NIR
- : BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO;
+ isIllum
+ ? BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_NIR
+ : BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO;
BDFaceImageInstance bdFaceImageInstance = isIllum ? nirInstance : rgbInstance;
float[] landmarks = isIllum ? faceInfos[0].landmarks : landmark;
@@ -933,33 +927,33 @@
livenessModel.setFeature(feature);
// 浜鸿劯妫�绱�
featureSearch(
- featureCheckMode,
- livenessModel,
- bdFaceCheckConfig,
- feature,
- secondFeature,
- featureSize,
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
+ featureCheckMode,
+ livenessModel,
+ bdFaceCheckConfig,
+ feature,
+ secondFeature,
+ featureSize,
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
} else {
// 鐢熸椿鐓ф绱�
long startFeatureTime = System.currentTimeMillis();
float featureSize =
- faceModel
- .getFaceFeature()
- .feature(
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO, rgbInstance, landmark, feature);
+ faceModel
+ .getFaceFeature()
+ .feature(
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO, rgbInstance, landmark, feature);
livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
livenessModel.setFeature(feature);
livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
// 浜鸿劯妫�绱�
featureSearch(
- featureCheckMode,
- livenessModel,
- bdFaceCheckConfig,
- feature,
- secondFeature,
- featureSize,
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
+ featureCheckMode,
+ livenessModel,
+ bdFaceCheckConfig,
+ feature,
+ secondFeature,
+ featureSize,
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
}
}
@@ -977,21 +971,22 @@
* @param liveScore 鍙鍏夋椿浣撻槇鍊�
*/
private void onFeatureChecks(
- int index,
- BDFaceImageInstance rgbInstance,
- BDFaceCheckConfig bdFaceCheckConfig,
- FaceInfo[] rgbFaceInfos,
- FaceInfo[] faceInfos,
- BDFaceImageInstance nirInstance,
- LivenessModel livenessModel,
- byte[] secondFeature,
- final int featureCheckMode,
- final int featureType,
- float[] rgbScores,
- float liveScore) {
+ int index,
+ BDFaceImageInstance rgbInstance,
+ BDFaceCheckConfig bdFaceCheckConfig,
+ FaceInfo[] rgbFaceInfos,
+ FaceInfo[] faceInfos,
+ BDFaceImageInstance nirInstance,
+ LivenessModel livenessModel,
+ byte[] secondFeature,
+ final int featureCheckMode,
+ final int featureType,
+ float[] rgbScores,
+ float liveScore) {
// 濡傛灉涓嶆娊鍙栫壒寰侊紝鐩存帴杩斿洖
if (featureCheckMode == 1) {
+
return;
}
byte[] feature = new byte[512];
@@ -1004,9 +999,9 @@
BDQualityConfig bdQualityConfig = bdFaceCheckConfig.bdQualityConfig;
boolean isIllum = bdQualityConfig != null ? illumScore < bdQualityConfig.illum : false;
BDFaceSDKCommon.FeatureType type =
- isIllum
- ? BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_NIR
- : BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO;
+ isIllum
+ ? BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_NIR
+ : BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO;
BDFaceImageInstance bdFaceImageInstance = isIllum ? nirInstance : rgbInstance;
if (rgbFaceInfos == null) {
@@ -1033,19 +1028,20 @@
livenessModel.setFeature(feature);
// 浜鸿劯妫�绱�
featureSearchs(
- index,
- featureCheckMode,
- livenessModel,
- bdFaceCheckConfig,
- feature,
- secondFeature,
- featureSize,
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
+ index,
+ featureCheckMode,
+ livenessModel,
+ bdFaceCheckConfig,
+ feature,
+ secondFeature,
+ featureSize,
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
} else {
// 鐢熸椿鐓ф绱�
long startFeatureTime = System.currentTimeMillis();
if (rgbFaceInfos == null) {
+
return;
}
@@ -1063,27 +1059,28 @@
}
float featureSize =
- faceModel
- .getFaceFeature()
- .feature(
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO,
- rgbInstance,
- rgbFaceInfos[index].landmarks,
- feature);
+ faceModel
+ .getFaceFeature()
+ .feature(
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO,
+ rgbInstance,
+ rgbFaceInfos[index].landmarks,
+ feature);
livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
livenessModel.setFeature(feature);
livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
// 浜鸿劯妫�绱�
+
featureSearchs(
- index,
- featureCheckMode,
- livenessModel,
- bdFaceCheckConfig,
- feature,
- secondFeature,
- featureSize,
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
+ index,
+ featureCheckMode,
+ livenessModel,
+ bdFaceCheckConfig,
+ feature,
+ secondFeature,
+ featureSize,
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
}
}
@@ -1098,13 +1095,13 @@
* @param type 鐗瑰緛鎻愬彇绫诲瀷
*/
private void featureSearch(
- final int featureCheckMode,
- LivenessModel livenessModel,
- BDFaceCheckConfig bdFaceCheckConfig,
- byte[] feature,
- byte[] secondFeature,
- float featureSize,
- BDFaceSDKCommon.FeatureType type) {
+ final int featureCheckMode,
+ LivenessModel livenessModel,
+ BDFaceCheckConfig bdFaceCheckConfig,
+ byte[] feature,
+ byte[] secondFeature,
+ float featureSize,
+ BDFaceSDKCommon.FeatureType type) {
// 濡傛灉鍙彁鍘荤壒寰侊紝涓嶅仛妫�绱紝姝ゅ杩斿洖
if (featureCheckMode == 2) {
@@ -1118,7 +1115,7 @@
// TODO 闃堝�煎彲浠ユ牴鎹笉鍚屾ā鍨嬭皟鏁�
if (featureCheckMode == 3) {
List<? extends Feature> featureResult =
- faceModel.getFaceSearch().search(type, bdFaceCheckConfig.scoreThreshold, 1, feature, false);
+ faceModel.getFaceSearch().search(type, bdFaceCheckConfig.scoreThreshold, 1, feature, false);
// TODO 杩斿洖top num = 1 涓暟鎹泦鍚堬紝姝ゅ鍙互浠绘剰璁剧疆锛屼細杩斿洖姣斿浠庡ぇ鍒板皬鎺掑簭鐨刵um 涓暟鎹泦鍚�
if (featureResult != null && featureResult.size() > 0) {
@@ -1151,13 +1148,13 @@
} else if (featureCheckMode == 4) {
// 鐩墠浠呮敮鎸�
float score =
- faceModel
- .getFaceSearch()
- .compare(
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO,
- livenessModel.getFeature(),
- secondFeature,
- true);
+ faceModel
+ .getFaceSearch()
+ .compare(
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO,
+ livenessModel.getFeature(),
+ secondFeature,
+ true);
livenessModel.setScore(score);
if (score > threholdScore) {
/*faceId = livenessModel.getFaceInfo().faceID;
@@ -1185,14 +1182,14 @@
* @param type 鐗瑰緛鎻愬彇绫诲瀷
*/
private void featureSearchs(
- final int index,
- final int featureCheckMode,
- LivenessModel livenessModel,
- BDFaceCheckConfig bdFaceCheckConfig,
- byte[] feature,
- byte[] secondFeature,
- float featureSize,
- BDFaceSDKCommon.FeatureType type) {
+ final int index,
+ final int featureCheckMode,
+ LivenessModel livenessModel,
+ BDFaceCheckConfig bdFaceCheckConfig,
+ byte[] feature,
+ byte[] secondFeature,
+ float featureSize,
+ BDFaceSDKCommon.FeatureType type) {
// 濡傛灉鍙彁鍘荤壒寰侊紝涓嶅仛妫�绱紝姝ゅ杩斿洖
@@ -1200,40 +1197,46 @@
livenessModel.setFeatureCode(featureSize);
return;
}
+
// 濡傛灉鎻愬彇鐗瑰緛+妫�绱紝璋冪敤search 鏂规硶
if (featureSize == FEATURE_SIZE / 4) {
long startFeature = System.currentTimeMillis();
// 鐗瑰緛鎻愬彇鎴愬姛
+
// TODO 闃堝�煎彲浠ユ牴鎹笉鍚屾ā鍨嬭皟鏁�
if (featureCheckMode == 3) {
- //System.out.println("==isOk==>44");
+
List<? extends Feature> featureResult =
- faceModel.getFaceSearch().search(type, bdFaceCheckConfig.scoreThreshold, 5, feature, false);
- //System.out.println("==isOk==>45");
+ faceModel.getFaceSearch().search(type, bdFaceCheckConfig.scoreThreshold, 2, feature, false);
+
// TODO 杩斿洖top num = 1 涓暟鎹泦鍚堬紝姝ゅ鍙互浠绘剰璁剧疆锛屼細杩斿洖姣斿浠庡ぇ鍒板皬鎺掑簭鐨刵um 涓暟鎹泦鍚�
if (featureResult != null && featureResult.size() > 0) {
- //System.out.println("==isOk==>鍖归厤鍒版暟閲�"+featureResult.size());
- User user = null;
- Feature topFeature = null;
- if(TextUtils.isEmpty(livenessModel.getGroupId())){
- //涓虹┖锛岄渶瑕佹帓搴忥紝浼樺厛鍙栦細鍛�
- for(Feature feat:featureResult) {
- threholdScore = bdFaceCheckConfig.scoreThreshold;
- if (feat != null && feat.getScore() > threholdScore) {
- User userOld = FaceApi.getInstance().getUserListById(feat.getId());
- //System.out.println("==isOk==>鍖归厤鍒扮被鍨�:"+userOld.getUserName());
- if("1".equals(userOld.getGroupId())){
- user = userOld;
- topFeature = feat;
- break;
- }else if(user==null){
- user = userOld;
- topFeature = feat;
- }
+ if(TextUtils.isEmpty(groupId)){
+ // 鑾峰彇绗竴涓暟鎹�
+ Feature topFeature = featureResult.get(0);
+ // 鍒ゆ柇绗竴涓槇鍊兼槸鍚﹀ぇ浜庤瀹氶槇鍊硷紝濡傛灉澶т簬锛屾绱㈡垚鍔�
+ threholdScore = bdFaceCheckConfig.scoreThreshold;
+ if (topFeature != null && topFeature.getScore() > threholdScore) {
+ // 褰撳墠featureEntity 鍙湁id+feature 绱㈠紩锛屽湪鏁版嵁搴撲腑鏌ュ埌瀹屾暣淇℃伅
+ User user = FaceApi.getInstance().getUserListById(topFeature.getId());
+ if (user != null) {
+ IdentifyResult idResult = new IdentifyResult(user, index, topFeature.getScore());
+ // Log.d("Attend", "add user:" + user.getUserInfo() + " index:" + index);
+ livenessModel.addIdentifyResult(idResult);
+ livenessModel.setUser(user);
+ livenessModel.setFeatureScore(topFeature.getScore());
+
+ setFail(livenessModel);
+ } else {
+ setFail(livenessModel);
}
+ } else {
+ setFail(livenessModel);
}
}else {
//鍙彇璇ョ被鍨嬬敤鎴�
+ User user = null;
+ Feature topFeature = null;
for(Feature feat:featureResult) {
// 鑾峰彇鏁版嵁
// 鍒ゆ柇闃堝�兼槸鍚﹀ぇ浜庤瀹氶槇鍊硷紝濡傛灉澶т簬锛屾绱㈡垚鍔�
@@ -1242,24 +1245,23 @@
//System.out.println("==isOk==>50");
// 褰撳墠featureEntity 鍙湁id+feature 绱㈠紩锛屽湪鏁版嵁搴撲腑鏌ュ埌瀹屾暣淇℃伅
User userOld = FaceApi.getInstance().getUserListById(feat.getId());
- if(livenessModel.getGroupId().equals(userOld.getGroupId())){
+ if(groupId.equals(userOld.getGroupId())){
user = userOld;
topFeature = feat;
break;
}
}
}
- }
- if (user != null) {
- //System.out.println("==isOk==>鍖归厤鍒�");
- IdentifyResult idResult = new IdentifyResult(user, index, topFeature.getScore());
- livenessModel.addIdentifyResult(idResult);
- livenessModel.setUser(user);
- livenessModel.setFeatureScore(topFeature.getScore());
- setFail(livenessModel);
- } else {
- //IdentifyResult idResult = new IdentifyResult(user, index, topFeature.getScore());
- setFail(livenessModel);
+ if (user != null&&topFeature!=null) {
+ //System.out.println("==isOk==>鍖归厤鍒�");
+ IdentifyResult idResult = new IdentifyResult(user, index, topFeature.getScore());
+ livenessModel.addIdentifyResult(idResult);
+ livenessModel.setUser(user);
+ livenessModel.setFeatureScore(topFeature.getScore());
+ setFail(livenessModel);
+ } else {
+ setFail(livenessModel);
+ }
}
} else {
setFail(livenessModel);
@@ -1267,13 +1269,13 @@
} else if (featureCheckMode == 4) {
// 鐩墠浠呮敮鎸�
float score =
- faceModel
- .getFaceSearch()
- .compare(
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO,
- livenessModel.getFeature(),
- secondFeature,
- true);
+ faceModel
+ .getFaceSearch()
+ .compare(
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO,
+ livenessModel.getFeature(),
+ secondFeature,
+ true);
livenessModel.setScore(score);
if (score > threholdScore) {
/*faceId = livenessModel.getFaceInfo().faceID;
@@ -1300,11 +1302,11 @@
* @param faceDetectCallBack
*/
public void onDetectSilentLiveCheck(
- final BDFaceImageConfig bdFaceImageConfig,
- final BDFaceImageConfig bdNirFaceImageConfig,
- final BDFaceImageConfig bdDepthFaceImageConfig,
- final BDFaceCheckConfig bdFaceCheckConfig,
- final FaceDetectCallBack faceDetectCallBack) {
+ final BDFaceImageConfig bdFaceImageConfig,
+ final BDFaceImageConfig bdNirFaceImageConfig,
+ final BDFaceImageConfig bdDepthFaceImageConfig,
+ final BDFaceCheckConfig bdFaceCheckConfig,
+ final FaceDetectCallBack faceDetectCallBack) {
long startTime = System.currentTimeMillis();
// 鍒涘缓妫�娴嬬粨鏋滃瓨鍌ㄦ暟鎹�
LivenessModel livenessModel = new LivenessModel();
@@ -1313,44 +1315,44 @@
BDFaceImageInstance rgbInstance = getBdImage(bdFaceImageConfig, bdFaceCheckConfig.darkEnhance);
livenessModel.setTestBDFaceImageInstanceDuration(System.currentTimeMillis() - startTime);
onTrack(
- rgbInstance,
- livenessModel,
- new DetectListener() {
- @Override
- public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
+ rgbInstance,
+ livenessModel,
+ new DetectListener() {
+ @Override
+ public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
- // 淇濆瓨浜鸿劯鐗瑰緛鐐�
- livenessModel.setLandmarks(faceInfos[0].landmarks);
- // 淇濆瓨浜鸿劯鍥剧墖
- livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
- // 璋冪敤缁樺埗浜鸿劯妗嗘帴鍙�
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
- }
- // 閫佹璇嗗埆
- onSilentLivenessCheck(
- rgbInstance,
- bdNirFaceImageConfig,
- bdDepthFaceImageConfig,
- bdFaceCheckConfig,
- livenessModel,
- startTime,
- faceDetectCallBack,
- faceInfos);
- }
-
- @Override
- public void onDetectFail() {
- // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(null);
+ // 淇濆瓨浜鸿劯鐗瑰緛鐐�
+ livenessModel.setLandmarks(faceInfos[0].landmarks);
+ // 淇濆瓨浜鸿劯鍥剧墖
livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
- faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
- faceDetectCallBack.onTip(0, "鏈娴嬪埌浜鸿劯");
+ // 璋冪敤缁樺埗浜鸿劯妗嗘帴鍙�
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
+ }
+ // 閫佹璇嗗埆
+ onSilentLivenessCheck(
+ rgbInstance,
+ bdNirFaceImageConfig,
+ bdDepthFaceImageConfig,
+ bdFaceCheckConfig,
+ livenessModel,
+ startTime,
+ faceDetectCallBack,
+ faceInfos);
}
- }
- });
+ @Override
+ public void onDetectFail() {
+ // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(null);
+ livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
+ faceDetectCallBack.onFaceDetectDarwCallback(livenessModel);
+ faceDetectCallBack.onTip(0, "鏈娴嬪埌浜鸿劯");
+ }
+ rgbInstance.destory();
+ }
+ });
}
/**
@@ -1364,206 +1366,206 @@
* @param faceDetectCallBack
*/
public void onSilentLivenessCheck(
- final BDFaceImageInstance rgbInstance,
- final BDFaceImageConfig nirBDFaceImageConfig,
- final BDFaceImageConfig depthBDFaceImageConfig,
- final BDFaceCheckConfig bdFaceCheckConfig,
- final LivenessModel livenessModel,
- final long startTime,
- final FaceDetectCallBack faceDetectCallBack,
- final FaceInfo[] fastFaceInfos) {
+ final BDFaceImageInstance rgbInstance,
+ final BDFaceImageConfig nirBDFaceImageConfig,
+ final BDFaceImageConfig depthBDFaceImageConfig,
+ final BDFaceCheckConfig bdFaceCheckConfig,
+ final LivenessModel livenessModel,
+ final long startTime,
+ final FaceDetectCallBack faceDetectCallBack,
+ final FaceInfo[] fastFaceInfos) {
if (future2 != null && !future2.isDone()) {
// 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
-
+ rgbInstance.destory();
return;
}
future2 =
- es2.submit(
- new Runnable() {
+ es2.submit(
+ new Runnable() {
- @Override
- public void run() {
- onDetect(
- bdFaceCheckConfig,
- rgbInstance,
- fastFaceInfos,
- livenessModel,
- new DetectListener() {
- @Override
- public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
- // 浜鸿劯id璧嬪��
- if (mLastFaceId != fastFaceInfos[0].faceID) {
- mLastFaceId = fastFaceInfos[0].faceID;
- mRgbLiveList.clear();
- mNirLiveList.clear();
- }
- if (bdFaceCheckConfig == null) {
-
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
- // 鏈�浼樹汉鑴告帶鍒�
- if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
- livenessModel.setQualityCheck(true);
-
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
- onQualityCheck(
- faceInfos,
- bdFaceCheckConfig.bdQualityConfig,
- faceDetectCallBack,
- new QualityListener() {
+ @Override
+ public void run() {
+ onDetect(
+ bdFaceCheckConfig,
+ rgbInstance,
+ fastFaceInfos,
+ livenessModel,
+ new DetectListener() {
@Override
- public void onQualitySuccess() {
- livenessModel.setQualityCheck(false);
- // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
- // TODO 娲讳綋妫�娴�
- BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
- boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
- if (isLiveCheck) {
- long startRgbTime = System.currentTimeMillis();
- boolean rgbLiveStatus =
- faceModel
- .getFaceLive()
- .strategySilentLive(
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
- rgbInstance,
- faceInfos[0],
- bdLiveConfig.framesThreshold,
- bdLiveConfig.rgbLiveScore);
- livenessModel.setRGBLiveStatus(rgbLiveStatus);
- livenessModel.setRgbLivenessDuration(
- System.currentTimeMillis() - startRgbTime);
+ public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
+ // 浜鸿劯id璧嬪��
+ if (mLastFaceId != fastFaceInfos[0].faceID) {
+ mLastFaceId = fastFaceInfos[0].faceID;
+ mRgbLiveList.clear();
+ mNirLiveList.clear();
}
- // TODO nir娲讳綋妫�娴�
- BDFaceImageInstance nirInstance = null;
- boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
- if (isHaveNirImage) {
-
- // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
- // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
- nirInstance = getBdImage(nirBDFaceImageConfig, false);
- livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
-
- // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
- long startIrDetectTime = System.currentTimeMillis();
- BDFaceDetectListConf bdFaceDetectListConf =
- new BDFaceDetectListConf();
- bdFaceDetectListConf.usingDetect = true;
- FaceInfo[] faceInfosIr =
- faceModel
- .getFaceNirDetect()
- .detect(
- BDFaceSDKCommon.DetectType.DETECT_NIR,
- BDFaceSDKCommon.AlignType
- .BDFACE_ALIGN_TYPE_NIR_ACCURATE,
- nirInstance,
- null,
- bdFaceDetectListConf);
- bdFaceDetectListConf.usingDetect = false;
- livenessModel.setIrLivenessDuration(
- System.currentTimeMillis() - startIrDetectTime);
- // LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
-
- if (faceInfosIr != null && faceInfosIr.length > 0) {
- FaceInfo faceInfoIr = faceInfosIr[0];
- long startNirTime = System.currentTimeMillis();
- boolean nirLiveStatus =
- faceModel
- .getFaceLive()
- .strategySilentLive(
- BDFaceSDKCommon.LiveType
- .BDFACE_SILENT_LIVE_TYPE_NIR,
- nirInstance,
- faceInfoIr,
- bdLiveConfig.framesThreshold,
- bdLiveConfig.nirLiveScore);
- livenessModel.setNIRLiveStatus(nirLiveStatus);
- livenessModel.setIrLivenessDuration(
- System.currentTimeMillis() - startNirTime);
+ if (bdFaceCheckConfig == null) {
+ rgbInstance.destory();
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
}
-
- nirInstance.destory();
+ return;
}
- // TODO depth娲讳綋妫�娴�
- if (depthBDFaceImageConfig != null) {
- fastFaceInfos[0].landmarks = faceInfos[0].landmarks;
- // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
- float[] depthLandmark = new float[faceInfos[0].landmarks.length];
- BDFaceImageInstance depthInstance;
- if (bdFaceCheckConfig.cameraType == 1) {
- System.arraycopy(
- faceInfos[0].landmarks,
- 0,
- depthLandmark,
- 0,
- faceInfos[0].landmarks.length);
- for (int i = 0; i < 144; i = i + 2) {
- depthLandmark[i] -= 80;
- }
- fastFaceInfos[0].landmarks = depthLandmark;
+ // 鏈�浼樹汉鑴告帶鍒�
+ if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
+ livenessModel.setQualityCheck(true);
+ rgbInstance.destory();
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
}
-
- depthInstance = getBdImage(depthBDFaceImageConfig, false);
- livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
- // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
- long startDepthTime = System.currentTimeMillis();
- boolean depthLiveStatus =
- faceModel
- .getFaceLive()
- .strategySilentLive(
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
- depthInstance,
- fastFaceInfos[0],
- bdLiveConfig.framesThreshold,
- bdLiveConfig.nirLiveScore);
- livenessModel.setDepthLiveStatus(depthLiveStatus);
- livenessModel.setDepthtLivenessDuration(
- System.currentTimeMillis() - startDepthTime);
- depthInstance.destory();
+ return;
}
- // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
- livenessModel.setAllDetectDuration(
- System.currentTimeMillis() - startTime);
- // LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
- // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+ onQualityCheck(
+ faceInfos,
+ bdFaceCheckConfig.bdQualityConfig,
+ faceDetectCallBack,
+ new QualityListener() {
+ @Override
+ public void onQualitySuccess() {
+ livenessModel.setQualityCheck(false);
+ // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
+ // TODO 娲讳綋妫�娴�
+ BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
+ boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
+ if (isLiveCheck) {
+ long startRgbTime = System.currentTimeMillis();
+ boolean rgbLiveStatus =
+ faceModel
+ .getFaceLive()
+ .strategySilentLive(
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
+ rgbInstance,
+ faceInfos[0],
+ bdLiveConfig.framesThreshold,
+ bdLiveConfig.rgbLiveScore);
+ livenessModel.setRGBLiveStatus(rgbLiveStatus);
+ livenessModel.setRgbLivenessDuration(
+ System.currentTimeMillis() - startRgbTime);
+ }
+ // TODO nir娲讳綋妫�娴�
+ BDFaceImageInstance nirInstance = null;
+ boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
+ if (isHaveNirImage) {
- // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
+ // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
+ // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
+ nirInstance = getBdImage(nirBDFaceImageConfig, false);
+ livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
+
+ // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
+ long startIrDetectTime = System.currentTimeMillis();
+ BDFaceDetectListConf bdFaceDetectListConf =
+ new BDFaceDetectListConf();
+ bdFaceDetectListConf.usingDetect = true;
+ FaceInfo[] faceInfosIr =
+ faceModel
+ .getFaceNirDetect()
+ .detect(
+ BDFaceSDKCommon.DetectType.DETECT_NIR,
+ BDFaceSDKCommon.AlignType
+ .BDFACE_ALIGN_TYPE_NIR_ACCURATE,
+ nirInstance,
+ null,
+ bdFaceDetectListConf);
+ bdFaceDetectListConf.usingDetect = false;
+ livenessModel.setIrLivenessDuration(
+ System.currentTimeMillis() - startIrDetectTime);
+ // LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
+
+ if (faceInfosIr != null && faceInfosIr.length > 0) {
+ FaceInfo faceInfoIr = faceInfosIr[0];
+ long startNirTime = System.currentTimeMillis();
+ boolean nirLiveStatus =
+ faceModel
+ .getFaceLive()
+ .strategySilentLive(
+ BDFaceSDKCommon.LiveType
+ .BDFACE_SILENT_LIVE_TYPE_NIR,
+ nirInstance,
+ faceInfoIr,
+ bdLiveConfig.framesThreshold,
+ bdLiveConfig.nirLiveScore);
+ livenessModel.setNIRLiveStatus(nirLiveStatus);
+ livenessModel.setIrLivenessDuration(
+ System.currentTimeMillis() - startNirTime);
+ }
+
+ nirInstance.destory();
+ }
+ // TODO depth娲讳綋妫�娴�
+ if (depthBDFaceImageConfig != null) {
+ fastFaceInfos[0].landmarks = faceInfos[0].landmarks;
+ // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
+ float[] depthLandmark = new float[faceInfos[0].landmarks.length];
+ BDFaceImageInstance depthInstance;
+ if (bdFaceCheckConfig.cameraType == 1) {
+ System.arraycopy(
+ faceInfos[0].landmarks,
+ 0,
+ depthLandmark,
+ 0,
+ faceInfos[0].landmarks.length);
+ for (int i = 0; i < 144; i = i + 2) {
+ depthLandmark[i] -= 80;
+ }
+ fastFaceInfos[0].landmarks = depthLandmark;
+ }
+
+ depthInstance = getBdImage(depthBDFaceImageConfig, false);
+ livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
+ // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
+ long startDepthTime = System.currentTimeMillis();
+ boolean depthLiveStatus =
+ faceModel
+ .getFaceLive()
+ .strategySilentLive(
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
+ depthInstance,
+ fastFaceInfos[0],
+ bdLiveConfig.framesThreshold,
+ bdLiveConfig.nirLiveScore);
+ livenessModel.setDepthLiveStatus(depthLiveStatus);
+ livenessModel.setDepthtLivenessDuration(
+ System.currentTimeMillis() - startDepthTime);
+ depthInstance.destory();
+ }
+ // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
+ livenessModel.setAllDetectDuration(
+ System.currentTimeMillis() - startTime);
+ // LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
+ // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+ rgbInstance.destory();
+ // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ }
+
+ @Override
+ public void onQualityFail(String detectFail, String occlusionFail) {
+ livenessModel.setQualityOcclusion(occlusionFail);
+ livenessModel.setQualityDetect(detectFail);
+ livenessModel.setQualityCheck(true);
+ rgbInstance.destory();
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ }
+ });
}
@Override
- public void onQualityFail(String detectFail, String occlusionFail) {
- livenessModel.setQualityOcclusion(occlusionFail);
- livenessModel.setQualityDetect(detectFail);
- livenessModel.setQualityCheck(true);
+ public void onDetectFail() {
if (faceDetectCallBack != null) {
faceDetectCallBack.onFaceDetectCallback(livenessModel);
}
}
});
- }
-
- @Override
- public void onDetectFail() {
-
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- }
- });
- }
- });
+ }
+ });
}
private void onTrack(BDFaceImageInstance rgbInstance, LivenessModel livenessModel, DetectListener detectListener) {
@@ -1632,10 +1634,10 @@
* @return
*/
public void onQualityCheck(
- final FaceInfo[] faceInfos,
- final BDQualityConfig bdQualityConfig,
- final FaceDetectCallBack faceDetectCallBack,
- final QualityListener qualityListener) {
+ final FaceInfo[] faceInfos,
+ final BDQualityConfig bdQualityConfig,
+ final FaceDetectCallBack faceDetectCallBack,
+ final QualityListener qualityListener) {
if (bdQualityConfig == null) {
qualityListener.onQualitySuccess();
@@ -1720,7 +1722,7 @@
}
}
if (!TextUtils.isEmpty(stringBufferDetected.toString())
- || !TextUtils.isEmpty(stringBufferOcclusion.toString())) {
+ || !TextUtils.isEmpty(stringBufferOcclusion.toString())) {
if (!TextUtils.isEmpty(stringBufferDetected.toString())) {
detectFail = stringBufferDetected.toString();
}
@@ -1748,9 +1750,9 @@
* @return
*/
public boolean onQualityCheck(
- final FaceInfo[] faceInfos,
- final BDQualityConfig bdQualityConfig,
- final FaceDetectCallBack faceDetectCallBack) {
+ final FaceInfo[] faceInfos,
+ final BDQualityConfig bdQualityConfig,
+ final FaceDetectCallBack faceDetectCallBack) {
if (bdQualityConfig == null) {
return true;
@@ -1848,7 +1850,7 @@
* @return
*/
public boolean onPersonQualityCheck(
- final FaceInfo faceInfo, final BDQualityConfig bdQualityConfig, final FaceDetectCallBack faceDetectCallBack) {
+ final FaceInfo faceInfo, final BDQualityConfig bdQualityConfig, final FaceDetectCallBack faceDetectCallBack) {
if (bdQualityConfig == null) {
return true;
@@ -1930,31 +1932,28 @@
* rightCheek 鍙宠噳閬搵寰楀垎
*/
private boolean selectQuality(
- float bluriness,
- float leftEye,
- float rightEye,
- float nose,
- float mouth,
- float leftCheek,
- float rightCheek,
- float chin) {
+ float bluriness,
+ float leftEye,
+ float rightEye,
+ float nose,
+ float mouth,
+ float leftCheek,
+ float rightCheek,
+ float chin) {
return bluriness < 0.5
- && leftEye < 0.75
- && rightEye < 0.75
- && nose < 0.75
- && mouth < 0.75
- && leftCheek < 0.75
- && rightCheek < 0.75
- && chin < 0.7;
+ && leftEye < 0.75
+ && rightEye < 0.75
+ && nose < 0.75
+ && mouth < 0.75
+ && leftCheek < 0.75
+ && rightCheek < 0.75
+ && chin < 0.7;
}
// 浜鸿瘉鏍搁獙鐗瑰緛鎻愬彇
public float personDetect(
- final Bitmap bitmap, final byte[] feature, final BDFaceCheckConfig bdFaceCheckConfig, Context context) {
- if(bitmap==null||bitmap.isRecycled()){
- return -1;
- }
+ final Bitmap bitmap, final byte[] feature, final BDFaceCheckConfig bdFaceCheckConfig, Context context) {
BDFaceImageInstance rgbInstance = new BDFaceImageInstance(bitmap);
float ret = -1;
FaceInfo[] faceInfos;
@@ -1962,14 +1961,14 @@
if (bdFaceCheckConfig != null) {
bdFaceCheckConfig.bdFaceDetectListConfig.usingDetect = true;
faceInfos =
- faceModel
- .getFaceDetectPerson()
- .detect(
- BDFaceSDKCommon.DetectType.DETECT_VIS,
- BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_RGB_ACCURATE,
- rgbInstance,
- null,
- bdFaceCheckConfig.bdFaceDetectListConfig);
+ faceModel
+ .getFaceDetectPerson()
+ .detect(
+ BDFaceSDKCommon.DetectType.DETECT_VIS,
+ BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_RGB_ACCURATE,
+ rgbInstance,
+ null,
+ bdFaceCheckConfig.bdFaceDetectListConfig);
} else {
faceInfos = faceModel.getFaceDetectPerson().detect(BDFaceSDKCommon.DetectType.DETECT_VIS, rgbInstance);
}
@@ -1977,19 +1976,19 @@
// 鍒ゆ柇璐ㄩ噺妫�娴嬶紝閽堝妯$硦搴︺�侀伄鎸°�佽搴�
if (onPersonQualityCheck(faceInfos[0], bdQualityConfig, new FaceQualityBack(context))) {
ret =
- faceModel
- .getFacePersonFeature()
- .feature(
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO,
- rgbInstance,
- faceInfos[0].landmarks,
- feature);
+ faceModel
+ .getFacePersonFeature()
+ .feature(
+ BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO,
+ rgbInstance,
+ faceInfos[0].landmarks,
+ feature);
}
} else {
-
+ rgbInstance.destory();
return -1;
}
-
+ rgbInstance.destory();
return ret;
}
}
--
Gitblit v1.9.3