胸部レントゲン画像からCOVID-19を診断するAIを動かしてみた


はじめに

コロナウイルス感染症が流行しています。このページでは胸部レントゲン画像やCTからCOVID-19を判定するCOVID-Netについて紹介します。この記事ではDockerを使って動かした方法について書きます。

COVID-Net とは

胸部レントゲン画像から「正常」「肺炎」「COVID-19」の3種類を判定する分類器です。

日本語記事

Dockerを利用して動かしてみる

 多くの方にこのソフトを試してもらえるように、ruby-jpのメンバーの助けを借りて、Dockerfileを作成しました。(ほとんど作ってもらいました。)

Dockerはコンテナ仮想化のソフトです。MacでWindowsを実行するVMWare FusionParallels DesktopVirtualBoxといったソフトを想像してもらえるとよいかと思います。

Macを利用している方は公式ページからDockerをインストールします。
Windows10を使ってる場合でも、最新のWindowsアップデートを適応している場合は、Dockerがインストールできる場合もあります。

ターミナルを起動する

ターミナルを起動します。(Windowsではpowershellなど)

半角英数で

cd

と打ち込みます。cd の次に半角スペースを一つ入れます。まだRetrun(Enter)は押さないでください。

 次に、レントゲン画像を入れているディレクトリをターミナルのウィンドウにドラッグ&ドロップします。すると、たとえば下記のように表示されるはずです。(ターミナルに慣れた方は直接パスを打ち込んでもかまいません)

cd /Users/kojix2/Desktop/chest-xray

cd = change directory の意味で、レントゲン画像が入ったディレクトリに移動してください、という意味になります。Return(Enter)で実行します。終わったら

ls

と打って、Retrun(Enter)を押します。ls コマンドは、ディレクトリ内のファイルの一覧を表示します。ここでchest-image01.jpg 等レントゲン画像の名前が表示されれば成功しています。

ターミナルになれてない読者もいるかもしれませんが、以下順番にコマンドを打ち込んでいってください。

Dockerイメージのダウンロード

DockerイメージをDocker Hubからダウンロードします。

docker pull kojix2/covid-net

ダウンロードには時間がかかるので待ちましょう。

コンテナを生成して起動する

ここではカレントディレクトリを、/tmp/share にマウントします。これでコンテナから手元の画像にアクセスできるようになります。

sudo docker run -it -v $(pwd):/tmp/share kojix2/covid-net bash

起動するとTensorFlowのロゴが表示されます。

________                               _______________                
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ / 
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


WARNING: You are running this container as root, which can cause new files in
mounted volumes to be created as the root user on your host machine.

To avoid this, run the container by specifying your user's userid:

$ docker run -u $(id -u):$(id -g) args...

推論(Inference)

サンプルの胸部レントゲン画像を判定してみましょう。

assets/ex-covid.jpeg

python inference.py \
    --weightspath models/COVIDNet-CXR4-A \
    --metaname model.meta \
    --ckptname model-18540 \
    --imagepath assets/ex-covid.jpeg

次のような結果が表示されます。

Prediction: COVID-19
Confidence
Normal: 0.031, Pneumonia: 0.189, COVID-19: 0.780

正常 0.031、肺炎 0.189、COVID-19 0.780 でありCOVID-19の可能性が高いという判定結果です。

自分で用意した画像を診断するためには imagepath を書き換えます。

ここでは、Wikipediaの正常なレントゲンの画像を使います。chest.jpg という名前で保存しました。

https://en.wikipedia.org/wiki/Chest_radiograph#/media/File:Normal_posteroanterior_(PA)_chest_radiograph_(X-ray).jpg

python inference.py \
    --weightspath models/COVIDNet-CXR4-A \
    --metaname model.meta \
    --ckptname model-18540 \
    --imagepath /tmp/share/chest.jpg

結果は…

Prediction: COVID-19
Confidence
Normal: 0.000, Pneumonia: 0.000, COVID-19: 1.000

おっと、なんと 100% COVID-19であるという判定になってしまいました!

これは明らかな間違いです。

このように、このモデルの精度はあまり高くありません。私が試してみた範囲でも、かなり高い確率でCOVID-19と誤判定する傾向がありました。deep learningを利用した画像判別器が間違えることは多々あるということです。AIという言葉はときどき独り歩きしていることがありますが、画像分類器(通称AI)は単なる道具でありますから、むやみに盲信したり怖がったりする必要はありません。

