我们 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/MacOS | CPU/GPU | 110MB | 高精度人脸检测 |
ultralightfastgenericface | 下载 | Windows/Linux/MacOS | CPU/GPU | 1.7MB | 高速人脸检测 |
seetaface6 | 下载 | Windows/Linux | CPU/GPU | 288MB | 人脸检测、人脸比对、人脸库注册、查询 |
facenet | 下载 | Windows/Linux/MacOS | CPU/GPU | 104MB | 人脸特征提取、人脸比对 |
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参数说明
字段名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
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 | 运行设备 |
4、人脸检测方法
DetectionResponse response = faceModel.detect("test.jpg");
当然你也可以传 BufferedImage
或 byte[]
。一张图里多张脸也完全没问题!
结果会返回一个 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