【前処理編】肺のCT画像からCOVID19かどうかの判断は可能か?【機械学習】
IT技術
前処理編~肺のCT画像からCOVID19か予想できるのか?
今回は、肺の 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」です。
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枚の画像が似ていないことは、明らかですね。
また、画像のサイズも、均一ではなさそうです。
この差をなくすために、前処理が一般的に必要とされていますが、今回はお試しなので割愛します。
ちなみに 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 に混ざることで、不当に精度が上がることを防ぐため。
同じ患者であれば、「画像が似ている」か「同じ疾患を持っている」、という判断もできます。
準備編へつづく!
こちらの記事は、【準備編】へつづきます。
こちらの記事もオススメ!
2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...
2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit
おすすめ記事
immichを知ってほしい
2024.10.31