セグメンテーション — 画像を画素単位で理解する
「どこに何があるか」を四角い枠で答えるのが物体検出なら、セグメンテーションはすべての画素に「あなたは何クラスか」を答えさせるタスクです。画素分類という見方、エンコーダ・デコーダ構造とskip接続、そしてIoU/Diceによる評価までを、動かしながら掘り下げます。
1. 分割とは「画素の分類」である
セマンティックセグメンテーションの出力は、入力と同じ解像度のクラスマップです。ネットワークは各画素について全クラスの確率分布(softmax)を出し、その argmax を塗ったものが分割結果になります。つまり本質は「H×W 個の分類問題を一度に解く」こと。分類 CNN との違いは、空間解像度を最後まで(あるいは最後に)保たなければならない点に尽きます。
下のデモは道路シーンの分割結果です。画素の上にマウスを乗せると、その画素のクラス確率分布が見えます。物体の内部では確率が1クラスに集中し、境界付近では分布がなだらかに混ざることを確認してください。損失関数(画素ごとの交差エントロピー)が一番苦労しているのは、まさにこの境界画素です。
2. エンコーダ・デコーダとskip接続
画素分類には矛盾した2つの要求があります。クラスを当てるには広い受容野=深い層で得る文脈情報が必要ですが、深い層はプーリングで解像度を失い、境界の位置情報が消えます。これが受容野と解像度のジレンマです。
FCN (2015) は全結合層を畳み込みに置き換えて「任意サイズの入力→粗いクラスマップ」を実現し、アップサンプリングで解像度を戻しました。U-Net はさらに、エンコーダの各解像度の特徴マップをデコーダの同じ解像度へ横渡しするskip接続を導入し、失われた位置情報を復元段に注入します。下のU字を流れるデータを眺めながら、skip接続をOFFにしたときの出力境界の変化を見てください。
3. どこまで合えば「正解」か — IoU と Dice
分割の評価は画素の集合同士の重なりで測ります。予測マスク A と正解マスク B に対して、定番は次の2つ。
数式だけでは「IoU 0.5」がどれくらいのズレなのか感覚が湧きません。下のデモで予測マスクをドラッグして、IoU=0.5 の見た目を体に入れてください。思ったよりずっと「ズレて見える」はずです — 検出タスクで IoU 0.5 が合格ラインとされるのはかなり緩い基準で、だからこそ COCO では 0.5〜0.95 を平均する厳しい指標が使われます。
4. セマンティックからインスタンスへ
セマンティック分割は「車というクラス」を塗るだけで、車が3台いても全部同じ色です。1台ずつを別の個体として切り分けるのがインスタンスセグメンテーション(代表格は検出枠の中でマスクを推定する Mask R-CNN)。さらに、可算物体(thing)はインスタンスで、空や道路のような不可算領域(stuff)はセマンティックで塗り分ける統合タスクがパノプティックセグメンテーションです。
5. まとめ
- セグメンテーションの本質は画素ごとの分類。出力は H×W×C の確率マップで、境界画素ほど分布が曖昧になる。
- 受容野と解像度のジレンマに対し、U-Net は skip接続で位置情報を復元段に注入し、DeepLab は膨張畳み込みで解像度を守ったまま受容野を広げた。
- 評価は IoU(mIoU)と Dice。IoU=0.5 は見た目にはかなり大きなズレ。クラス不均衡には Dice loss が効く。
- クラスを塗るセマンティック、個体を切るインスタンス、両者を統合するパノプティックという3段階のタスク設計がある。