如何用Java实现离线人脸识别1:N(附源码)

549 阅读7分钟

🍬JAVA轻量级深度学习算法库,该库致力于构建Java生态与AI模型之间的高效桥梁

📚简介

SmartJavaAI是专为Java 开发者打造的一个功能丰富、开箱即用的 Java 算法工具包,致力于帮助Java开发者高效集成各类智能算法。SmartJavaAI通过对多种主流算法的统一封装,开发者无需深入了解底层实现,即可轻松在 Java 代码中调用人脸识别、目标检测、OCR 等功能。目前已支持部分人脸识别与目标检测算法,底层实现涵盖了 C++、Python 等语言的深度学习模型。后续将持续扩展更多算法,最终将构建一个面向 Java 开发者的通用智能工具库。

🚀 能力展示

人脸检测

人脸比对1:1

人证核验

人脸比对1:N

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

🚀 核心亮点

针对 Java 开发者在集成智能算法时常见的两大痛点:

  • 🐍 主流AI深度学习框架(PyTorch/TensorFlow)的Python生态与Java工程体系割裂

  • ⚙️ 现有算法方案分散杂乱,封装不统一,使用门槛高,不易直接服务于 Java 业务开发

实现了:

开箱即用 - 两行代码即可调用算法

支持多种深度学习引擎 - Pytorch、Tensorflow、MXNet、ONNX Runtime

功能丰富 - 当前支持人脸识别与目标检测,未来将陆续支持 OCR、图像分类、NLP 等多个 AI 领域任务,构建全面的智能算法体系。

跨平台兼容 - 支持Windows/Linux/macOS系统(x86 & ARM架构)

📌 支持功能

✅ 已实现功能

  • 人脸检测
    人脸检测、人脸识别、人脸比对1:1、人脸比对1:N、人脸库注册、人脸库、人脸库删除

⌛ 规划中功能

性别检测,年龄检测,活体检测

🌟 AI集成方式对比

方案技术特点优点缺点
OpenCV传统图像处理方案✅ 提供java接口
✅ 轻量级部署
✅ 社区资源丰富
❌ 基于传统算法精度低(60%-75%)
❌ 需本地安装环境
虹软SDK商业级闭源解决方案✅ 开箱即用
✅ 提供完整文档和SDK
✅ 支持离线活体检测
❌ 免费版需年度授权更新
❌ 商业授权费用高
❌ 代码不可控
‌**云API(阿里云)**‌SaaS化云端服务✅ 零部署成本
✅ 支持高并发
✅ 自带模型迭代
❌ 网络延迟风险(200-800ms)
❌ 按调用量计费
❌ 有数据安全风险
Python混合调用跨语言调用方案✅ 可集成PyTorch/TF等框架
✅ 支持自定义算法
✅ 识别精度高
❌ 需维护双语言环境
❌ 进程通信性能损耗(30%+)
❌ 异常处理复杂度翻倍
DJL框架深度学习框架✅ 纯Java实现
✅ 支持主流深度学习框架
✅ 可加载预训练模型(99%+)
❌ 需掌握DL知识
❌ 需处理模型加载、预处理、后处理等复杂技术细节
SmartJavaAIjava深度学习工具包✅ 支持主流深度学习框架
✅ 提供丰富、开箱即用API
✅ 上手简单,单一Jar包集成
❌要求JDK版本11及以上

安装

1、环境要求

  • Java 版本:JDK 11或更高版本
  • 操作系统:不同模型支持的系统不同,请参考各模型说明

2、Maven

在项目的 pom.xml 中添加以下依赖(仅用于人脸识别模块)。如需引入全部功能,请使用 smartjavaai-all 模块。

<dependency>
    <groupId>ink.numberone</groupId>
    <artifactId>smartjavaai-face</artifactId>
    <version>1.0.10</version>
</dependency>

3、人脸模型下载

如果在有网环境下使用,不需要下载模型(SeetaFace6模型除外)

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

方法说明

