Skip to content

Commit

Permalink
性能优化,最近最稳定一版本
Browse files Browse the repository at this point in the history
  • Loading branch information
AnyLifeZLB committed Nov 13, 2024
1 parent de149ca commit 984e2b8
Show file tree
Hide file tree
Showing 15 changed files with 57 additions and 56 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ On_device Offline Android Face Detection 、Recognition 、Liveness Detection An

![设备端离线机器学习优点](images/whyOfflineSDK.png)

## 当前版本说明 V1.8.41 (仅仅维护1.8.20以上版本)
- 修复高清人脸带来的BUG,修复试用版随机闪退问题
- 1:N 人脸识别添加确认机制,提高搜索匹配精确度
## 当前版本说明 V1.8.50 (仅仅维护1.8.20以上版本)
- 适配部分Android 定制设备卡顿问题
- 重新封装完善动作活体 静默活体调用,简化调用
- 修复大尺寸照片中人脸过小导致的人脸入库失败问题

建议[Fork] + [Star] 以便获取最新更新 # [FaceVerificationSDK](https://github.com/AnyLifeZLB/FaceVerificationSDK)
Expand Down Expand Up @@ -112,7 +112,7 @@ SDK支持Android 5+,建议设备配置 CPU为八核64位2.4GHz以上 摄像
- 3.光线环境好,检测的人脸无遮挡,化浓妆或佩戴墨镜口罩

## 常见问题
常见问题请参考:https://github.com/AnyLifeZLB/FaceVerificationSDK/blob/main/questions.md
常见问题请参考:https://github.com/AnyLifeZLB/FaceVerificationSDK/blob/main/questions.md
所有的开发测试都在手机和平板进行,特殊定制硬件如RK3288 等适配需要兼容适配


Expand Down
10 changes: 5 additions & 5 deletions README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ On_device Offline Android Face Detection 、Recognition 、Liveness Detection An

![设备端离线机器学习优点](images/whyOfflineSDK.png)

## 当前版本说明 V1.8.33 (仅仅维护1.8.20以上版本)
- 修复高清人脸带来的BUG,修复试用版随机闪退问题
- 1:N 人脸识别添加确认机制,提高搜索匹配精确度
## 当前版本说明 V1.8.50 (仅仅维护1.8.20以上版本)
- 适配部分Android 定制设备卡顿问题
- 重新封装完善动作活体 静默活体调用,简化调用
- 修复大尺寸照片中人脸过小导致的人脸入库失败问题

建议[Fork] + [Star] 以便获取最新更新 # [FaceVerificationSDK](https://github.com/AnyLifeZLB/FaceVerificationSDK)
Expand Down Expand Up @@ -113,8 +113,8 @@ SDK支持Android 5+,建议设备配置 CPU为八核64位2.4GHz以上 摄像
- 3.光线环境好,检测的人脸无遮挡,化浓妆或佩戴墨镜口罩

## 常见问题
常见问题请参考:https://github.com/AnyLifeZLB/FaceVerificationSDK/blob/main/questions.md
所有的开发测试都在手机和平板进行,特殊定制硬件如RK3288 等适配需要兼容适配
常见问题请参考:https://github.com/AnyLifeZLB/FaceVerificationSDK/blob/main/questions.md
所有的开发测试都在手机和平板进行,特殊定制硬件如RK3288 等适配需要兼容适配



