diff --git a/README.md b/README.md index 48f81d0..4762aef 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- +
## 已经解决试用版集成闪退问题!! @@ -12,6 +12,7 @@ On_device Offline Android Face Detection 、Recognition 、Liveness Detection An ![设备端离线机器学习优点](images/whyOfflineSDK.png) ## 当前版本说明 V1.8.60 (建议升级到最新版本) +- 解决动作活体重构后出现不能识别通过问题 - 解决试用版本SDK集成闪退问题 !!! - 加快1:N 人脸搜索速度,性能优化 - 重新封装完善动作活体 静默活体,简化调用 @@ -19,13 +20,16 @@ On_device Offline Android Face Detection 、Recognition 、Liveness Detection An 建议[Fork] + [Star] 以便获取最新更新 # [FaceVerificationSDK](https://github.com/AnyLifeZLB/FaceVerificationSDK) - SDK 接入演示代码目前仅托管在GitHub,国内镜像不是最新的,请移步到GitHub 更新最新的演示代码 + **SDK 接入代码仓库,及时更新使用最新版** https://github.com/AnyLifeZLB/FaceVerificationSDK + 国内代码托管地址(不方便翻墙请邮件联系获取最新代码) https://gitee.com/onDeviceAI/FaceVerificationSDK + + ## 简要说明 SDK包含动作活体、静默活体检测,[1:1人脸识别以及1:N , M:N人脸识别检索](https://github.com/AnyLifeZLB/FaceVerificationSDK/blob/main/Introduce_11_1N_MN.md),**所有功能都在设备终端离线执行,SDK本身不用联网,不保存不上传任何人脸信息敏感资料更具隐私安全** -其中活体检测支持张嘴、微笑、眨眼、摇头、点头 随机两种组合验证(摇头点头也可拆分为左右上下4个动作),低端机离线验证速度正常。 +其中活体检测支持张嘴、微笑、眨眼、摇头、点头 随机两种组合验证(支持去除特定的动作),低端机离线验证速度正常。 SDK支持Android 5+,建议设备配置 CPU为八核64位2.4GHz以上 摄像头RGB 宽动态镜头分辨率720p以上,帧率大于30并且无拖影。 @@ -36,11 +40,11 @@ SDK支持Android 5+,建议设备配置 CPU为八核64位2.4GHz以上 摄像 ## [使用场景和区别](https://github.com/AnyLifeZLB/FaceVerificationSDK/blob/main/Face_1:1_1:N_M:N.md) - 【1:1】 移动考勤真人校验,App免密登录,酒店入驻、刷脸支付、刷脸解锁、真人校验 + 【1:1】 移动考勤真人校验、App免密登录、刷脸支付、刷脸解锁、真人校验 - 【1:N】 小区门禁,公司门禁,智能门锁,智慧校园、景区、工地、社区、酒店等 + 【1:N】 小区门禁、公司门禁、智能门锁、智慧校园、景区、工地、社区、酒店等 - 【M:N】 公安布控,人群追踪 监控等等 (人脸搜索 Demo 测试可使用图片 face_search_test.jpg) + 【M:N】 公安布控,人群追踪 监控等等 (测试效果可使用 MN_face_search_test.jpg 模拟) ## 接入使用 @@ -58,14 +62,11 @@ SDK支持Android 5+,建议设备配置 CPU为八核64位2.4GHz以上 摄像 更多使用说明下载参考本Repo和下载Demo体验,里面有比较详尽的使用方法, 熟悉后大概2小时可集成完毕 其中 - - * NaviActivity Demo 演示导航页面 + * appMain 主工程,faceAILib 是人脸识别相关源码 + * /FaceAI/NaviActivity Demo 演示导航页面 * /verify/目录 1:1 人脸检测识别,活体检测页面 * /search/目录 1:N 和 M:N 人脸识别搜索页面,人脸库管理 - - 1:1人脸识别不含活体检测不需要license授权,活体检测和人脸搜索的使用需要你发送邮件到anylife.zlb@gmail.com 确认授权 - 内容包括App名称、包名(applicationId)、签名证书SHA1和简要描述和要申请 1:1 / 1:N / M:N 哪种类型、5项内容。 - + * /addFaceImage 识别和搜索共用的添加人脸照片 ## Demo 下载体验 @@ -81,19 +82,19 @@ SDK支持Android 5+,建议设备配置 CPU为八核64位2.4GHz以上 摄像 如果 SDK 不能匹配你的应用场景需要特殊定制化,请发邮件到anylife.zlb@gmail.com 也可以加微信 HaoNan19990322 (请标注为 人脸识别 ,否则会自动忽略添加,谢谢) - 欢迎关注Fork+Star获取最新动态 Github: https://github.com/AnyLifeZLB/FaceVerificationSDK + 欢迎关注Fork+Star获取最新动态,提出使用建议等 https://github.com/AnyLifeZLB/FaceVerificationSDK ## 提升接入效率,提高SDK识别准确率 ### 提升接入效率 - - 1.去蒲公英下载APK Demo 体验SDK 的基本功能,看看是否满足业务需求;人脸搜索可以一键倒入200+张人脸图再录入你自己的 - - 2.更新GitHub 最新的代码,花1天左右时间熟悉SDK API 和对应的注释备注,断点调试一下基本功能;熟悉后再接入到主工程 - - 3.欲速则不达,一定要先跑成功SDK 接入Demo。熟悉后再接入到主工程验证匹配业务功能。有问题可以GitHub 提issues + 1.去蒲公英下载APK Demo 体验SDK 的基本功能,看看是否满足业务需求;人脸搜索可以一键导入200+张人脸图再录入你自己的 + 2.更新GitHub 最新的代码,花1天左右时间熟悉SDK API 和对应的注释备注,断点调试一下基本功能;熟悉后再接入到主工程 + 3.欲速则不达,一定要先跑成功SDK 接入Demo。熟悉后再接入到主工程验证匹配业务功能。有问题可以GitHub 提issues ### 提高SDK识别准确率 - - 1.试用建议的设备配置和摄像头 - - 2.录入高质量的人脸图,如(images/face_example.jpg)(证件照输入目前优化中) - - 3.光线环境好,检测的人脸无遮挡,化浓妆或佩戴墨镜口罩 - - 4.人脸图大于 300*300(人脸部分区域大于200*200)五官清晰无遮挡 + 1.试用建议的设备配置和摄像头 + 2.录入高质量的人脸图,如(images/face_example.jpg)(证件照输入目前优化中) + 3.光线环境好,检测的人脸无遮挡,化浓妆或佩戴墨镜口罩 + 4.人脸图大于 300*300(人脸部分区域大于200*200)五官清晰无遮挡 ## 常见问题 常见问题请参考:https://github.com/AnyLifeZLB/FaceVerificationSDK/blob/main/questions.md @@ -102,6 +103,6 @@ SDK支持Android 5+,建议设备配置 CPU为八核64位2.4GHz以上 摄像 ## 快速接入 Demo 以main主工程 --> faceAiLib 的方式演示,熟悉本SDK 接入Demo 后可以先Copy faceAiLib到你主工程先跑起来 - 再根据业务情况修改完善。熟悉后大约2小时就能集成成功,可大大降低公司研发投入实现降本增效(笑)。 + 再根据业务情况修改完善。熟悉后大约2小时就能集成成功,可大大降低公司研发投入实现降本增效。 diff --git a/appMain/build.gradle b/appMain/build.gradle index 6210ae1..98bc7a3 100644 --- a/appMain/build.gradle +++ b/appMain/build.gradle @@ -7,18 +7,19 @@ android { compileSdk 33 defaultConfig { + //应用包名 applicationId "com.ai.face.verifyPub" minSdk 21 targetSdk 33 versionCode 20 - versionName "1.8.54" + versionName "1.8.60" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { - release { + debug { minifyEnabled true zipAlignEnabled true shrinkResources true diff --git a/appMain/src/main/java/com/example/mainapp/WelcomeActivity.java b/appMain/src/main/java/com/example/mainapp/WelcomeActivity.java index 1747582..fc8e20e 100644 --- a/appMain/src/main/java/com/example/mainapp/WelcomeActivity.java +++ b/appMain/src/main/java/com/example/mainapp/WelcomeActivity.java @@ -31,7 +31,7 @@ protected void onCreate(Bundle savedInstanceState) { LottieAnimationView startFaceAILib= findViewById(R.id.goFaceAILib); startFaceAILib.setAnimation(R.raw.loading); startFaceAILib.loop(false); - startFaceAILib.setSpeed(3f); + startFaceAILib.setSpeed(4f); startFaceAILib.playAnimation(); //主工程调用Face AI Lib 中人脸识别功能 diff --git a/Introduce_11_1N_MN.md b/doc/Introduce_11_1N_MN.md similarity index 100% rename from Introduce_11_1N_MN.md rename to doc/Introduce_11_1N_MN.md diff --git a/change_log.md b/doc/change_log.md similarity index 89% rename from change_log.md rename to doc/change_log.md index 2521690..69fdbf8 100644 --- a/change_log.md +++ b/doc/change_log.md @@ -1,10 +1,18 @@ +# V1.8.0 +- 内测中... + +- 解决动作活体重构后出现不能识别通过问题 +- 解决试用版本SDK集成闪退问题 !!! +- 添加照片质量检测接口 +- 优化1:1 人脸识别体验问题 + # V1.8.50 - 修复试用版本闪退问题 - 加快1:N 人脸搜索速度,性能优化 - 重新封装完善动作活体 静默活体,简化调用 - 修复大尺寸照片中人脸过小导致的人脸入库失败问题 -# V1.8.32 +# V1.8.40 - 大尺寸人脸照片输入裁剪 # V1.8.30 @@ -12,11 +20,8 @@ - 录入人脸简化,添加人脸角度校验 # V1.8.25 -- 修复老版本的随机闪退问题 -- 注册人脸的尺寸方式 +- 注册人脸的尺寸 - 封装Kotlin协程,Java 调用更方便 - -# V1.8.20 - 人脸照片录入去除更多限制条件 # V1.8.19 diff --git a/privacy.md b/doc/privacy.md similarity index 100% rename from privacy.md rename to doc/privacy.md diff --git a/questions.md b/doc/questions.md similarity index 96% rename from questions.md rename to doc/questions.md index d77634c..7aaf55b 100644 --- a/questions.md +++ b/doc/questions.md @@ -34,12 +34,12 @@ 正式包(debuggable=false)授权后,不限终端数量,不限制使用次数。 授权绑定App包名和签名SHA1进行,需要新的功能和新特性开发根据评估情况再协定。 -| SDK 功能模块 | 收费情况(双11巨惠) | 功能描述 | +| SDK 功能模块 | 收费情况 | 功能描述 | |:------------|:-----------:|:------------| | 基础功能 | 完全免费 | 1.静态人脸图对比 2.图片中裁剪人脸 | | 1:1 人脸识别 | 299 | 动态图像人脸识别,不包含活体检测VIP功能 | -| 1:1人脸识别活体检测 | 4000 | 包含人脸识别 活体检测 人脸录入完整功能 | -| 1:N&M:N人脸搜索 | 7000 | 从人脸库中搜索对应的人是谁是否在库中 | +| 1:1人脸识别活体检测 | 5000 | 包含人脸识别 活体检测 人脸录入完整功能 | +| 1:N&M:N人脸搜索 | 8000 | 从人脸库中搜索对应的人是谁是否在库中 | | 定制开发 | 按需评估 | 如果试用当前的SDK不能满足业务需求定制安装工作量和难度评估 | 收费项目需要试用请添加微信或邮件申请,并告知App 名称,包名 ,签名SHA1和 简单使用场景介绍 diff --git a/faceAILib/build.gradle b/faceAILib/build.gradle index f1d3633..6864b2f 100644 --- a/faceAILib/build.gradle +++ b/faceAILib/build.gradle @@ -69,14 +69,11 @@ configurations.configureEach { // GitHub 无法访问,挂梯子也无效 ?参考 https://github.com/maxiaof/github-hosts dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) // 人脸识别 试用版本请升级到1.8.50 以上版本。https://github.com/AnyLifeZLB/FaceVerificationSDK // JDK==11,更多查看主页Readme 或者发送邮件到anylife.zlb@gmail.com - implementation 'io.github.anylifezlb:FaceRecognition:1.8.56' - - + implementation 'io.github.anylifezlb:FaceRecognition:1.8.60.alpha' // 以下为业务需要其他依赖,不是SDK 运行的必须依赖 diff --git a/faceAILib/src/main/java/com/ai/face/AboutFaceAppActivity.kt b/faceAILib/src/main/java/com/ai/face/AboutFaceAppActivity.kt index ba7ae54..89c1b90 100644 --- a/faceAILib/src/main/java/com/ai/face/AboutFaceAppActivity.kt +++ b/faceAILib/src/main/java/com/ai/face/AboutFaceAppActivity.kt @@ -11,7 +11,7 @@ import android.widget.Toast import com.ai.face.databinding.ActivityAboutFaceAppBinding /** - * + * 关于我们 * */ class AboutFaceAppActivity : AppCompatActivity() { diff --git a/faceAILib/src/main/java/com/ai/face/FaceAINaviActivity.kt b/faceAILib/src/main/java/com/ai/face/FaceAINaviActivity.kt index 88a18b4..d6bd3a5 100644 --- a/faceAILib/src/main/java/com/ai/face/FaceAINaviActivity.kt +++ b/faceAILib/src/main/java/com/ai/face/FaceAINaviActivity.kt @@ -21,7 +21,6 @@ import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks /** * SDK 接入演示Demo,请先熟悉本Demo跑通住流程后再集成到你的主工程验证业务 * - * */ class FaceAINaviActivity : AppCompatActivity(), PermissionCallbacks { private lateinit var viewBinding: ActivityFaceAiNaviBinding diff --git a/faceAILib/src/main/java/com/ai/face/addFaceImage/AddFaceImageActivity.java b/faceAILib/src/main/java/com/ai/face/addFaceImage/AddFaceImageActivity.java index 2409c2c..b91c0f8 100644 --- a/faceAILib/src/main/java/com/ai/face/addFaceImage/AddFaceImageActivity.java +++ b/faceAILib/src/main/java/com/ai/face/addFaceImage/AddFaceImageActivity.java @@ -34,7 +34,8 @@ import java.io.ByteArrayOutputStream; /** - * 添加一张规范的人脸图并裁剪为SDK需要的正方形。 + * 添加一张规范的人脸图并裁剪为SDK需要的正方形,1:1 和1:N 公共的添加人脸图 + * 注意保存的方式有点差异 * * 其他系统的录入的人脸请自行保证人脸规范,否则会导致识别错误 * @@ -158,10 +159,12 @@ private void showConfirmDialog(Bitmap bitmap) { btnOK.setOnClickListener(v -> { if (!TextUtils.isEmpty(fileName)) { + //1:1 人脸识别保存人脸底图 baseImageDispose.saveBaseImage(bitmap, pathName, fileName, 400); dialog.dismiss(); finish(); } else if (!TextUtils.isEmpty(editText.getText().toString())) { + //1:N ,M:N 人脸搜索保存人脸看 dialog.dismiss(); Intent intent = new Intent(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/faceAILib/src/main/java/com/ai/face/search/CopyFaceImageUtils.kt b/faceAILib/src/main/java/com/ai/face/search/CopyFaceImageUtils.kt index 10a10c5..c78f157 100644 --- a/faceAILib/src/main/java/com/ai/face/search/CopyFaceImageUtils.kt +++ b/faceAILib/src/main/java/com/ai/face/search/CopyFaceImageUtils.kt @@ -83,39 +83,33 @@ class CopyFaceImageUtils { /** * 把工程目录Assert 下的图片插入到App 指定人脸搜索库 * 你也可以参考把服务器网络图片下载后插入到人脸搜索库 - * */ private suspend fun copyAssertTestFaceImages(context: Application) = withContext(Dispatchers.IO) { - val assetManager = context.assets - val subFaceFiles = context.assets.list("") - if (subFaceFiles != null) { - for (index in subFaceFiles.indices) { + val asset = context.assets + val faceFiles = context.assets.list("") + if (faceFiles != null) { + for (index in faceFiles.indices) { //网络图下载后转为Bitmap 一样的处理方式 - val originBitmap=getBitmapFromAsset( - assetManager, - subFaceFiles[index] - ) - + val originBitmap=getBitmapFromAsset(asset, faceFiles[index]) if(originBitmap!=null){ //本地库保存的路径 - val fileName=CACHE_SEARCH_FACE_DIR + subFaceFiles[index] + val fileName=CACHE_SEARCH_FACE_DIR + faceFiles[index] //insertOrUpdateFaceImage 处理人脸图入库,里面会检测裁剪人脸,图像量化处理; // 插入失败请看onFailed log FaceSearchImagesManger.IL1Iii.getInstance(context).insertOrUpdateFaceImage( originBitmap, fileName,object :FaceSearchImagesManger.Callback { override fun onSuccess() { - Log.d("Add Face","Add Face successful"+subFaceFiles[index]); + Log.d("Add Face","Add Face successful"+faceFiles[index]); } - override fun onFailed(msg: String) { - Log.e("Add Face","Add Face onFailed"+subFaceFiles[index]); + Log.e("Add Face","Add Face onFailed"+faceFiles[index]); } } ) }else{ - Log.e("Add Face","获取Assert 目录文件图片失败 : "+subFaceFiles[index]); + Log.e("Add Face","获取Assert 目录文件图片失败 : "+faceFiles[index]); } } diff --git a/faceAILib/src/main/java/com/ai/face/search/FaceSearch1NActivity.java b/faceAILib/src/main/java/com/ai/face/search/FaceSearch1NActivity.java index 379ffba..a1c47a1 100644 --- a/faceAILib/src/main/java/com/ai/face/search/FaceSearch1NActivity.java +++ b/faceAILib/src/main/java/com/ai/face/search/FaceSearch1NActivity.java @@ -65,7 +65,7 @@ protected void onCreate(Bundle savedInstanceState) { * 第二个参数linearZoom [0.001f,1.0f] 指定焦距,参考{@link CameraControl#setLinearZoom(float)} * 焦距拉远一点,人才会靠近屏幕,才会减轻杂乱背景的影响。定制设备的摄像头自行调教此参数 */ - CameraXFragment cameraXFragment = CameraXFragment.newInstance(cameraLens, 0.005f); + CameraXFragment cameraXFragment = CameraXFragment.newInstance(cameraLens, 0.001f); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_camerax, cameraXFragment) .commit(); diff --git a/faceAILib/src/main/java/com/ai/face/search/FaceSearchMNActivity.java b/faceAILib/src/main/java/com/ai/face/search/FaceSearchMNActivity.java index a2785d7..66896cc 100644 --- a/faceAILib/src/main/java/com/ai/face/search/FaceSearchMNActivity.java +++ b/faceAILib/src/main/java/com/ai/face/search/FaceSearchMNActivity.java @@ -65,7 +65,7 @@ protected void onCreate(Bundle savedInstanceState) { * 第二个参数linearZoom [0.001f,1.0f] 指定焦距,参考{@link CameraControl#setLinearZoom(float)} * 焦距拉远一点,人才会靠近屏幕,才会减轻杂乱背景的影响。定制设备的摄像头自行调教此参数 */ - CameraXFragment cameraXFragment = CameraXFragment.newInstance(cameraLens, 0.005f); + CameraXFragment cameraXFragment = CameraXFragment.newInstance(cameraLens, 0.001f); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_camerax, cameraXFragment) .commit(); diff --git a/faceAILib/src/main/java/com/ai/face/verify/FaceVerificationActivity.java b/faceAILib/src/main/java/com/ai/face/verify/FaceVerificationActivity.java index b47e13b..f1e9752 100644 --- a/faceAILib/src/main/java/com/ai/face/verify/FaceVerificationActivity.java +++ b/faceAILib/src/main/java/com/ai/face/verify/FaceVerificationActivity.java @@ -58,7 +58,7 @@ public class FaceVerificationActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_face_verification); + setContentView(R.layout.activity_face_verification);//建议背景白色可以补充光照不足 setTitle("1:1 face verify"); scoreText = findViewById(R.id.silent_Score); tipsTextView = findViewById(R.id.tips_view); @@ -79,7 +79,7 @@ protected void onCreate(Bundle savedInstanceState) { * 第二个参数linearZoom [0.001f,1.0f] 指定焦距,参考{@link CameraControl#setLinearZoom(float)} * 焦距拉远一点,人才会靠近屏幕,才会减轻杂乱背景的影响。定制设备的摄像头自行调教此参数 */ - cameraXFragment = CameraXFragment.newInstance(cameraLensFacing, 0.005f); + cameraXFragment = CameraXFragment.newInstance(cameraLensFacing, 0.001f); getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_camerax, cameraXFragment).commit(); @@ -97,12 +97,13 @@ protected void onCreate(Bundle savedInstanceState) { //人脸图的裁剪和保存最好提前完成,如果不是本SDK 录入的人脸可能人脸不标准 //这里可能从网络等地方获取,业务方自行决定,为了方便模拟我们放在Assert 目录 Bitmap remoteBitmap = VerifyUtils.getBitmapFromAssert(this, "yourFace.pngtest"); - if (remoteBitmap==null){ - Toast.makeText(getBaseContext(),R.string.add_a_face_image,Toast.LENGTH_LONG).show(); + if (remoteBitmap == null) { + Toast.makeText(getBaseContext(), R.string.add_a_face_image, Toast.LENGTH_LONG).show(); tipsTextView.setText(R.string.add_a_face_image); return; } //人脸照片可能不是规范的正方形,非人脸区域过大甚至无人脸 多个人脸等情况,需要SDK内部裁剪等处理 + //(检测人脸照片质量使用 checkFaceQuality方法,处理类同checkFaceQuality) AddFaceUtils.ILil.getInstance(getApplication()) .disposeBaseFaceImage(remoteBitmap, yourFacePath, new AddFaceUtils.Callback() { //从图片中裁剪识别人脸成功 @@ -110,11 +111,12 @@ protected void onCreate(Bundle savedInstanceState) { public void onSuccess(@NonNull Bitmap cropedBitmap) { initFaceVerification(cropedBitmap); } + //识别的错误信息 @Override - public void onFailed(@NotNull String msg) { + public void onFailed(@NotNull String msg,int errorCode) { Log.e("ttt", msg); - Toast.makeText(getBaseContext(),msg,Toast.LENGTH_LONG).show(); + Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show(); } }); } @@ -130,18 +132,16 @@ public void onFailed(@NotNull String msg) { * @param baseBitmap 1:1 人脸识别对比的底片,如果仅仅需要活体检测,可以把App logo Bitmap 当参数传入并忽略对比结果 */ private void initFaceVerification(Bitmap baseBitmap) { - FaceProcessBuilder faceProcessBuilder = new FaceProcessBuilder.Builder(this) - .setThreshold(0.88f) //阈值设置,范围限 [0.85,0.95] 识别可信度,也是识别灵敏度 + .setThreshold(0.85f) //阈值设置,范围限 [0.8,0.95] 识别可信度,也是识别灵敏度 .setBaseBitmap(baseBitmap) //1:1 人脸识别对比的底片,仅仅需要SDK活体检测可以忽略比对结果 .setLivenessType(LivenessType.SILENT_MOTION) //活体检测可以有静默活体,动作活体或者组合也可以不需要活体NONE .setLivenessDetectionMode(LivenessDetectionMode.FAST) //硬件配置低用FAST动作活体模式,否则用精确模式 .setSilentLivenessThreshold(silentLivenessPassScore) //静默活体阈值 [0.88,0.99] .setMotionLivenessStepSize(2) //随机动作活体的步骤个数[1-2],SILENT_MOTION和MOTION 才有效 - .setVerifyTimeOut(16) //活体检测支持设置超时时间 [9,22] 秒 + .setVerifyTimeOut(15) //活体检测支持设置超时时间 [9,22] 秒 .setGraphicOverlay(faceTipsOverlay) //正式环境请去除设置 .setProcessCallBack(new ProcessCallBack() { - /** * 1:1 人脸识别 活体检测 对比结束 * @@ -165,9 +165,9 @@ public void onProcessTips(int i) { public void onTimeCountDown(float percent) { faceCoverView.startCountDown(percent); } - }).create(); + faceVerifyUtils.setDetectorParams(faceProcessBuilder); cameraXFragment.setOnAnalyzerListener(imageProxy -> { @@ -227,6 +227,8 @@ private void showVerifyResult(boolean isVerifyMatched, float similarity, float s *

