最近在做人脸识别相关的项目,发现 SmartJavaAI 提供的人脸属性检测功能真的挺有意思的,居然能看出一个人是不是戴了口罩,眼睛有没有睁开,还能判断脸部的角度……这不,就赶紧写篇博客和大家分享下如何在 Java 中使用这套接口做一波“人脸八卦”检测!
人脸属性检测能干嘛?
简单来说,人脸属性检测包含:
- 性别识别:猜猜是他还是她?
- 年龄估计:猜年龄不用尴尬地问了!
- 口罩检测:还能识别你有没有戴口罩
- 眼睛状态:睁眼还是闭眼?
- 脸部姿态:包括俯仰角(抬头低头)、偏航角(左看右看)和翻滚角(歪头杀!)
效果展示
|
|
如何上手?
1、引入 Maven 依赖
在项目的pom.xml的dependencies中加入以下内容(全部功能),也可以根据需求单独引入人脸模块,具体可以查看 SmartJavaAI官方文档
<dependency>
<groupId>cn.smartjavaai</groupId>
<artifactId>smartjavaai-all</artifactId>
<version>1.0.12</version>
</dependency>
2、模型下载
SmartJavaAI 默认使用的是 SeetaFace6 活体检测模型,首次使用前请先下载模型文件并解压到本地路径。
🔗 下载地址:
⚠️ 下载后请将模型路径配置到
faceAttributeConfig#setModelPath中。
3、加载模型:
FaceAttributeConfig config = new FaceAttributeConfig();
config.setModelEnum(FaceAttributeModelEnum.SEETA_FACE6_MODEL);
// 替换为你实际的模型路径
config.setModelPath("C:/Users/Administrator/Downloads/sf3.0_models/sf3.0_models");
FaceAttributeModel faceAttributeModel = FaceAttributeModelFactory.getInstance().getModel(config);
配置项也可以自定义,想开启或关闭某些检测功能都可以:
| 字段名称 | 字段类型 | 默认值 | 说明 |
|---|---|---|---|
| modelEnum | FaceAttributeModelEnum | SEETA_FACE6_MODEL | 模型枚举,目前支持人脸属性检测的模型只有seetaface6模型 |
| modelPath | String | NULL | 手动指定离线模型路径 |
| enableAge | boolean | true | 是否启用年龄检测,可选 |
| enableGender | boolean | true | 是否启用性别检测,可选 |
| enableHeadPose | boolean | true | 是否启用人脸姿态检测,可选 |
| enableEyeStatus | boolean | true | 是否启用眼睛状态检测,可选 |
| enableMask | boolean | true | 是否启用口罩检测,可选 |
| device | DeviceEnum | CPU | 指定运行设备,支持 CPU/GPU |
4、开始检测啦!(支持多种图片输入方式)
DetectionResponse response = faceAttributeModel.detect("test.jpg");
当然你也可以传 BufferedImage 或 byte[]。一张图里多张脸也完全没问题!
结果会返回一个 DetectionResponse,里面有每张脸的坐标、属性、关键点信息,像这样:
{
"detectionInfoList": [ // 检测信息列表
{
"detectionRectangle": { //矩形框
"height": 174, // 矩形高度
"width": 147, // 矩形宽度
"x": 275, // 左上角横坐标
"y": 143 // 左上角纵坐标
},
"faceInfo": { // 人脸信息
"faceAttribute": { //人脸属性
"age": 44, //年龄
"genderType": "FEMALE", //性别
"headPose": { //脸部姿态
"pitch": 12.958274,
"roll": 0.19592644,
"yaw": -4.166052
},
"leftEyeStatus": "OPEN",// 左眼开闭
"rightEyeStatus": "OPEN",//右眼开闭
"wearingMask": false //是否戴口罩
},
"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
}
]
}
}
]
}
进阶玩法:基于已检测出的人脸框 + 关键点做属性检测
假如你已经提前做了人脸检测并拿到了人脸区域和五个关键点(左眼、右眼、鼻尖、嘴角 x2),你也可以这么玩:
List<FaceAttribute> attrs = faceAttributeModel.detect("test.jpg", detectionResponse);
甚至单张人脸也支持:
FaceAttribute attr = faceAttributeModel.detect("test.jpg", rect, keyPoints);
检测最“显眼”的那张脸
有时候你只想识别照片里“最中心”的主角脸,这也有办法:
LivenessStatus top = faceAttributeModel.detectTopFace("test.jpg");
FaceAttribute 字段讲解
| 字段名称 | 字段类型 | 说明 |
|---|---|---|
| genderType | GenderType | 性别枚举 |
| age | Integer | 年龄 |
| leftEyeStatus | EyeStatus | 左眼状态 |
| rightEyeStatus | EyeStatus | 右眼状态 |
| wearingMask | Boolean | 是否带口罩 |
| headPose | HeadPose | 姿态 |
GenderType 性别枚举
| 枚举值 | 说明 |
|---|---|
| MALE | 男 |
| FEMALE | 女 |
| UNKNOWN | 未知 |
EyeStatus 眼睛状态枚举
| 枚举值 | 说明 |
|---|---|
| OPEN | 睁眼 |
| CLOSED | 闭眼 |
| NON_EYE_REGION | 非眼部区域 |
| UNKNOWN | 未知 |
HeadPose 姿态检测结果字段讲解
| 字段名称 | 字段类型 | 说明 |
|---|---|---|
| pitch | Float | 上下(俯仰角),正值抬头,负值低头 (-90°~+90°) |
| yaw | Float | 左右(偏航角),正值右偏,负值左偏(-90°~+90°) |
| roll | Float | 倾斜(翻滚角),正值右倾,负值左倾(-90°~+90°) |
开源项目与文档地址
本篇文章中的人脸属性检测功能,来自开源项目 SmartJavaAI,项目专为 Java 开发者打造,封装了多种人脸识别与图像处理能力。
🔗 Gitee 项目地址:gitee.com/dengwenjie/…
🔗 GitHub 项目地址:github.com/geekwenjie/…
🔗 GitCode 项目地址:gitcode.com/geekwenjie/…
📖 在线文档地址:doc.smartjavaai.cn
完整Demo代码地址:examples