- 特征提取主干由 ResNet50 替换为 Swin-Small, 性别和年龄预测分支由少量卷积替换为 MLP
- 性别预测比较准确, 年龄预测误差较大, 原因及解决思路下面单独说明
- 更新了 README 中的说明
- 权重文件欢迎移步 Release 页面下载
- 深度学习框架由 Keras 替换为 PyTorch
- 模型结构由少量的卷积层替换为成熟的 ResNet 作为主干,并将年龄预测和性别预测统一到一个模型中,采用双分支输出结构。
- 目前在验证集的性别预测准确率为 91%
- 实际体验差强人意,但与去年 5 月份的试水版本相比,效果会更好
【2022.4.22】模型权重已上传 click to download ,玩得愉快~- 【2022.4.29】删除了代码仓库中的权重文件,如有需要,欢迎移步 Release 页面下载~
- 训练, 离线评估, 在线推理 相关命令见
./scripts/
目录下的脚本 - 使用的 IMDB-WIKI(wiki_crop.tar) 数据集可由此下载; 该链接指向的数据集文件已经是 IMDB-WIKI 数据集团队官方按照人脸区域裁剪过的了, 因此不需要进一步裁剪, 详细说明可移步数据集主页
- 安装所需的第三方库
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
- 将 wiki_crop.tar 解压到任意目录下, 然后使用脚本
./preprocess/prepare_dataset.py
来准备训练所需的相关文件
- 性别预测分支使用交叉熵损失函数
- 年龄预测分支使用均方差损失函数
- 模型使用 timm 库实现 (https://github.com/huggingface/pytorch-image-models)
注: ResNet-50 已替换为 Swin-Small, Conv1 和 Conv2 已替换为 MLP. 训练加载了 timm库 提供的 ImageNet-21k 预训练权重
由于使用了完整的原始的 wiki_crop 数据集, 而从数据集主页可见下图:
该图曲线说明数据集中图片主体的年龄集中在 30 岁左右 (数据不均衡), 所以训练的模型 (更何况存在过拟合的模型) 会倾向于将年龄预测为该时间段。
解决思路为: 将年龄模型和性别模型分开,训练年龄模型时:对 30 岁左右的样本欠采样, 对剩余年龄段过采样
训练过程的记录, 从曲线上可以发现模型训练到后面显然已经过拟合了 :), 不过由于使用的权重保存策略是 val_loss 最低点, 所以无伤大雅 (不想重新训练一遍了)
这是对一张组合图像的处理结果(组合的四张图片选自 IMDB-WIKI 数据集的原始图像)
测试视频 剪辑自: https://www.di.ens.fr/~laptev/download/drinking.avi