DeepFace 年龄与性别识别:从 pip install 到出结果的最短实践
【免费下载链接】deepfaceA Lightweight Face Recognition and Facial Attribute Analysis (Age, Gender, Emotion and Race) Library for Python项目地址: https://gitcode.com/GitHub_Trending/de/deepface
DeepFace 是 Python 生态里常用的人脸分析库,其中年龄识别与性别检测模块可以直接吃进一张人脸图片,返回整数年龄和 Woman/Man 两个性别标签及其概率。它不判断"这张脸是谁",只做属性分析,适合年龄验证、内容分级、批量画像统计这类场景。本文给出一条最短可用路径和对应的调参速查。
最短路径:装好并看到第一个结果
仓库里自带测试图片,装好依赖后直接用它跑第一次分析。首次调用会自动下载模型权重,之后走本地缓存,无需再联网。
git clone https://gitcode.com/GitHub_Trending/de/deepface cd deepface pip install -r requirements.txtfrom deepface import DeepFace results = DeepFace.analyze("tests/unit/dataset/img1.jpg", actions=["age", "gender"]) print(results[0]["age"], results[0]["dominant_gender"], results[0]["gender"])输出形如29 Woman {'Woman': 99.3, 'Man': 0.7}:年龄是 0~100 的整数,性别是一个标签加概率字典。一张照片里的多人图,analyze会返回一个列表,每个检测到的脸一项。
一张图讲清它怎么算出结果
年龄和性别两条链路共享同一套流程:输入 → 人脸检测 → 对齐与缩放 → 特征提取 → 分类头 → 输出。
DeepFace.analyze先用 detector_backend 指定的检测器(默认 opencv)找到人脸框,按眼睛位置做对齐,再缩放到 224x224 送进模型,这一步的实现在 modules/demography.py。两个模型都以 VGGFace 卷积网络做特征提取,只换分类头:
# Age: 101 个分类单元,输出 0~100 岁的概率分布 age_model_output = Convolution2D(101, (1, 1), name="predictions")(base_model.layers[-4].output) # Gender: 2 个分类单元,softmax 得到概率年龄头输出 101 个概率后,用"概率 × 岁数"加权求和得到连续年龄,再转成整数,逻辑在 Age.py 的find_apparent_age;性别头输出 2 个概率,取最大者作为标签,标签和加载逻辑在 Gender.py。也就是说,两者是同一个特征提取器 + 不同输出头的结构,这也是它们推理速度接近的原因。
按你的场景调一下
单人注册年龄校验
- 输入:一张用户自拍照
- 期望:整数年龄,低于阈值则拦截
- 核心调用:
age = DeepFace.analyze(photo, actions=["age"])[0]["age"]actions只传需要的项可以省掉另外两个模型的推理。
批量扫一个目录
多人合影里每个脸都会单独出一项结果,遍历文件即可。
- 输入:目录路径
- 期望:每张图每个脸的年龄与性别
- 核心调用:
import glob for path in glob.glob("photos/*.jpg"): try: for r in DeepFace.analyze(path, actions=["age", "gender"]): print(path, r["age"], r["dominant_gender"]) except Exception: print(path, "no face")API 服务接入
- 输入:HTTP 请求里的图片 base64
- 期望:JSON 形式的年龄、性别概率
- 仓库自带 Flask 服务,入口在 api/src/app.py,启动方式见 docker/docker-compose.yml,无需自己写路由。
效果不满意时的调参速查
| 配置项 | 默认值 | 调整方向 | 适用条件 |
|---|---|---|---|
detector_backend | opencv | 换retinaface、mediapipe等 | opencv 漏检侧脸、远距离人脸时 |
enforce_detection | True | 设False | 低分辨率图找不到人脸时不想抛异常 |
align | True | 设False提速 | 对精度要求不高、追求吞吐 |
expand_percentage | 0 | 调大如20 | 裁剪人脸区域太紧导致边缘信息丢失 |
actions | 全部四项 | 只传需要的 | 减少推理次数,降低耗时 |
以上参数均为analyze的入参,签名和说明在 modules/demography.py。
已知局限与不适用场景
- 年龄输出是 0~100 的整数,且 101 个概率类加权求和的结果对端点年龄不敏感,儿童和极高龄人群误差会明显放大。
- 性别只有 Woman/Man 两个标签,没有置信度门槛,概率接近五五开时结果基本是抛硬币。
- 一切以人脸检测为前提:检测器找不到脸,整条分析链路直接中止,遮挡、反光、严重侧脸是常见失效点。
- 该模块无法判断"这张脸是不是某个人",身份比对需要用库里另外的识别模型。
需要更多细节可查阅仓库内的 README 和 tests/unit/test_analyze.py,接口行为以源码为准。
【免费下载链接】deepfaceA Lightweight Face Recognition and Facial Attribute Analysis (Age, Gender, Emotion and Race) Library for Python项目地址: https://gitcode.com/GitHub_Trending/de/deepface
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考