← Back to list

卷積神經網路 CNN 判讀肺炎 CXR 影像

川流不息的病人、處理不完的 Complaints、堆積待打的病歷,此時電話那頭護理師提醒:「醫師可以幫我看一下 X 光片嗎 🤭?」

Sigrid C. in MDBros · 2021-08-14 08:01 · 0 claps · 4.6 min read
#cnn #pneumonia #cxr #ai
Open on Medium ↗
Wiki topics: AI · AI · General

卷積神經網路 CNN 判讀肺炎 CXR 影像

無論在醫院見實習當住院醫師,還是去診所做健檢業務或一般看診,胸腔 X 光影像(CXR)就跟每天都會刷牙洗臉吃飯如影隨形(咦 🤔?),尤其從 2019 年至今已經舉世造成極大影響的 COVID 就是從肺炎起家,各科英雄好漢懷疑病人有肺部感染時,除了兔寶寶戳鼻子採檢和血單、Culture 之外,就來張 CXR 起手式吧!

川流不息的病人、處理不完的 Complaints、堆積待打的病歷,此時電話那頭護理師提醒:「醫師可以幫我看一下 X 光片嗎?」

攝影師:cottonbro,連結:Pexels

攝影師:cottonbro,連結:Pexels

當然好 🖖!不過,如果有個小幫手可以先協助我做點功課,把五花八門的可能性縮減到較窄的範圍,好讓我點開 PACS 時已經有了初步的答案,是不是聽起來不錯呢?那麼,這次就讓我們來瞧瞧如何用 CNN 來建構肺炎閱片小幫手吧 👀

我們使用的是 Kaggle 肺炎胸腔 X 光資料集,來自於 2018 年發表在 Cell 學術期刊的論文,主要使用的是已經 Label 好的兒童胸部 X 光片,5,232 張影像裡分成 1,349 張正常、2,538 張細菌性肺炎、1,345 張病毒性肺炎的影像,大家可以點進去、下載資料集來玩玩看。

Kaggle 肺炎胸腔 X 光資料集

Kaggle 肺炎胸腔 X 光資料集

多元分類資料集的準備

如果大家已經下載了資料集,開始訓練模型前,我們先來看看手邊有哪些資料可以用。它已經很貼心地分好 Train / Validation / Test 三個資料夾,而每個資料夾裡又有「Normal」、「Pneumonia(肺炎)」兩種影像,Pneumonia 裡又根據檔名的註記,分為 Bacteria(細菌)與 Virus(病毒)兩個類別。

看完了資料長相,怎麼準備資料集呢?我們先來設定基本參數,如圖片大小固定成每張都是 200x200 再送給 Model、定義好 3 個類別(正常、細菌性、病毒性,當然也可以只分成正常和肺炎的二元分類),接著把圖片讀進來、以 for Loop 用路徑 Split 的方式指定每張圖片對應的分類。

[embed]

不過我們現在 y 裡裝的只有最開始 class_map 的 0, 1, 2,要做 one-hot encoding 轉為長度 = 3(分幾類決定了長度)的向量,用 keras 的 utils 中to_categorical 這個 Function。

[embed]

建構模型

準備好資料以後,就來建模吧!要特別注意,餵給模型的 Data Input Size,形狀必須跟我們原本資料集 x_train, x_val, x_test 一樣才行。以下面這個模型為例,前兩層的卷積我們使用 64 個 Filters、Kernel Size 是 3x3、Activation Function 用 Relu,接著加上 1 層 MaxPooling…重複再用 2 層分別有 128、256、512 個 Filters 的卷積加上 1 層 MaxPooling,最後把 Feature Maps 的特徵向量攤平 Flatten、接上 1 層 Dense Layer,分成 3 類、以 softmax 輸出模型結果。

[embed]

訓練模型

建模後,我們設定讓模型計算 Loss、優化超參數、衡量結果的指標,用分類的損失函數 categorical_crossentropy、Optimizer 用預設的 SGD(Stochastic Gradient Descent)、計算模型的 Accuracy,再設定 Batch Size、Epochs 的數量。

[embed]

跑完之後,我們找出訓練歷程中 Validation Loss 最低是多少、對應的 Accuracy 有多高,再把 Training(藍色線)、Validation 隨著 50 個 Epochs 的 Iterations,Accuracy 和 Loss 的變化是多少;通常 Training 的 Loss 會比較低。

[embed]

Accuracy 隨著 Iteration 的變化

Accuracy 隨著 Iteration 的變化

Loss 隨著 Iteration 的變化

Loss 隨著 Iteration 的變化

衡量模型的其他 Metrics

sklearn 有提供分類任務裡常用的 classification_report、Confusion Matrix,我們用模型沒看過的資料(x_test),讓模型預測每一筆資料的機率值,再透過 argmax 看哪一個類別有最大的機率(y_pred),去跟 Ground Truth(y_true)來評估成果如何。像我們總體的 Accuracy 只有 0.6,第 0 類表現最好(0.73)、第 1 類表現最糟(0.41)。

[embed]

這次小幫手看他沒看過的 CXR 結果的分類報告

這次小幫手看他沒看過的 CXR 結果的分類報告

希望這次的分享大家覺得有意思,下次再讓我們繼續看看 AI 遇上臨床工作人員,有什麼令人怦然心動的火花吧 🌹

CC


메타데이터
post_id
447df99596d2
slug
卷積神經網路-cnn-判讀肺炎-cxr-影像-447df99596d2
url
https://medium.com/mdbros/%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-cnn-%E5%88%A4%E8%AE%80%E8%82%BA%E7%82%8E-cxr-%E5%BD%B1%E5%83%8F-447df99596d2
canonical_url
https://medium.com/mdbros/%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-cnn-%E5%88%A4%E8%AE%80%E8%82%BA%E7%82%8E-cxr-%E5%BD%B1%E5%83%8F-447df99596d2
author_url
https://medium.com/@sigridcw
status
ok
fetched_at
2026-07-28 02:01:45