优化流程,测试不再验证活体
This commit is contained in:
@@ -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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val similar = result?.similar ?: 0f
|
loadLogInfo(
|
||||||
binding.tvSimilarValue.text = "$similar,${retryFailCount}次"
|
"collectFace,recognizeUserId 识别成功 userId=$userId, time=${DateTimeUtils.getDateTimeString()}"
|
||||||
loadLogInfo("collectFace,recognizeUserId 人脸识别配置阈值为:${faceSuccessThreshold},失败阈值为:${faceFailThreshold},相似度为:${similar},失败次数为:${retryFailCount}")
|
)
|
||||||
if (similar > faceSuccessThreshold) {
|
|
||||||
loadLogInfo("collectFace,recognizeUserId 相似度为:${similar},识别成功时间:${DateTimeUtils.getDateTimeString()}")
|
// 成功后必须重置状态
|
||||||
//大 于识别阈值,作为识别成功判断
|
retryFailCount = 0
|
||||||
currentUserId = result?.faceEntity?.userName
|
isCollecting.set(false)
|
||||||
Debouncer(5000).debounce { openPlate(currentUserId) }
|
isCollectFace = false
|
||||||
|
currentUserId = userId
|
||||||
|
|
||||||
|
// 防抖,防止重复开闸
|
||||||
|
openPlateDebouncer.debounce {
|
||||||
|
openPlate(userId)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
loadLogInfo("collectFace,recognizeUserId 人脸识别相似度为:${similar},失败次数为:${retryFailCount}")
|
|
||||||
if (similar < faceFailThreshold || retryFailCount >= maxFailCount) {
|
if (isCollectFace) {
|
||||||
//相似度低于识别错误阈值进行采集、识别失败次数大于等于最大失败次数,作为识别失败判断
|
loadLogInfo("collectFace,recognizeUserId 正在采集中,忽略失败结果 similar=$similar")
|
||||||
if (isCollectFace.not()) {
|
return
|
||||||
//非采集中
|
}
|
||||||
loadLogInfo("collectFace,recognizeUserId 未识别到人脸信息,相似度为:${similar},开始采集时间:${DateTimeUtils.getDateTimeString()}")
|
|
||||||
|
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
|
isCollectFace = true
|
||||||
collectFace()
|
collectFace()//采集人脸
|
||||||
return
|
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作为识别是否成功来加载人脸识别结果
|
||||||
*/
|
*/
|
||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user