Slide 1

Slide 1 text

RSNA2024の振り返り 第3回 関東Kaggler会 2025/02/15 Koki “NANACHI” Wada

Slide 2

Slide 2 text

自己紹介 • 名前: 和田孝喜(Twitter/Kaggle: ななち /NANACHI) • Tier: Competitions Master • 学生時代はNTKとかNNの汎化バウン ドとか • IceCubeでたまたまメダル取れてから kaggleが楽しくなり継続

Slide 3

Slide 3 text

本日の発表について • RSNA2024の1st placeの解法を発表! ✓discussionの解法に書いたこと ✓discussionの解法に書ききることができな かった詳細 ✓各種モデルに対してどのような気持ちを込め て作ったか • この発表で特に伝えたいこと ✓パイプラインコンペで意識するべきこと ✓モデルの気持ちを考えることの重要性 ✓面倒くさがらず実装することの重要性 RSNA2025にきっと役立つ!! 聞いた人全員金メダル!!

Slide 4

Slide 4 text

RSNA2024概要(タスクとラベル) タスク 腰椎のMR画像から各患部のseverityを3つに分類 - 1人あたり5つの椎間板 L1/L2, L2/L3, …, L5/S1 - 1つの椎間板当たり5つのラベル - Spinal Canal Stenosis (SCS) - (left/right) Neural Foraminal Narrowing (NFN) - (left/right) Subarticular Stenosis (SS) - クラス Normal/Mild, ModerateおよびSevere 6 L1/L2 L2/L3 L3/L4 L4/L5 L5/S1 右画像出典: /https://miamineurosciencecenter.com/en/conditions/herniated-disc/ 各椎間板の位置 椎間板ごとのラベル位置 ラベル

Slide 5

Slide 5 text

RSNA2024概要(データ) 一人当たり3種類のMR画像 - Sagittal T2/STIR - Sagittal T1 - Axial T2 画像出典: https://www.lecturio.com/concepts/computed-tomography-ct/ MR画像 患部の位置を特定するための補助ラベル その他 患者ID MR画像のID MR画像のZ軸 ラベル種類 椎間板種類 XY座標 これをチェックすることでannotatorが どこを見てラベルをつけたかわかる train_label_coordinates.csv

Slide 6

Slide 6 text

基本的なアプローチ アプローチ 患部の位置予測=>severity予測(過去のRSNAを参考) - 1st. 各levelのinstance number予測 - SCSとNFNは3D-CNNで予測 - SSはSCSのinstance numberとdicomのメタ データから計算 - 2nd. XY座標予測(2D-CNN) - 3rd. Severity予測(2.5D-CNN) - SCSはSagittal T2とAxial T2で予測 - NFNはSagittal T1とAxial T2で予測 - SSはAxial T2のみで予測 詳細 Sag T2 Sag T1 Z予測(NFN) Ax T2 Z予測(SCS) Z計算(SS) XY予測(SS) XY予測(SCS) XY予測(NFN) severity(SCS) severity(NFN) severity(SCS) 推論パイプライン

Slide 7

Slide 7 text

タイムライン baseline 2-stage(早めにやっておくか…) - 3D-CNNでxyz座標予測 - 予測したxyzを中心に患部Crop - 2D-CNNでseverity予測 Private LB: ~200th New baseline 3-stage(めんどくさがらずにやるぞ!) - 3D-CNNでZ予測(SSはSCSから計算) - 予測したZ座標に対応するMR画像から xyを予測. 患部Crop - 3chの2D-CNNでseverity予測 Private LB: ~19th 2D=>2.5D 3-stage(かっこいいことするぞ!) - 3chCNNから2.5Dに切り替え(エンコー ドされた特徴はAttention Poolingでま ぜまぜ) - Aux loss追加(後述) Private LB: 8th Final 3-stage(モデルガチャガチャするの楽しい!) - Attention Poolの前にbi-LSTM追加 - Ensemble (ConvNext&efficientnet-v2) - その他細かい調整 Private LB: 1st 6月18日 8月20日 9月1日(コンペ終了40日前) 9月27日(コンペ終了2週間前)

Slide 8

Slide 8 text

解法説明の流れ ここから先は以下の流れでステージごとに説明 - データ前処理 - モデルのアーキテクチャ - (あれば)小ネタはさむ(ロバスト性の向上とかAux lossとか) ここからさき基本的にはSCSを代表として説明!

Slide 9

Slide 9 text

1st stage: instance number予測

Slide 10

Slide 10 text

1st stage: データの前処理 MR画像を読み込んで順番通りにスタック 基本 1. Meta dataに従って順番通りにスタック 2. 画像を384 × 384にreshape 3. スタックした画像を 0, 1 に正規化 4. 𝑍 = 32にそろえるためにzero padding 32に揃えたのはscs(nfn)のMR画像の枚数が32を 超えず, またキリが良かったから. 詳細