* 添加声音提示和动画提示定制也在这里根据返回码进行定制 */ + int retryTime = 0; + private void showFaceVerifyTips(int actionCode) { if (!isDestroyed() && !isFinishing()) { runOnUiThread(() -> { @@ -283,8 +285,14 @@ private void showFaceVerifyTips(int actionCode) { .setMessage(R.string.motion_liveness_detection_time_out) .setCancelable(false) .setPositiveButton(R.string.retry, (dialogInterface, i) -> { - //建议控制重试次数,一般2次没成功基本不用重试了,设备配置太低或环境因素 - faceVerifyUtils.retryVerify(); + retryTime++; + //建议控制重试次数,一般2次没成功基本不用重试了,设备配置太低或环境因素 + if (retryTime > 1) { + //记得按钮名字改一下 + FaceVerificationActivity.this.finish(); + } else { + faceVerifyUtils.retryVerify(); + } } ).show(); break; diff --git a/face_search_test.jpg b/images/MN_face_search_test.jpg similarity index 100% rename from face_search_test.jpg rename to images/MN_face_search_test.jpg diff --git a/install_newest_mediapipe_on_macos.md b/install_newest_mediapipe_on_macos.md deleted file mode 100644 index eceafdc..0000000 --- a/install_newest_mediapipe_on_macos.md +++ /dev/null @@ -1,66 +0,0 @@ -## Unable to install mediapipe-model-maker newest version on Macos ? - -yes ,when I first time try install mediapipe-model-maker,it can only install 0.1.0.2 , -but 0.2.1.3 is the newest at 2023,11,14; what the problem ? my macos version is 13.6.1 - -So I Post a issues to google/mediaPipe https://github.com/google/mediapipe/issues/4945 - -Maybe it is a Small probability event,I can not find method to resolve it - - -## Logs - -OS Platform and Distribution -macos Ventura 13.3.1 (a) (22E772610a - -Compiler version -pip --version 23.3.1 - -Programming Language and version -python3 --version 3.9.0 - - -macos Ventura 13.3.1 (a) is not a Stable version? OK, update from 13.3.1 to 13.6.1 - -sadly.... - -python -m pip install mediapipe-model-maker==0.2.1.3 -Collecting mediapipe-model-maker==0.2.1.3 -Using cached mediapipe_model_maker-0.2.1.3-py3-none-any.whl.metadata (1.6 kB) -Requirement already satisfied: absl-py in ./venv/lib/python3.9/site-packages (from mediapipe-model-maker==0.2.1.3) (1.4.0) -INFO: pip is looking at multiple versions of mediapipe-model-maker to determine which version is compatible with other requirements. This could take a while. -ERROR: Could not find a version that satisfies the requirement mediapipe>=0.10.0 (from mediapipe-model-maker) (from versions: 0.8.4.2, 0.8.5, 0.8.6.2, 0.8.7.1, 0.8.7.2, 0.8.7.3, 0.8.8.1, 0.8.9.1, 0.8.10, 0.8.10.1, 0.8.11, 0.9.0, 0.9.0.1, 0.9.1.0) -ERROR: No matching distribution found for mediapipe>=0.10.0 - -## step 1 - - please run below python code - ``` - import distutils - print(distutils.util.get_platform()) - print(platform.mac_ver()[0]) - ``` - the result is : - macosx-10.9-x86_64 - 10.16 - oh,my God ! why ?? - -[run below commands on terminal and you will see the difference:](https://eclecticlight.co/2020/08/13/macos-version-numbering-isnt-so-simple/) - -SYSTEM_VERSION_COMPAT=1 cat /System/Library/CoreServices/SystemVersion.plist -SYSTEM_VERSION_COMPAT=0 cat /System/Library/CoreServices/SystemVersion.plist - - -## Step 2 -run below commands on terminal - -> export SYSTEM_VERSION_COMPAT=0 - -You could also add this to your. bash_profile or other shell environment file if you have one, to do this automatically for you. - -OK , you can download newest version now - -pip3 install mediapipe-model-maker==newestVersion - -Goooooooooooood Luck! -