手把手教你用 Java 实现人脸识别、人证核验、人脸比对1:N

455 阅读3分钟

我们 Java 程序员在做人脸识别时,常常会遇到一些痛点:

🤯 大多数算法只提供 Python 接口,Java 接口稀缺

🧩 缺乏好用的、免费的离线解决方案

在最近的人脸识别相关开发中,我发现 SmartJavaAI 正好完美地解决了这些问题。 它不仅为 Java 提供了友好的接口,还支持人脸检测、人脸识别、人脸比对(1:1)、人脸比对(1:N)、人证核验、人脸注册、人脸搜索、等核心功能,部署简单、开箱即用,特别适合我们 Java 开发者使用。

效果展示

人脸检测

- 5点人脸关键点定位

人脸比对1:1

- 人脸对齐

人证核验

人脸比对1:N

- 人脸对齐
- 人脸注册
- 人脸库查询
- 人脸库删除

快速开始

1、Maven引入

在项目的pom.xml的dependencies中加入以下内容(全部功能),也可以根据需求单独引入人脸模块,具体可以查看 SmartJavaAI官方文档

<dependency>
    <groupId>cn.smartjavaai</groupId>
    <artifactId>smartjavaai-all</artifactId>
    <version>1.0.12</version>
</dependency>

2、人脸模型下载

根据需求选择合适的模型进行下载。以下是可用的人脸识别模型及相关信息:

模型名称下载地址兼容系统支持设备文件大小适用场景
retinaface下载Windows/Linux/MacOSCPU/GPU110MB高精度人脸检测
ultralightfastgenericface下载Windows/Linux/MacOSCPU/GPU1.7MB高速人脸检测
seetaface6下载Windows/LinuxCPU/GPU288MB人脸检测、人脸比对、人脸库注册、查询
facenet下载Windows/Linux/MacOSCPU/GPU104MB人脸特征提取、人脸比对

3、初始化模型

FaceModel faceModel = FaceModelFactory.getInstance().getModel();

自定义模型配置

FaceModelConfig config = new FaceModelConfig();
config.setModelEnum(FaceModelEnum.RETINA_FACE);
config.setConfidenceThreshold(FaceConfig.DEFAULT_CONFIDENCE_THRESHOLD);
config.setNmsThresh(FaceConfig.NMS_THRESHOLD);
FaceModel faceModel = FaceModelFactory.getInstance().getModel(config);

FaceModelConfig参数说明

字段名称类型默认值说明
modelEnumFaceModelEnumRETINA_FACE人脸模型
confidenceThresholddouble0.85置信度阈值
similarityThresholddouble0.62相似度阈值
nmsThreshdouble0.45非极大抑制阈值
modelPathStringnull模型路径
faceDbPathStringnull人脸库路径
deviceDeviceEnumCPU运行设备

4、人脸检测方法

DetectionResponse response = faceModel.detect("test.jpg");

当然你也可以传 BufferedImagebyte[]。一张图里多张脸也完全没问题!

结果会返回一个 DetectionResponse,里面有每张脸的坐标、属性、关键点信息,像这样:

检测结果示例

{
  "detectionInfoList": [ // 检测信息列表
    {
      "detectionRectangle": { //矩形框
        "height": 174, // 矩形高度
        "width": 147, // 矩形宽度
        "x": 275, // 左上角横坐标
        "y": 143 // 左上角纵坐标
      },
      "faceInfo": { // 人脸信息
        "keyPoints": [ // 5个人脸关键点:循序依次为,左眼中心、右眼中心、鼻尖、左嘴角和右嘴角
          {
            "x": 339.5083751678467,
            "y": 192.76402664184573
          },
          {
            "x": 404.7374267578125,
            "y": 197.89914321899414
          },
          {
            "x": 388.9555263519287,
            "y": 231.50675201416016
          },
          {
            "x": 339.8661708831787,
            "y": 265.51241302490234
          },
          {
            "x": 397.7071800231933,
            "y": 269.7657699584961
          }
        ]
      }
    }
  ]
}

5、检测并绘制人脸

该方法不仅可以检测人脸,还会在输入图像上绘制出检测到的人脸框以及5点人脸关键点并保存为输出图像。

faceModel.detectAndDraw("input.jpg","output.jpg");

6、人脸特征提取

此方法从输入的图像中提取人脸特征,返回一个包含人脸特征的 List

List<float[]> faceResult = faceModel.extractFeatures("input.jpg");

7、人脸特征比对

通过比较两个人脸特征,计算它们的相似度,返回值为0到1之间的浮动值,值越大表示人脸越相似。

float similar = faceModel.calculSimilar(feature1, feature2);
log.info("相似度:{}", similar);

8、人脸比对(1:1)

此方法直接比较两张人脸的相似度,用于1:1的人脸比对,返回相似度分数。

float similar = faceModel.featureComparison("input1.jpg","input2.jpg");
log.info("相似度:{}", similar);

9、人脸注册

此方法用于将某个用户的人脸图像注册到系统中,并关联一个唯一的标识符(如 "zhangsan")。人脸注册后,系统会将人脸信息保存到人脸库中(例如:faces-data.db),以便后续进行人脸比对和查询。

boolean isSuccss = faceModel.register("zhangsan","input.jpg");

10、人脸比对(1:N)

此方法在已注册的人脸库中进行人脸比对,返回与输入图像最相似的注册人脸数据,适用于1:N比对。

FaceResult faceResult = faceModel.search("input.jpg");

开源项目与文档地址

本篇文章中的人脸检测功能,来自开源项目 SmartJavaAI

🔗 Gitee 项目地址:gitee.com/dengwenjie/…

🔗 GitHub 项目地址:github.com/geekwenjie/…

🔗 GitCode 项目地址:gitcode.com/geekwenjie/…

📖 在线文档地址:doc.smartjavaai.cn

完整Demo代码地址:examples