项目简介

1 简介

本项目基于PaddlePaddle框架复现了微软亚洲研究院在ECCV 2018 COCO人体姿态估计竞赛的亚军方案:Simple Baseline人体姿态估计算法,并基于Pose_ResNet50在MPII数据集上进行了实验。

项目提供预训练模型和AiStudio在线体验NoteBook。

背景

近年来人体姿态估计的研究已取得显著进展,各大benchmark上的指标不断被刷新;如HourglassAiStudio项目)。但随着精度性能的提升,模型的复杂度也越来越高,这使得找出究竟是哪种结构最为有效变得困难,本篇文章的作者尝试提供一个简单的比较基线,但是依旧能够取得很好的效果,为后来的研究者提供了架构设计思路

算法解读

该算法十分简单易懂。网络结构就是一个普通的backbone(如resnet50)加一些转置卷积层(作head network)

具体结构:

  • 首先:在Resnet的基础上,取最后残差模块输出特征层(命名C5)。
  • 然后:后面接上3个反卷积模块(每个模块为:Deconv + BatchNorm + RELU,其中参数为256通道,4卷积核,stride为2,padding为1)
  • 最后:用1一个2D Conv实现输出预测图。再求最大响应值就可以得到最后预测的坐标点位置。

损失函数:MSE损失

作者认为这可能是得到heatmaps的最简单方式,并且包含了从深到浅的特征。实验表明,这种简单的思想确实取得了很好的效果。

论文:

项目参考:

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数据集的测试效果如下表。

NetWorkepochsoptimage_sizebatch_sizedatasetmemorycardmeanconfig
PoseResNet50140Adam256x25632x4MPII32G188.8256x256_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}
}
Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