前回は、画像中の領域抽出に用いられる、U-Netと呼ばれるU字型の畳み込みネットワークを紹介しました。
今回は、U-Netを人体の腹部MRI画像に適用して、実際に肝臓の領域抽出を行ってみます。
今回は、U-Netを人体の腹部MRI画像に適用して、実際に肝臓の領域抽出を行ってみます。
肝臓抽出に用いたU-Net
前回も解説しましたが、U-Netが領域抽出に適している理由が図1に示されています。
3大特徴は、「Upサンプリング」,「Merge(マージ)」,「全結合層がない」です。
詳細は、https://lp-tech.net/articles/5MIeh (Deep learningで画像認識⑨〜Kerasで畳み込みニューラルネットワーク vol.5〜) を参照してください。
3大特徴は、「Upサンプリング」,「Merge(マージ)」,「全結合層がない」です。
詳細は、https://lp-tech.net/articles/5MIeh (Deep learningで画像認識⑨〜Kerasで畳み込みニューラルネットワーク vol.5〜) を参照してください。
教師データの作成
腹部のMRI画像(3D)を用いて、領域抽出のための教師データを作成しました。
今回は、自分で肝臓領域を塗ってマスク画像を作成したので、手間を削減するために、1人の3D画像(60~70 スライス)あたり、約10スライス毎に1スライスの割合で抜き出し、計6~7 スライスのマスク画像を作成しました(画像サイズは224x224 pixel)。マスク画像の作成には、医用画像解析ソフト「3D slicer」を用いました。
訓練用に12人(82スライス)、評価用に3人(20 スライス)のMRI画像とマスク画像のセットを用意し、オリジナルの教師データとしました。図4に一例を示します。
その後、オリジナルの教師データの画像データセット数を50倍水増し(Data Augmentation)し、訓練用(4100スライス)と評価用(1000スライス)を追加しました。当然ですが、Data Augmentationにおいて、元画像とマスク画像の両方に同じ移動・変形を施す必要があります。
Kerasでは、Data Augmentationにおける関数(Image Generator)が既に提供されていますが、関数を自作することもできます。また、学習の繰り返し計算の中で水増しすることもできますが、もちろん前もって水増ししておくこともできます。今回は、自作の関数を用いて、前もって水増しを行いました。医用画像の場合、あまりにも不自然な移動・変形を加えて水増しすることは得策ではない気がします。例えば、画像を左右反転させて肝臓が左側になる、というような変形は行うべきではないでしょう。
今回は、自分で肝臓領域を塗ってマスク画像を作成したので、手間を削減するために、1人の3D画像(60~70 スライス)あたり、約10スライス毎に1スライスの割合で抜き出し、計6~7 スライスのマスク画像を作成しました(画像サイズは224x224 pixel)。マスク画像の作成には、医用画像解析ソフト「3D slicer」を用いました。
訓練用に12人(82スライス)、評価用に3人(20 スライス)のMRI画像とマスク画像のセットを用意し、オリジナルの教師データとしました。図4に一例を示します。
その後、オリジナルの教師データの画像データセット数を50倍水増し(Data Augmentation)し、訓練用(4100スライス)と評価用(1000スライス)を追加しました。当然ですが、Data Augmentationにおいて、元画像とマスク画像の両方に同じ移動・変形を施す必要があります。
Kerasでは、Data Augmentationにおける関数(Image Generator)が既に提供されていますが、関数を自作することもできます。また、学習の繰り返し計算の中で水増しすることもできますが、もちろん前もって水増ししておくこともできます。今回は、自作の関数を用いて、前もって水増しを行いました。医用画像の場合、あまりにも不自然な移動・変形を加えて水増しすることは得策ではない気がします。例えば、画像を左右反転させて肝臓が左側になる、というような変形は行うべきではないでしょう。
推測結果
領域抽出では、評価値としてDice(ダイス)係数というものを使います。教師データであるマスク画像と推測領域との類似度を示す指標です。下のように、通常のCNNでaccuracy, val_accuracyの箇所が、dice_coef, val_dice_coefになっているのが分かります。
また、出力層のシグモイド関数の閾値は0.5として白黒画像に変換しました。
また、出力層のシグモイド関数の閾値は0.5として白黒画像に変換しました。
Epoch 92/1000 4182/4182 [==============================] - 99s - loss: -0.8884 - dice_coef: 0.8884 - val_loss: -0.8273 - val_dice_coef: 0.8273 Epoch 93/1000 4182/4182 [==============================] - 99s - loss: -0.8887 - dice_coef: 0.8887 - val_loss: -0.8197 - val_dice_coef: 0.8197 Epoch 94/1000 4182/4182 [==============================] - 99s - loss: -0.8885 - dice_coef: 0.8885 - val_loss: -0.8297 - val_dice_coef: 0.8297
results.py
最適化ループの回数(epoch数)を増やすと訓練画像の評価値は徐々に増えて行きますが、評価画像の評価値は、100回程度のepoch数で約0.83に収束しました(図2)。
そこで、epoch数100回付近で評価画像の評価値が最大となるモデル重みを用いて、テスト画像(ある1人のMRI画像)から肝臓領域の推測を行いました(図6)。推測領域に若干欠如が見られますが、訓練データの情報量が元の3Dデータの約1/10(約10スライス毎に抜き出して作成したため)である割には、かなり高い精度で推測が行われたと考えられます。
そこで、epoch数100回付近で評価画像の評価値が最大となるモデル重みを用いて、テスト画像(ある1人のMRI画像)から肝臓領域の推測を行いました(図6)。推測領域に若干欠如が見られますが、訓練データの情報量が元の3Dデータの約1/10(約10スライス毎に抜き出して作成したため)である割には、かなり高い精度で推測が行われたと考えられます。
今回は、このU-Netを用いて、実際のMRI画像から肝臓領域を抽出してみました。
訓練データの情報量が元の3Dデータの約1/10である割には、かなり高い精度で推測が行われたと考えられます。
このように、U-netによってかなり精度良く臓器抽出を行うことが可能です。
手持ちのデータがある方は、是非色々試してみてはいかがでしょうか?
【参考文献 / URL】
[1] https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/
[2] Fully Convolutional Networks for Semantic Segmentation, Evan Shelhamer, Jonathan Long, and Trevor Darrell, Member, IEEE, 2016.
[3] 実装ディープラーニング,藤田一弥, 高原 歩,オーム社.
訓練データの情報量が元の3Dデータの約1/10である割には、かなり高い精度で推測が行われたと考えられます。
このように、U-netによってかなり精度良く臓器抽出を行うことが可能です。
手持ちのデータがある方は、是非色々試してみてはいかがでしょうか?
【参考文献 / URL】
[1] https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/
[2] Fully Convolutional Networks for Semantic Segmentation, Evan Shelhamer, Jonathan Long, and Trevor Darrell, Member, IEEE, 2016.
[3] 実装ディープラーニング,藤田一弥, 高原 歩,オーム社.
14 件
数字は、画像サイズ(pixel)を表す。