【论文精读】ViTPose

文章探讨了ViTPose框架在姿态估计中的潜力,使用Transformer编码器和两种轻量级解码器。实验结果显示,ViTPose具有良好的表示能力和可扩展性,且预训练数据和模型大小对其性能有显著影响。通过蒸馏方法验证了模型的可迁移性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要

       验证了ViT在姿态估计方向的潜力。

框架

image

编码器

       给定person图像作为输入X∈RH×W×3X \in \R^{{H} \times{W} \times 3}XRH×W×3,首先通过一个patch embedding将图像嵌入到token F∈RHd×Wd×cF \in \R^{{\frac H d} \times{\frac W d} \times c}FRdH×dW×c,其中ddd (默认16)是块嵌入层的下采样比率,CCC是通道维度。嵌入的token再由几个transformer层处理,每个transformer层由一个多头自注意力(MHSA)层和一个前馈网络(FFN)组成:
Fi+1′=Fi+MHSA(LN(Fi))Fi+1=Fi+1′+FFN(LN(Fi+1′))F^′_{i+1} = F_i+MHSA(LN(F_i)) \\ F_{i+1} = F^′_{i+1}+FFN(LN(F^′_{i+1}))Fi+1=Fi+MHSA(LN(Fi))Fi+1=Fi+1+FFN(LN(Fi+1))

       其中iii表示ithi_{th}ith transformer层的输出,初始特征F0=PatchEmbed(X)F_0 = PatchEmbed(X)F0=PatchEmbed(X)表示patch embedding层之后的特征。每个transformer层的空间和通道尺寸恒定,故骨干网的输出特征表示为Fout∈RHd×Wd×cF_{out} \in \R^{{\frac H d} \times{\frac W d} \times c}FoutRdH×dW×c

解码器

       采用两种轻量级解码器对从骨干网中提取的特征进行处理和关键点定位。第一种是经典的解码器,由两个反卷积块组成,每个反卷积块包含一个反卷积层,然后进行批量归一化和ReLU,每个块对特征图上采样2次,使用一个核大小为1×11 × 11×1的卷积层来获得关键点的定位热力图。
K=Conv1×1(Deconv(Deconv(Fout)))K = Conv_{1×1}(Deconv(Deconv(F_{out})))K=Conv1×1(Deconv(Deconv(Fout)))

       其中K∈RH4×W4×NkK \in \R^{{\frac H 4} \times{\frac W 4} \times N_k}KR4H×4W×Nk表示估计的热力图(每个关键点一个),NkN_kNk为要估计的关键点数量,对于MS COCO数据集,被设置为17。

       第二种直接使用双线性插值对编码器的特征图进行4次上采样,然后用一个ReLU和一个核大小为3×33 × 33×3的卷积层,获得热力图。
K=Conv3×3(Bilinear(ReLU(Fout)))K = Conv_{3×3}(Bilinear(ReLU(F_{out})))K=Conv3×3(Bilinear(ReLU(Fout)))

实验

实验配置

image
       ViTPose遵循自顶向下的人体姿态估计设置,检测器用于检测人体实例,ViTPose用于估计检测实例的关键点。使用ViT-B、ViT-L和ViT-H作为骨架,将相应的模型表示为ViTPose-B、ViTPose-L和ViTPose-H。骨架用MAE预训练权重进行初始化。使用256×192256 × 192256×192输入分辨率和AdamW优化器,学习率为5e-4。使用Udp进行后处理。模型训练了210次,在第170次和第200次时学习率下降了10次。最佳设置上图所示。

消融实验

image
       用经典解码器和简单解码器来训练ViTPose,以ResNet 作为骨干训练SimpleBaseline。可以观察到,对于ResNet-50和ResNet-152,使用简单解码器会导致大约18 AP下降。以视transformer为骨干的ViTPose与简单解码器无此想象,只有ViT-B、ViT-L和ViT-H的性能略有下降,对于指标AP50和AR50, ViTPose在使用两个解码器中的任何一个时获得了类似的性能,这表明普通视觉transformer具有很强的表示能力,不需要复杂的解码器。

       从表中还可以得出结论ViTPose的性能随着模型大小的增加而不断提高,说明ViTPose具有良好的可扩展性。

灵活性

预训练数据的灵活性

image
       上图为采用VitPose-B结构,在MS COCO val set上,四种预训练方案的结果。四种预训练方案具体为:

  • 采用ImagNet预训练分类任务
  • 采用MS COCO中的单个人体crop预训练MAE任务,将75%的patch随机的mask掉,然后让网络学习恢复这些patch
  • 任务框架同方案2,不过数据集采用MS COCO + AI Challenger的单个人体crop
  • 任务框架同方案2,不过数据集采用MS COCO + AI Challenger的全部数据

       这些模型分别在三个数据集上进行了1600个epoch的预训练,然后在MS COCO数据集上进行了210个epoch的姿态注释微调。可以看到使用MS COCO + AI Challenger(croping),在只有一半数据量的情况下,可以达到比ImageNet更好的效果。

