U-Net徹底解説:セグメンテーションを“拡張-収縮”構造で攻略する!

こんにちは、ゆずかきです。
ここからは、「U-Net」 と呼ばれる医用画像を中心に様々な分野で活用されているセグメンテーション用ニューラルネットワークについて、私のブログ記事としてまとめてみたいと思います。

今回取り上げるU-Netは、オリジナル論文「U-Net: Convolutional Networks for Biomedical Image Segmentation」(Olaf Ronneberger, Philipp Fischer, Thomas Brox, 2015)で提案されたアーキテクチャ。医療画像のような限られたアノテーションデータしかないシナリオでも高い性能を発揮することから、今でも根強い人気があります。

さらに最近では、SAM(Segment Anything Model) という汎用的なセグメンテーション技術も注目されており、U-Netとの組み合わせによる高性能な画像処理パイプラインが話題を呼んでいます。そこで本記事では、U-Netの論文解説 を丁寧かつ網羅的に行うとともに、実装面や拡張事例、そしてSAMとの関連性なども触れながら深堀りしていきたいと思います。

それでは、論文の内容を一通り振り返りながら、本気で解説していきましょう。

論文URL
👇
U-Net: Convolutional Networks for Biomedical Image Segmentation


§本記事の構成

  • はじめに: U-Netとは?
  • 論文の背景と課題意識:医療領域のデータ不足を克服する
  • U-Netのアーキテクチャ: “収縮パス”と“拡張パス”
  • 実装上の工夫:データ拡張、Overlap-Tile戦略、Loss設計など
  • 主要な実験結果:EM画像・細胞追跡の挑戦的ベンチマーク
  • 拡張・応用範囲:他の領域やSAMとの組み合わせは?
  • まとめと今後の展望

U-Netは一見シンプルな構造に見えながら、強力なデータ拡張戦略や転移学習のしやすさなど、多くの特徴を備えています。順を追って見ていきましょう。


§はじめに: U-Netとは?

論文の正式名称は、

U-Net: Convolutional Networks for Biomedical Image Segmentation

著者は、Olaf Ronneberger, Philipp Fischer, Thomas Brox(ドイツ・フライブルク大学)を中心とした研究グループ。発表は2015年ですが、すでにかなりの引用数を獲得しており、医用画像セグメンテーションでは“定番中の定番”となっているモデルです。

この研究の主なゴールは、限られたアノテーション(教師データ)があっても、画像全体に対してピクセル単位で高精度なセグメンテーションを実現する こと。とくに組織切片や顕微鏡画像では、“正解データが数十枚ほどしか存在しない” ケースがザラです。

そこで著者らは、

  1. データ拡張(Data Augmentation)を強力に活用
  2. エンコーダ(contracting path)+デコーダ(expanding path)の対称構造
  3. 重み付き損失関数でオブジェクトの輪郭や分離を学習
    などを組み合わせた「Uの形をしたネットワーク(U-Net)」を提案し、当時のSOTA(state-of-the-art)を大きく塗り替えました。

§論文の背景と課題意識:医療領域のデータ不足を克服する

ディープラーニングが活躍するには、本来多数のアノテーション済みデータが必要です。例えばImageNetなどは100万枚以上のラベル付き画像が存在し、巨大モデルの学習に活用されてきました。

しかし、医療画像や顕微鏡画像は状況が異なり、1つ1つの画像に対するアノテーション作業が非常に手間です。細胞や組織の輪郭を正確に塗りつぶすには専門知識が必要で、大規模データセットを作るのは簡単ではありません。

この問題を回避するために、パッチ単位のスライディングウィンドウ方式(Ciresanら, 2012)などが過去に提案されていましたが、

  • 推論が遅い(各ピクセルの近傍パッチを何度も畳み込み)
  • 広域コンテキスト vs. 高解像度局所情報のバランスが難しい

といったデメリットがありました。

そこで、Fully Convolutional Network (FCN) [Long et al., 2014] の考え方をさらに進化させたのがU-Netです。畳み込みとプーリングで特徴を抽出しつつ、同時にアップサンプリングで元解像度を復元する というアプローチにより、高い位置精度広域の文脈情報を両立しているわけですね。


