Kaggle CZII コンペ上位解法まとめ
はじめに
KaggleのCZII - CryoET Object Identificationコンペに参加しました。
まったく歯が立たなかったので(悔しい…!)、
その振り返りとして上位解法をまとめます。
その中でも今回は上位解法に多かったセグメンテーションでのアプローチを中心にまとめます。
コンペ概要
タスク
このコンペティションの目的は、3D細胞画像内のタンパク質複合体を自動的に識別・アノテーションする機械学習アルゴリズムを開発することです。
このコンペティションでは、トモグラム(3D画像)内の粒子の中心点を特定することが課題です。
データセットの構成
粒子の種類と難易度
データには6つの粒子についてラベルが存在しており、それぞれ難易度が異なっていました。
また、beta-amylaseについては評価対象外とされていました。
評価指標でbeta-amylaseの予測には重み0が掛けられるので残していても問題ない状況でしたが、5クラス+背景とするチームもありました。
- apo-ferritin(簡単)
- beta-amylase(不可能、評価対象外)
- beta-galactosidase(難しい)
- ribosome(簡単)
- thyroglobulin(難しい)
- virus-like-particle(簡単)
ぱっと見では何がどの粒子なのかわかりません…
ファイル構成
トレーニングにはテストに含まれないdenoised以外のzarrファイルが存在しており、どう使うのか、使わないのかも議論にあがっていました。
トレーニングデータ
- トモグラムデータ(3D画像)が保存されたZarrファイル。
- 1つのzarrファイルに複数の解像度のデータが保存されている
- 粒子の真の位置情報(アノテーション)が保存されたJSONファイル。
- その他のフィルタリングされたデータ(テストデータには含まれない)
-
wbp
(加重逆投影) -
ctfdeconvolved
(CTFデコンボリューション) -
isonetcorrected
(ISONET補正)
-
テストデータ
-
トモグラムデータ(denoisedのみ提供)。
- テストのzarrファイルは最高解像度のデータが使用される(X, Y, Z)= (630, 630, 184)
最終的な評価には約500個のトモグラムが使用されます。
評価指標
提出物は、β値4のF-βスコアで評価されます。このスコアは再現率(Recall)を重視し、粒子の見逃し(False Negative)を強くペナルティする一方、偽陽性(False Positive)には比較的寛容です。
F-βスコアは以下の式で計算されます:
-
5つの粒子クラスが対象となり、
- 簡単な粒子(リボソーム、ウイルス様粒子、アポフェリチン)は重み1
- 難しい粒子(サイログロブリン、β-ガラクトシダーゼ)は重み2
- 評価方法: 複数のトモグラム全体でマイクロ平均を行い、全データセットの再現率と適合率を計算した後、F-βスコアを適用します。
- β-アミラーゼはトレーニングデータに含まれますが、スコアに影響しないため評価対象外です。
基本解法
- 公式のサンプルノートブックではセグメンテーションモデルで座標推定していました。
- 粒子クラスの半径に応じたマスクの生成
- 3D U-NetでProbabilityの予測
- マスクのバイナリ化
- 連結成分分析などから各粒子の座標を推定する
- また、物体検出で座標推定するアプローチもありました。
上位解法
上位チームの解法では大きな流れや考え方が異なるというより、
それぞれのプロセスの取り組みでの細やかな工夫が見受けられました。
データ
- シミュレーションデータの使用:本コンペではコンペデータの他に外部データの存在がアナウンスされていました。
- 事前学習で使うケースが見受けられた(7th)
前処理
- 正規化
- パーセンタイル正規化が多く採用されていました。
医療系画像ではこの手法が多く採用されるようです。(初めて知った)
- パーセンタイル正規化が多く採用されていました。
- ガウシアンヒートマップの作成
- 多くのチームが0/1のハードラベルからソフトラベルに変換していました。
- 一方で1stのチームはハードラベルのままピクセル単位の分類を行っています。
- GroundTruth maskサイズの調整(8th, 9th)
- 今回粒子の中心座標から半径の0.5倍以内の範囲に座標を予測できればTruthとみなされます。
ガウシアンヒートマップと近い発想だと思われますが、半径に応じたマスク生成時に半径自体を小さく調整するチームがありました。
- 今回粒子の中心座標から半径の0.5倍以内の範囲に座標を予測できればTruthとみなされます。
- ピクセル座標系への変換時にオフセット追加
- 座標変換時にピクセルのズレが発生しておりそのオフセットを処理する必要がありました
モデル
- セグメンテーションモデル
MONAIの3D U-Netをベースに検討され、2.5D U-Netも使用されていました。- 3Dモデル
- FlexibleUnet、ConvNeXt、ResNet101、VoxResNet、VoxHRNet、SegResNet、DenseVNet、DynUNet
- 2.5Dモデルバックボーン
- EfficientNet-B2、EfficientNetV2-B2、ConvNeXt-Nano、ResNet34d、ResNetRS-50
- 3Dモデル
- 物体検出モデル(1st)
- 採用理由:セグメンテーションアプローチは実装が簡単ですが、点検出タスクには適していないと判断し、物体検出アプローチを採用したとのことでした。
- SegResNetとDynUnetバックボーンを使った独自の物体検出モデルを開発していました。
学習方法
- 損失関数
基本的にはDiceLossなどが使用されていましたが、正例/負例のサンプル数に大きな偏りがあるため、それに対応するチームがありました。- DiceLoss、DiceCELoss、Weighted-CELoss(1st)、MSE-based Loss(4th)、FocalTversky++ Loss(6th)、Weighted-BCELoss(7th)
- 勾配クリッピングの採用(5th)
- 非スコア対象のクラス(beta-amylase)を含めることで、他のクラスとの識別性が向上しました。(1st)
- 背景クラスに比べ、陽性クラスの重みを256倍にすることで、小さな物体の検出精度を高めました。(1st)
- EMAの使用(8th)
後処理
おそらく、本コンペの差を分けたのはこの後処理と後述のアンサンブルかと思われます。
粒子が本来別々のものなのに結合されてしまうケースなどもあり、その対処がフィルタリングなどで必要でした。
各チームで様々なアイデアがあり非常に面白いです。
- 連結成分分析後、マスクサイズに応じてフィルタリング(5th)
- 連結成分分析を用いず効率的に局所最大を見つけて座標を求めるチーム(4th, 7th)
- Watershed Segmentationでの粒子の分離(8th)
- 接触する物体をうまい具合に分離してくれる古典的アルゴリズム
- KL-Divergenceの最小化で粒子の分離(10th)
アンサンブル
このコンペティションではアンサンブルが大きなカギを握っており、
そのための高速化とアンサンブル手法に各チーム差が見られました
- 高速化
- TensorRT
- GPU並列化
- アンサンブル手法
- セグメンテーションと物体検出のアンサンブル(1st)
- model soupでのアンサンブル(8th)
- モデルの重みを平均する手法らしい
- https://arxiv.org/abs/2203.05482
- TTA:下記組み合わせ
- 軸方向のフリップ(X/Y/Z)
- 90/180/270度回転
おわりに
今回はセグメンテーションアプローチを中心にCZIIの上位解法をまとめました。
各プロセスで丁寧な処理が求められる良いコンペだったと思います。
個人的に上位解法をまとめているときに面白かった点として、
4th solution(yu4uさん、tattakaさん)のサブミッションノートブックにアイデアメモが残されており、
上位の方の考え方・コンペの歩き方を垣間見ることができました。
手札の多さや試行回数の多さなど、非常に参考になりました。
(こうならなきゃ勝てないのか…という気持ちも湧いた)
参考資料
-
4th solution 振返り
Discussion