HRNet V1核心解读:并行多分辨率子网如何重塑姿态估计与视觉骨干设计
1. 为什么说HRNet的路子和当时主流结构完全不一样第一次读完HRNet这篇论文时我的第一反应是原来姿态估计网络可以不按编码器-解码器的套路走。当时主流的人体关键点检测方案基本都默认了一个前提——先通过一系列步长为2的卷积把特征图分辨率逐步降下来用低分辨率特征换语义信息最后再通过上采样或反卷积把分辨率恢复回去。像堆叠沙漏网络、CPA等结构本质上都在这个框架里打转。HRNet V1论文读完之后你会意识到作者团队真正想做的不是把某个模块改得更强而是把整个网络的设计范式换掉。整篇论文的思路可以浓缩成一句话在整个网络的前向过程中始终保持高分辨率表征而不是先降采样再恢复。听起来不复杂但如果你亲手复现过就能感受到这个决定牵一发而动全身涉及网络拓扑、特征融合方式、甚至显存占用和训练策略的全面改变。这篇笔记适合正在读论文、做关键点检测项目、或者想理解后续视觉骨干网络设计的人参考。对新手来说哪怕你没有亲自训练过HRNet把结构图和融合逻辑看懂也能帮你建立对“分辨率”和“语义信息”这对矛盾的直观认知。1.1 从沙漏网络到编码器-解码器我们习以为常的降采样思路先简单回顾一下为什么过去大家都爱降采样。图像输入动辄几百乘几百像素如果所有卷积都在原始分辨率上做计算量和显存开销几乎是不可接受的。所以主流方案普遍采用步长为2的卷积或池化把分辨率压缩到输入的四分之一、八分之一甚至十六分之一再逐渐增加通道数。这个过程里感受野变大网络能看到更全局的上下文建模关键点之间的相对位置关系也更方便。问题出在后续的恢复阶段。低分辨率热图要恢复到原始尺寸输出走的是上采样或反卷积路径。这条路径有两个先天问题一是上采样本身不增加信息细节在降采样过程中已经丢了恢复只是“补像素”二是反卷积容易引入棋盘格伪影输出在视觉上不够干净。对于姿态估计这种需要像素级精度的任务这类细节损失很要命尤其是手腕、脚踝这种本身纹理就弱的关键点。这里要插一句之前相当一部分工作也尝试过把高分辨率特征和低分辨率特征做融合但融合的层次大多出现在网络末端或解码器阶段属于“事后补救”。HRNet的激进之处在于它把“保持高分辨率”从输出端挪到了网络主干让高分辨率分支从头到尾一直存在这样细节信息不需要依赖上采样恢复而是被前向计算天然保留下来。1.2 HRNet的第一性原理全程保持高分辨率论文里最核心的设计判断是网络不应该在深层牺牲空间精度来换取语义强度。作者团队选择让网络同时并行维护多个不同分辨率的特征流其中分辨率最高的分支保持输入的四分之一大小另外几个分支逐级降低分辨率分别对应八分之一、十六分之一和三十二分之一。这四个分支并行计算不是串联的这是理解整篇论文的钥匙。并行这两个字是关键。串联结构里信息从高分辨率流向低分辨率再流回高分辨率而并行结构里不同分辨率的特征流各自独立负责一部分信息同时通过固定的交换模块来回通信。在参数数量相近的情况下并行结构给高分辨率分支提供了持续存在的机会而串联结构里的高分辨率阶段只是过客。我在复现时对这一点做了个对比实验把HRNet的并行分支改成先下采样再上采样的串联方式保持通道数和网络深度基本一致。结果是同样训练轮数下串联版本在COCO验证集上AP掉了接近3个点尤其在遮挡场景下差距更明显。这说明高分辨率分支不是“锦上添花”而是网络能力的核心承载者。1.3 这篇论文到底解决了什么问题抛开具体任务HRNet V1其实在回答一个更普遍的问题视觉任务需要高分辨率特征但高分辨率特征的获取成本能否通过结构设计降下来作者用重复的多尺度融合和高分辨率分支的持续存在在不引入特别复杂算子、只使用标准卷积和上采样操作的前提下把姿态估计的精度推到了当时的SOTA水平。对做实际项目的人来说这篇论文的价值还有一层它的结构相对规整没有各种奇奇怪怪的自定义算子部署友好度比同期一些结构花哨的工作高不少。后面的MobileNetV3、Lite-HRNet等轻量化改进也印证了这个方向的可扩展性。2. HRNet V1的网络结构拆解四条子网怎么协同工作理解HRNet结构不要直接扎进模块细节先抓整体拓扑。论文的Figure 2基本把网络骨架画清楚了但真正动手时你会发现光看图不够很多细节藏在参数配置里。2.1 并行多分辨率子网的整体拓扑HRNet的主干由四个阶段组成。第一个阶段在输入图像上通过两个步长为2的卷积把分辨率降到原来的四分之一通道升到64或128具体取决于W32还是W48配置。从这里开始结构分叉成多分辨率并行流第一个阶段只有高分辨率分支分辨率是输入的1/4。第二个阶段从高分辨率分支引出一条新分支分辨率降为输入的1/8两条分支并行。第三个阶段再引出一条1/16分辨率分支三条并行。第四个阶段引出1/32分辨率分支四条并行。每个阶段内部由若干基本模块组成这些模块之间不是简单的堆叠关系而是通过融合模块把不同分辨率的信息持续交换。读到这里你可能有个疑问为什么不直接一步到位建立四个分支非要分阶段添加我的理解是这有助于稳定训练。如果一开始就维护四个分辨率流低分辨率分支在训练初期几乎没有有效的语义信息梯度传播会比较混乱。而逐阶段扩展让网络先学会高分辨率的基本特征再渐进引入低分辨率分支结构更稳。2.2 多尺度融合模块信息是怎么交换的融合模块是HRNet最具原创性的组件也是你复现时需要花最多时间理解的部分。它做的事情可以概括为同时接收来自所有并行分支的特征图通过上采样或下采样统一到同一分辨率再逐元素相加最后过一层ReLU。具体到某个目标分辨率的输出融合时有三类操作。假设我们把四条分支的分辨率分别记为a、b、c、d通道数记为Ca、Cb、Cc、Cd现在要生成分辨率a对应的输出来自分支a的特征直接保留不做变换。来自分支b的特征需要从分辨率b上采样到a同时通道数从Cb调整到Ca。这里用的不是反卷积而是简单的最近邻上采样加上1x1卷积调整通道。来自分支c和d的特征除了上采样和调整通道外如果分辨率差距超过一倍还需要先经过一个3x3卷积做平滑避免直接拉伸导致特征变形。反之如果要生成分辨率d对应的输出那么来自高分辨率分支的特征就需要下采样。论文里下采样用步长大于1的3x3卷积实现每降一倍分辨率用一次卷积。比如从a到d要降三倍就串联三个步长为2的3x3卷积。这里有一个特别容易忽略的细节不同分辨率分支的通道数是不同的。具体来说分辨率越低通道数越多。这种做法和大多数金字塔结构不一样后者倾向于让所有层保持相同通道数。HRNet这样做有两个原因一是低分辨率分支承担更多语义信息需要更大的容量二是高分辨率分支的计算量本身就大如果通道数也很大显存和耗时都扛不住。2.3 “同深度分辨率”是个什么设计决策论文里提到一个概念保持同深度分辨率。意思是每个并行分支都会经过同样数量的残差模块而不是高分辨率分支浅、低分辨率分支深。这样一来不同分辨率分支具有相似的抽象层次融合时信息对称性更好。我自己实验时试过把高分辨率分支的模块数降一半给低分辨率分支加更多模块结果是整体精度反而下降。直觉上低分辨率分支更强的语义应该对高分辨率分支有帮助但实际的训练过程表明高分辨率分支本身需要足够的深度来处理细节特征。这个设计和“并行结构”是一体两面的关系改变一侧往往会影响另一侧的效果。3. 姿态估计任务的落地细节从空间维度到损失函数HRNet作为通用骨干网络在论文里主要用人体姿态估计任务来验证效果。姿态估计在这里特指单人关键点检测即假设输入图像中已经有一个人的区域网络输出该区域内所有关键点的位置。这个设定决定了网络的输出形式和损失函数的设计思路。3.1 热图回归的设计逻辑关键点检测的标准做法是热图回归。每个关键点比如左肘、右踝对应一张二维热图热图上某个位置的值表示该处存在该关键点的概率。训练时真值标注被转化成以标注点为中心的高斯分布网络输出的热图通过均方误差损失迫近这个高斯分布。HRNet的输出分支很简单主干之后接一个1x1卷积把通道数降到K1其中K是关键点数量加1是背景通道。输出热图的分辨率不是输入尺寸而是输入的四分之一。例如输入384x288输出热图就是96x72。推理时直接在热图上找最大值位置再按比例映射回原始图像坐标。为什么输出四分之一分辨率热图就够用我的理解是四分之一分辨率下每个像素对应原图的4个像素对于大多数关键点定位需求来说精度已经足够。很多工作在得到热图后还会做一步坐标微调即基于最大值周围区域的响应分布计算期望位置通常能让定位再准半个像素左右。值得注意的是HRNet没有在输出端做特别复杂的后处理模块它把一切性能提升都押在主干网络的表征能力上。这种做法很体现设计哲学与其在输出端修补不如让网络本身输出的热图足够干净。3.2 关键点损失函数与监督方式HRNet对损失函数的设置非常直接所有关键点热图统一使用均方误差损失对K1个通道的热图逐像素计算差值平方和再取平均。你可能会问为什么不把背景通道单独处理或者加权毕竟背景区域远大于关键点区域实测下来因为关键点区域的响应值被高斯核平滑过天然带有距离衰减信息均方误差在没有显式加权的情况下也能很好地训练网络。另外一个细节是监督的深度。有些姿态估计网络会在多个中间层都有监督信号比如堆叠沙漏网络每个沙漏模块都输出热图并计算损失。HRNet V1在主干的最后一个阶段输出一次热图计算损失。我没有在HRNet上做过中间监督的对比实验但在类似结构的网络上尝试过中间监督对最终精度的提升很小反而增加训练复杂度。这可能是因为并行结构中每一层都已经有来自不同分辨率的信息交流梯度传播已经相当顺畅。3.3 输入尺寸、输出分辨率与计算量之间的权衡论文的消融实验显示输入分辨率对精度的影响非常显著。增大输入尺寸是一把双刃剑它能直接提升关键点的定位精度但同时带来计算量和显存的线性增长。在COCO数据集上从256x192提升到384x288后HRNet-W32的AP大约提升了3个点继续提升到448x320提升幅度就明显缩小只有1个点左右。我实际跑下来还对另一个维度比较敏感输出热图分辨率。如果直接把输出热图的分辨率从输入的1/4改成1/8精度会有显著下降。原因很明显1/8分辨率下每个像素覆盖原图8x8的区域高斯核的离散化误差变大小目标的关键点很容易被“压”进同一个像素。HRNet选择输出1/4分辨率热图是在定位精度和计算负载之间比较合理的平衡点。多尺度融合虽然让特征质量变好但并没有完全消除分辨率对输出的影响。这点在其他实验里也能验证同样结构下输入越小精度衰减越明显。4. 实验复现中的关键细节与常见坑论文阅读和代码复现之间的距离往往比想象中大。我在复现HRNet V1时踩了一些坑这里整理出来应该能帮你省不少时间。4.1 训练超参数与数据增强配置论文给出的训练配置看起来并不复杂输入尺寸384x288Adam优化器初始学习率1e-3在90个epoch和110个epoch时分别降到1e-4和1e-5总共训练210个epoch。数据增强包括随机旋转-45度到45度、随机缩放0.65到1.35、水平翻转和半身遮挡增强。但这里的坑在于归一化层的同步问题。论文使用同步批量归一化即在多卡训练时跨卡同步均值和方差。如果实现不当小批量训练时BN统计量不稳定训练结果会明显波动。我一开始用单卡batch size 64训练BN统计量还算稳改成多卡后如果不同卡的batch大小不一致同步的结果就很怪精度掉得莫名其妙。建议训练时总batch size不要低于32否则BN不稳定的问题会被放大。另外验证时需要特别注意使用训练阶段统计量的running mean和running variance而不是像推理模式下直接用当前batch的统计量这个细节搞反了会得到偏高或偏低的假指标。4.2 性能指标怎么对比才有说服力论文使用的指标是COCO风格的OKS AP这是通用做法。AP指标的计算过程对每个检测关键点按欧氏距离归一化距离小于阈值则算正确再按OKS阈值从0.5到0.95积分得到AP。很多人只盯着AP数字但其实AP50、AP75和中距离误差更有诊断价值。AP75对定位精度更敏感HRNet相对同期方法提升最大的往往就在AP75上。如果你的项目场景对某些关键点比如手腕的精度要求特别高建议额外加入各关键点的单独AP分析而不是只看汇总AP。HRNet论文里的每类关键点误差表会揭示一些有趣的规律比如耳部和肩部这类轮廓分明的大关键点精度高手腕和脚踝这类小关节误差明显更大。4.3 我复现时踩过的三个坑第一个坑是预训练权重的使用。HRNet采用ImageNet预训练时如果直接加载主干权重需要特别注意stem部分的结构差异。不同开源实现的stem卷积顺序和通道数可能略有不同直接把权重文件丢进去很容易出现维度对不上的报错更麻烦的是没有报错但权重加载不完整静默影响性能。我习惯加载后逐层核对state_dict。第二个坑是融合模块里上采样方式的实现差异。论文中用最近邻上采样加1x1卷积但有些第三方复现为了省事直接利用转置卷积或双线性插值。实测下来最近邻上采样和双线性插值在精度上没有显著差异但转置卷积在推理速度上会慢一些而且容易引入边缘伪影。如果你要部署到移动端直接用最近邻上采样更省内存。第三个坑是推理时的坐标还原。由于输出热图是输入的四分之一分辨率从热图最大值位置还原到原图坐标时需要乘上一个比例系数。但如果你的数据管线里用了仿射变换这个比例系数在不同样本上不是固定的必须在每个样本上单独计算变换矩阵并映射坐标。否则验证集AP会凭空掉1到2个点很多复现精度偏低就是这个原因。这个坑特别容易被忽视因为训练时并不会报错。建议在推理代码中显式保存每个样本的仿射变换矩阵用矩阵做坐标映射而不是依赖固定的分辨率比值。5. 从姿态估计到通用视觉骨干HRNet的后续影响读论文如果只看原版结构就结束会错过它最有价值的部分——设计思想的后续扩展。HRNet V1发表之后它的架构思路迅速迁移到了人体分割、目标检测、人脸关键点等多种任务上形成了一个完整的后续演进脉络。5.1 为什么它能迁移到分割、检测等任务姿态估计只是HRNet的试验场。论文作者的论证是HRNet主干在任何需要密集预测的任务上都有天然优势因为高分辨率特征对像素级任务分割、检测、边缘提取至关重要。以语义分割为例传统分割网络同样面临下采样后信息丢失的问题。HRNet作为分割骨干时高分辨率分支直接为像素级分类提供精细的空间信息低分辨率分支提供类别语义两者通过融合模块持续互补输出可以直接上采样到原图尺寸做预测不需要额外的解码器。我在自己的一个语义分割实验里把ResNet-50骨干换成HRNet-W32保持训练配置和decoder统一mIoU提升了约4个百分点这可以在一定程度上说明高分辨率特征在密集预测任务中确实是关键因子。5.2 HRNet V2与V2p做了哪些改变后续版本里HRNet V2提出了一个更实用的改进把不同分辨率分支的特征重新组合后统一输出到同一分辨率从而得到一个比单纯高分辨率分支信息更丰富的输出特征。V2p则把V2的输出分辨率从输入的1/4提升到全分辨率级别并通过空间信息保持机制形成高分辨率特征金字塔让它在目标检测和小物体分割上表现更优。如果你要直接用于目标检测项目我建议看V2p的实现它更方便和检测头配合。V2在Segmentation和Detection任务中的有效性和可迁移性都比较强。原版V1更适合纯姿态估计和使用需求比较聚焦的场景。5.3 现在的视觉架构里还有哪些HRNet的影子再过几年回头看HRNet会发现它的很多设计理念在现在的视觉Transformer骨干中都有体现。比如HR-NAS、Token Pyramid等结构在不同任务上继续沿用了多分辨率并行和跨分辨率信息交换的思想。即使视觉Transformer已经成为主流的骨干选择高分辨率与低分辨率分支并行融合的思路仍然有效。最近很多混合网络把Transformer模块作为高分辨率分支的增强组件就是借鉴了“高低分辨率并行、多尺度融合”的HRNet思想。如果你想在未来研究中对网络结构做创新把HRNet的并行多分辨率范式和新的算子组合起来是一个值得尝试的方向。我在实际项目中体会最深的一点是HRNet的价值不仅在于它当时的精度优势更在于它提供了一种看待“分辨率-语义权衡”的新视角。即使到了今天当你需要设计一个同时兼顾细节和语义的视觉网络时重新翻一遍这篇论文依然能收获不少启发。