§U-Netのアーキテクチャ: “収縮パス”と“拡張パス”

U-Netの最大の特徴は、U字型に配置された2つのパスです。

  1. Contracting path(収縮パス)
  • いわゆるエンコーダに相当する部分。
  • 画像に畳み込み(Conv 3×3 + ReLU)を連続でかけ、2×2のMaxPoolingでダウンサンプリングしながら、チャンネル数を倍増させていく。
  • これにより、高次元の特徴量を抽出すると同時に、空間解像度は段階的に縮小する。
  1. Expanding path(拡張パス)
  • いわゆるデコーダに相当する部分。
  • ここでは、アップサンプリング(Up-convolution 2×2)を行い、空間解像度を段階的に元に戻していく。
  • その際、Contracting path側の対応する層の特徴マップを“スキップ結合”(concat)で取り込み、高解像度の位置情報を再注入する。
  • 結果として、高精細なセグメンテーションマップを生成可能になる。

この2つをつなげると、ちょうどアルファベットの“U”字を描くようなネットワーク構造になるため、U-Netと呼ばれます。

論文の図(Fig.1)を見ると、

  • 入力画像を右下に向けてどんどん縮小(Contracting)
  • その後、右下から左上に向かって拡大復元(Expanding)

しているのが分かると思います。また、最後の層(Conv 1×1)でピクセル単位のクラススコアを出力し、各ピクセルが背景か細胞か、といったセグメンテーションを行う仕組みです。

さらに特徴的なのは、収縮パスと拡張パスが“ほぼ対称”の構造を持つこと。これにより、ダウンサンプリング時に失われがちな空間情報を都度補完しながら復元できるのが強みですね。


§実装上の工夫:データ拡張、Overlap-Tile戦略、Loss設計など

論文では、U-Netの構造だけでなく、周辺のテクニックも重要視しています。主なポイントを見ていきましょう。

1. データ拡張(Data Augmentation)

  • 医用画像では学習データが少ないので、強力な水増しが必須。
  • 著者らはElastic Deformation(弾性変形)を積極的に利用。具体的には、3×3の格子点でランダムな変位ベクトルを生成し、画像全体を滑らかに変形させる。
  • これにより、細胞や組織が様々な形状に変形してもロバストに認識できるようになる。

2. Overlap-Tile戦略

  • FCN系モデルでは、出力サイズが入力画像よりも小さくなる(パディングなしConvのため)という問題がある。
  • そこで、大きな画像をタイル状に切り分けて推論する際、境界部分が切れないように(あるいは情報が欠けないように)、タイル同士をオーバーラップさせる(Overlap-Tile)アプローチを提案。
  • 辺のピクセル情報が不足する部分については、画像の鏡映りによる補完も行う。

3. Loss設計(Weighted Loss)

  • 細胞同士が接触している部分をきちんと分離(輪郭を切る)したい場合、接触境界ピクセルに対して重みを高くする。
  • 具体的には、背景と前景のクラス頻度を均衡させるweightマップに加え、近接する2つの細胞間の境界ピクセルにも大きなペナルティを与えるよう設定している。
  • これにより、セル同士のくっつきをモデルが学習して、輪郭が綺麗に分割されるようになる。

4. 実装環境(当時)

  • 論文中では、Caffeフレームワークを使用。
  • 学習はGPU(NVIDIA Titan, 6GB)で約10時間。
  • 当時の実装でも、512×512サイズの画像セグメンテーションが1秒以下で処理可能。

今ではPyTorchやTensorFlow/Kerasでの実装が主流となっていますが、構造としては同じものが組めます。


§主要な実験結果:EM画像・細胞追跡の挑戦的ベンチマーク

論文では、2つの代表的なベンチマークでU-Netの有効性を示しています。

  1. EM (Electron Microscopy)画像の神経構造セグメンテーション
  • ISBI 2012から継続するEM segmentation challenge(ショウジョウバエの神経細胞膜を分割)。
  • 提案手法U-Netは、Warping error(分割境界のずれを評価)で従来のトップモデルを大幅に上回った。
  • 特に競合となるCiresanらのスライディングウィンドウCNNをしのぎ、ランキング1位を獲得。
  1. HeLa細胞などのTracking(セル追跡)用途
  • ISBI 2014/2015のCell Tracking Challengeにおける、フェーズコントラスト顕微鏡画像・DIC画像のセグメンテーション。
  • データ数が少なく難易度が高いが、U-NetはIOU(Intersection Over Union)が90%超という高精度を叩き出し、2位以下に大差をつけて1位に。
  • 触れ合う細胞が多いDICのケースでも、輪郭強調の重み付けにより頑健に学習でき、他モデルを圧倒する結果に。

