🍬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知识 ❌ 需处理模型加载、预处理、后处理等复杂技术细节 |
SmartJavaAI | java深度学习工具包 | ✅ 支持主流深度学习框架 ✅ 提供丰富、开箱即用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/GPU | 110MB | 高精度人脸检测 |
ultralightfastgenericface | 下载 | Windows Linux MacOS | CPU/GPU | 1.7MB | 高速人脸检测 |
seetaface6 | 下载 | Windows Linux | CPU | 288MB | 人脸检测、人脸比对、人脸库注册、人脸库查询 |
facenet | 下载 | Windows Linux MacOS | CPU/GPU | 104MB | 人脸特征提取、人脸比对 |
方法说明
获取默认人脸模型:
- 默认模型: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参数说明
字段名称 | 字段类型 | 默认值 | 说明 |
---|---|---|---|
modelEnum | FaceModelEnum | RETINA_FACE | 人脸模型枚举 |
confidenceThreshold | double | 0.85 | 置信度阈值,分数低于这个值的结果将被过滤掉。值越高越严格,越低越宽松。 |
similarityThreshold | double | 0.62 | 相似度阈值 作用:判断是否为同一人脸 |
nmsThresh | double | 0.45 | 非极大抑制阈值,用于去除重复的人脸框,当两个框的重叠度超过该值时,只保留一个,建议使用默认值 |
modelPath | String | NULL | 手动指定离线模型路径 |
faceDbPath | String | NULL | 人脸库路径(注册/查询功能需配置) |
device | DeviceEnum | CPU | 指定运行设备,支持 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_MODEL | seetaface6全功能人脸模型 |
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字段说明
字段名称 | 字段类型 | 说明 |
---|---|---|
key | String | 注册人脸的key值 |
similar | float | 相似度 |
人脸删除
- 参数为调用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/…