TenosorFlow : 超音波画像の神経構造セグメンテーション
作成 : (株)クラスキャット セールスインフォメーション
日時 : 06/13/2017
今回は超音波画像セグメンテーションを TensorFlow で実装してみます。
題材は前回に続いて Kaggle の出題からで、超音波画像のデータセット上で神経構造を識別可能なモデルの構築が求められています :
具体的には以下のサンプル画像のような首の超音波画像の BP セグメンテーションを行ないます。BP は Brachial Plexus, 腕神経叢 (わんしんけいそう) を意味します :
実際に実験してみると、目標が訓練しやすい形式に設定されていることもあってこの課題自体はさほど難しいわけではありませんが、セグメンテーションは医療分野に限らず応用範囲が広い技術です。
データセットの概要
訓練用データセットには、腕神経叢の超音波画像とそのセグメンテーション・マップ i.e. セグメンテーションを表わすマスク画像が対になって含まれています。患者毎に 120 枚の超音波画像が含まれ、超音波画像は shape 580 x 420 x 1 のグレースケール画像です。それぞれの超音波画像に対応したマスク画像も併せて用意されています。約 50 人の患者分が用意されていて、つまり約 12,000 (= 120*2*50) 枚の画像が含まれています。
今回はマスク画像が用意されている訓練用データセットを分割して、訓練・検証・テスト用として利用しました。
以下は最初の患者の 1 枚目の超音波画像とそのマスク画像です :
![]() |
![]() |
そして以下は最初の患者の (120 枚ある) 超音波画像群のサブセットです :
以下は上の超音波画像のそれぞれに対して対(つい)になっているマスク画像です :
モデル
課題はセグメンテーションですが、このケースでは要するにマスク画像を教師信号とする教師あり学習です。
セグメンテーションを行なうモデルは定石としては FCN (Fully Convolutional Network) あるいはその改良版の U-Net が考えられます。U-NET は生物医学でのセグメンテーションに良く利用されるようです。
基本的には Convolutional Auto-encoder の一種と考えられますので、先に VGG-16 による Auto-encoder でも試してみます。入出力が異なるので厳密には Auto-encoder ではありませんが、ここでは便宜上 Auto-encoder と呼称します。
なお参考まで、FCN の元ペーパーは以下です :
そして U-Net :
- U-Net: Convolutional Networks for Biomedical Image Segmentation
- 3D U-Net: Learning Dense Volumetric Segmentation from Sparse Annotation
訓練
損失関数は基本的には類似度が測れれば良いのですが、ここでは ダイス係数 を用いました (MSE では上手くいきません)。
ダイス係数は自然言語処理で良く用いられます :
[Auto-encoder 損失]
[U-Net 損失]
予測
さて予測結果です。概ね位置特定については上手くいっているようですが、その範囲については正確性を欠いています。
また、(意外なことに) 普通の Auto-encoder でも U-Net でも予測結果に殆ど違いは見られませんでした。これは課題のセグメンテーションが比較的単純な構造であるためかもしれません。
● 以下の5例は比較的上手くいっている例です。
Auto-encoder による予測、U-Net による予測、そしてマスク画像の正答の順に示します :
患者 1 : 予測 (Auto-encoder)
患者 1 : 予測 (U-Net)
患者 1 : 正答
患者 2 : 予測 (Auto-encoder)
患者 2 : 予測 (U-Net)
患者 2 : 正答
患者 3 : 予測 (Auto-encoder)
患者 3 : 予測 (U-Net)
患者 3 : 正答
患者 4 : 予測 (Auto-encoder)
患者 4 : 予測 (U-Net)
患者 4 : 正答
患者 5 : 予測 (Auto-encoder)
患者 5 : 予測 (U-Net)
患者 5 : 正答
● 以下の2例は上手くいってない例です :
患者 6 : 予測 (Auto-encoder)
患者 6 : 予測 (U-Net)
患者 6 : 正答
患者 7 : 予測 (Auto-encoder)
患者 7 : 予測 (U-Net)
患者 7 : 正答
以上