福岡人データサイエンティストの部屋

データサイエンスを極めるため、日々の学習を綴っています。

【医療画像AI】CNNで医療画像を分類してみた(その2)#003



こんにちは!こーたろーです。


本日は、CNNを使って医療画像の分類のその2です。


今回の分類は、前回のブログの続きとなりますので、このブログからご覧のかたは、一つ前のブログを一度参照してから、コードを作成してみてください。


CNNで医療画像を分類してみた(その1)【医療画像AI】#002 - 福岡人データサイエンティストの部屋


前回は、評価手法として再代入法による評価でしたが、今回は実際に「Test」データでの評価を行っていきます。


必要データのダウンロード

前回同様に日本放射線技術学会 画像部会のページからtestデータをダウンロードします。
http://imgcom.jsrt.or.jp/imgcom/wp-content/uploads/2018/12/Directions01_RGB.zip
こちらのリンクを開くと、ダウンロードが開始します。


前回、ダウンロードした方は再ダウンロードは不要です。


「Directions01_RGB.zip」という、ファイルがダウンロードされたら、解凍してください。


前回は「train」のフォルダを使って学習させました。今回は、「train」のフォルダで学習させたモデルに「test」データを入れて評価します。


ライブラリ・オブジェクトのインポート

「test」のフォルダは、pythonファイルと同じ階層に配置しております。


ソースコードを使われる場合は、ファイルの参照するパスを、ご自身の「train」フォルダのパスへ設定し直してみてください。

import matplotlib.pyplot as plt
import numpy as np
import os

from os import listdir
from keras.preprocessing.image import load_img, img_to_array
from tensorflow.python.keras.utils import to_categorical
from sklearn.metrics import accuracy_score, confusion_matrix

from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense



ライブラリ・オブジェクトのインポートは前回と同じでやっていきます。


前回の続きからpythonファイル編集するといいかもしれません。(実際にそうやって書いています)

「test」データの処理その1(画像データ処理)



Test用の画像についても32(ピクセル)×32(ピクセル)×3チャネル(RGB)の画像になります。


前回のTrainデータの処理と同様の処理をTestデータに対しても行っていきます。

手順としては、

  1. フォルダにある画像のファイル名を取得する
  2. ファイルをTensorflowで利用できる4次元にするための箱を準備する
  3. 4次元のうち、「横(幅)」「縦(高さ)」の情報を取り出し、4次元の配列に追加する(この時、画素数の正規化をしておく)
  4. 4つのフォルダの4次元配列を結合して、一つの配列にする

といった手順です。


FnameUp = [filename for filename in listdir('./test/Up') if not filename.startswith('.')]
testU = np.zeros((len(FnameUp),32, 32, 3))
for i in range(0, len(FnameUp)):
    fnameform = './test/Up/%s' %FnameUp[i]
    testU[i] = np.array(img_to_array(load_img(fnameform, target_size=(32,32))))/255.0

FnameDown = [filename for filename in listdir('./test/Down') if not filename.startswith('.')]
testD = np.zeros((len(FnameDown),32, 32, 3))
for i in range(0, len(FnameDown)):
    fnameform = './test/Down/%s' %FnameDown[i]
    testD[i] = np.array(img_to_array(load_img(fnameform, target_size=(32,32))))/255.0

FnameLeft = [filename for filename in listdir('./test/Left') if not filename.startswith('.')]
testL = np.zeros((len(FnameLeft),32, 32, 3))
for i in range(0, len(FnameLeft)):
    fnameform = './test/Left/%s' %FnameLeft[i]
    testL[i] = np.array(img_to_array(load_img(fnameform, target_size=(32,32))))/255.0

FnameRight = [filename for filename in listdir('./test/Right') if not filename.startswith('.')]
testR = np.zeros((len(FnameRight),32, 32, 3))
for i in range(0, len(FnameRight)):
    fnameform = './test/Right/%s' %FnameRight[i]
    testR[i] = np.array(img_to_array(load_img(fnameform, target_size=(32,32))))/255.0

test_all = np.concatenate((testU, testD, testL, testR), axis=0)
test_all.shape



「test」データの処理その1(正解ラベル)

次に、正解ラベルを作成していきます。


正解ラベルは、フォルダ毎にUP・Down・Left・Rightのラベルを割り当てます。


それぞれ「0」「1」「2」「3」と名付けます。


そして、そのnumpyリストを作成したあとで、4つのリストを結合します。


それらは、One-hotベクトル化することで、CNNの正解ラベルとすることができます。


labelUp = np.full((len(FnameUp), 1), 0, dtype="uint8")
labelDown = np.full((len(FnameDown), 1), 1, dtype="uint8")
labelLeft = np.full((len(FnameLeft), 1), 2, dtype="uint8")
labelRight = np.full((len(FnameRight), 1), 3, dtype="uint8")

label_test_All= np.concatenate((labelUp, labelDown, labelLeft, labelRight), axis=0)

Onehot_label_All = to_categorical(label_test_All, 4)





モデルの構築・学習



前回のブログで学習させたモデルを使うため、今回は省略です。確認はこちらから。


CNNで医療画像を分類してみた(その1)【医療画像AI】#002 - 福岡人データサイエンティストの部屋

Testデータでの予測と評価



作成したテストデータを投入していきます。また、正解ラベルについても混合行列に入れて評価していきます。

probs = model.predict(test_all)
results = list(model.predict_classes(test_all, verbose=1))
cmatrix = confusion_matrix(label_test_All, results)
cmatrix



混合行列はこのようになりました。



最後に、正解率を確認します。

score = accuracy_score(label_test_All, results)
score





テストデータは、各10枚ずつしかないですが、作成したCNNは十分に画像の向きを判別できるレベルになっていることが分かります。


この処理が、どのように役に立つかというと、データストレージの管理で訳に立ちます。


これらの医療画像が大量に集まっているデータレイクを考えると、いちいち向きを確認して、揃えることは大変な労力が必要になってきます。
そこで、データレイクからDWH(データウエアハウス)へ移行するときにこのような機械学習がもちられることがあります。
単純な作業ではありますが、画像の向きを判定するAIを作成し、全ての画像をUPの方向にする処理を加えることで、DWHでは向きの揃った画像になりますね。


データサイエンティストとしては、ストレージ管理も重要なので、こういったAIも役立つと思っています。


ではでは。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装