重症度の推論

続いて重症度の推論です。

python inference_severity.py \
    --weightspath_geo models/COVIDNet-SEV-GEO \
    --weightspath_opc models/COVIDNet-SEV-OPC \
    --metaname model.meta \
    --ckptname model \
    --imagepath assets/ex-covid.jpeg

結果です。

Geographic severity: 0.519
Geographic extent score for right + left lung (0 - 8): 4.155
For each lung: 0 = no involvement; 1 = <25%; 2 = 25-50%; 3 = 50-75%; 4 = >75% involvement.
Opacity severity: 0.388
Opacity extent score for right + left lung (0 - 6): 2.329
For each lung: 0 = no opacity; 1 = ground glass opacity; 2 =consolidation; 3 = white-out.

判定の正確な定義はわかりませんが、involvement=浸潤、consolidation=濃い浸潤影 でしょうから、中等度に陰影が広がっているという感じでしょうか。

自前の画像を判定する場合は、imagepath を書き換えます。

python inference_severity.py \
    --weightspath_geo models/COVIDNet-SEV-GEO \
    --weightspath_opc models/COVIDNet-SEV-OPC \
    --metaname model.meta \
    --ckptname model \
    --imagepath /tmp/share/chest.jpg

先ほどのWikipediaの正常画像の重症度を判定してみましょう。

https://en.wikipedia.org/wiki/Chest_radiograph#/media/File:Normal_posteroanterior_(PA)_chest_radiograph_(X-ray).jpg

Geographic severity: 0.293
Geographic extent score for right + left lung (0 - 8): 2.341
For each lung: 0 = no involvement; 1 = <25%; 2 = 25-50%; 3 = 50-75%; 4 = >75% involvement.
Opacity severity: 0.242
Opacity extent score for right + left lung (0 - 6): 1.450
For each lung: 0 = no opacity; 1 = ground glass opacity; 2 =consolidation; 3 = white-out.

こちらは、浸潤はほとんどないか、肺スリガラス状陰影(Ground Glass Opacity) がわずかにあるという判定になったようです。COVID-19の判定は完全に誤っていましたが、重症度判定はかなり低く判定されているようです。傾向としては、大きく間違っていないかもしれません。

Dockerコンテナ・イメージの削除

Dockerイメージのサイズが2.67GBと割と巨大です。もう使わない場合や、ディスクの空き容量が気になる場合はdocker rm docker rmiで削除しておきましょう。

自分で環境をセットアップする

コンピュータやプログラミングの知識のある方、エンジニアの方は、はじめからAnaconda等を利用して、Tensorflowと必要なライブラリをインストールすればCOVID-Netは動作します。ライブラリーのバージョンに気をつけてください。