こうした生体画像特化の難タスクで最先端を塗り替えた点が、U-Netが大きく注目された理由の一つです。


§拡張・応用範囲:他の領域やSAMとの組み合わせは?

U-Netは医学・バイオ以外のタスクでも広く応用可能です。
たとえば、

  • 衛星画像(リモートセンシング)での道路や建物抽出
  • 自動車の自動運転におけるSemantic Segmentation
  • オブジェクト検出のバックボーンとして、解像度を維持した特徴マップを取り込むなど

さらに、最近ではMetaが提案したSegment Anything Model(SAM)が注目を集めていますが、U-Netのようなエンコーダ-デコーダ構造SAMの画像セグメンテーション用大規模事前学習を組み合わせることで、

  • 特定の領域のみを高精細に再セグメンテーション
  • SAMの汎用性 × U-Netの高精度復元

といった連携が研究コミュニティで進んでいます。実際にSAMを初期の粗セグメンテーションに使い、そこからU-Netベースのファインチューニングで精度向上を狙うプロジェクトが出始めており、今後は医療やバイオの現場でも“SAM + U-Net”のようなハイブリッドが広がる可能性があります。


§実装サンプル(PyTorch版)

ここでは簡単なPyTorch実装例(概念的なサンプル)を示します。
※バージョン表記は一例です。実際の環境に合わせてご調整ください。

【環境とバージョン例】
- Python==3.9
- PyTorch==2.0.0
- torchvision==0.15.0
- CUDA==11.7

【U-Netの実装例】
import torch
import torch.nn as nn
import torch.nn.functional as F