Slide 11

Slide 11 text

1st stage : モデルの構造と訓練 その1 - 3D ConvNeXt Encoder - Global Average Pooling - level毎にinstance numberを予測するヘッド (SCSは5個, NFNは10個) ※NFNはleftとrightが存在するため10個のヘッド モデル構造 - 損失関数: CE Loss - 32クラス分類問題として訓練(𝑍 = 32なので) 訓練 3D ConvNeXt Encoder Global Average Pooling 3D L3/L4 Head L2/L3 Head L1/L2 Head L4/L5 Head L5/S1 Head CE Loss CE Loss CE Loss CE Loss CE Loss

Slide 12

Slide 12 text

1st stage: モデルの構造と訓練 その2 - 基本は前と同じ - ただしヘッドは3次元(XYZを回帰で予測) モデル構造 - 損失関数: L1 Loss - 3dimの回帰問題として訓練(XYZ) - ラベルはそれぞれ Τ 𝑋 𝑊𝑖𝑑𝑡ℎ, Τ 𝑌 𝐻𝑒𝑖𝑔ℎ𝑡, Τ 𝑍 32 を使用 - XYは補助ロスとして機能(ZだけでなくXYも わかったほうがモデル君うれしいはず!) 訓練 3D ConvNeXt Encoder Global Average Pooling 3D L3/L4 Head L2/L3 Head L1/L2 Head L4/L5 Head L5/S1 Head L1 Loss L1 Loss L1 Loss L1 Loss L1 Loss sigmoid sigmoid sigmoid sigmoid sigmoid

Slide 13

Slide 13 text

1st stage 小ネタ(cls head vs reg head) - 基本的に分類ヘッドのほうが全体的には良い傾向 - ただし, 回帰ヘッドは分類ヘッドに比べて大きく外す確率が低 い傾向 アンサンブルして大きく外す確率を(気持ち)下げた ※+-1, 2くらいのずれならリカバリーできる範囲だが, それ以上 外されるとしんどいので気持ちだけでも下げるのは重要! Head error=+-0 error=+-1 error=+-2 error>=+-3 cls head 71.08% 27.04% 1.43% 0.44% reg head 67.48% 30.59% 1.61% 0.31%

Slide 14

Slide 14 text

1st stage 小ネタ(ConvNeXtの実装) ConvNeXtは, - 強い! - 速い! - 実装しやすく拡張も容易! のでベースラインでは一旦これ使っとけば良いと思ってます! RSNA2024をやってるときにめちゃくちゃお世話になったrepo https://github.com/FrancescoSaverioZuppichini/ConvNext ResNetから少しずつConvNeXtに変えていくのでわかりやすい!

Slide 15

Slide 15 text

2nd stage: XY座標予測

Slide 16

Slide 16 text

2nd stage: データの前処理 instance number を用いて3chにする 基本 1. L1/L2~L5/S1までのinstance numberの中央 値をとり, それを中心に前後1枚のMR画像を スタック 2. 画像を512 × 512にreshape 3. スタックした画像を 0, 1 に正規化 詳細

Slide 17

Slide 17 text

2nd stage : モデルの構造と訓練 - 2D encoder (ConvNeXt & efficientnet-v2) - Global Average Pooling - level毎にXY座標を予測するヘッド モデル構造 - 損失関数: L1 Loss - 2dimの回帰問題として訓練(XY) - ラベルはそれぞれ Τ 𝑋 𝑊𝑖𝑑𝑡ℎ, Τ 𝑌 𝐻𝑒𝑖𝑔ℎ𝑡を使用 訓練 2D Encoder Global Average Pooling 3D L3/L4 Head L2/L3 Head L1/L2 Head L4/L5 Head L5/S1 Head sigmoid sigmoid sigmoid sigmoid sigmoid L1 Loss L1 Loss L1 Loss L1 Loss L1 Loss

Slide 18

Slide 18 text

3rd stage: severity予測

Slide 19

Slide 19 text

3rd stage: データの前処理 instance numberとXYを用いてCrop 基本 1. 画像を512 × 512にreshape 2. instance number を中心に前後2枚までス タック(5ch) 3. スタックした画像を 0, 1 に正規化 4. XY座標をもとにCrop Cropの範囲はMR画像を眺めながら決定 詳細

Slide 20

Slide 20 text

3rd stage: データの前処理 1. Cropの範囲はCV見つつエラー分析しながら 決定 2. Crop範囲は4つのパラメータで指定 • Upper • Lower • Left • Right 詳細(Crop)

Slide 21

Slide 21 text

3rd stage: データの前処理 Crop(SCS) MRImage Left right upper Lower sagt2 96 32 40 40 axial 96 96 96 96 - AxialのCropにはleft/right SSのXY座標を用いて中 心点を計算 - SagittalからL5/S1をCropする際には少しだけ Cropの範囲を下にずらした(L5/S1は角度が急だっ たため)

