2025 最新方案,用 Java 搞定人脸属性检测:年龄、性别、口罩,眼睛,姿态

1,147 阅读4分钟

最近在做人脸识别相关的项目,发现 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);

配置项也可以自定义,想开启或关闭某些检测功能都可以:

字段名称字段类型默认值说明
modelEnumFaceAttributeModelEnumSEETA_FACE6_MODEL模型枚举,目前支持人脸属性检测的模型只有seetaface6模型
modelPathStringNULL手动指定离线模型路径
enableAgebooleantrue是否启用年龄检测,可选
enableGenderbooleantrue是否启用性别检测,可选
enableHeadPosebooleantrue是否启用人脸姿态检测,可选
enableEyeStatusbooleantrue是否启用眼睛状态检测,可选
enableMaskbooleantrue是否启用口罩检测,可选
deviceDeviceEnumCPU指定运行设备,支持 CPU/GPU

4、开始检测啦!(支持多种图片输入方式)

DetectionResponse response = faceAttributeModel.detect("test.jpg");

当然你也可以传 BufferedImagebyte[]。一张图里多张脸也完全没问题!

结果会返回一个 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 字段讲解

字段名称字段类型说明
genderTypeGenderType性别枚举
ageInteger年龄
leftEyeStatusEyeStatus左眼状态
rightEyeStatusEyeStatus右眼状态
wearingMaskBoolean是否带口罩
headPoseHeadPose姿态

GenderType 性别枚举

枚举值说明
MALE
FEMALE
UNKNOWN未知

EyeStatus 眼睛状态枚举

枚举值说明
OPEN睁眼
CLOSED闭眼
NON_EYE_REGION非眼部区域
UNKNOWN未知

HeadPose 姿态检测结果字段讲解

字段名称字段类型说明
pitchFloat上下(俯仰角),正值抬头,负值低头 (-90°~+90°)
yawFloat左右(偏航角),正值右偏,负值左偏(-90°~+90°)
rollFloat倾斜(翻滚角),正值右倾,负值左倾(-90°~+90°)

开源项目与文档地址

本篇文章中的人脸属性检测功能,来自开源项目 SmartJavaAI,项目专为 Java 开发者打造,封装了多种人脸识别与图像处理能力。

🔗 Gitee 项目地址:gitee.com/dengwenjie/…

🔗 GitHub 项目地址:github.com/geekwenjie/…

🔗 GitCode 项目地址:gitcode.com/geekwenjie/…

📖 在线文档地址:doc.smartjavaai.cn

完整Demo代码地址:examples