1 FCNの概要と背景

1.1 セマンティックセグメンテーションの課題

セマンティックセグメンテーションは、画像内の各ピクセルに意味ラベルを割り当てるタスクである。従来の手法では、手動で設計された特徴量(SIFT、HOGなど)と分類器(SVM、ランダムフォレスト)を組み合わせていたが、複雑なシーンや多クラス分類において精度が限定的であった。深層学習の登場後も、畳み込みニューラルネットワーク(CNN)は画像分類タスクに特化しており、入力画像から固定サイズのベクトル(クラス確率)を出力するため、ピクセル単位予測には適さなかった。そこで、任意サイズの入力を処理し、密なラベルマップを生成できるアーキテクチャが求められた。

1.2 従来CNNとの違い

従来のCNNは、畳み込み層とプーリング層を積み重ねた後、全結合層を用いて固定長のベクトルを出力する。これにより、空間情報が失われ、画像内の物体の位置や形状を正確に捉えることが困難である。一方、FCNは全結合層をすべて畳み込み層に置き換えることで、入力画像の空間次元を維持したまま、ピクセル単位の出力を生成する。また、FCNは入力サイズに依存せず、任意の解像度の画像を処理できる点が大きな特徴である。

1.3 FCNの登場と意義

FCNは2015年にLongらによって提案され、セマンティックセグメンテーションの分野に革命をもたらした。初めてエンドツーエンドの学習を可能にし、ピクセル単位の精度を大幅に向上させた。これにより、医療画像診断自動運転リモートセンシングなど、現実世界のアプリケーションに深層学習を適用する道が開かれた。FCNは後続のU-Net、SegNet、DeepLabなどのアーキテクチャの基礎となり、画像セグメンテーション研究の出発点として重要な位置を占める。

2 FCNの基本構造

2.1 畳み込み層の置き換え

FCNの核心は、従来のCNNにおける全結合層を1×1畳み込み層に置き換えることにある。例えば、VGG-16をベースにした場合、最後の全結合層(4096次元のベクトル)を1×1畳み込み層(チャネル数=クラス数)に変換する。これにより、出力は空間マップ(例えば、高さ×幅×クラス数)となり、各位置でピクセルごとの分類が可能となる。さらに、畳み込み層のみで構成されるため、ネットワークは任意のサイズの画像を受け入れることができる。

2.2 アップサンプリング手法

2.2.1 転置畳み込み(デコンボリューション)

FCNでは、ダウンサンプリングにより縮小された特徴マップを元の画像サイズに戻すために、転置畳み込み(Transposed Convolution)を用いる。これは、通常の畳み込みの逆演算のように働き、学習可能なフィルタにより特徴マップを拡大する。転置畳み込みは、アップサンプリングの際に空間的な細部を復元するが、過剰な学習によりチェッカーボード状のアーティファクトが生じることがある。

2.2.2 双線形補間

もう一つの単純なアップサンプリング手法として、双線形補間がある。これは周囲のピクセル値を線形に重み付けして新しいピクセルを生成する方法で、学習パラメータを持たず計算コストが低い。FCNの初期の実装では、転置畳み込みを学習させる代わりに、双線形補間で初期化することが多い。ただし、双線形補間のみでは高周波の詳細を回復できないため、通常は転置畳み込みと併用される。

2.3 スキップ接続役割

2.3.1 粗い特徴と細かい特徴の融合

FCNでは、ダウンサンプリングを繰り返すと、高レベルの意味情報は得られるが、空間解像度が低下し物体の境界がぼやける。この問題を解決するため、スキップ接続(Skip Connection)を導入する。スキップ接続は、浅い層(高解像度)の特徴マップと深い層(低解像度)の特徴マップを融合することで、細かい局所情報と大域的な文脈情報を同時に活用する。

2.3.2 FCN-8s、FCN-16s、FCN-32sのバリエーション

FCNの論文では、異なるスキップ接続の深さに応じて3つのバリエーションが提案された:

  • FCN-32s:アップサンプリングを1回(32倍)のみ行い、スキップ接続なし。最も粗い結果。
  • FCN-16s:2段階のアップサンプリングを行い、中間層(プーリング4の出力)からのスキップ接続を追加。やや改善。
  • FCN-8s:3段階のアップサンプリングを行い、さらに浅い層(プーリング3の出力)からのスキップ接続も追加。最も細かい境界が得られる。

FCN-8sが一般的に最も精度が高く、標準的なFCNの実装として広く使われている。

3 FCNの学習と最適化

