在这里插入图片描述

痛点

​ 目前,常用的人脸识别算法大多基于Python开发,因为Python对深度学习框架的支持较好,且许多优秀的人脸识别算法都是在深度学习框架下实现的。然而,对于Java开发者来说,这种情况并不十分友好。传统上,Java开发的人脸识别算法主要依赖OpenCV,但与基于深度学习的算法相比,OpenCV的精度相对较低。此外,若Java开发者希望使用Python实现的算法,还需要安装Python环境,并且熟悉Python语言,整体上门槛较高且使用流程繁琐。

今天,介绍一个开源项目给大家,通过仅两行代码即可实现人脸识别,极大地简化了Java开发者的使用流程。

java实现人脸识别方案比较

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

SmartJavaAI是基于 DJL(Deep Java Library) 封装的轻量级深度学习算法库,依托DJL的自动模型管理和跨框架特性,无需安装Python环境且无需手动下载模型文件(模型由DJL内部自动从云端加载),该库致力于构建Java生态与AI模型之间的高效桥梁。针对Java开发者面临的两大痛点:

  • 🐍 主流AI框架(PyTorch/TensorFlow)的Python生态与Java工程体系割裂
  • ⚙️ 直接使用DJL需处理模型加载、预处理、后处理等复杂技术细节

SmartJavaAI实现了:
开箱即用 - 两行代码完成人脸检测/识别
多模型支持 - 集成RetinaFace/Ultra-Light-Fast-Generic-Face-Detector双检测模型(即将支持OCR/目标检测)
跨平台兼容 - 完美支持Windows/Linux/macOS系统(x86 & ARM架构)

🌟 核心优势

维度Python生态原生DJL本工具包
开发效率需搭建Python环境需实现完整AI Pipeline提供即用API
学习成本需掌握Python/C++混合编程需深入理解AI框架机制Java语法即可调用
部署复杂度需维护多语言服务需处理底层资源调度单一Jar包集成
性能表现原生高性能依赖开发者优化经验内置生产级调优

📌 支持功能

✅ 已实现功能

  • 人脸检测
    支持图片/视频流中的多面孔定位与质量评估
  • 人脸特征提取
    基于深度学习算法生成512维特征向量
  • 人脸特征比对 (1:1)
  • 人脸查询 (1:N)
    人脸库注册/人脸库查询/人脸库删除

⌛ 规划中功能

  • OCR文字识别
    即将支持身份证/银行卡/车牌等关键信息提取,适配复杂背景与模糊文本
  • 目标检测
    计划集成YOLOv9模型,支持车辆检测/安全帽识别/工业质检等场景
  • 图像分割
  • 语音识别
    基于Transformer的语音转文本引擎,支持中文/英文多语种识别