获取默认人脸模型:

  • 默认模型:retinaface,联网自动下载
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指定运行设备,支持 CPU/GPU

注意事项:

1、当使用 SeetaFace6 模型时,必须手动设置 modelPath,若启用人脸注册和查询功能,还需配置 faceDbPath。modelPath 为模型目录路径,无需包含具体文件名。

2、similarityThreshold目前只支持seetaface6模型使用

3、seetaface6模型不支持自定义confidenceThreshold

FaceModelEnum人脸模型枚举说明

枚举值说明
RETINA_FACE高精度人脸检测模型
ULTRA_LIGHT_FAST_GENERIC_FACE轻量人脸检测模型
FACENET_FEATURE_EXTRACTION人脸特征提取模型
SEETA_FACE6_MODELseetaface6全功能人脸模型

FaceModel API 方法说明

人脸检测

DetectionResponse detect(String imagePath);
DetectionResponse detect(InputStream imageInputStream);
DetectionResponse detect(BufferedImage image);
DetectionResponse detect(byte[] imageData);

DetectionResponse字段说明

  • 返回并非json格式,仅用于字段讲解
{
  "rectangleList": { // 检测到的矩形区域列表
    "x": 100, // 左上角横坐标
    "y": 150, // 左上角纵坐标
    "width": 80, // 矩形宽度
    "height": 60, // 矩形高度
    "score": 9.8 // 置信度
  }
}

检测并绘制人脸框

/**
 * 检测并绘制人脸
 * @param imagePath 图片输入路径(包含文件名称)
 * @param outputPath 图片输出路径(包含文件名称)
 */
void detectAndDraw(String imagePath, String outputPath);

/**
 * 检测并绘制人脸
 * @param sourceImage
 * @return
 */
BufferedImage detectAndDraw(BufferedImage sourceImage);

人脸特征提取

  • 返回float数组
float[] featureExtraction(String imagePath);
float[] featureExtraction(InputStream inputStream);
float[] featureExtraction(BufferedImage sourceImage);
float[] featureExtraction(byte[] imageData);

人脸比对(相似度计算)

  • 参数为featureExtraction的返回结果
/**
 * 计算相似度
 * @param feature1 图1特征
 * @param feature2 图2特征
 * @return
 */
float calculSimilar(float[] feature1, float[] feature2);

人脸注册

boolean register(String key, String imagePath);
boolean register(String key, InputStream inputStream);
boolean register(String key, BufferedImage sourceImage);
boolean register(String key, byte[] imageData);

人脸查询

FaceResult search(String imagePath);
FaceResult search(InputStream inputStream);
FaceResult search(BufferedImage sourceImage);
FaceResult search(byte[] imageData);

FaceResult字段说明

字段名称字段类型说明
keyString注册人脸的key值
similarfloat相似度

人脸删除

  • 参数为调用register方法时的key值
long removeRegister(String... keys);

清空人脸库

long clearFace();

完整示例代码

示例代码

📁 src/main/java/smartai/examples/face

└── 📄RetinaFaceDemo.java (人脸模型:RetinaFace示例代码)

└── 📄LightFaceDemo (人脸模型:UltraLightFastGenericFaceModel示例代码)

└── 📄SeetaFace6Demo.java (人脸模型:SeetaFace6示例代码)

└── 📄FaceNetDemo.java (人脸模型:FaceNet示例代码)

离线使用

1、首次运行,会自动下载模型及底层依赖库到缓存目录中。缓存路径请看文档:离线使用

2、seetaface6需要手动下载模型,其他模型调用都会自动下载,如果因网络问题下载失败,请手动下载模型,并放置到缓存目录中

3、可以在联网环境中运行程序一次,确保所需的依赖库已下载。然后将缓存目录复制到离线环境中相同的路径下,即可实现离线使用

源码地址

码云:gitee.com/dengwenjie/…
github:github.com/geekwenjie/…
gitcode:gitcode.com/geekwenjie/…