核心特点

  1. 极致轻量化:模型大小仅 0.32MB(CoreML 版本更是低至 0.17MB),但性能接近比它大 1500 倍以上的主流模型;
  2. 实时性:支持实时摄像头年龄 / 性别检测 demo,结合轻量级人脸检测器(如 LBP)可实现高效推理;
  3. 核心思路:采用 “由粗到细” 的多阶段回归策略,将年龄估计拆解为多个小粒度的分类任务,每个阶段仅优化前一阶段的决策误差,同时为每个年龄类别分配动态范围,解决年龄量化分组带来的精度问题。

技术栈与环境

  • 框架:Keras(基于 TensorFlow 后端);
  • 硬件:GTX-1080Ti(训练)、CPU/GPU(推理);
  • 系统:Ubuntu;
  • 依赖:OpenCV、dlib、MTCNN(人脸检测)、MobileNet/DenseNet(网络组件)、Anaconda(环境管理)等。

仓库结构

SSR-Net/
├── LICENSE                  # Apache 2.0 开源许可证
├── README.md                # 项目说明、使用指南
├── pre-trained/             # 预训练模型(IMDB/WIKI/Morph2/亚洲人脸等数据集)
├── data/                    # 数据预处理脚本
│   ├── TYY_IMDBWIKI_create_db.py  # IMDB/WIKI 数据集预处理
│   ├── TYY_MORPH_create_db.py     # Morph2 数据集预处理
│   └── TYY_utils.py               # 数据处理工具
├── training_and_testing/    # 训练、测试脚本
│   ├── SSRNET_model.py      # SSR-Net 通用模型定义
│   ├── run_all.sh           # MobileNet/DenseNet 训练脚本
│   ├── run_ssrnet.sh        # SSR-Net 训练脚本
│   └── ...
├── demo/                    # 演示脚本(摄像头/视频)
│   ├── SSRNET_model.py      # 演示用 SSR-Net 模型
│   ├── TYY_demo_ssrnet_lbp_webcam.py  # 实时摄像头demo(LBP人脸检测)
│   ├── TYY_demo_mtcnn.py    # 视频demo(MTCNN人脸检测)
│   └── lbpcascade_frontalface_improved.xml  # LBP人脸检测器配置
└── paper_images/            # 论文相关图片

