TenosorFlow : 肺がん検出 課題
作成 : (株)クラスキャット セールスインフォメーション
日時 : 06/12/2017
今回は肺がん検出の課題を TensorFlow で扱ってみます。題材は以下の記事にわかりやすい説明がありますが :
Kaggle が主催した、CT スキャンの画像から肺ガンを検出するモデルを競うコンテストで提供されているデータセットを利用します。既にコンテスト自体は終了していますが、逆にどのようなアプローチを取れば良いのかある程度は判明していますので、TensorFlow で実装して試してみたいと思います。
Kaggle のチュートリアルにはモデルのベースラインが示されていますが、今回は入門編という位置づけでリサンプリングによる前処理のみを行なった上で基本的なモデルをトレーニングしてみます。
以下の画像はある陽性患者の CT スキャン画像群を再構成して 3D 表示したものです :
データセット概要
データセットは以下で提供されています :
データセットの中心は約 1,500 人ほどの患者の CT スキャン画像群で、患者毎に 200 ~ 300 毎程度のグレースケール画像があります。shape は 512 x 512 x 1。画像が意外に粗いのはデータが比較的古いためのようです。各患者には (単純化して言うならば) 陽性/陰性のラベルが張られていて、本来の課題は未知の患者のラベルを予測するものですが、既にコンテストは終了していますのでここではラベルつきの患者のデータセットを分割して利用します。
サンプルデータの例として、以下はある患者の CT スキャン画像のリストの一部です :
そして拡大画像例。上は陽性、下は陰性患者のものです :
![]() | ![]() | ||
![]() | ![]() |
予備実験
取り敢えず感触をつかむために、特別な前処理は行なわずに訓練してみました。
以下のグラフは左が損失で、右が検証精度です :
![]() | ![]() |
一応はトレーニングが収束を見せるのですが、0 にまでは下がりきりません。
また精度も 67 % くらいで頭打ちです。この数字はかなり悪いです。
リサンプリングによる改良
生データのままでは精度が上がりませんでしたので、次に前処理の改良を考えます。Kaggle には前処理のチュートリアルが各種用意されていますのでそれらを参考にして、CT スキャン画像を (生データから実測値ベースに線形変換した上で) リサンプリングして再構成しました。補正しないと見にくいですが、以下はその画像例です :
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
そして以下は (前処理には直接には関係なく) あくまで参考のためですが、リサンプリングしたデータを元にマーチングキューブ法 (コンピュータグラフィックスのアルゴリズム) を使用して骨格を立体画像化したものです :
![]() | ![]() |
また、ピクセルデータを変換した CT 値 (or HU, Hounsfield Unit) においては閾値の設定により組織がある程度分別できますので、同じ CT スキャン画像データを元にして異なる組織を立体画像化することもできます :
![]() | ![]() |
![]() | ![]() |
トレーニング結果
以下がトレーニング結果を示すグラフです。各サンプルのデータ量が大きくなるためにトレーニングには多少工夫が必要となりましたが、今度は損失はきれいに下がりました (グラフのノイズはエポック間の継ぎ目です) :
クロスエントロピー | MSE |
![]() | ![]() |
訓練精度 | |
![]() |
しかしながら検証精度は 72 ~ 80 % 程度で、更に false positive/negative のケースを精査してみると特徴が掴めているとは推定できず、この基本モデルでは限界があることも確認できます。簡単に言えば、汎化性能が出ていません。
次回はチュートリアルで提示されているモデルを利用して実験する予定です。
以上