class UNet(nn.Module):
    def __init__(self, in_channels=1, out_channels=2, base_ch=64):
        super(UNet, self).__init__()

        # Contracting path
        self.enc1 = self.conv_block(in_channels, base_ch)
        self.enc2 = self.conv_block(base_ch, base_ch*2)
        self.enc3 = self.conv_block(base_ch*2, base_ch*4)
        self.enc4 = self.conv_block(base_ch*4, base_ch*8)

        # Bottleneck
        self.bottleneck = self.conv_block(base_ch*8, base_ch*16)

        # Expanding path
        self.up4 = nn.ConvTranspose2d(base_ch*16, base_ch*8, kernel_size=2, stride=2)
        self.dec4 = self.conv_block(base_ch*16, base_ch*8)

        self.up3 = nn.ConvTranspose2d(base_ch*8, base_ch*4, kernel_size=2, stride=2)
        self.dec3 = self.conv_block(base_ch*8, base_ch*4)

        self.up2 = nn.ConvTranspose2d(base_ch*4, base_ch*2, kernel_size=2, stride=2)
        self.dec2 = self.conv_block(base_ch*4, base_ch*2)

        self.up1 = nn.ConvTranspose2d(base_ch*2, base_ch, kernel_size=2, stride=2)
        self.dec1 = self.conv_block(base_ch*2, base_ch)

        # Final output
        self.out_conv = nn.Conv2d(base_ch, out_channels, kernel_size=1)

    def conv_block(self, in_ch, out_ch):
        block = nn.Sequential(
            nn.Conv2d(in_ch, out_ch, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(out_ch, out_ch, kernel_size=3, padding=1),
            nn.ReLU(inplace=True)
        )
        return block

    def forward(self, x):
        # Contract
        c1 = self.enc1(x)
        p1 = F.max_pool2d(c1, 2)

        c2 = self.enc2(p1)
        p2 = F.max_pool2d(c2, 2)

        c3 = self.enc3(p2)
        p3 = F.max_pool2d(c3, 2)

        c4 = self.enc4(p3)
        p4 = F.max_pool2d(c4, 2)

        # Bottleneck
        bn = self.bottleneck(p4)

        # Expand
        u4 = self.up4(bn)
        merge4 = torch.cat([u4, c4], dim=1)
        d4 = self.dec4(merge4)

        u3 = self.up3(d4)
        merge3 = torch.cat([u3, c3], dim=1)
        d3 = self.dec3(merge3)

        u2 = self.up2(d3)
        merge2 = torch.cat([u2, c2], dim=1)
        d2 = self.dec2(merge2)

        u1 = self.up1(d2)
        merge1 = torch.cat([u1, c1], dim=1)
        d1 = self.dec1(merge1)

        out = self.out_conv(d1)
        return out

# 使い方例
if __name__ == "__main__":
    # バッチサイズ 2, チャンネル数 1, 画像サイズ 256x256 のダミーデータ
    x = torch.randn(2, 1, 256, 256)
    model = UNet(in_channels=1, out_channels=2, base_ch=64)
    y = model(x)
    print("Output shape:", y.shape)  # -> (2, 2, 256, 256)

上記はあくまでも“最小限のU-Net”であり、BatchNormDropout注意機構(Attention) などの拡張もさまざまに検討されています。必要に応じて改良してみてください。


§まとめと今後の展望

U-Net は、「収縮パスでグローバル情報を圧縮しながら学習し、拡張パスで位置情報を再構築する」というシンプルなアイデアで、高いセグメンテーション精度を実現しました。特に下記のポイントが注目に値します。

  1. 少量データへの適応:Elastic Deformationなどの強力なデータ拡張を採用し、アノテーション枚数が限られていても高性能
  2. スキップ結合で高解像度を復元:収縮パスの特徴マップを上手く再利用し、マルチスケールなコンテキストを活かす。
  3. 医学・バイオ分野での成功:EM画像や細胞セグメンテーションにおいて、既存手法を凌駕する結果を示す。
  4. 汎用性の高さ:医用画像だけでなく、衛星画像・自動運転など幅広いタスクに応用。
  5. SAMとのハイブリッド:大規模事前学習されたSegment Anything Model(SAM)との組み合わせによる、高速・高精細なセグメンテーションへの発展が期待。

U-Netは2015年に提案されたモデルですが、その後もAttention U-NetUNet++、さらには様々な変形(ResUNet, Nested UNet, Swin UNetなど)が提案され、コミュニティは活発に発展しています。また、メモリ効率や推論速度を改善する手法も多数出てきています。

さらに近年の大規模モデル(例:Vision TransformersやDiffusionベース)とも競合・協調し、セグメンテーションの品質を極限まで引き上げる流れがあります。本記事で取り上げたSAM(Segment Anything Model)との組み合わせは、特に医療画像の分野でも期待されています。

以上、U-Net の基本から論文内容、実装・応用まで駆け足で解説してみました。エンコーダ-デコーダ型ネットワークの原点とも言えるモデルなので、是非一度コードを手元で動かしてみていただければと思います。

最後までお読みいただき、ありがとうございました!


🔑この記事のポイントまとめ

  • U-Net:医用画像セグメンテーションにおける定番アーキテクチャ。少量データ環境でも高精度。
  • 収縮パスで特徴を抽出 & 拡張パスで空間解像度を復元、スキップ結合で詳細情報を補完。
  • EMセグメンテーションや細胞追跡などの高難易度タスクでSOTAに。
  • Weighted LossElastic Deformation などの実装上の工夫がポイント。
  • SAM(Segment Anything Model) との連携でさらなる応用が期待。

■ブログ記事タイトル案 (5つ)

  1. 「U-Net」完全攻略:医用画像セグメンテーションの王道アーキテクチャを徹底解説
  2. 少量データで最高の精度!U-Netの強みと実装テクニックを網羅する
  3. U字型ネットワークの衝撃:U-Netで学ぶ収縮・拡張パスの神髄
  4. SAM時代にも色褪せないU-Netの魅力:ベーシック構造からハイブリッド応用まで
  5. AttentionやSAMとの統合も見据える!U-Netの論文を根こそぎ解説する重厚ガイド

以上です。どうぞご活用ください!

画像解析

Posted by yuzukaki-dialog