感想

 まず、大前提として、レントゲンで新型コロナウイルス感染症の症例を正確に判定するのは困難な課題です。人間にも判定できないのですから、話題の「AI」を用いればレントゲン画像からCOVID-19を判定できる、などと思ってはいけません。新型コロナウイルス感染症例のうち胸部レントゲンで異常が判明したのは14.7%に過ぎないという記事1もあります。レントゲン画像では、そもそもCOVID-19を診断できないと考えられます。

 次に、COVID-Netは臨床で利用されることを想定した製品ではないことをもう一度確認しておきたいと思います。この点はソフトウェアの作者がREADMEで強調されている通りです。

 それから、社会的な問題として、COVID-19を判定する検査の是非ついて活発に議論が行われています。検査を拡大することが、すなわち患者の救命、感染拡大の防止、医療リソースの分配について、必ずしも良好な結果に結びつくとは限らないということ、これは、今日まで特にPCR検査について、多くの有識者の方々が慎重な議論を重ねてきた通りです。この非常に難しい問題について、私は十分な見識がありませんのでコメントすることができません。しかし、精度の低い検査手段を一つ追加すればアウトプットも少し改善するだろうというような簡単ものでないということは、しっかりと心にとめておかねばならないでしょう。

 そのように、前提となる制約がいくつかありますが、そのなかで私がこのプロジェクトにふれてみて感じた点を、簡単に書こうと思います。

 最初にCOVID-Netの弱点について。COVID-Net は精度が低い、特に「感度」が高すぎると思います。(この項目は具体的にデータセットを使って検証したわけではなく、個人の印象に基づいて書かれていますので誤りがふくまれている可能性があります。ご注意ください。)インターネットで公開されている胸部X線画像を試しにいくつかCOVID-Netで読み込んでみたところ、コロナウイルスと誤判定されるケースがかなりありました。本文中でもWikipediaの正常なレントゲン画像がCOVID-19陽性と判定されています。

 もしもCOVID-19がまれな疾患であるならば、「感度」の高さは、早期診断やスクリーニングに役立つかもしれません。しかし実際には、上気道炎や肺炎はとてもありふれた症状です。
 病院には「咳嗽」「鼻水」「喀痰」「のどの痛み」といった症状の方がたくさん来院します。そのような頻度の高い症状をもつ人々の中から、新型コロナウイルス感染症を見分ける手段が求められます。COVID-Netの感度が高すぎるのであれば、コロナウイルスと無関係の上気道炎や肺炎も陽性と判定してしまいそうです。そうであれば臨床現場で役立つようになるのはかなり先になりそうです。

 一方で肺炎まで進行した症例であれば、COVID-Netも細菌性肺炎とCOVID-19由来の肺炎を判別できるかも知れません。しかし、そのような進行した肺炎では、レントゲンよりもCTが診断に有効であると考えられます。CTはドーナッツ状の装置の中に入って撮影する検査です。CTはレントゲンよりも遙かに情報量が多く、専門家がCT画像を観察すれば、高い精度でコロナウイルスの特徴ーたとえば胸膜直下に優位に分布するすりガラス陰影などーを読影することができるでしょう。このように進行したケースではCTの撮影が行われるため、レントゲン診断ソフトの活躍する領域は限定されると思われます。

 次にCOVID-Netのすばらしい点です。COVID-NetはレントゲンによるCOVID-19判定器であり、CTが使えない環境下、レントゲンのみでコロナウイルス感染症を判別しようとするセッティングで効果を発揮するように構想されています。これは多くの開業医やクリニックのセッティングに合致するもので、これは素晴らしい点だと私は思います。

 これは私の個人的な意見になりますが、現在の医療用画像診断AIの開発の大きな問題点として、大企業と大病院がその開発の中心となるために、開発者の意識が「高度医療の実現」に向かってしまい、より大きな社会的なニーズがある部分にフォーカスが当たりにくいのではないかと考えています。
 たとえば、今回の例ですと、大規模病院は必要に応じてCTやPCRを行うため、レントゲン用の診断ソフトを開発するモチベーションは発生しにくいと考えられます。その点、このプロジェクトは、実社会で役立ちそうな部分にフォーカスしており、その点が大変すばらしいと感じました。

 また、pre-trained モデルを広くインターネット公開して、深層学習用のライブラリTensorflowなどのオープンソースのソフトウェアを用いることで、誰でも自由にモデルを試すことができるということ。これは言うまでもなく、大変すばらしいことだと思います。COVID-Netは近日中にCT用のモデルも公開する予定であると書かれておりますので、そちらも注目されます。

 最後に、筆者は感染症やレントゲンの専門家ではありませんし、ましてCOVID-19の診療に実際に携わっているわけでもありません。ですので上記のコメント・感想は、あくまで一個人による、おそらくこうだろうという想像に基づく意見に過ぎない部分があります。

 たとえば「重症度の判定」をどのように評価するべきか、また現場でどのように活用するべきか、といった部分は、私の手には余ります。ですから、より多くの人にこのようなモデルを試用して頂いて、そういった部分についても考えて頂けると幸いです。

 現場で日々働いている皆さまには頭が下がる思いです。そういう方からみると、当然ながら不備のある部分や異論が多々あるかと思います。そういった場合は遠慮なくコメント欄で指摘して頂けますと幸いです。

おわりに

 コロナウイルス感染症が拡大するなか、誰もが不安を抱えながら、気をつけて過ごされていると思いす。
 COVID19は機械学習が人命救命につながる可能性をもつ特異なケースです。個人情報の保護は大事です。しかし病気になった方が臨床データを適切に提供し有効な判定ソフトが作成できるのであれば、ひょっとすると、そこから救える命もあるかも知れません。
 しかし一方で、技術の活用においては、途中の判定率を高めれば、すなわち最終的なアウトカム(救命率など)が高められるとも限らず、複雑な難しい社会的な問題が絡んできます。
 コンピュータによる画像診断は新しい技術です。このような新しい技術に触れる人が増えることで改良が促進され、いずれは患者の救命、感染拡大の防止、医療現場の作業軽減といった成果に結びつくことを強く願っています。