Android 1:N和 M:N 人脸搜索SDK接入步骤说明

FaceSearchSDK_Android

应用户要求,人脸识别1:N ,M:N检索独立成库,以便减少体积和快速接入SDK, 这是独立版本的人脸识别搜索,
离线版Android 1:N,M:N 人脸识别检索,速度快,精度高。On_device Offline Android Face 1:N,M:N Search
(含有1:1 人脸识别活体检测完整版本的工程地址:https://github.com/AnyLifeZLB/FaceVerificationSDK)

WechatIMG1212.jpg

首次接入SDK建议先下载DemoAPK安装了解本SDK 的基本功能,服务与政策,下载本Demo 跑一跑流程熟悉基础接入.

SDK支持Android 5+,建议设备配置 CPU为八核64位2.0 GHz以上 摄像头RGB 宽动态镜头分辨率1080p以上,帧率大于30,无拖影

简要介绍

简单使用场景

  • 【1:N】 小区门禁,智能门锁,考勤机,智慧校园、工地、社区店等
  • 【M:N】 公安布控,特定群体追踪等

目前人脸检索速度约50MS(三星N9700千张人脸验证),人脸检索的速度和硬件配置,人脸质量和识别threshold(阈值)设置有关
运行本Demo体验的时候点击导航页[增删改人脸] 后进入编辑页面,点击右上角[拍照]启动系统相机自拍一张.也可以点击[App 内置200张Ai人脸头像]
模拟N较大的情况,理论上N支持万张以上,需要验证更多人脸素材场景可以自行将人脸导入项目Assert目录验证大容量场景

特殊DIY Android系统 或 特殊定制硬件(基于RK3X88平台等),外接USB摄像头等有问题请先提Issues附带Android版本、硬件配置、错误log等信息;
或发反馈邮件到anylife.zlb@gmail.com(建议先熟悉人脸识别相关基础)

SDK接入简要流程

1.首先Gradle 中引入依赖

implementation ‘io.github.anylifezlb:FaceSearchSDK:1.8.9’ //请依赖最新稳定版本++

2.检查依赖冲突等

SDK开发的 compileSdk=33,需要Kotlin 环境支持,如果遇到依赖冲突或者SDK集成编译问题请参考升级或解决冲突

//若第三方依赖有冲突,或者因为compileSdk过低需要降级依赖版本可以参考修改
configurations.all {
    resolutionStrategy {
        force 'org.android.google:9.9.9' //合适不冲突版本
    }
}

3.确定是否自行管理相机还是默认使用SDK相机管理摄像头

推荐快速接入SDK相机管理的初始化

第一个参数0/1 指定前后摄像头; 第二个参数linearZoom [0.1f,1.0f] 指定焦距,默认0.1
cameraXFragment = CameraXFragment.newInstance(cameraLensFacing,0.09f);

然后在相机分析回调中调用FaceSearchEngine 搜索引擎进行工作

cameraX.setOnAnalyzerListener(imageProxy -> {
      FaceSearchEngine.Companion.getInstance().runSearch(imageProxy, 0);
});

自定义管理相机

如果你的项目需要高定制化相机管理或者自定义硬件相机数据格式,方向不兼容需要自行管理可以不使用SDK 中的CameraXFragment管理相机,我们有个小Demo演示双目摄像头自行管理相机你仅仅需要在子线程中持续输入图像帧Bitmap. SDK 在后续流程中会检测人脸,搜索人脸并进行状态和结果回调。

    //1.在摄像头回调预览中循环调用runSearch()方法
    //自行保证Bitmap 的方向角度正确无旋转,清晰度。runSearch必须在子线程运行
    FaceSearchEngine.Companion.getInstance().runSearch(realTimeFaceBmp);

自定义管理相机更多请参考 https://github.com/AnyLifeZLB/BinocularCameraFaceSearch

4.人脸搜索过程中各种参数的初始化

```
    FaceProcessBuilder faceProcessBuilder = new FaceProcessBuilder.Builder(this)
            .setNeedMultiValidate(false)      //是否需要筛选结果防止误识别,需要硬件CPU配置高,Android 8+
            .setThreshold(0.88f)                  //阈值设置,范围限 [0.8 , 0.95] 识别可信度,也是识别灵敏度
            .setNeedNirLiveness(false)        //是否需要红外活体能力,只有1:N VIP 有
            .setNeedRGBLiveness(false)        //是否需要普通RGB活体检测能力,只有1:N VIP 有
            .create();

    faceDetectorUtils.setDetectorParams(faceProcessBuilder);

```

//初始化引擎,开始人脸检索
FaceSearchEngine.Companion.getInstance().initSearchParams(faceProcessBuilder);

//搜索的各种状态和结果回调,更多参考Demo

.setProcessCallBack(new SearchProcessCallBack() {

   @Override
   public void onMostSimilar(String similar, Bitmap bitmap) {
       binding.resultId.setText(similar);
       Glide.with(requireContext())
            .load(CACHE_SEARCH_FACE_DIR + File.separatorChar + similar)
            .diskCacheStrategy(DiskCacheStrategy.NONE)
            .transform(new RoundedCorners(12)) // 数字根据自己需求来改
            .into(binding.resultImg);
   }



   @Override
   public void onProcessTips(int i) {
      showPrecessTips(i);
   }

注意事项

  1. 所有的人脸都必须通过SDK 的API 插入到人脸管理目录,而不是File 文件放入到目录就行,SDK API 还会提取人脸特征操作
  2. 录入的人脸底片请使用正脸无遮挡的清晰照片,平时戴眼睛的依然使用戴眼镜的人脸照片
  3. setNeedMultiValidate 和 setThreshold 根据你项目需要精确度和反应速度合理设置参数
  4. Demo 中有Assert 有250 张测试人脸;你可以在人脸管理页面中右上角通过自拍添加一张个人清晰人脸照进行测试验证
  5. 请勿不经验证直接用于生产环境,特别是有严格匹配的场景

Demo 下载体验

最新版体验下载地址: https://www.pgyer.com/FaceSearchSDK
或者直接扫码安装

更多使用说明下载参考本Repo和下载Demo代码体验,里面有比较详尽的使用方法

演示视频快速预览

https://github.com/AnyLifeZLB/FaceSearchSDK_Android/assets/15169396/46cca423-1cc9-4861-bec9-7457f68ad986

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您提到的是一个比较常见的人脸搜索和识别任务。这里我简单介绍一下一种基于 OpenCV 和 FaceNet 的 M:N 人脸识别方法,同时提供一个可视化的结果展示方法。 首先,我们需要准备以下工具和数据: - OpenCV:用于图像处理和人脸检测。 - FaceNet:用于人脸特征提取。 - 人脸数据库:用于训练和测试模型。 接下来,我们可以按照以下步骤进行 M:N 人脸识别: 1. 数据预处理:首先需要对人脸数据库进行预处理,包括对每张人脸图像进行人脸检测和对齐,然后使用 FaceNet 提取每张人脸图像的特征向量,将它们保存到一个特征向量数据库中。 2. 检测和对齐:对于输入的测试图像,使用 OpenCV 进行人脸检测和对齐,确保输入图像中的人脸与数据库中的人脸对齐。 3. 特征提取:使用 FaceNet 对输入图像中的人脸进行特征提取,得到一个特征向量。 4. 特征匹配:将输入图像的特征向量与数据库中的所有特征向量进行匹配,得到一个相似度矩阵。这个矩阵中的每个元素表示输入图像的特征向量与数据库中对应特征向量的相似度。 5. 识别和可视化:根据相似度矩阵,我们可以得到每个人脸在数据库中的匹配得分。根据阈值可以判断输入图像中的人脸是否在数据库中出现过。同时,我们可以将匹配得分最高的前 N 个人脸在输入图像中进行可视化展示,以便于用户进行识别。 这里提供一个简单的 Python 代码示例,用于实现 M:N 人脸识别和可视化: ```python import cv2 import numpy as np import os import tensorflow as tf from facenet import facenet from scipy import misc # 加载 FaceNet 模型和人脸数据库 model_dir = './model/20180402-114759' database_dir = './database' model = facenet.load_model(model_dir) database = facenet.load_data(database_dir) # 人脸检测器 detector = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') # 识别阈值 threshold = 0.6 # 可视化参数 font = cv2.FONT_HERSHEY_SIMPLEX font_scale = 1 thickness = 2 # 读取测试图像 image_path = './test.jpg' image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 人脸检测和对齐 faces = detector.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) for (x, y, w, h) in faces: cropped = image[y:y+h, x:x+w] aligned = misc.imresize(cropped, (160, 160), interp='bilinear') prewhitened = facenet.prewhiten(aligned) prewhitened = np.reshape(prewhitened, (-1, 160, 160, 3)) # 特征提取 feed_dict = {model.images_placeholder: prewhitened, model.phase_train_placeholder: False} features = model.embedding.eval(feed_dict=feed_dict) # 特征匹配 similarities = np.dot(database, features.T) indices = np.argsort(similarities)[::-1] # 可视化 for i in range(3): index = indices[i] similarity = similarities[index] if similarity < threshold: break name = os.path.basename(os.path.splitext(database_files[index])[0]) cv2.putText(image, name, (x, y-10-30*i), font, font_scale, (0, 0, 255), thickness) # 显示结果 cv2.imshow('Result', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个代码示例中,我们首先通过 FaceNet 加载了一个人脸数据库,然后使用 OpenCV 进行了人脸检测和对齐,接着使用 FaceNet 对输入图像中的人脸进行了特征提取,最后对输入图像的特征向量与数据库中的特征向量进行了匹配,并将匹配得分最高的前三个人脸可视化展示在输入图像中。 希望这个简单的代码示例能够帮助您理解 M:N 人脸识别和可视化的方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值