简单有效的人体姿态估计:Sample Baseline(ECCV 2018)
Sample Baseline(ECCV 2018) 的Paddle实现,在MPII数据集上达到88.81的Mean PCK。项目获得第五届论文复现赛冠军。
项目简介
1 简介
本项目基于PaddlePaddle框架复现了微软亚洲研究院在ECCV 2018 COCO人体姿态估计竞赛的亚军方案:Simple Baseline人体姿态估计算法,并基于Pose_ResNet50在MPII数据集上进行了实验。
项目提供预训练模型和AiStudio在线体验NoteBook。
背景
近年来人体姿态估计的研究已取得显著进展,各大benchmark上的指标不断被刷新;如Hourglass(AiStudio项目)。但随着精度性能的提升,模型的复杂度也越来越高,这使得找出究竟是哪种结构最为有效变得困难,本篇文章的作者尝试提供一个简单的比较基线,但是依旧能够取得很好的效果,为后来的研究者提供了架构设计思路。
算法解读
该算法十分简单易懂。网络结构就是一个普通的backbone(如resnet50)加一些转置卷积层(作head network)。
具体结构:
- 首先:在Resnet的基础上,取最后残差模块输出特征层(命名C5)。
- 然后:后面接上3个反卷积模块(每个模块为:Deconv + BatchNorm + RELU,其中参数为256通道,4卷积核,stride为2,padding为1)
- 最后:用1一个2D Conv实现输出预测图。再求最大响应值就可以得到最后预测的坐标点位置。
损失函数:MSE损失
作者认为这可能是得到heatmaps的最简单方式,并且包含了从深到浅的特征。实验表明,这种简单的思想确实取得了很好的效果。
论文:
- [1] Xiao, Bin and Wu, Haiping and Wei, Yichen. Simple Baselines for Human Pose Estimation and Tracking.
European Conference on Computer Vision (ECCV), 2018.
项目参考:
2 复现精度
评价指标解释:
PCK:Percentage of Correct Keypoints,即是关键点正确估计的比例。其计算方式是:计算检测的关键点与其对应的groundtruth间的归一化距离小于设定阈值的比例(the percentage of detections that fall within a normalized distance of the ground truth).
下表中的mean表示的是Mean PCK,即对于不同关节部位关键点正确估计的平均比例值。
在MPII val数据集的测试效果如下表。
NetWork | epochs | opt | image_size | batch_size | dataset | memory | card | mean | config |
---|---|---|---|---|---|---|---|---|---|
PoseResNet50 | 140 | Adam | 256x256 | 32x4 | MPII | 32G | 1 | 88.8 | 256x256_d256x3_adam_lr1e-3.yaml |
注意:与原项目一致,采用了Flip test。原项目的配置是4卡,所以batch_size需要在原始项目的实验设置 基础上x4。
AiStudio上预训练模型:PoseResNet50
3 数据集
MPII
原始数据集是matlab的格式,论文提供了转换成json存储的数据集:OneDrive
AIStudio上的公开数据集:MPII Human Pose
- 数据集大小:
- 训练集: 15K
- 验证集: 3K
- 测试集: 7K
16类标注: (0 - r ankle, 1 - r knee, 2 - r hip, 3 - l hip, 4 - l knee, 5 - l ankle, 6 - pelvis, 7 - thorax, 8 - upper neck, 9 - head top, 10 - r wrist, 11 - r elbow, 12 - r shoulder, 13 - l shoulder, 14 - l elbow, 15 - l wris
应有的数据集结构:
|-- data
`-- |-- mpii
`-- |-- annot
| |-- gt_valid.mat
| |-- test.json
| |-- train.json
| |-- trainval.json
| `-- valid.json
`-- images
|-- 000001163.jpg
|-- 000003072.jpg
4 代码结构与说明
代码结构
${POSE_ROOT}
├── cocoapi # coocapi
├── data # 数据存放
├── experiments # 配置文件
├── images # 项目图片
├── lib # 模型,数据集定义处理
├── log #日志
├── output # 输出目录
├── pose_estimation # 训练,评估,测试函数
├── README.md
├── README_EN.md
└── requirements.txt
说明
1、本项目在Aistudio平台进行开发,使用Tesla V100 32G* 1。
2、如果你想使用其他数据集,如coco。请检查原始项目的实验设置
.yaml文件的差异如下(只需要增加BACKBONE这一行和DEPTH这一行以及增加学习率更新策略这一行(可选PolynomialDecay/MultiStepDecay),其余的相同):
MODEL:
NAME: pose_resnet
BACKBONE: resnet
DEPTH: 50
TRAIN:
BATCH_SIZE: 128
SHUFFLE: True
BEGIN_EPOCH: 0
END_EPOCH: 140
RESUME: False
OPTIMIZER: adam
LR_TYPE: PolynomialDecay
实验发现,原项目采用的MultiStepDecay效果不如PolynomialDecay,因为在最后近20个epoch,MultiStepDecay策略的学习率已经下降到0.00001,对于模型的影响已经很小,几乎没什么作用。
3、output目录下包含已经训练好的模型参数以及对应的日志(train.log)。log文件夹包含可视化日志文件。
快速开始
1 数据集解压
!mkdir /home/aistudio/data/mpii
%cd /home/aistudio/data/mpii/
!tar -zxvf /home/aistudio/data/data58767/mpii_human_pose_v1.tar.gz
!unzip /home/aistudio/data/data58767/annot.zip -d /home/aistudio/data/mpii/
2 安装依赖
%cd /home/aistudio/HumanPose/
!pip install -r requirements.txt
## COCOAPI
# # # not to install the COCO API into global site-packages
!cd cocoapi/PythonAPI&&python3 setup.py install --user
3 训练
通过配置yaml文件指定训练参数,模型。
例如下面,特征提取模块为resnet50,输入图像大小为256x256,解码模块为3个256通道的反卷积模块。使用adam优化器,初始学习率为1e-3。
Note: 可以在配置文件中开启DEBUG 查看可视化的训练预测图像输出。
%cd /home/aistudio/HumanPose/
!python pose_estimation/train.py \
--cfg experiments/mpii/resnet50/256x256_d256x3_adam_lr1e-3.yaml
4 验证
对训练好的模型在数据集上进行评估。指定训练时使用的配置文件和指定训练好的模型的路径。
并通过–flip-test选项开启翻转测试。
%cd /home/aistudio/HumanPose/
!python pose_estimation/valid.py \
--cfg experiments/mpii/resnet50/256x256_d256x3_adam_lr1e-3.yaml \
--flip-test \
--model-file output/mpii/pose_resnet_50/256x256_d256x3_adam_lr1e-3/model_best.pdparams
5 预测
除了在数据集上进行指标的评估,还可以用自己的图片进行关键点检测噢。
例如下面的指令,需要指定训练用的配置文件以及图片文件和预训练模型。
需要注意的是,由于该算法是top-down的,并不检测人在图片中的位置,需要首先在infer.py的138行用一个目标检测算法获得人在图片中的坐标框,或者人工选取人所在的坐标框。
%cd /home/aistudio/HumanPose/
!python pose_estimation/infer.py --cfg experiments/mpii/resnet50/256x256_d256x3_adam_lr1e-3.yaml --img-file images/test.jpg --model-file output/mpii/pose_resnet_50/256x256_d256x3_adam_lr1e-3/model_best.pdparams --flip-test
利用项目中的实例图片,可以得到预测结果:
心得
复现Sample Baseline这篇论文的过程中,第一次了解了人体姿态估计的算法设计和实践。一方面需要弄懂论文的理论含义,另外一方面需要大量的代码移植工作。自身的代码能力得到了进一步提升,同时对于深度学习框架Paddle更加熟悉。
遇到的主要问题和解决方式:
1、预训练backbone模型的BN层的默认MOMENTUM参数值,Paddle与原项目是不一致的。Paddle默认0.9,但torch默认0.1。导致在所有代码调通后,始终精度无法对齐,误差很大。浪费了好几天时间查找问题以及训练资源。这从侧面说明,如果不充分熟悉两个框架,很可能出现意料之外的问题。
2、Paddle的split函数和Torch的split函数输入参数含义不一致,导致损失无法对齐。这个问题也花了很多时间才发现。Torch的split函数指定分割间距,但Paddle指定的是划分的数量。
1和2两个问题详细地可以在HumanPose/lib/utils/diff_analysis.py中找到差异分析代码。
3、导出需要指定输入图像大小。可以用
data_spec = paddle.static.InputSpec(shape=[1, 3, height, width], dtype='float32')
表示输入图像的形状。
作者信息
信息 | 描述 |
---|---|
作者 | xbchen |
日期 | 2021年12月 |
框架版本 | PaddlePaddle==2.2.1 |
应用场景 | 人体姿态估计 |
硬件支持 | GPU、CPU |
邮箱 | joyful_chen@163.com |
引用
@inproceedings{xiao2018simple,
author={Xiao, Bin and Wu, Haiping and Wei, Yichen},
title={Simple Baselines for Human Pose Estimation and Tracking},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2018}
}
更多推荐
所有评论(0)