3.1 損失関数(ピクセル単位のクロスエントロピー

FCNの学習では、各ピクセルに対する分類問題として、ピクセル単位のクロスエントロピー損失(Pixel-wise Cross-Entropy Loss)を用いる。出力マップの各位置で、ネットワークが予測したクラス確率と正解ラベルとの差を計算し、全ピクセルの平均損失とする。クラス不均衡がある場合(例えば、背景が大部分を占める)には、クラス重みを調整することもある。

3.2 データ拡張の重要性

セグメンテーションデータセットは一般にアノテーションコストが高く、サンプル数が限られる。そのため、データ拡張(Data Augmentation)が学習の安定性と汎化性能に大きく寄与する。代表的な手法として、ランダムな回転、スケーリング、フリップ、色調変化(明るさ、コントラスト、彩度)、ガウスノイズの付加などが用いられる。特に、画像とラベルマップに同じ幾何変換を同時に施すことが重要である。

3.3 バッチ正規化とドロップアウトの適用

FCNの学習時には、バッチ正規化(Batch Normalization)を畳み込み層の後に挿入することで、勾配の安定化と収束速度の向上が期待できる。ただし、小さなバッチサイズでは効果が低下するため、実装時には注意が必要である。ドロップアウト(Dropout)は全結合層の代替として導入されることがあるが、畳み込み層に適用すると過度な情報欠落を招く可能性があるため、一般的には最終層付近でのみ使用されるか、またはドロップアウトを避ける設計も多い。

4 FCNの応用例

4.1 医療画像(臓器・腫瘍の自動抽出)

医療画像解析では、CTスキャンやMRIから臓器(肝臓、腎臓、心臓など)や病変(腫瘍、出血領域)を自動抽出するためにFCNが活用される。特に、臓器の輪郭が曖昧な場合でも、FCNのピクセル単位予測により高精度なセグメンテーションが可能となり、放射線治療計画や診断支援システムに貢献している。

4.2 自動運転(道路・歩行者領域のセグメンテーション)

自動運転車両の周囲環境認識において、FCNは道路、車両、歩行者、標識などの領域をピクセルレベルで識別する。リアルタイム処理の要求に対しては、軽量なFCNバリアント(例:ENet、ICNet)が開発されているが、基本的なセグメンテーション性能はFCNのアーキテクチャに基づいている。

4.3 リモートセンシング(土地被覆分類)

衛星画像や航空写真の解析では、FCNを用いて森林、水域、農地、都市域などの土地被覆を分類する。従来の画素ベース分類よりも、空間的文脈を捉えられるため、ノイズに強くスムーズな分類結果が得られる。また、時系列画像の変化検出にも応用される。

4.4 インタラクティブ画像編集(背景切り抜き)

画像編集ソフトウェアでは、FCNを利用して背景と被写体を自動的に分離する機能が実装されている。ユーザーがマーキングした領域を手がかりに、FCNがピクセル単位で前景・背景を推定し、高精度な切り抜きを実現する。代表的な例として、Adobe Photoshopの「被写体を選択」ツールなどが挙げられる。

5 FCNの限界と発展

5.1 空間詳細の損失問題

FCNはダウンサンプリング(プーリング)により空間解像度を低下させるため、細かい物体や境界の詳細が失われやすい。特に、小さな物体や薄い構造(例えば、血管や電線)のセグメンテーションでは精度が低い。スキップ接続によってある程度改善されるが、根本的な解決には至っていない。

5.2 計算コストとメモリ消費

FCNは全結合層を排除したとはいえ、特にバックボーンとしてVGG-16などの大規模ネットワークを用いる場合、パラメータ数とメモリ消費が大きい。また、アップサンプリング段階での高解像度特徴マップはGPUメモリを圧迫する。これにより、高解像度画像の処理やリアルタイムアプリケーションへの適用が困難である。

5.3 後継アーキテクチャ:U-Net、SegNet、DeepLab

FCNの限界を克服するため、多くの改良アーキテクチャが提案された:

  • U-Net:エンコーダ-デコーダ構造と対称的なスキップ接続を特徴とし、医療画像セグメンテーションで高い性能を示す。
  • SegNet:プーリング時のインデックスを保存し、アップサンプリング時に再利用することでメモリ効率を向上。
  • DeepLab:空孔畳み込み(Atrous Convolution)と条件付き確率場(CRF)を導入し、受容野を拡大しつつ空間解像度を維持。

これらのアーキテクチャは、FCNの基本アイデア(全結合層の排除とアップサンプリング)を継承しながら、それぞれの弱点を補完している。

6 実装ガイド

6.1 フレームワークの選択(PyTorch、TensorFlow)

FCNの実装には、主要な深層学習フレームワークであるPyTorchまたはTensorFlow(Kerasを含む)が適している。PyTorchは動的計算グラフと直感的なデバッグが特徴で、研究用途に広く使われる。TensorFlowは静的グラフによる最適化が強く、本番環境でのデプロイに優れる。どちらのフレームワークにも、FCNの標準的な実装例が公式リポジトリやコミュニティで公開されている。

6.2 代表的な実装例

代表的な実装例として、PyTorchではVGG-16をベースにしたFCN-8sのコードが多く公開されている。具体的には、事前学習済みのVGG-16の全結合層を畳み込み層に置き換え、スキップ接続と転置畳み込み層を追加する。TensorFlow/Kerasでは、tf.keras.applicationsのVGG-16モデルを拡張する形で実装される。また、軽量なバックボーン(MobileNet、ResNet-18など)を用いた実装も存在する。

6.3 パラメータ調整のポイント

FCNの学習では以下のポイントに注意する:

  • バックボーンの選択:VGG-16は精度が高いが重い。ResNetやMobileNetはパラメータ数を削減できる。
  • バッチサイズ:GPUメモリに応じて調整。小さなバッチサイズではバッチ正規化の効果が低下するため、グループ正規化への代替も検討する。
  • 学習率:事前学習済みのバックボーン部分は低い学習率(1e-4程度)、新規追加層にはやや高い学習率(1e-3程度)を設定する。
  • アップサンプリング層の初期化:転置畳み込みは双線形補間で初期化すると収束が安定する。
  • 損失関数の重み付け:クラス不均衡が大きい場合は、クラスごとのピクセル数に応じて損失に重みを付ける。