セグメンテーションは、画像を画素(ピクセル)単位で分類するタスクです。物体検出が「矩形」で物体の位置を表すのに対し、セグメンテーションは物体の輪郭に沿った詳細な領域を得られます。

1. セグメンテーションの種類

種類 説明 個体の区別
Semantic Segmentation(意味的領域分割) 画素ごとにクラスラベルを付与する しない(同じクラスの複数個体はまとめて1色になる)
Instance Segmentation(個体領域分割) 物体検出(どの物体か)+画素単位のマスク(どの範囲か) する(同じクラスでも個体ごとに別マスク)
Panoptic Segmentation(全景領域分割) Semantic と Instance を統合 背景(stuff:空や道路など数えられないもの)は Semantic 的に、物体(things:車や人など数えられるもの)は Instance 的に扱う

具体例:道路に車が3台並んでいる画像を考えます。

  • Semantic Segmentation:3台の車すべてが同じ「車」クラスの1色で塗られる(3台の境界は区別されない)
  • Instance Segmentation:3台の車それぞれに別々のマスク(車1、車2、車3)が付く
  • Panoptic Segmentation:道路や空といった背景は1色でまとめて塗り、車のような物体は個体ごとに区別する、という両者のいいとこ取り

2. 代表モデル

FCN(Fully Convolutional Network)

セグメンテーションに CNN を本格的に応用した先駆的モデルです。

  • 通常の画像分類 CNN の末尾にある全結合層を使わず、すべて畳み込み層のみで構成する
    • 全結合層は入力サイズが固定されるが、畳み込み層のみであれば任意サイズの画像を入力でき、出力も画像に対応した空間的な形(画素ごとの予測)を保てる
  • CNN を通すと畳み込み・プーリングにより解像度が下がっていくため、最終的に元の画像と同じ解像度に戻すための Upsampling(アップサンプリング) が必要になる
  • Upsampling には転置畳み込み(Transposed Convolution、逆畳み込みとも呼ばれる)が使われることが多く、通常の畳み込みとは逆に、入力より出力の解像度を大きくする操作を行う

U-Net

医療画像セグメンテーションなどで広く使われる、左右対称な構造を持つモデルです。

  • Encoder(収縮パス):畳み込みとプーリングを繰り返し、画像を徐々にダウンサンプリングしながら特徴を抽出していく
  • Decoder(拡大パス):転置畳み込みなどでアップサンプリングを繰り返し、元の解像度まで戻していく
  • Skip Connection(スキップ接続):Encoder 側の各層の出力を、対応する解像度の Decoder 側の層に直接連結する
Encoder                                    Decoder
入力 → conv → pool → conv → pool → ... → 最深部 → ... → upconv → conv → 出力
         └───────────── skip connection ─────────────┘

Skip Connection が重要な理由は、Decoder が Upsampling だけで細部(物体の境界など)を復元しようとしても、深い層まで圧縮される過程で失われた空間的な位置情報は戻ってこないためです。Encoder の浅い層(高解像度・低次特徴)の情報を直接 Decoder に渡すことで、境界のシャープなセグメンテーションが可能になります。

SegNet

U-Net と同じく Encoder-Decoder 構造ですが、Upsampling の方式が異なります。

  • U-Net が Skip Connection で Encoder の特徴マップそのものを Decoder に連結するのに対し、SegNet は Encoder の Pooling を行った際の「どの位置が最大値だったか」というPooling Indices(プーリングインデックス)だけを記憶しておき、Decoder 側のアップサンプリング時にそのインデックス位置に値を戻す方式を取る
  • この方式によりメモリ効率が良くなる一方、U-Net ほど豊富な特徴情報は Decoder に渡されない

Mask R-CNN

物体検出の Faster R-CNN を拡張し、Instance Segmentation を行えるようにしたモデルです。

  • Faster R-CNN の「クラス分類」「ボックス回帰」の2つの出力ヘッドに加えて、マスク予測ブランチを追加し、各候補領域内で画素単位のマスクを出力する
  • RoIAlign:Faster R-CNN の RoI Pooling は候補領域を固定サイズに変換する際に座標を整数値に丸める(量子化する)ため、位置ずれの誤差が生じていた。RoIAlign はこの丸め処理を行わず、バイリニア補間を用いて連続値のまま特徴を抽出することで、画素単位の精度が求められるマスク予測に必要な位置精度を確保する

3. Dilated Convolution(Atrous Convolution, 拡張畳み込み)

セグメンテーションでは「広い範囲の文脈(コンテキスト)を捉えたいが、解像度は落としたくない」という要求があります。通常、受容野(Receptive Field:出力の1画素が入力のどれだけの範囲を見ているか)を広げるには、プーリングやストライドの大きい畳み込みで解像度を下げる必要がありますが、これはセグメンテーションに必要な空間情報を失わせてしまいます。

Dilated Convolution(拡張畳み込み) は、カーネルの各要素の間に隙間(dilation)を空けることで、パラメータ数や解像度を変えずに受容野だけを広げる手法です。

  • dilation rate $r=1$ のときは通常の畳み込みと同じ
  • $r=2$ のときはカーネルの要素間に1マスずつ隙間を空けて適用する(カーネルサイズが見かけ上大きくなる)

これにより、プーリングによる解像度低下を避けながら、より広い文脈情報を取り込んだ特徴抽出が可能になります(DeepLab シリーズなどで採用)。

4. 評価指標

IoU(画素単位)

物体検出と同じ考え方を画素単位に適用したものです。

\[\text{IoU} = \frac{\text{予測マスクと正解マスクの重なり画素数}}{\text{予測マスクと正解マスクの和集合画素数}}\]

セグメンテーションでは特に mIoU(mean IoU)、つまり各クラスの IoU をクラス数で平均した値が代表的な評価指標として使われます。

Dice係数(F1スコアに相当)

\[\text{Dice} = \frac{2 |\text{予測} \cap \text{正解}|}{|\text{予測}| + |\text{正解}|}\]

Dice係数は分類における F1スコア(適合率と再現率の調和平均)に相当する指標で、医療画像セグメンテーションなど、対象領域が画像全体に対して小さい(クラス不均衡が大きい)タスクでよく使われます。

IoU と Dice係数は次の関係で相互に変換できます。

\[\text{Dice} = \frac{2\,\text{IoU}}{1+\text{IoU}}, \qquad \text{IoU} = \frac{\text{Dice}}{2-\text{Dice}}\]

まとめ

  • セグメンテーションは Semantic/Instance/Panoptic の3種類に大別され、「個体を区別するか」が分類の軸になる
  • FCN は全結合層を排したことで任意サイズの画像に対応でき、U-Net は Skip Connection によって細部の空間情報を保持する
  • Mask R-CNN は物体検出(Faster R-CNN)にマスク予測を追加した構造で、RoIAlign が位置精度を支える
  • Dilated Convolution は解像度を落とさずに受容野を広げる手法で、広い文脈と高解像度出力の両立に使われる
  • 評価には IoU(mIoU)と Dice係数が代表的で、両者は数式的に相互変換可能