Skip to content

Commit

Permalink
1. 解决动作活体重构后出现不能识别通过问题
Browse files Browse the repository at this point in the history
2. 优化1:1 人脸识别体验
  • Loading branch information
AnyLifeZLB committed Nov 24, 2024
1 parent 67e9434 commit 9e954a6
Show file tree
Hide file tree
Showing 17 changed files with 77 additions and 135 deletions.
43 changes: 22 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<div align=center>
<img src="https://github.com/user-attachments/assets/84da1e48-9feb-4eba-bc53-17c70e321111" width = 17% height = 17% />
<img src="https://github.com/user-attachments/assets/84da1e48-9feb-4eba-bc53-17c70e321111" width = 20% height = 20% />
</div>

## 已经解决试用版集成闪退问题!!
Expand All @@ -12,20 +12,24 @@ On_device Offline Android Face Detection 、Recognition 、Liveness Detection An
![设备端离线机器学习优点](images/whyOfflineSDK.png)

## 当前版本说明 V1.8.60 (建议升级到最新版本)
- 解决动作活体重构后出现不能识别通过问题
- 解决试用版本SDK集成闪退问题 !!!
- 加快1:N 人脸搜索速度,性能优化
- 重新封装完善动作活体 静默活体,简化调用
- 修复大尺寸照片中人脸过小导致的人脸入库失败问题

建议[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并且无拖影。

Expand All @@ -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 模拟)


## 接入使用
Expand All @@ -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 下载体验

Expand All @@ -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
Expand All @@ -102,6 +103,6 @@ SDK支持Android 5+,建议设备配置 CPU为八核64位2.4GHz以上 摄像

## 快速接入
Demo 以main主工程 --> faceAiLib 的方式演示,熟悉本SDK 接入Demo 后可以先Copy faceAiLib到你主工程先跑起来
再根据业务情况修改完善。熟悉后大约2小时就能集成成功,可大大降低公司研发投入实现降本增效(笑)
再根据业务情况修改完善。熟悉后大约2小时就能集成成功,可大大降低公司研发投入实现降本增效。


5 changes: 3 additions & 2 deletions appMain/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 中人脸识别功能
Expand Down
File renamed without changes.
15 changes: 10 additions & 5 deletions change_log.md → doc/change_log.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
# V1.8.0
- 内测中...

- 解决动作活体重构后出现不能识别通过问题
- 解决试用版本SDK集成闪退问题 !!!
- 添加照片质量检测接口
- 优化1:1 人脸识别体验问题

# V1.8.50
- 修复试用版本闪退问题
- 加快1:N 人脸搜索速度,性能优化
- 重新封装完善动作活体 静默活体,简化调用
- 修复大尺寸照片中人脸过小导致的人脸入库失败问题

# V1.8.32
# V1.8.40
- 大尺寸人脸照片输入裁剪

# V1.8.30
- 重构SDK接入方式,更加简单
- 录入人脸简化,添加人脸角度校验

# V1.8.25
- 修复老版本的随机闪退问题
- 注册人脸的尺寸方式
- 注册人脸的尺寸
- 封装Kotlin协程,Java 调用更方便

# V1.8.20
- 人脸照片录入去除更多限制条件

# V1.8.19
Expand Down
File renamed without changes.
6 changes: 3 additions & 3 deletions questions.md → doc/questions.md
Original file line number Diff line number Diff line change
Expand Up @@ -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和 简单使用场景介绍
Expand Down
5 changes: 1 addition & 4 deletions faceAILib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 运行的必须依赖
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import android.widget.Toast
import com.ai.face.databinding.ActivityAboutFaceAppBinding

/**
*
* 关于我们
*
*/
class AboutFaceAppActivity : AppCompatActivity() {
Expand Down
1 change: 0 additions & 1 deletion faceAILib/src/main/java/com/ai/face/FaceAINaviActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
/**
* SDK 接入演示Demo,请先熟悉本Demo跑通住流程后再集成到你的主工程验证业务
*
*
*/
class FaceAINaviActivity : AppCompatActivity(), PermissionCallbacks {
private lateinit var viewBinding: ActivityFaceAiNaviBinding
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
import java.io.ByteArrayOutputStream;

/**
* 添加一张规范的人脸图并裁剪为SDK需要的正方形。
* 添加一张规范的人脸图并裁剪为SDK需要的正方形,1:1 和1:N 公共的添加人脸图
* 注意保存的方式有点差异
*
* 其他系统的录入的人脸请自行保证人脸规范,否则会导致识别错误
*
Expand Down Expand Up @@ -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();
Expand Down
24 changes: 9 additions & 15 deletions faceAILib/src/main/java/com/ai/face/search/CopyFaceImageUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Loading

0 comments on commit 9e954a6

Please sign in to comment.