• トップ
  • ブログ一覧
  • 【前処理編】肺のCT画像からCOVID19かどうかの判断は可能か?【機械学習】
  • 【前処理編】肺のCT画像からCOVID19かどうかの判断は可能か?【機械学習】

    広告メディア事業部広告メディア事業部
    2020.10.14

    IT技術

    前処理編~肺のCT画像からCOVID19か予想できるのか?

    肺のCT画像

    今回は、肺の CT 画像から、COVID 19か否かを予測する深層学習モデルを、「PyTorch」で実装してみたいと思います。

    PyTorch を採用した理由は、「Kaggle」での実装例も多く、公式ドキュメントも充実しているためです。

    というわけで、Kaggle に公開されているデータセットを用いて、「二値分類」をしていきたいと思います。

    実行は、すべて Kaggle の notebook 上で行っているので、自宅にGPUがない方でも、すぐに試すことができます。

    ちなみに、こちらの記事は「プログラミングで分類に挑戦する」ということが目的で、COVID 19を確実に分類できるわけではありませんので、予めご了承をお願い致します。

    データの下見と前処理

    今回使用するデータセットは、「COVID 19の画像」と「そうではない画像」とで、フォルダ分けして与えられています。

    DataFrameにまとめる

    使いやすいよう、「Pandas」のデータフレームに、まとめておくことにしました。

    1#make dataFrame
    2import pandas as pd
    3import glob
    4import os
    5os.chdir('/kaggle/input/computed-tomography-of-lungs-datase-for-covid19')
    6train_posi=glob.glob('CODE19 Data/Training Data/Covid/*')
    7train_nega=glob.glob('CODE19 Data/Training Data/Non Covid/*')
    8test_posi=glob.glob('CODE19 Data/Testing Data/Covid/*')
    9test_nega=glob.glob('CODE19 Data/Testing Data/Non Covid/*')
    10
    11train_df_posi=pd.DataFrame(columns=['filename',"covid"])
    12train_df_posi["filename"]=train_posi
    13train_df_posi["covid"]=1
    14train_df_nega=pd.DataFrame(columns=['filename',"covid"])
    15train_df_nega["filename"]=train_nega
    16train_df_nega["covid"]=0
    17train_df=pd.concat([train_df_nega,train_df_posi])
    18
    19tes_df_posi=pd.DataFrame(columns=['filename',"covid"])
    20tes_df_posi["filename"]=test_posi
    21tes_df_posi["covid"]=1
    22tes_df_nega=pd.DataFrame(columns=['filename',"covid"])
    23tes_df_nega["filename"]=test_nega
    24tes_df_nega["covid"]=0
    25test_df=pd.concat([tes_df_nega,tes_df_posi])
    26
    27#reset_index
    28train_df = train_df.reset_index(drop=True)
    29test_df = test_df.reset_index(drop=True)

    以下のように、「covid」の列が疾患か否かを示しており、疾患である場合のラベルは「1」です。

    DataFrameにまとめる
    1train_df["covid"].describe()
    2
    3>>>
    4count    746.000000
    5mean       0.467828
    6std        0.499299
    7min        0.000000
    825%        0.000000
    950%        0.000000
    1075%        1.000000
    11max        1.000000
    12Name: covid, dtype: float64

    「train」「test」ともに、COVID 19である割合は、5割ほどで乖離はなさそうでした。

    画像をみてみる

    画像分類をするとき、「何枚かの画像は、自分の目で見る」ということが大事です。

    特に医療画像では、作成された過程などにより、かなりの差異が生じます。

    たとえば、下の3枚の画像が似ていないことは、明らかですね。

    肺のレントゲン画像1
    肺のレントゲン画像2
    肺のレントゲン画像3

    また、画像のサイズも、均一ではなさそうです。

    この差をなくすために、前処理が一般的に必要とされていますが、今回はお試しなので割愛します。

    ちなみに COVID 19では、肺の部分が、白く抜けたようになります。

    交差検証をする

    機械学習モデルの作成において大事なことは、「特徴量生成」や「どのモデルを使うか」より、適切な Validation をとることだ。

    という金言があるように、データの分け方を考えることは、かなり重要です。

    とりあえずの層化抽出

    今回は、「正例」と「負例」との割合と、fold ごとに等しくする層化抽出を行います。

    1if CFG.debug:
    2    folds = train_df.sample(n=200, random_state=CFG.seed).reset_index(drop=True).copy()
    3else:
    4    folds = train_df.copy()
    5train_labels = folds[CFG.target_col].values
    6kf = StratifiedKFold(n_splits=CFG.n_fold, shuffle=True, random_state=CFG.seed)
    7for fold, (train_index, val_index) in enumerate(kf.split(folds.values, train_labels)):
    8    print("num_train,val",len(train_index),len(val_index),len(val_index)+len(train_index))
    9    print(max(train_index))
    10    folds.loc[val_index, 'fold'] = int(fold)
    11
    12folds['fold'] = folds['fold'].astype(int)
    13folds.head()

    メタデータが与えられている場合なら、他の分け方を考えても良いと思います。

    CT 画像の形式としてよくある「DICOM データ」では、患者 ID が付随している可能性が高いです。

    この場合は、「GroupKFold」を用いることが、選択肢となります。

    理由は、同じ患者の画像が別の fold に混ざることで、不当に精度が上がることを防ぐため。

    同じ患者であれば、「画像が似ている」か「同じ疾患を持っている」、という判断もできます。

    準備編へつづく!

    こちらの記事は、【準備編】へつづきます。

    featureImg2020.10.16【準備編】肺のCT画像からCOVID19かどうかの判断は可能か?【機械学習】準備編~肺のCT画像からCOVID19か予想できるのか?今回は、前回に引き続き、肺の CT 画像から、COVID 19...

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...
    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...
    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事