4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ android {
minSdk 21
targetSdk 34
versionCode 20
versionName "1.8.43"
versionName "1.8.46"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
Expand Down Expand Up @@ -69,7 +69,7 @@ dependencies {

// 人脸识别 活体检测 以及人脸检索 SDK 依赖. 更新SDK Clean 工程
// 目前仅维护1.8.20 以上版本。
implementation 'io.github.anylifezlb:FaceRecognition:1.8.43.alpha5'
implementation 'io.github.anylifezlb:FaceRecognition:1.8.47'


// 以下为业务需要其他依赖,不是SDK 运行的必须依赖
Expand Down
3 changes: 0 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,6 @@
android:name=".addFaceImage.AddFaceImageActivity"
android:exported="false" />

<activity
android:name=".verify.LivenessDetectionActivity"
android:exported="false"/>

<activity
android:name=".search.FaceSearch1NActivity"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ protected void onCreate(Bundle savedInstanceState) {
// 2.各种参数的初始化设置
SearchProcessBuilder faceProcessBuilder = new SearchProcessBuilder.Builder(this)
.setLifecycleOwner(this)
.setThreshold(0.88f) //阈值设置,范围限 [0.80 , 0.95] 识别可信度,也是识别灵敏度
.setThreshold(0.88f) //阈值设置,范围限 [0.85 , 0.95] 识别可信度,也是识别灵敏度
.setNeedMultiValidate(false) //是否需要确认机制防止误识别,低配置设备影响搜索速度
.setFaceLibFolder(CACHE_SEARCH_FACE_DIR) //内部存储目录中保存N 个图片库的目录
.setImageFlipped(cameraLens == CameraSelector.LENS_FACING_FRONT) //手机的前置摄像头imageProxy 拿到的图可能左右翻转
Expand Down Expand Up @@ -157,7 +157,7 @@ private void showPrecessTips(int code) {
break;

case MASK_DETECTION:
binding.searchTips.setText(R.string.no_mask_please); //默认无
binding.searchTips.setText(R.string.no_mask_please);
break;

case NO_LIVE_FACE:
Expand All @@ -169,7 +169,7 @@ private void showPrecessTips(int code) {
break;

case FACE_DIR_EMPTY:
//大多数粉丝大概的撒
//人脸库没有录入照片
binding.searchTips.setText(R.string.face_dir_empty);
break;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ private void showPrecessTips(int code) {
break;

case FACE_DIR_EMPTY:
//大多数粉丝大概的撒
//人脸库没有录入照片
binding.searchTips.setText(R.string.face_dir_empty);
break;

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/ai/face/search/GraphicOverlay.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public void onDraw(Canvas canvas) {
textPaint.setTypeface(Typeface.DEFAULT);
textPaint.setColor(Color.GREEN);
String faceId=rectLabel.getFaceName().replace(".jpg", "");
canvas.drawText(rectLabel.getFaceScore()+" ≈ "+faceId, rectLabel.getRect().left + 22.0f, rectLabel.getRect().top + 55.0f, textPaint);
canvas.drawText(faceId+" ≈ "+rectLabel.getFaceScore(), rectLabel.getRect().left + 22.0f, rectLabel.getRect().top + 55.0f, textPaint);
}
rectPaint.setStrokeWidth(4.0f);
rectPaint.setStyle(Paint.Style.STROKE);
Expand Down
18 changes: 8 additions & 10 deletions app/src/main/java/com/ai/face/verify/FaceVerificationActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@
* 2.录入高质量的人脸图,人脸清晰,背景纯色(证件照输入目前优化中)
* 3.光线环境好,检测的人脸无遮挡,化浓妆或佩戴墨镜口罩帽子等
* 4.人脸照片要求300*300 裁剪好的仅含人脸的正方形照片,背景纯色
*
*/
public class FaceVerificationActivity extends AppCompatActivity {
private TextView tipsTextView, secondTipsTextView, scoreText;
private FaceTipsOverlay faceTipsOverlay;
private FaceCoverView faceCoverView;
private final FaceVerifyUtils faceVerifyUtils = new FaceVerifyUtils();
private int faceSearchViewMargin = 0;

//RGB 镜头 720p, 固定 30 帧,无拖影,RGB 镜头建议是宽动态
//静默活体检测要求 RGB 镜头 720p, 固定 30 帧,无拖影,RGB 镜头建议是宽动态
private final float silentLivenessPassScore = 0.92f; //静默活体分数通过的阈值


Expand All @@ -57,7 +57,6 @@ protected void onCreate(Bundle savedInstanceState) {
FaceVerificationActivity.this.finish();
});

faceSearchViewMargin = faceCoverView.getMargin() / 2;

int cameraLensFacing = getSharedPreferences("faceVerify", Context.MODE_PRIVATE)
.getInt("cameraFlag", 0);
Expand Down Expand Up @@ -93,7 +92,7 @@ protected void onCreate(Bundle savedInstanceState) {
//防止在识别过程中关闭页面导致Crash
if (!isDestroyed() && !isFinishing() && faceVerifyUtils != null) {
//2.第二个参数是指圆形人脸框到屏幕边距,可加快裁剪图像和指定识别区域,设太大会裁剪掉人脸区域
faceVerifyUtils.goVerify(imageProxy, faceSearchViewMargin);
faceVerifyUtils.goVerify(imageProxy, faceCoverView.getMargin());
}
});
}
Expand All @@ -112,15 +111,15 @@ private void initFaceVerify(Bitmap baseBitmap) {
.setThreshold(0.88f) //阈值设置,范围限 [0.8 , 0.95] 识别可信度,也是识别灵敏度
.setBaseBitmap(baseBitmap) //1:1 人脸识别对比的底片,仅仅需要SDK活体检测可以忽略比对结果
.setLivenessType(LivenessType.SILENT_MOTION) //活体检测可以有静默活体,动作活体或者组合也可以不需要活体NONE
.setLivenessDetectionMode(LivenessDetectionMode.ACCURACY)//硬件配置低用FAST动作活体模式,否则用精确模式
.setLivenessDetectionMode(LivenessDetectionMode.FAST)//硬件配置低用FAST动作活体模式,否则用精确模式
.setSilentLivenessThreshold(silentLivenessPassScore) //静默活体阈值 [0.88,0.99]
.setMotionLivenessStepSize(2) //随机动作活体的步骤个数[1-2],SILENT_MOTION和MOTION 才有效
.setVerifyTimeOut(16) //活体检测支持设置超时时间 [9,22] 秒
.setGraphicOverlay(faceTipsOverlay) //正式环境请去除设置
.setProcessCallBack(new ProcessCallBack() {

/**
* 1:1 人脸识别对比结束
* 1:1 人脸识别 活体检测 对比结束
*
* @param isMatched true匹配成功(大于setThreshold); false 与底片不是同一人
* @param similarity 与底片匹配的相似度值
Expand All @@ -137,10 +136,10 @@ public void onProcessTips(int i) {
showFaceVerifyTips(i);
}

//动作活体检测时间限制倒计时
//动作活体检测时间限制倒计时百分比
@Override
public void onTimeOutStart(float time) {
faceCoverView.startCountDown(time);
public void onTimeCountDown(float percent) {
faceCoverView.startCountDown(percent);
}


Expand Down Expand Up @@ -297,7 +296,6 @@ private void showFaceVerifyTips(int actionCode) {
protected void onDestroy() {
super.onDestroy();
faceVerifyUtils.destroyProcess();
faceCoverView.destroyView();
}


Expand Down
14 changes: 7 additions & 7 deletions app/src/main/res/layout/activity_about_us.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="77dp"
android:layout_marginLeft="66dp"
android:layout_marginLeft="50dp"
android:gravity="left"
android:padding="19dp"
android:text="微信 WeChat: HaoNan19990322"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textSize="15sp"
app:layout_constraintTop_toTopOf="parent" />


Expand All @@ -36,12 +36,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="66dp"
android:layout_marginLeft="66dp"
android:layout_marginLeft="50dp"
android:gravity="left"
android:padding="19dp"
android:text="邮箱 Email: anylife.zlb@gmail.com"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textSize="15sp"
app:layout_constraintTop_toTopOf="@+id/wechat" />


Expand All @@ -50,12 +50,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="66dp"
android:layout_marginLeft="66dp"
android:layout_marginLeft="50dp"
android:gravity="left"
android:padding="19dp"
android:text="What App : +8618707611416"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textSize="15sp"
app:layout_constraintTop_toTopOf="@+id/email" />

<TextView
Expand All @@ -67,7 +67,7 @@
android:padding="19dp"
android:text="@string/long_press_copy_msg"
android:textColor="@android:color/darker_gray"
android:textSize="16sp"
android:textSize="15sp"
app:layout_constraintTop_toTopOf="@+id/whatapp" />


Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/layout/activity_face_search_mn.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="27dp"
android:textColor="@color/yellow"
android:textColor="@color/red"
android:textSize="17sp"
android:gravity="center"
android:textStyle="bold"
Expand Down
14 changes: 7 additions & 7 deletions app/src/main/res/layout/activity_face_verification.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
android:id="@+id/face_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
customAttr:circle_margin="15dp"
customAttr:circle_margin="18dp"
customAttr:progress_end_color="@color/green"
customAttr:progress_start_color="@color/green2"
customAttr:show_progress="true"
Expand All @@ -31,15 +31,15 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginTop="59dp"
android:layout_marginTop="66dp"
android:background="@color/blue"
android:gravity="center"
android:paddingLeft="11dp"
android:paddingTop="5dp"
android:paddingRight="11dp"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:text="@string/keep_face_visible"
android:textColor="@color/green"
android:textColor="@color/white"
android:textSize="17sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/layout/activity_navi.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
android:gravity="center"
android:text="@string/face_verify_1vs1"
android:textColor="#2DCC18"
android:textSize="15sp" />
android:textSize="14sp" />

</LinearLayout>

Expand Down Expand Up @@ -83,7 +83,7 @@
android:gravity="center"
android:text="@string/add_face_image"
android:textColor="#2DCC18"
android:textSize="15sp"
android:textSize="14sp"
app:layout_constraintTop_toBottomOf="@+id/update_base_image" />

</LinearLayout>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@

<!--Navi activity-->
<string name="face_verify_1vs1">1:1人脸识别 </string>
<string name="add_face_image">人脸录入</string>
<string name="add_face_image">人脸底图录入</string>
<string name="only_motion_liveness_detection">仅人脸活体检测</string>
<string name="face_search_navi">1:N &amp; M:N人脸搜索识别 </string>
<string name="switch_camera">切换前后摄像头 </string>
Expand Down
14 changes: 10 additions & 4 deletions app/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,20 @@
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert.Self</item>

<item name="buttonBarPositiveButtonStyle">@style/positiveBtnStyle</item>
<item name="buttonBarNegativeButtonStyle">@style/negativeBtnstyle</item>
</style>


<style name="Theme.AppCompat.Light.Dialog.Alert.Self" parent="@style/Theme.AppCompat.Light.Dialog.Alert">
<!--修改AlertDialog按钮的颜色-->
<item name="colorAccent">@color/white</item>
<!--确定按钮样式-->
<style name="positiveBtnStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">@color/green</item>
</style>

<!--取消按钮样式-->
<style name="negativeBtnstyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">@color/red</item>
</style>


Expand Down
10 changes: 5 additions & 5 deletions questions.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
如果你的设备硬件配置有加速器支持( GPU 和数字信号处理器DSP)以及运行较高的Android 系统,定制SDK运行的效率和准确度都会有相应的提升

### 1.移动端是否包含iOS 端?
iOS 有1:1 人脸识别(含静默活体)
iOS 有1:1 人脸识别(含静默活体),动作活体移植中

### 2.为什么小朋友群体1:N ,M:N 误识别率较高?
小朋友的五官差异相对成年人确实没有那么大,需要专门为小朋友群体训练人脸识别模型
Expand All @@ -16,7 +16,7 @@
如果你的系统摄像头采用标准的 Android Camera2 API 和摄像头 HIDL 接口大部分都支持,也已经支持部分USB外接摄像头,其他的需要根据自定义开发板情况评估,你也可以自行管理摄像头和切换画面角度等,参考 https://github.com/AnyLifeZLB/BinocularCameraFaceSearch

### 4.人脸识别1:N 搜索是否能支持N>万人以上
本SDK 目前已经支持万人以上,大容量人脸库搜索速度快,
本SDK 目前已经支持万人以上,大容量人脸库搜索速度快,也支持分库搜索

### 5.如何提升 1:N/M:N 人脸识别的准确率?
- 录入高质量的人脸图
Expand All @@ -32,7 +32,7 @@

### 8.是否免费?
1:1 静态人脸照片对比完全免费,API VerifyUtils.evaluateFaceSimi
1:1 人脸识别基础版本299元,含有活体检测人脸录入校验4K,不限终端数量,不限制使用次数。
1:1 人脸识别基础版本299元,含有活体检测4K,不限终端数量,不限制使用次数。
1:N /M:N人脸搜索识别功能授权费用8K,不限终端数量,不限制使用次数。
授权绑定App包名和签名SHA1进行,需要新的功能和定制特性开发根据评估情况再协定。
「同一主体授权有多个变种App使用不同包名可以提供资料证明后协商优惠处理」
Expand Down Expand Up @@ -70,8 +70,8 @@ anylife.zlb@gmail.com。
### 12.是否可以使用在金融,强安全场景
SDK没有达到100% 的准确度,不建议使用在金融 强安全等严格要求领域,建议的场景如下:

【1:1】 移动考勤真人校验,App免密登录,酒店入驻、刷脸支付、刷脸解锁、真人校验
【1:N】 智能门锁,考勤机,通缉人员行踪搜索,智慧校园、景区、工地、社区、酒店等
【1:1】 移动考勤真人校验,App免密登录,酒店入驻、刷脸解锁、真人校验
【1:N】 智能门锁,小区门禁,公司门禁,智慧校园、景区、工地、社区、酒店等
【M:N】 公安布控,人群追踪 监控等等**

### 13.能通过File 操作直接把人脸照片放到制定目录就开始人脸搜索吗?
Expand Down

0 comments on commit 984e2b8

Please sign in to comment.