MoveNet

Google提供的在线演示:https://storage.googleapis.com/tfjs-models/demos/pose-detection/index.html?model=movenet

MoveNet 是一个 Bottom-up estimation model, 使用heatmap。

网络架构

主要分为三个部分:Backbone、Header、PostProcess

  • Backbone:Mobilenetv2 + FPN
  • Header:输入为Backbone的特征图,经过各自的卷积,输出各自维度的特征图。共有四个Header:分别为Center、KeypointRegression、KeypointHeatmap、Local Offsets
    • Center:[N, 1, H, W], 这里1代表当前图像上所有人中心点的Heatmap,可以理解为关键点,只有一个,所以通道为1。提取中心点两种方式:
      • 一个人所有关键点的算术平均数。
      • 所有关键点最大外接矩形的中心点。(效果更好)
    • KeypointHeatmap:[N, K, H, W] N:Batchsize、K:关键点数量,比如17。H、W:对应特征图的大小,这里输入为 192 × 192 192 \times 192 192×192 , 降采样四倍就是 48 × 48 48\times 48 48×48 。代表当前图像上所有人的关键点的Heatmap
    • KeypointRegresssion:[N, 2K, H, W] K个关键点,坐标用 x , y x, y x,y表示,那么就有2K个数据。这里 x , y x, y x,y 代表的是同一个人的关键点对于中心点的偏移值。原始MoveNet用的是特征图下的绝对偏移值,换成相对值(除以48转换到0-1),可以加快收敛。
    • LocalOffsets:[N, 2K, H, W] 对应K个关键点的坐标,这里是Offset,模型降采样特征图可能存在量化误差,比如192分辨率下x = 0 和 x= 3映射到48分辨率的特征图时坐标都变为了0;同时还有回归误差。
class MoveNet(nn.Layer):
    def __init__(self, num_classes=17, width_mult=1.,mode='train'):
        super(MoveNet, self).__init__()

        self.backbone = Backbone()

        self.header = Header(num_classes, mode)
        

        self._initialize_weights()


    def forward(self, x):
        x = self.backbone(x) # n,24,48,48
        # print(x.shape)

        x = self.header(x)
        # print([x0.shape for x0 in x])

        return x

损失函数

KeypointHeadmap 和 Center 采用加权MSE,平衡了正负样本。
KeypointRegression 和LocalOffsets 采用了 L1 Loss。
最终各个Loss权重设置为1:1:1:1

loss = paddle.pow((pre-target),2) weight_mask = target*k+1
paddle.pow(torch.abs(target-pre), 2) loss = loss*weight_mask

参考文献

  1. 2021轻量级人体姿态估计模型修炼之路(附谷歌MoveNet复现经验) - 知乎 (zhihu.com)
  2. fire717/movenet.pytorch: A Pytorch implementation of MoveNet from Google. Include training code and pre-train model. (github.com)
  3. https://storage.googleapis.com/tfjs-models/demos/pose-detection/index.html?model=movenet

快速开始

全流程引导进行项目生成,实现数据生成、训练、测试一体化

解压数据集

# 无需运行
# !mkdir /home/aistudio/data/coco
# !unzip /home/aistudio/data/data97273/annotations_trainval2017.zip -d /home/aistudio/data/coco
# !unzip /home/aistudio/data/data97273/train2017.zip -d /home/aistudio/data/coco
# !unzip /home/aistudio/data/data97273/val2017.zip -d /home/aistudio/data/coco

# 新数据时用
# Make data to adapt the data format.
# %cd /home/aistudio/work/
# !python scripts/make_coco_data_17keypooints.py

配置项目环境

pip install yacs

训练

cd /home/aistudio/work/
python train.py

测试

进入config.py 修改配置文件,修改测试图片路径。

cd /home/aistudio/work.
python predict.py
测试结果

Heatmap

导出模型

pip install paddle2onnx
python pd2onnx.py

个人介绍

姓名: 芦星宇

学校: 江苏科技大学 人工智能专业 本三

研究方向:姿态估计、图网络、异常检测

Github:https://github.com/Xingyu-Romantic

Logo

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

更多推荐