数据集说明

  • IMDB-WIKI:大规模野生人脸数据集,适合通用场景;
  • Morph2:受控环境下的人脸数据集,需申请授权获取,预训练模型对摄像头场景适配性较好,但性别模型存在过拟合;
  • Megaage-Asian:亚洲人脸数据集(单独仓库:https://github.com/b02901145/SSR-Net_megaage-asian),适合亚洲人脸场景。

适用场景

适合需要轻量级、实时性的年龄 / 性别估计场景(如智能监控、人机交互),尤其适合资源受限的设备;同时提供了完整的训练、测试、演示流程,便于研究和二次开发。

https://github.com/shamangary/SSR-Net.git

SSR-Net 预训练模型使用指南

SSR-Net 提供了基于 IMDB/WIKI/Morph2 等数据集训练的 MobileNet 系列预训练模型(如 mobilenet_reg_0.25_64/mobilenet_reg_0.5_64),以下是完整的使用步骤,包含模型加载、数据预处理、推理预测全流程。

一、环境准备

确保已安装依赖(与仓库基础环境一致):

# 建议创建conda环境
conda create -n ssrnet python=3.6
conda activate ssrnet

# 安装核心依赖
pip install keras==2.0.6 tensorflow==1.15 opencv-python==4.5.5.62 numpy==1.16.6 dlib==19.24.0

二、预训练模型文件说明

仓库中预训练模型以 JSON(模型结构)+ H5(权重) 形式存储,路径示例:

SSR-Net/pre-trained/
├── imdb/
│   ├── mobilenet_reg_0.25_64/  # 宽度因子0.25,输入64x64
│   │   ├── mobilenet_reg_0.25_64.json  # 模型结构
│   │   └── mobilenet_reg_0.25_64.h5    # 模型权重(需自行下载/训练生成)
│   └── mobilenet_reg_0.5_64/   # 宽度因子0.5,输入64x64
└── wiki/
    └── mobilenet_reg_0.25_64/  # WIKI数据集训练的同规格模型

注:权重文件(.h5)需从仓库作者提供的链接下载,或自行基于数据集训练生成。

三、核心使用步骤

1. 加载预训练模型

通过 Keras 加载 JSON 结构 + H5 权重,示例代码:

import json
import numpy as np
from keras.models import model_from_json

# 1. 定义模型路径(根据实际路径修改)
model_json_path = "SSR-Net/pre-trained/imdb/mobilenet_reg_0.25_64/mobilenet_reg_0.25_64.json"
model_weights_path = "SSR-Net/pre-trained/imdb/mobilenet_reg_0.25_64/mobilenet_reg_0.25_64.h5"

# 2. 加载模型结构
with open(model_json_path, "r") as f:
    model_json = f.read()
model = model_from_json(model_json)

# 3. 加载预训练权重
model.load_weights(model_weights_path)

# 4. 验证模型加载(可选)
model.summary()  # 打印模型结构,确认输入为(64,64,3)

2. 输入数据预处理

模型要求输入为 64x64x3 的 RGB 图像,且需标准化(像素值归一化到 0~1),步骤:

import cv2

def preprocess_image(image_path):
    """
    预处理单张图像:
    1. 读取图像(RGB格式)
    2. 人脸检测(可选,模型仅对人脸区域有效)
    3. 缩放至64x64
    4. 归一化像素值
    """
    # 读取图像(BGR→RGB)
    img = cv2.imread(image_path)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    # 人脸检测(使用LBP检测器,与demo一致)
    face_cascade = cv2.CascadeClassifier("SSR-Net/demo/lbpcascade_frontalface_improved.xml")
    faces = face_cascade.detectMultiScale(img_rgb, scaleFactor=1.1, minNeighbors=5)

    if len(faces) == 0:
        raise ValueError("未检测到人脸,请确保图像包含清晰人脸")

    # 裁剪人脸区域(取第一个检测到的人脸)
    x, y, w, h = faces[0]
    face_img = img_rgb[y:y+h, x:x+w]

    # 缩放至64x64
    face_img_resized = cv2.resize(face_img, (64, 64))

    # 归一化(0~1)
    face_img_normalized = face_img_resized / 255.0

    # 扩展维度(适配模型输入:(1,64,64,3))
    input_tensor = np.expand_dims(face_img_normalized, axis=0)

    return input_tensor

# 示例:预处理单张图像
input_tensor = preprocess_image("test_face.jpg")

3. 模型推理(年龄 / 性别预测)

模型输出为年龄回归值(浮点数),若为性别模型则输出 0/1(女 / 男),示例:

# 1. 年龄预测
age_pred = model.predict(input_tensor)[0][0]
print(f"预测年龄:{round(age_pred, 1)} 岁")

# 2. 性别预测(若使用性别预训练模型)
# gender_pred = model.predict(input_tensor)[0][0]
# gender = "女" if gender_pred < 0.5 else "男"
# print(f"预测性别:{gender}")

四、批量推理 / 集成多个预训练模型

可加载多个数据集(IMDB/WIKI)的预训练模型,取预测均值提升精度:

def ensemble_predict(image_path, model_paths):
    """集成多个预训练模型预测"""
    input_tensor = preprocess_image(image_path)
    preds = []

    for json_path, weights_path in model_paths:
        # 加载模型
        with open(json_path, "r") as f:
            model_json = f.read()
        model = model_from_json(model_json)
        model.load_weights(weights_path)

        # 预测
        pred = model.predict(input_tensor)[0][0]
        preds.append(pred)

    # 取均值
    avg_pred = np.mean(preds)
    return avg_pred

# 示例:集成IMDB和WIKI的0.25宽度模型
model_paths = [
    ("SSR-Net/pre-trained/imdb/mobilenet_reg_0.25_64/mobilenet_reg_0.25_64.json",
     "SSR-Net/pre-trained/imdb/mobilenet_reg_0.25_64/mobilenet_reg_0.25_64.h5"),
    ("SSR-Net/pre-trained/wiki/mobilenet_reg_0.25_64/mobilenet_reg_0.25_64.json",
     "SSR-Net/pre-trained/wiki/mobilenet_reg_0.25_64/mobilenet_reg_0.25_64.h5")
]
ensemble_age = ensemble_predict("test_face.jpg", model_paths)
print(f"集成预测年龄:{round(ensemble_age, 1)} 岁")

五、使用仓库自带 Demo 快速验证

仓库提供了直接调用预训练模型的 Demo 脚本,无需手动加载模型,步骤:

1. 视频文件推理(CPU)

cd SSR-Net/demo
# 使用MTCNN人脸检测 + 预训练模型推理视频
KERAS_BACKEND=tensorflow CUDA_VISIBLE_DEVICES='' python TYY_demo_mtcnn.py your_video.mp4

2. 实时摄像头推理

cd SSR-Net/demo
# 使用LBP人脸检测 + 预训练模型实时推理
KERAS_BACKEND=tensorflow CUDA_VISIBLE_DEVICES='' python TYY_demo_ssrnet_lbp_webcam.py

Demo 会自动加载默认预训练模型,若需更换模型,修改 Demo 脚本中 model_path 变量即可。

六、常见问题解决

  1. 模型加载报错:确保 Keras 版本为 2.0.6(高版本不兼容旧版 JSON 结构),TensorFlow 使用 1.x 版本。
  2. 预测结果偏差大
    • 确保输入是人脸区域(非整图);
    • 优先使用 Morph2 数据集预训练模型(摄像头场景适配性更好);
    • 亚洲人脸建议使用 Megaage-Asian 分支的预训练模型。
  1. 权重文件缺失:预训练权重需自行训练生成,或联系作者获取下载链接。

七、预训练模型选型建议

模型规格

适用场景

特点

mobilenet_reg_0.25_64

移动端 / 资源受限设备

极致轻量化,速度快

mobilenet_reg_0.5_64

桌面端 / 精度优先场景

精度更高,速度稍慢

IMDB 数据集模型

通用野生人脸场景

泛化性强

WIKI 数据集模型

偏学术 / 公开人脸场景

补充 IMDB 的样本分布

Morph2 数据集模型

摄像头实时检测

适配受控环境下的人脸

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