Slide 22

Slide 22 text

3rd stage: データの前処理 Crop(NFN) MRImage Left right upper Lower sagt1 96 64 32 32 axial 48 144 96 96

Slide 23

Slide 23 text

3rd stage: データの前処理 Crop(SS) MRImage Left right upper Lower axial 48 144 96 96

Slide 24

Slide 24 text

3rd stage: モデル構造・訓練のアイデア アイデア 2.5D+Augmentation+Aux Lossでロバスト性の向上 3/5chの2DCNNは前ステージの予測誤差の影響が強いことがエラー分析で判明(特 にinstance numberの誤差) それぞれのMR画像を独立にエンコードして, instance numberの誤差に対して頑 健になるような特長量の混ぜ方を考えよう! 2.5D + Augmentation + Aux Loss (特長量を混ぜるところで) 詳細

Slide 25

Slide 25 text

3rd stage: 今回採用した2.5Dの流れ instance_number=8の場合

Slide 26

Slide 26 text

3rd stage: Augmentation + Aux Loss 2.5D採用時点でロバスト性の向上は確認できたが, 更にエラーに 対して頑健にしたい instance numberを確率的にずらすdata augmentation (確率 は1st ステージのエラー率を用いて決める) Head error=+-0 error=+-1 error=+-2 error>=+-3 cls head 71.08% 27.04% 1.43% 0.44% reg head 67.48% 30.59% 1.61% 0.31% ズレ無し: 65% +-1ズレ: 30% +-2ズレ: 5%

Slide 27

Slide 27 text

3rd stage: Augmentation + Aux Loss サブタスク: (メインの分類とは別に)instance numberを予測させる 気持ち: アノテータが注目していたMR画像を理解し, そのcontextを集約時に使えるようになれ! Aux Loss Attention Pooling時に計算したattention scoreを 直接CE Lossに渡し, instance numberに対応する scoreを直接上げる方法  性能悪化 instance numberだけに注目すればよいわけで はない?instance numberのラベル自体が悪い? 初手 2D Encoder vec3 vec4 vec5 vec2 vec1 bi-LSTM Attn score計算 集約 Cls head Aux CE Loss attention score

Slide 28

Slide 28 text

3rd stage: Augmentation + Aux Loss サブタスク: (メインの分類とは別に)instance numberを予測させる 気持ち: アノテータが注目していたMR画像を理解し, そのcontextを集約時に使えるようになれ! Aux Loss 集約用のattention score計算とは別にinstance number予測用のattention scoreを計算 気持ち) bi-LSTMの出力する特徴量にannotator のcontextを含ませて, そのうえで分類のための attention scoreを計算していただく  著しく性能向上 Best 2D Encoder vec3 vec4 vec5 vec2 vec1 bi-LSTM (集約用)Attn score計算 集約 Cls head Aux CE Loss (aux用)Attn score計算

Slide 29

Slide 29 text

3rd stage: モデルの構造と訓練 - 2D encoder (ConvNeXt & efficientnet-v2) - bi-LSTMで特長量まぜまぜ - 集約用attention score計算 - 集約&concat - 分類用ヘッド メインタスク 2D Encoder & GAP bi-LSTM (agg)Attn score 集約 concatenate Aux CE Loss (aux)Attn score Sagittal T2 bi-LSTM (agg)Attn score 集約 (aux)Attn score Axial T2 main head CE Loss Aux CE Loss sub head sub head Aux CE Loss Aux CE Loss 2D Encoder & GAP - instance number予測用のattention score計算 &CE Loss - concatせず入力ごとに分類タスクを解くサブ ヘッド&CE Loss サブタスク

Slide 30

Slide 30 text

3rd stage小ネタ Aux Lossの有無とCVへの影響度は 以下の通り(SCS) Aux Lossの有無 2D Encoder & GAP bi-LSTM (agg)Attn score 集約 concatenate Aux CE Loss (aux)Attn score Sagittal T2 bi-LSTM (agg)Attn score 集約 (aux)Attn score Axial T2 main head CE Loss Aux CE Loss sub head sub head Aux CE Loss Aux CE Loss 2D Encoder & GAP fold without Aux with Aux 0 0.254 0.240 1 0.283 0.254 2 0.267 0.254 3 0.264 0.252 4 0.244 0.261 mean 0.2624 0.2522 大きく改善する!

Slide 31

Slide 31 text

まとめ • RSNAは面倒くさがらずにパイプライン頑張って作る • ConvNeXtは実験をサクッと進めるうえで使いやすい • 2.5D強い! • 前ステージのエラーを考慮に入れた訓練が重要 • アノテータの気持ちをAux Lossで教えてあげる