分辨率灵活性

image
       上图为不同模型输入分辨率的结果。采用不同的输入图像大小和下采样率ddd训练ViTPose,可以看到ViTPose-B的性能随着输入分辨率的增加而提高。

注意型灵活性

image
       上图为VitPose采用不同注意力模块组合实验。直接使用1/8特征大小的全注意力在MS COCO val集上获得了最好的77.4 AP(行一),但即使在混合精度训练模式下也会存在较大的内存占用。故采用Shift和Pool分别表示Shift窗口和池窗口机制,窗口注意力可以缓解内存问题,但代价是由于缺乏全局上下文建模,从77.4 AP到66.4 AP(行二),性能下降。移动窗口和池化窗口机制都促进了全局上下文建模的跨窗口信息交换,从而以不到10%的内存增加显著提高了10 AP的性能(行三、行四)。当两种机制同时使用时,性能进一步提升到76.8 AP(行五)。与ViTDet 中提出的联合使用全注意力和窗口注意力的策略(行六)相当,但内存占用更少。
       通过比较表中的第五行和最后一行,通过将窗口大小从8×88 × 88×8扩大到16×1216 × 1216×12,性能可以进一步从76.8 AP提高到77.1 AP,这也优于全部注意力和窗口注意力联合设置。

微调灵活性

image
       上图为三种微调ViTPose-B模型:完全微调、冻结MHSA模块和冻结FFN模块。冻结MHSA模块后(行二),与完全微调(行一)相比,性能下降至75.1 AP。冻结FFN模块和仅微调MHSA模块时(行三),有3.0 AP的显著下降,意味着视觉transformer的FFN模块更负责特定任务的建模。相比之下,MHSA模块更与任务无关。

任务灵活性

image
       上图为ViTPose整体模型使用MS COCO, AI Challenger 和MPII数据集进行多数据集训练测试,直接使用多数据集训练后的模型进行评估, decoder而没有在MS COCO上进一步微调。通过使用所有三个数据集进行训练,可以观察到ViTPose的性能从75.8 AP持续提高到77.1 AP。尽管与MS COCO和AI Challenger的组合相比,MPII的体积要小得多,但使用MPII进行训练仍然带来了0.1 AP的增加,这表明ViTPose可以很好地利用不同数据集中的多样化数据。

可转移性

       采用两种蒸馏方法测试算法的可转移性。方法一,给定一个教师网络T和学生网络S,采用简单的蒸馏方法,添加一个输出蒸馏损失Lt→sodL^{od}_{t→s}Ltsod,以迫使学生网络的输出模仿教师网络的输出。
Lt→sod=MSE(Ks,Kt)L^{od}_{t→s}=MSE(K_s,K_t)Ltsod=MSE(Ks,Kt)

       其中KsK_sKsKtK_tKt是给定相同输入的学生和教师网络的输出。

       方法二为基于token的蒸馏方法来桥接教师和学生模型,是对方法一的补充。随机初始化一个额外的可学习知识标记ttt,并在教师模型的块嵌入层之后将其附加到视觉标记,冻结经过训练的教师模型,调整几个epoch的知识token获得知识:
