优化姿态估计模型

前言

本文是个人优化实验的记录,若读者对实验有兴趣,请点赞并评论,后续我会把代码开源。本文优化了一个regression-based 轻量级姿态估计模型,最终精度和heatmap-based的精度差不多,速度超越了heatmap-based的方法。实验大部分参考了镜子大佬知乎的优化过程。

配置

  1. 框架mmpose。
  2. 数据集为mpii,16个关键点,评价指标为pckh。
  3. 训练使用四块3090显卡。

配置文件组成

不同实验的配置文件如下,训练完成会在workdir下根据配置文件名生成不同的文件夹。
优化姿态估计模型_第1张图片

实验

第一部分,dsnt

  1. 首先确认 (1) baseline(regression-based),与镜子大佬一样,本文使用的baseline为shufflev2+deeppose的方案,直接回归出关节坐标点。然后以heatmap-based的方法 (2) shufflev2+heatmap为target,本文将实现一个精度和速度均超过target的regression-based 轻量级姿态估计模型; 实验结果如下: 推理耗时计算方法,转成onnx计算单张图片推理耗时一千次,取50:950的均值,耗时计算偶尔会有1ms的波动,仅供参考
    在这里插入图片描述
    可以看到,regression-based方法比heatmap-based方法精度低许多,但是regression-based方法可以直接得到坐标点,不需要后处理。
  2. backbone输出特征图维度(b,1024,8,8),使用一个卷积得到(b,16,8,8) 论文dsnt对输出的特征图求期望得到(b,16,2)个关键点,并使用js散度进行正则化。dsnt可以隐式的利用了heatmap学到的特征,比直接回归坐标有更高的精度。实验结果如下,js散度有个超参数sigma,根据经验 高斯核的一般取 sigma = n/64*2,n为特征图大小,所以这里sigma取0.25最好。dsnt的损失由两部分组成,一是js散度,二是pred和gt的mse。
    在这里插入图片描述
  3. 正则化js散度有个权重,具体实验如下。js散度对最终的精度影响不大,所以后续实验默认取1
    在这里插入图片描述
  4. 实验11 把adam优化器换成了adamw,实验12 在11的基础上把四张卡训练换成了一张卡,实验13 在11的基础上把epoch增加到了310。一,实验4和实验11对比,可知adamw有用。二,实验11和12对比,单卡训练比多卡训练精度高,原因具体参考链接。另外增大epoch没有效果,说明已经收敛了。
    在这里插入图片描述
  5. 在实验11的基础上,加上实验2训练得到的backbone,使用它初始化我们模型的bacbone。最终的结果如下:在这里插入图片描述
    第一部分完结,最终的模型为:
input: 256*256,  backbone: shufflev2 1.0x, 
output 64*1024*8*8, 
no neck, 
decode: one conv 64*16*8*8, 
with dsnt, sigma 0.25, mse_w 1, js_w 1, adamw, hm预训练权重

总结:dsnt sigma 0.25 + mse_w=1 + js_w=1 + adamw + hm预训练权重 = 提升精度

第二部分,rle

iccv2021 rle,flow模型概念。简单来说,回归模型回归出坐标点和伸缩尺度,flow模型估计差值分布。最终坐标 = 伸缩尺度*差值分布+回归出的坐标。inference时假设预测得到的 回归坐标=最终坐标,所以丢弃了flow模型。为了添加rle,backbone出来分为两个分支,一个用作dsnt回归坐标;另外一个用于rle预测分布。

  1. 实验一加上rle,得到实验15。
  2. 实验16加上了预训练权重。
  3. 实验17在15上加上了dsnt。
  4. 实验18在15的基础上加上了dsnt和预训练权重。到这一步,损失由dsnt的损失和rle的损失构成。
  5. 实验19-21为无用实验,对一些权重进行了调整。
  6. 实验22把backbone的宽度为2.0,得到了扩大bacbone后heatmap-based方法的精度。
  7. 实验23在18的基础上扩大了bacbone,并使用了22的权重。
  8. 实验24,在18的基础上对bacbone输出的特征图反卷积两次扩大输出特征图。
    优化姿态估计模型_第2张图片
    总结:rle+hm权重+dsnt+扩大输出分辨率 = 提高精度。另外,加大backbone的深度也可以提高精度,这里忽略,后续继续使用 shufflev2 x1的backbone。

第三部分,simcc

ECCV2022的文章,核心思想就是预测出两个一维向量,分别求解一维向量最大位置的索引,即为x和y的坐标。举个栗子,输入图片(256,256,3),图片里面只有一个点需要我们预测,网络输出两个256维向量,第一256维向量最大值在索引10处,则x=10,同理可以y的坐标。
接下来的实验在实验24的基础上再加上一个分支,用于预测两个一维向量,添加simcc监督信息。实验结果如下:
25. 在24的基础上增加了simcc分支。
26. 25的基础上去掉rle分支。
27. 25的基础上去掉dsnt分支。
在这里插入图片描述
总结:simcc的监督形式类似热图监督,可能对回归损失造成了干扰,导致精度下降了~。

突发奇想,dsnt是对热图bx16x8x8中的每个8x8求softmax并求期望,那么我应该可以对simcc (两个b16512,x和y)类似dsnt的方式对一维向量512求期望(loss中没加dsnt的js损失)。实验结果如下:
28. ------
29. 去掉dsnt的分支,只有simcc和rle的分支,simcc求期望得到坐标值,并且不用一维向量的label监督训练,bacbone输出没有上采样。
30. 29的基础上上采样。
31. 29基础上一维向量也进行了监督。
32. 30的基础上一维向量也进行了监督。
在这里插入图片描述
总结:目前来说实验30得到了最高的精度,方法:simcc采用dsnt求期望的形式得到坐标+rle+高分辨率+hm预训练权重得到了最高的精度;

另外,当增大bacbone的输出分辨率后,很明显出现了过拟合的现象,需要加一些正则化手段。
我觉得在实验30的基础上,可以把四张卡改为一张卡,bacbone目前还是shufflev2 x1可以扩大深度,也可以蒸馏学习。这些应该都可以提升模型的精度,本文就不实验了(省电费: >)。

优化pose告一段落~,去学习mmdet喽~
有用的话点个赞哦~

你可能感兴趣的:(深度学习,深度学习,姿态估计)