ステータス:ドラフト(2026-10-13)、一部実測。 1・4節の例はノートPCの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つの方向に分かれます。
2. U-Net(2015):縮小して拡大し、同じ階層同士をつなぐ
Ronnebergerらは、顕微鏡の細胞画像のセグメンテーション(画素ごとに「細胞か背景か」を塗り分けること)のためにU-Netを作成しました。名前の通りU字型の形状をしています。
- 収縮パス(エンコーダ):畳み込み2回+2×2の最大プーリングを繰り返し、解像度を下げてチャンネルを増やします。文脈を集約します。
- 拡張パス(デコーダ):アップサンプリングにより解像度を再び大きくします。
- スキップ接続:収縮パスの同じ解像度の特徴マップを切り出し、拡張パスに 結合します(チャンネル方向に連結)。デコーダは「深い層の判断」と「浅い層の詳細な境界」を同時に見て塗り分けます。
第2回のResNetのショートカットは値を 足し、U-Netのスキップ接続は 結合します。足し算は同じ情報を少し修正するものであり、結合は異なる種類の情報(位置と意味)を並べて置き、次の層に混ぜ合わせさせるものです。
少量のデータで学習するための仕組み
医療画像はアノテーションコストが高くつきます。論文の学習データは、電子顕微鏡のセグメンテーション30枚(512×512)、細胞追跡コンテストのデータ約35枚・20枚程度でした。そのため、設計がデータの節約に合わせて最適化されています。
- パディングなしの畳み込み。 端を0で埋めないため、出力が入力よりも小さくなります(図1基準で入力572×572 → 出力388×388)。偽の境界値を学習させないための選択です。大きな画像はタイル状に分割して処理し、端の外側は画像を 鏡のように反転させて 埋めます(オーバーラップタイル戦略)。
- 弾性変形による拡張。 3×3の粗い格子の各点を標準偏差10pxでランダムにずらし、滑らかに補間して画像を歪ませます。細胞組織が実際にそのように変形するためです。
- 重み付き損失。 接している細胞の間の狭い背景の帯に大きな重み(w₀=10、σ≈5px)を与え、2つの細胞を1つに塗りつぶさないようにします。
結果(論文):電子顕微鏡セグメンテーションコンテストで歪み誤差0.000353により1位(従来最高は0.000420)。2015年細胞追跡コンテストの2つのデータにおいてIoU 0.9203(2位0.83)と 0.7756(2位0.46)。512×512の1枚を当時のGPUで1秒以内にセグメンテーションし、学習にはメモリ6GBのデスクトップGPUで10時間かかりました。
U-Netは医療画像を超えて、「入力と同じサイズの地図を出力しなければならない」ほぼすべてのタスクの基本形となりました。卓球のボール探しにおけるTrackNetV2もU-Net構造です(TT Scoreモデル解剖 第2回)。
3. HRNet(2019):高解像度を最後まで残す
U-Netは一度縮小してから再び大きくします。縮小する過程で失われた位置情報をスキップ接続で戻しますが、デコーダが受け取る高解像度の特徴は 浅い層のものであるため意味情報が弱いです。Sunらは人物姿勢推定(17箇所の関節の位置特定)のために別のアプローチを取りました。それは 最初から最後まで高解像度の分岐を維持することです。
- 第1段階は、高解像度(入力の1/4)の1つの分岐から始まります。
- 段階ごとに、解像度を半分にしチャンネルを2倍にした分岐を 追加します。既存の分岐はそのまま残します。HRNet-W32の4つの分岐のチャンネル数は32・64・128・256です。
- 分岐は並行して計算され、 交換ユニットでお互いに混ざり合います。低解像度から高解像度への変換は1×1畳み込み+nearest近傍アップサンプリング、その逆はストライド2の3×3畳み込みです。このマルチ解像度の融合を合計8回繰り返します。
- 出力されるヒートマップは、最も解像度の高い分岐から得られます。
結果として、高解像度の分岐が深い層の意味情報を継続的に受け取りながらも、解像度を失わずに維持します。
| モデル(COCO姿勢、検証セット) | 入力 | AP | パラメータ数 | GFLOPs |
|---|---|---|---|---|
| SimpleBaseline(ResNet-152) | 256×192 | 72.0 | 6,860万 | 15.7 |
| HRNet-W32(事前学習なし) | 256×192 | 73.4 | 2,850万 | 7.10 |
| HRNet-W32(ImageNet事前学習あり) | 256×192 | 74.4 | 2,850万 | 7.10 |
| SimpleBaseline(ResNet-152) | 384×288 | 74.3 | 6,860万 | 35.6 |
| HRNet-W48 | 384×288 | 76.3 | 6,360万 | 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)となっています。
やってみる:ヒートマップを座標に逆変換する
ヒートマップは最終的に座標に変換して使用します。方法は2つあります。
- argmax:最も明るいマスの位置。シンプルですが、マスの大きさ分の誤差が残ります。
- 加重中心:閾値(最大値の半分)を超えるマスの位置を、値に基づいて加重平均します。マスとマスの間の位置(サブピクセル)を復元します。
256×256の画像のランダムな位置2,000箇所にσ=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 |
ここから2つのことが読み取れます。第一に、argmaxの誤差はストライドに正比例します。1/4解像度のヒートマップをargmaxで読み取ると、平均1.5pxの誤差がそのまま失われます。第二に、加重中心を使用すると誤差が7〜8倍に減少します。そのため、姿勢推定のコードではargmaxの後に隣接するマスに向けて1/4マス分移動させるような補正の後処理を追加し、ボール探しのWASBでは塊の 加重中心を使用します。ただし、実際のヒートマップにはノイズや2番目のピーク(蛍光灯のような偽のボール)が存在するため、この表ほどきれいにはいきません。
5. 限界
- メモリ。 高解像度の特徴マップはサイズの二乗に比例してメモリを消費します。HRNetの高解像度の分岐は常に生存し続けるため、大きな入力に対してはバッチサイズを小さくする必要があります。
- 複数のピークが存在する場合。 ヒートマップは「候補が複数あること」を自然に表現できますが、その中でどれが本物であるかは別途決定する必要があります。ボール探しにおいては、フレーム間の軌跡がその役割を果たします。
- 重なり合う物体。 同じ種類の物体が2つ接近して配置されると、山が結合してしまいます。U-Netの「接着された細胞間の重み付き損失」はこの問題に対する1つの処方箋でした。
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は、ヒートマップの代わりにx軸・y軸の2つの1D分布を出力するSimCCを使用しています。2Dの地図を2つの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