t∗=arg min⁡t(MSE(T(t;X),Kgt)t^∗ = \argmin_t (MSE(T({t; X}), K_{gt})t=targmin(MSE(T(t;X),Kgt)

       其中KgtK_{gt}Kgt是真实热图,XXX是输入图像,T(t;X)T({t; X})T(t;X)表示教师的预测,t∗t^∗t表示最小化损失的最佳标记。之后,在训练期间,冻结知识token t∗t^∗t并与学生网络中的视觉token连接,以将知识从教师传递到学生网络。因此,学生网络的损失是:
Lt→std=MSE(S(t∗;X),Kgt)Lt→stod=MSE(S(t∗;X),Kt)+MSE(S(t∗;X),Kgt)L^{td}_{t→s} = MSE(S({t^∗; X}), K_{gt})\\ L^{tod}_{t→s} = MSE(S({t^∗; X}), K_t) + MSE(S({t^∗; X}), K_{gt})Ltstd=MSE(S(t;X),Kgt)Ltstod=MSE(S(t;X),Kt)+MSE(S(t;X),Kgt)

       其中Lt→stdL^{td}_{ t→s}LtstdLt→stodL^{tod}_ {t→s}Ltstod分别表示token蒸馏损失,输出蒸馏损失和token蒸馏损失的组合。
image
       上图为使用经典的输出蒸馏和知识token蒸馏将知识从ViTPose-l迁移到ViTPose-b。可以看出,基于token的蒸馏为ViTPose-B带来0.2 AP增益(行一),而输出蒸馏带来0.5 AP(行二)增加。两种蒸馏方法具有互补性,综合使用得到76.6 AP(行三),验证了ViTPose模型具有良好的可迁移性。

对比实验

image
       上图为对多种姿态估计算法在MS COCO val的test-dev集的结果对比。使用256×192256 × 192256×192的输入分辨率、单个A100 GPU,batch大小为64。

       可以观察到,ViTPose的模型尺寸较大,但它在吞吐量和精度之间获得了更好的权衡。ViTPose在更大的backbone上表现也很好。例如,ViTPose-L在val集上获得了比ViTPose-B更好的性能。ViTPose-L的表现超过了之前的SOTA CNN和transformer模型,包括UPD和TokenPose,并具有类似的推理速度。对比ViTPose-H(第15行)和HRFormer-B(第9行),ViTPose-H在仅使用MS COCO数据进行训练就获得了更好的性能和更快的推理速度,分别有79.1 AP和75.6 AP以及241fps和158fps。
image
       使用ViTAE-G骨干构建了一个更强大的模型ViTPose-g,该模型具有1B参数,更大的输入分辨率(576×432576×432576×432),以及MS COCO和AI Challenger数据进行训练,探索了ViTPose的性能极限。具有ViTAE-G backbone的单个ViTPose模型在MS COCO测试开发集上的性能达到了80.9 AP,优于之前的所有SOTA方法,其中之前的最佳方法UDP++集成了17个模型,并在稍好的检测器下达到了80.8 AP。在集成三个模型后,ViTPose进一步取得了最好的81.1 AP。
image
       上图为在MS COCO数据集的测试效果。
image
image
image
       上图为在AI Challenger、OCHuman、MPII等具有遮挡、截断、尺度和人体外观的变化的数据集的测试效果。

reference

Xu, Y. , Zhang, J. , Zhang, Q. , & Tao, D. . (2022). Vitpose: simple vision transformer baselines for human pose estimation.

### 论文精读与实验复现的方法 #### 方法概述 论文精读和实验复现是深入理解研究工作的重要手段。在IT领域,这种方法不仅有助于掌握技术细节,还能培养批判性思维能力以及实际动手能力。以下是针对论文精读和实验复现的具体方法。 --- #### 一、论文精读的核心步骤 1. **快速浏览全文** 阅读摘要、引言和结论部分,了解论文的研究背景、主要贡献和技术框架[^1]。这一步的目标是形成对整篇论文的大致印象。 2. **逐节细读** 对于任务规划模块或其他核心章节,仔细阅读其理论推导、算法设计和实验设置等内容。注意作者提到的局限性和未来工作的方向[^1]。如果发现某些方面未被充分讨论(如参数影响或任务依赖关系),可以记录下来作为后续探索的方向。 3. **绘制结构图** 使用流程图或者概念地图的方式整理出论文的技术路线及其组成部分之间的逻辑联系[^2]。这种可视化工具能够帮助记忆复杂的信息流,并便于与其他相关工作对比分析。 4. **质疑与思考** 提问自己几个关键问题:为什么选择了特定的方法?是否存在其他可能更优的选择?数据集选取是否合理?评价指标是否有偏倚等问题[^3]? --- #### 二、实验复现的关键环节 1. **环境搭建** 根据论文描述准备所需的软件库版本号、硬件配置需求等基础条件。很多时候官方开源代码附带详细的安装指南可以帮助加速此阶段进程[^2]。 2. **重现基线结果** 尝试按照文中提供的超参设定运行原始模型得到接近原作报告数值的表现水平。这是验证个人实现正确性的第一步也是最重要的一步[^1]。 3. **修改与优化** 基于自己的理解和前期提出的疑问尝试调整网络架构、损失函数定义甚至整个训练策略等方面的内容看能否进一步提升性能表现或是解决之前指出的一些不足之处例如增加对于不同类型输入适应性强弱测试等等[^3]。 4. **撰写总结文档** 不仅要记录下成功再现的结果也要包括失败案例的原因剖析这样既有利于自我反思也方便日后查阅参考资料时迅速定位重要知识[^2]. --- #### 示例代码片段展示如何加载预训练权重文件(以PyTorch为例) ```python import torch def load_pretrained_weights(model, path_to_checkpoint): checkpoint = torch.load(path_to_checkpoint) model.load_state_dict(checkpoint['model']) epoch = checkpoint.get('epoch', None) loss = checkpoint.get('loss', None) return model, epoch, loss ``` 上述代码展示了怎样从磁盘上的checkpoint恢复先前保存的状态以便继续训练或者是直接用于推理模式下的预测操作[^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值