状态:草稿(2026-10-13),部分为实测值。 第 1 节和第 4 节的示例是在笔记本电脑 CPU 上直接运行得到的值(
code/03_heatmap.py, 3 秒)。论文数据引自原文并附带了相应的条件。寻球模型的实测数据引用自 TT Score 模型剖析第 2 篇。 编写规则:以实测数据为基础,未能测得的数据标记为“未实测”。
目录
- 1. 分类要缩小,而位置必须保留
- 2. U-Net(2015):缩小再放大,同层相连
- 3. HRNet(2019):高分辨率贯穿始终
- 4. 热图:绘制地图而非输出坐标
- 5. 局限性
- 6. 与我们项目的联系
- 参考文献
1. 分类要缩小,而位置必须保留
在第 1 篇中提到过,池化在扩大感受野的同时会模糊位置。我们来亲自看看它模糊到了什么程度。我们在 32×32 的图像上画了一个直径 3px 的球,并反复进行了 2×2 的平均池化(实测)。
| 分辨率 | 尺寸 | 保留为球的格子数(值 > 0.25) | 最亮格子 |
|---|---|---|---|
| 1 | 32×32 | 7 | 1.00 |
| 1/2 | 16×16 | 2 | 1.00 |
| 1/4 | 8×8 | 1 | 0.31 |
| 1/8 | 4×4 | 0 | 0.08 |
| 1/16 | 2×2 | 0 | 0.02 |
在 1/8 分辨率下,球几乎无法与背景区分。这意味着在分类模型(ResNet 通常会缩小到 1/32)的深层中,并没有保留球的准确位置。然而,深层具有判断“这是球吗”的广阔上下文。 我们需要一种兼具上下文(深而广的视角)和位置(浅而细致的视角)的结构。答案由此分为了两个分支。
2. U-Net(2015):缩小再放大,同层相连
Ronneberger 等人为了对显微镜细胞图像进行分割(为每个像素涂上“是细胞还是背景”)而开发了 U-Net。正如其名,它呈 U 字形。
- 收缩路径(编码器):重复两次卷积 + 2×2 最大池化,以缩小分辨率并增加通道数。用于收集上下文。
- 扩张路径(解码器):通过上采样将分辨率重新放大。
- 跳跃连接:裁剪收缩路径中相同分辨率的特征图,并将其 拼接到扩张路径中(沿通道方向连接)。解码器结合了“深层的判断”与“浅层的细致边界”来进行绘制。
第 2 篇中 ResNet 的捷径是将值 相加,而 U-Net 的跳跃连接则是 拼接。相加是对相同信息的轻微修正,而拼接则是将不同种类的信息(位置和语义)并排放在一起,让下一层去融合它们。
用于在少量数据下进行训练的机制
医疗影像的标注成本很高。该论文的训练数据仅有约 30 张电子显微镜分割图(512×512)以及 35 张和 20 张的细胞追踪竞赛数据。因此,其设计完全迎合了数据节省的需求。
- 无填充卷积。 由于不使用 0 填充边缘,输出会比输入小(基于图 1,输入 572×572 → 输出 388×388)。这是一个避免学习虚假边缘值的选择。大图会被分割成块进行处理,而边缘外部通过将图像 镜像翻转 来填充(重叠块策略)。
- 弹性变形增强。 以标准差 10px 随机位移 3×3 粗网格的各个点并进行平滑插值,从而使图像发生扭曲。这是因为细胞组织在现实中确实会发生此类变形。
- 加权损失。 对紧邻细胞之间的狭窄背景带赋予更大的权重(w₀=10, σ≈5px),以防止将两个细胞涂成一个。
结果(论文):在电子显微镜分割竞赛中以 0.000353 的畸变误差获得第一名(此前最高为 0.000420)。在 2015 年细胞追踪竞赛的两组数据中,IoU 分别为 0.9203(第二名 0.83)和 0.7756(第二名 0.46)。当时的 GPU 在 1 秒内即可完成一张 512×512 图像的分割,训练则使用 6GB 内存的桌面 GPU 花费了 10 个小时。
U-Net 不仅超越了医疗影像领域,还成为了几乎所有“需要输出与输入相同大小的地图”的任务的基础形态。乒乓球寻找模型 TrackNetV2 也采用了 U-Net 结构(TT Score 模型剖析第 2 篇)。
3. HRNet(2019):高分辨率贯穿始终
U-Net 先缩小一次再放大。尽管在缩小过程中丢失的位置信息通过跳跃连接被找回,但解码器接收到的高分辨率特征属于 浅层,因此语义较弱。Sun 等人为人体姿态估计(寻找 17 个关节的位置)开辟了另一条道路。那就是 从头到尾维持高分辨率分支。
- 第 1 阶段从一个高分辨率(输入的 1/4)分支开始。
- 每个阶段会 添加一个分辨率减半、通道数翻倍的分支。原有的分支则保持不变。HRNet-W32 的四个分支通道数分别为 32、64、128、256。
- 各个分支并行计算,并在 交换单元中相互融合。低分辨率 → 高分辨率通过 1×1 卷积 + 最近邻上采样实现,反之则通过步长为 2 的 3×3 卷积实现。这种多分辨率融合总共重复了 8 次。
- 输出热图来自最高分辨率的分支。
结果,高分辨率分支在不断吸收深层语义信息的同时,没有丢失分辨率。
| 模型(COCO 姿态,验证集) | 输入 | AP | 参数量 | GFLOPs |
|---|---|---|---|---|
| SimpleBaseline(ResNet-152) | 256×192 | 72.0 | 6860万 | 15.7 |
| HRNet-W32(无预训练) | 256×192 | 73.4 | 2850万 | 7.10 |
| HRNet-W32(ImageNet 预训练) | 256×192 | 74.4 | 2850万 | 7.10 |
| SimpleBaseline(ResNet-152) | 384×288 | 74.3 | 6860万 | 35.6 |
| HRNet-W48 | 384×288 | 76.3 | 6360万 | 32.9 |
(论文表 1。AP 是对多个阈值下的关节位置准确度求平均得到的值。)在测试集(test-dev)上,HRNet-W48 384×288 达到了 75.5。该表的核心要点是,在相同输入下,它比 SimpleBaseline 的参数和计算量更少,却更加准确。“先丢弃分辨率再找回”远不如“不丢弃”来得高效。
4. 热图:绘制地图而非输出坐标
U-Net 和 HRNet 都会输出 地图。对于分割而言,它是为每个像素涂上“属于物体的概率”;对于姿态和寻球而言,它则是涂上“关节(球)在此处概率”的 热图。标准答案也是用地图制作的。在关节位置绘制一个小型高斯山丘,并测量预测地图与每个像素的均方误差(MSE)。Stacked Hourglass(2016)使用的是标准差 1px 的山丘,HRNet 论文也写着 1px,而官方配置文件中则使用了 σ=2。根据 HRNet 官方配置标准,输出分辨率为输入的 1/4(256×192 → 64×48)。
亲自尝试:将热图读回坐标
热图最终必须转换成坐标才能使用。方法有两种。
- argmax:最亮格子的位置。简单但会产生一个格子大小的误差。
- 加权中心:对超过阈值(最大值的一半)的格子位置按其数值进行加权平均。能够恢复格子间的位置(亚像素)。
我们在 256×256 图像的 2000 个随机位置绘制了 σ=2 格子的山丘,并针对不同的热图步长(相对于原图的缩小程度)进行了读回,测量了原图坐标误差(实测,无噪声的理想情况)。
| 步长 | 热图尺寸 | argmax 平均误差 | 加权中心平均误差 |
|---|---|---|---|
| 1 | 256×256 | 0.37px | 0.05px |
| 2 | 128×128 | 0.77px | 0.10px |
| 4 | 64×64 | 1.53px | 0.20px |
| 8 | 32×32 | 3.05px | 0.40px |
从中可以读出两点。第一,argmax 误差与步长成正比。如果用 argmax 读取 1/4 分辨率的热图,平均会直接损失 1.5px。第二,加权中心将误差减少了 7–8 倍。因此,姿态估算代码会在 argmax 之后附加诸如向邻近格子方向偏移 1/4 格子的校正等后处理,而寻球的 WASB 使用的是斑块的 加权中心。不过,实际的热图中存在噪声和第二个峰值(如日光灯之类的假球),因此不会像这张表那么干净。
5. 局限性
- 内存。 高分辨率特征图消耗的内存与尺寸的平方成正比。由于 HRNet 的高分辨率分支持续存活,因此在处理大输入时必须减小批次大小。
- 当存在多个峰值时。 热图能够自然地表达“存在多个候选”,但必须另外决定其中哪个才是真正的目标。在寻球任务中,帧之间的轨迹承担了这一角色。
- 重叠物体。 当同种类的两个物体靠得很近时,山丘会合并。U-Net 的“细胞间加权损失”就是针对该问题的一个解决方案。
6. 与我们项目的联系
TT Score 的寻球完全遵循了本文的脉络(TT Score 模型剖析第 2 篇)。
- TrackNetV2 采用 U-Net 结构,输入连续 3 帧并输出 3 张热图。
- WASB 及其球台版本 BlurBall 将骨干网络更换为了轻量级 HRNet(参数量约 150 万)。输入为
(B, 9, 288, 512)(RGB × 3 帧),并在 0.5 处截断热图,输出连通区域的 加权中心作为球的位置。这与第 4 节实验中的“加权中心”是相同的方法。 - 在模型输入中,球的直径仅有 3px 左右。正如第 1 节表格所示,在 1/8 分辨率下球就会消失,因此将高分辨率分支保留到最后的 HRNet 非常契合。
- 姿态估计的 RTMPose 使用了 SimCC,它不输出热图,而是输出 x 轴和 y 轴的两个 1D 分布。这是将 2D 地图拆分为两个 1D 以减少计算量的另一条途径(TT Score 模型剖析第 4 篇)。
下一篇文章将介绍如何对这些地图进行评分以及如何对其进行训练,内容涉及损失函数与训练技巧。
蒂蒂小结。 缩小到 1/8 的话球就消失啦。所以寻球模型会把大地图一直带在身边。虽然很重,但总比弄丢球要好呢。
参考文献
- Ronneberger, O., Fischer, P., Brox, T. (2015). U-Net: Convolutional Networks for Biomedical Image Segmentation. MICCAI 2015. https://arxiv.org/abs/1505.04597
- Sun, K., Xiao, B., Liu, D., Wang, J. (2019). Deep High-Resolution Representation Learning for Human Pose Estimation. CVPR 2019. https://arxiv.org/abs/1902.09212
- Wang, J. et al. (2020). Deep High-Resolution Representation Learning for Visual Recognition. IEEE TPAMI. https://arxiv.org/abs/1908.07919
- Newell, A., Yang, K., Deng, J. (2016). Stacked Hourglass Networks for Human Pose Estimation. https://arxiv.org/abs/1603.06937
- 示例代码与输出:此文件夹中的
code/03_heatmap.py,code/03_heatmap.out.txt