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

    メディアチームメディアチーム
    2020.10.14

    IT技術

    【前処理編】肺のCT画像からCOVID19かどうかの判断は可能か?

    前処理編~肺の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ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background