目前已集成的人脸算法模型

  • RetinaFace 模型[[GitHub]](https://github.com/deepinsight/insightface/tree/master/detection/retinaface):一个高效的深度学习人脸检测模型,支持高精度的人脸检测,但目前不支持人脸比对
  • Ultra-Light-Fast-Generic-Face-Detector-1MB [GitHub]:一个轻量级的人脸检测模型,适用于需要较低延迟和较小模型尺寸的应用场景。
  • Seetaface6 [GitHub]:是中科视拓最新开放的商业正式级版本,支持人脸检测、关键点定位、人脸识别。同时增加了活体检测、质量评估、年龄性别估计。并且响应时事,开放了口罩检测以及戴口罩的人脸识别模型

模型对比及下载地址

模型名称下载地址文件大小适用场景兼容系统
retinaface下载110MB高精度人脸检测Windows/Linux/MacOS
ultralightfastgenericface下载1.7MB高速人脸检测Windows/Linux
seetaface6下载288MB人脸检测/人脸识别Windows/Linux

环境要求

  • Java 版本:JDK 11或更高版本
  • 操作系统:不同模型支持的系统不一样,具体请查看文档

使用步骤

📌 运行提示

(1)默认算法(RetinaFace)或轻量算法(Ultra-Light-Fast-Generic-Face-Detector )都为python算法,兼容 Windows、Linux、MacOS,Android 等系统,SmartJavaAI首次启动将自动下载模型到及依赖库到本地(.djl.ai隐藏文件夹),建议保持网络畅通。初始化完成后,后续启动可实现毫秒级响应。在无网络环境下,可指定本地模型路径(需提前下载模型包)。目前,这两种算法不支持人脸识别或人脸比对功能。

(2)Seetaface6 采用 C++ 编写,兼容 Windows、CentOS、Ubuntu 等系统。创建算法时,将自动加载对应系统的依赖库。Seetaface6 支持全功能人脸处理(人脸检测、人脸比对 1:1 或 1:N)。SmartJavaAI 通过 JNI 调用 C++ 接口,不支持在线下载模型,需手动下载并存储至本地。使用人脸比对等功能时,需要将项目中db/faces-data.db存放到您本地路径下并在config中指定人脸库路径。

1. 安装人脸算法依赖

在 Maven 项目的 pom.xml 中添加 SmartJavaAI的人脸算法依赖:

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

2. 人脸检测代码示例

//创建人脸算法
FaceAlgorithm currentAlgorithm = FaceAlgorithmFactory.createFaceAlgorithm();
//使用图片路径检测
FaceDetectedResult result = currentAlgorithm.detect("src/main/resources/largest_selfie.jpg");

3. 轻量人脸检测代码示例

//创建人脸算法
FaceAlgorithm currentAlgorithm = FaceAlgorithmFactory.createLightFaceAlgorithm();
//使用图片路径检测
FaceDetectedResult result = currentAlgorithm.detect("src/main/resources/largest_selfie.jpg");

4. 使用图片输入流检测

//支持各种输入流方式检测图片
File input = new File("src/main/resources/largest_selfie.jpg");
FaceDetectedResult result = currentAlgorithm.detect(new FileInputStream(input));

5. 人脸比对(1:1)

(1)将项目中db/faces-data.db存放到您本地路径下

(2)下载模型到本地路径,下载地址:https://pan.baidu.com/s/1hfNacA8ISV2qHrycjOkgqA?pwd=1234 提取码:1234

(3)如果网盘地址请联系本人,文档最后有联系方式

// 初始化配置
ModelConfig config = new ModelConfig();
config.setAlgorithmName("seetaface6");//目前支持人脸比对的算法只有:seetaface6
//人脸库路径 如果不指定人脸库,无法使用 1:N人脸搜索
config.setFaceDbPath("C:/Users/Administrator/Downloads/faces-data.db");
//改为模型存放路径
config.setModelPath("/opt/sf3.0_models");
//创建人脸算法
FaceAlgorithm currentAlgorithm = FaceAlgorithmFactory.createFaceAlgorithm(config);
//自动裁剪人脸并比对人脸特征
float similar = currentAlgorithm.featureComparison("src/main/resources/kana1.jpg","src/main/resources/kana2.jpg");
log.info("相似度:{}", similar);

6. 人脸特征提取及比对

// 初始化配置
ModelConfig config = new ModelConfig();
config.setAlgorithmName("seetaface6");
//人脸库路径 如果不指定人脸库,无法使用 1:N人脸搜索
config.setFaceDbPath("C:/Users/Administrator/Downloads/faces-data.db");
//改为模型存放路径
config.setModelPath("C:/Users/Administrator/Downloads/sf3.0_models/sf3.0_models");
//创建人脸算法
FaceAlgorithm currentAlgorithm = FaceAlgorithmFactory.createFaceAlgorithm(config);
//提取图像中最大人脸的特征
float[] feature1 = currentAlgorithm.featureExtraction("src/main/resources/kana1.jpg");
float[] feature2 = currentAlgorithm.featureExtraction("src/main/resources/kana2.jpg");
float similar = currentAlgorithm.calculSimilar(feature1, feature2);
log.info("相似度:{}", similar);

7. 注册及搜索人脸(1:N)

// 初始化配置
ModelConfig config = new ModelConfig();
config.setAlgorithmName("seetaface6");
//人脸库路径 如果不指定人脸库,无法使用 1:N人脸搜索
config.setFaceDbPath("C:/Users/Administrator/Downloads/faces-data.db");
//改为模型存放路径
config.setModelPath("C:/Users/Administrator/Downloads/sf3.0_models/sf3.0_models");
//创建人脸算法 自动将人脸库加载到内存中
FaceAlgorithm currentAlgorithm = FaceAlgorithmFactory.createFaceAlgorithm(config);
//等待人脸库加载完毕
Thread.sleep(1000);
//注册kana1人脸,参数key建议设置为人名
boolean isSuccss = currentAlgorithm.register("kana1","src/main/resources/kana1.jpg");
//注册jsy人脸,参数key建议设置为人名
isSuccss = currentAlgorithm.register("jsy","src/main/resources/jsy.jpg");
FaceResult faceResult = currentAlgorithm.search("src/main/resources/kana2.jpg");
if(faceResult != null){
    log.info("查询到人脸:{}", faceResult.toString());
}else{
    log.info("未查询到人脸");
}

8. 人脸检测(离线下载模型)

// 初始化配置
ModelConfig config = new ModelConfig();
config.setAlgorithmName("retinaface");//人脸算法模型,目前支持:retinaface/ultralightfastgenericface/seetaface6
//config.setAlgorithmName("ultralightfastgenericface");//轻量模型
config.setConfidenceThreshold(FaceConfig.DEFAULT_CONFIDENCE_THRESHOLD);//置信度阈值
config.setMaxFaceCount(FaceConfig.MAX_FACE_LIMIT);//每张特征图保留的最大候选框数量
//nms阈值:控制重叠框的合并程度,取值越低,合并越多重叠框(减少误检但可能漏检);取值越高,保留更多框(增加检出但可能引入冗余)
config.setNmsThresh(FaceConfig.NMS_THRESHOLD);
//模型下载地址:
//retinaface: https://resources.djl.ai/test-models/pytorch/retinaface.zip
//ultralightfastgenericface: https://resources.djl.ai/test-models/pytorch/ultranet.zip
//改为模型存放路径
config.setModelPath("/Users/xxx/Documents/develop/face_model/retinaface.pt");
//创建人脸算法
FaceAlgorithm currentAlgorithm = FaceAlgorithmFactory.createFaceAlgorithm(config);
//使用图片路径检测
FaceDetectedResult result = currentAlgorithm.detect("src/main/resources/largest_selfie.jpg");
logger.info("人脸检测结果:{}", JSONObject.toJSONString(result));
//使用图片流检测
File input = new File("src/main/resources/largest_selfie.jpg");
//FaceDetectedResult result = currentAlgorithm.detect(new FileInputStream(input));
//logger.info("人脸检测结果:{}", JSONObject.toJSONString(result));
BufferedImage image = ImageIO.read(input);
//创建保存路径
Path imagePath = Paths.get("output").resolve("retinaface_detected.jpg");
//绘制人脸框
ImageUtils.drawBoundingBoxes(image, result, imagePath.toAbsolutePath().toString());

完整代码

📁 examples/src/main/java/smartai/examples/face
 └── 📄FaceDemo.java

源码地址

码云:https://gitee.com/dengwenjie/SmartJavaAI
github:https://github.com/geekwenjie/SmartJavaAI


Geek文杰
1 声望0 粉丝