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

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.json.JSONObject
import timber.log.Timber
import java.util.concurrent.atomic.AtomicBoolean
/**
* 人脸识别
@@ -193,6 +194,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
recognizeViewModel.updateRegisterStatus(RecognizeViewModel.REGISTER_STATUS_DONE)
this.userFaceInfo = userFaceInfo
getFaceDataBlock { faceData ->
isCollecting.set(false)
isCollectFace = false
Thread {
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 openPlateDebouncer = Debouncer(5000)
private val isCollecting = AtomicBoolean(false)
/**
* 根据相似度similar>设定阈值0.8作为识别成功判断,
* 如果similar<0.3作为识别失败判断,
@@ -287,36 +292,99 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
*/
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
}
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) }
if (isCollectFace) {
loadLogInfo("collectFace,recognizeUserId 正在采集中,忽略失败结果 similar=$similar")
return
}
loadLogInfo("collectFace,recognizeUserId 人脸识别相似度为:${similar},失败次数为:${retryFailCount}")
if (similar < faceFailThreshold || retryFailCount >= maxFailCount) {
//相似度低于识别错误阈值进行采集、识别失败次数大于等于最大失败次数,作为识别失败判断
if (isCollectFace.not()) {
//非采集中
loadLogInfo("collectFace,recognizeUserId 未识别到人脸信息,相似度为:${similar},开始采集时间:${DateTimeUtils.getDateTimeString()}")
isCollectFace = true
collectFace()
if (similar <= faceFailThreshold || retryFailCount >= maxFailCount) {
loadLogInfo(
"collectFace,recognizeUserId 识别失败,开始采集 similar=$similar, " +
"retry=$retryFailCount, time=${DateTimeUtils.getDateTimeString()}"
)
if (!isCollecting.compareAndSet(false, true)) {
loadLogInfo("collectFace 已在采集中,忽略重复触发")
return
}
retryFailCount = 0
isCollectFace = true
collectFace()//采集人脸
return
}
//满足similar >= faceFailThreshold && similar <= successThreshold时进行重试
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作为识别是否成功来加载人脸识别结果
*/
@@ -370,7 +438,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
return@getPlateData
}
// if (tempUserId != currentUserId) {
SoundPoolUtil.getInstance().play(RECOGNIZE_SUCCESS, 0)
SoundPoolUtil.getInstance().play(RECOGNIZE_SUCCESS, 0)
// } else {
// SoundPoolUtil.getInstance().play(COLLECT_SUCCESS, 0)
// }
@@ -631,6 +699,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
}
retryFailCount = 0
binding.tvSimilarValue.text = ""
isCollecting.set(false)
isCollectFace = false
plateEnable = true
collectCount = 0
@@ -687,7 +756,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
private fun collectFace() {
loadLogInfo("collectFace: -----------1,开始采集人脸,开始时间:${DateTimeUtils.getDateTimeString()}----------")
// if (isFirstOpen) return
if (isFirstOpen) return
loadLogInfo("collectFace: ----------2,isFirstOpen=false-----------")
loadLogInfo("collectFace: ----------4,检测到人脸信息-----------")
currentUserId = null