优化流程,测试不再验证活体

This commit is contained in:
mazengfei
2026-02-02 16:36:24 +08:00
parent e1e754be9f
commit c5325f6ad6
2 changed files with 95 additions and 24 deletions
@@ -55,6 +55,7 @@ import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode import org.greenrobot.eventbus.ThreadMode
import org.json.JSONObject import org.json.JSONObject
import timber.log.Timber import timber.log.Timber
import java.util.concurrent.atomic.AtomicBoolean
/** /**
* 人脸识别 * 人脸识别
@@ -193,6 +194,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
recognizeViewModel.updateRegisterStatus(RecognizeViewModel.REGISTER_STATUS_DONE) recognizeViewModel.updateRegisterStatus(RecognizeViewModel.REGISTER_STATUS_DONE)
this.userFaceInfo = userFaceInfo this.userFaceInfo = userFaceInfo
getFaceDataBlock { faceData -> getFaceDataBlock { faceData ->
isCollecting.set(false)
isCollectFace = false isCollectFace = false
Thread { Thread {
saveFaceInfo(faceData) saveFaceInfo(faceData)
@@ -267,7 +269,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
/** /**
* 识别失败最大次数 * 识别失败最大次数
*/ */
private val maxFailCount = 2 private val maxFailCount = 5
/** /**
* 人脸失败阈值 * 人脸失败阈值
@@ -280,6 +282,9 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
private val faceSuccessThreshold by lazy { ConfigUtil.getRecognizeThreshold(this) } private val faceSuccessThreshold by lazy { ConfigUtil.getRecognizeThreshold(this) }
private val openPlateDebouncer = Debouncer(5000)
private val isCollecting = AtomicBoolean(false)
/** /**
* 根据相似度similar>设定阈值0.8作为识别成功判断, * 根据相似度similar>设定阈值0.8作为识别成功判断,
* 如果similar<0.3作为识别失败判断, * 如果similar<0.3作为识别失败判断,
@@ -287,36 +292,99 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
*/ */
private fun loadFaceRecognizeResult2(result: CompareResult?) { private fun loadFaceRecognizeResult2(result: CompareResult?) {
if(isCollectFace){ // 无有效结果直接忽略
val similar = result?.similar ?: return
binding.tvSimilarValue.text = "$similar${retryFailCount}"
loadLogInfo(
"collectFace,recognizeUserId 阈值 success=$faceSuccessThreshold, " +
"fail=$faceFailThreshold, similar=$similar, retry=$retryFailCount"
)
if (similar >= faceSuccessThreshold) {
val userId = result.faceEntity?.userName
if (userId.isNullOrBlank()) {
loadLogInfo("collectFace,recognizeUserId 识别成功但 userId 为空,忽略")
return
}
loadLogInfo(
"collectFace,recognizeUserId 识别成功 userId=$userId, time=${DateTimeUtils.getDateTimeString()}"
)
// 成功后必须重置状态
retryFailCount = 0
isCollecting.set(false)
isCollectFace = false
currentUserId = userId
// 防抖,防止重复开闸
openPlateDebouncer.debounce {
openPlate(userId)
}
return return
} }
val similar = result?.similar ?: 0f if (isCollectFace) {
binding.tvSimilarValue.text = "$similar${retryFailCount}" loadLogInfo("collectFace,recognizeUserId 正在采集中,忽略失败结果 similar=$similar")
loadLogInfo("collectFace,recognizeUserId 人脸识别配置阈值为:${faceSuccessThreshold},失败阈值为:${faceFailThreshold},相似度为:${similar},失败次数为:${retryFailCount}")
if (similar > faceSuccessThreshold) {
loadLogInfo("collectFace,recognizeUserId 相似度为:${similar},识别成功时间:${DateTimeUtils.getDateTimeString()}")
//大 于识别阈值,作为识别成功判断
currentUserId = result?.faceEntity?.userName
Debouncer(5000).debounce { openPlate(currentUserId) }
return return
} }
loadLogInfo("collectFace,recognizeUserId 人脸识别相似度为:${similar},失败次数为:${retryFailCount}")
if (similar < faceFailThreshold || retryFailCount >= maxFailCount) { if (similar <= faceFailThreshold || retryFailCount >= maxFailCount) {
//相似度低于识别错误阈值进行采集、识别失败次数大于等于最大失败次数,作为识别失败判断
if (isCollectFace.not()) { loadLogInfo(
//非采集中 "collectFace,recognizeUserId 识别失败,开始采集 similar=$similar, " +
loadLogInfo("collectFace,recognizeUserId 未识别到人脸信息,相似度为:${similar},开始采集时间:${DateTimeUtils.getDateTimeString()}") "retry=$retryFailCount, time=${DateTimeUtils.getDateTimeString()}"
isCollectFace = true )
collectFace() if (!isCollecting.compareAndSet(false, true)) {
loadLogInfo("collectFace 已在采集中,忽略重复触发")
return return
} }
retryFailCount = 0
isCollectFace = true
collectFace()//采集人脸
return
} }
//满足similar >= faceFailThreshold && similar <= successThreshold时进行重试
retryFailCount++ retryFailCount++
loadLogInfo("collectFace,recognizeUserId 人脸识别失败次数为:${retryFailCount}") loadLogInfo("collectFace,recognizeUserId 中间态重试,retryFailCount=$retryFailCount")
} }
// private fun loadFaceRecognizeResult2(result: CompareResult?) {
//
// if(isCollectFace){
// return
// }
//
// val similar = result?.similar ?: 0f
// binding.tvSimilarValue.text = "$similar${retryFailCount}次"
// loadLogInfo("collectFace,recognizeUserId 人脸识别配置阈值为:${faceSuccessThreshold},失败阈值为:${faceFailThreshold},相似度为:${similar},失败次数为:${retryFailCount}")
// if (similar > faceSuccessThreshold) {
// loadLogInfo("collectFace,recognizeUserId 相似度为:${similar},识别成功时间:${DateTimeUtils.getDateTimeString()}")
// //大 于识别阈值,作为识别成功判断
// currentUserId = result?.faceEntity?.userName
// Debouncer(5000).debounce { openPlate(currentUserId) }
// return
// }
// loadLogInfo("collectFace,recognizeUserId 人脸识别相似度为:${similar},失败次数为:${retryFailCount}")
// if (similar < faceFailThreshold || retryFailCount >= maxFailCount) {
// //相似度低于识别错误阈值进行采集、识别失败次数大于等于最大失败次数,作为识别失败判断
// if (isCollectFace.not()) {
// //非采集中
// loadLogInfo("collectFace,recognizeUserId 未识别到人脸信息,相似度为:${similar},开始采集时间:${DateTimeUtils.getDateTimeString()}")
// isCollectFace = true
// collectFace()
// return
// }
// }
// //满足similar >= faceFailThreshold && similar <= successThreshold时进行重试
// retryFailCount++
// loadLogInfo("collectFace,recognizeUserId 人脸识别失败次数为:${retryFailCount}")
// }
/** /**
* 根据相似度similar>设定阈值0.8作为识别是否成功来加载人脸识别结果 * 根据相似度similar>设定阈值0.8作为识别是否成功来加载人脸识别结果
*/ */
@@ -370,7 +438,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
return@getPlateData return@getPlateData
} }
// if (tempUserId != currentUserId) { // if (tempUserId != currentUserId) {
SoundPoolUtil.getInstance().play(RECOGNIZE_SUCCESS, 0) SoundPoolUtil.getInstance().play(RECOGNIZE_SUCCESS, 0)
// } else { // } else {
// SoundPoolUtil.getInstance().play(COLLECT_SUCCESS, 0) // SoundPoolUtil.getInstance().play(COLLECT_SUCCESS, 0)
// } // }
@@ -631,6 +699,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
} }
retryFailCount = 0 retryFailCount = 0
binding.tvSimilarValue.text = "" binding.tvSimilarValue.text = ""
isCollecting.set(false)
isCollectFace = false isCollectFace = false
plateEnable = true plateEnable = true
collectCount = 0 collectCount = 0
@@ -687,7 +756,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
private fun collectFace() { private fun collectFace() {
loadLogInfo("collectFace: -----------1,开始采集人脸,开始时间:${DateTimeUtils.getDateTimeString()}----------") loadLogInfo("collectFace: -----------1,开始采集人脸,开始时间:${DateTimeUtils.getDateTimeString()}----------")
// if (isFirstOpen) return if (isFirstOpen) return
loadLogInfo("collectFace: ----------2,isFirstOpen=false-----------") loadLogInfo("collectFace: ----------2,isFirstOpen=false-----------")
loadLogInfo("collectFace: ----------4,检测到人脸信息-----------") loadLogInfo("collectFace: ----------4,检测到人脸信息-----------")
currentUserId = null currentUserId = null
@@ -280,6 +280,8 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback {
// 填入在设置界面设置好的配置信息 // 填入在设置界面设置好的配置信息
boolean enableLive = !ConfigUtil.getLivenessDetectType(context).equals(context.getString(R.string.value_liveness_type_disable)); boolean enableLive = !ConfigUtil.getLivenessDetectType(context).equals(context.getString(R.string.value_liveness_type_disable));
enableLive = false;
boolean enableFaceQualityDetect = ConfigUtil.isEnableImageQualityDetect(context); boolean enableFaceQualityDetect = ConfigUtil.isEnableImageQualityDetect(context);
boolean enableFaceMoveLimit = ConfigUtil.isEnableFaceMoveLimit(context); boolean enableFaceMoveLimit = ConfigUtil.isEnableFaceMoveLimit(context);
boolean enableFaceSizeLimit = ConfigUtil.isEnableFaceSizeLimit(context); boolean enableFaceSizeLimit = ConfigUtil.isEnableFaceSizeLimit(context);
@@ -469,7 +471,7 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback {
} }
} }
private String getUserId(CompareResult result){ private String getUserId(CompareResult result) {
if (result != null && result.getFaceEntity() != null) { if (result != null && result.getFaceEntity() != null) {
return result.getFaceEntity().getUserName(); return result.getFaceEntity().getUserName();
} }
@@ -480,7 +482,7 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback {
public void onRecognized(CompareResult compareResult, Integer live, boolean similarPass) { public void onRecognized(CompareResult compareResult, Integer live, boolean similarPass) {
// TODO: 2026/1/21 测试使用 Observable.just(similarPass)代替Observable.just(true)--- // TODO: 2026/1/21 测试使用 Observable.just(similarPass)代替Observable.just(true)---
Observable.just(similarPass).observeOn(AndroidSchedulers.mainThread()).subscribe(aBoolean -> { Observable.just(similarPass).observeOn(AndroidSchedulers.mainThread()).subscribe(aBoolean -> {
Log.d(TAG, "collectFace,onRecognized: similarPass="+similarPass+",live="+live+",userId="+getUserId(compareResult)); Log.d(TAG, "collectFace,onRecognized: similarPass=" + similarPass + ",live=" + live + ",userId=" + getUserId(compareResult));
if (similarPass) { if (similarPass) {
recognizeUserId.postValue(compareResult); recognizeUserId.postValue(compareResult);
boolean isAdded = false; boolean isAdded = false;