边缘计算轻量级模型SSR-Net使用指南
SSR-Net是一种超轻量级年龄/性别识别模型,其CoreML版本仅0.17MB,性能接近主流大模型。采用多阶段回归策略,将年龄估计分解为多个小粒度分类任务,解决量化分组问题。支持实时摄像头检测,结合LBP或MTCNN人脸检测器实现高效推理。提供IMDB/WIKI/Morph2等数据集预训练模型,适合移动端及资源受限场景。模型以JSON+H5格式存储,输入64x64 RGB图像,输出年龄值或性别分
核心特点
- 极致轻量化:模型大小仅 0.32MB(CoreML 版本更是低至 0.17MB),但性能接近比它大 1500 倍以上的主流模型;
- 实时性:支持实时摄像头年龄 / 性别检测 demo,结合轻量级人脸检测器(如 LBP)可实现高效推理;
- 核心思路:采用 “由粗到细” 的多阶段回归策略,将年龄估计拆解为多个小粒度的分类任务,每个阶段仅优化前一阶段的决策误差,同时为每个年龄类别分配动态范围,解决年龄量化分组带来的精度问题。
技术栈与环境
- 框架: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 变量即可。
六、常见问题解决
- 模型加载报错:确保 Keras 版本为 2.0.6(高版本不兼容旧版 JSON 结构),TensorFlow 使用 1.x 版本。
- 预测结果偏差大:
-
- 确保输入是人脸区域(非整图);
- 优先使用 Morph2 数据集预训练模型(摄像头场景适配性更好);
- 亚洲人脸建议使用 Megaage-Asian 分支的预训练模型。
- 权重文件缺失:预训练权重需自行训练生成,或联系作者获取下载链接。
七、预训练模型选型建议
|
模型规格 |
适用场景 |
特点 |
|
mobilenet_reg_0.25_64 |
移动端 / 资源受限设备 |
极致轻量化,速度快 |
|
mobilenet_reg_0.5_64 |
桌面端 / 精度优先场景 |
精度更高,速度稍慢 |
|
IMDB 数据集模型 |
通用野生人脸场景 |
泛化性强 |
|
WIKI 数据集模型 |
偏学术 / 公开人脸场景 |
补充 IMDB 的样本分布 |
|
Morph2 数据集模型 |
摄像头实时检测 |
适配受控环境下的人脸 |
更多推荐


所有评论(0)