前一陣子工作上在 Survey 的東西,想了解深度學習在醫療影像上目前的近況、模型訓練的難易度和應用場景…等。最後挑選了吳恩達的團隊所設計的 CheXNet 來入手。
AI 醫療影像
所謂的醫療影像一直是窺視人體內部結構與組成的主要方法,常見的拍攝方式包括 X 光攝影、超音波影像、電腦斷層掃描(CT)、核磁共振造影(MRI)和心血管造影…等等。
不同的拍攝技術會決定影像性質、維度與張數多寡,這些因素也會直接影響深度學習的模型建立與應用場景。
X 光判讀(圖片來源: 社企流)
舉例來說,X 光是利用組織間對輻射吸收能力不同來成像,其吸收能力與密度呈正比,並將原本三維的空間關係疊壓在二維平面上成像。因此,涵蓋的資訊較為龐雜,且病灶可能會被組織或器官給遮擋。反之,電腦斷層可以用三維重建技術計算恢復人體的斷層面影像。
但電腦斷層影像的單筆資料較大,會造成訓練上的困難,且電腦斷層並非常規檢查,整體資料量也較少。反之,X 光是初階檢查因此容易累積出大量資料,滿足訓練的先決條件。兩者各有利弊,需視訓練目標來挑選資料。
一般來說,深度學習在醫療影像應用上,較適合需要透過影像判別腫瘤位置、偵測骨頭裂縫線條…等單純且單一的識別工作。之後再將識別結果交由醫師,醫師可進一步參考臨床資訊進行最終的診斷。
在現階段過程中,對於 AI 系統定位仍僅止於助手或是診療工具,醫師必須知曉工具的能力與限制,最後的決策仍以醫師為主。就實務層面來說,這也是最不涉及醫生利益,與診斷所產生的醫療糾紛的定位。
此外,AI 在醫學影像領域中,另一個需要克服的困難是資料部分,雖然各大醫療院所在長年累月下累積了大量的醫學影像,但這些影像的儲存方式並非為 AI 應用而設計,且再考慮到不同廠商、機器之間可能會儲存方式的差異,因此必須要進一步整理與提取成可供深度學習使用的資料。
此外還有標注的部分,不論是採用半監督式或是監督式學習都需要進行資料的標注,但請專業人員進行標注不僅成本昂貴,且相當費時,因此如何得到高品質的訓練資料將是訓練過程中的一大挑戰。
ChestX-ray14
說到資料集,在來看吳恩達的 CheXNet 之前,先來看看它所使用的資料集—ChestX-ray14。
資料集簡介
為目前最大規模的肺部 X 光資料集,由 NIH 美國國立衛生研究院所提供(載點)。
ChestX-ray 資料集包含 30 萬名病人與 10 萬張胸部前視圖 X 光影像(約 42G),研究人員對數據採用 NLP 方法從病例報告中提取關鍵字對影像進行標注,1-14 類分別對應 14 種肺部疾病,第 15 類表示未發現疾病。據稱,該數據庫使用 NLP 標注準確率超過 90%。
資料集內容
14 種肺部疾病包含:Atelectasis、Hernia、Cardiomegaly、Infiltration、Consolidation、Mass、Edema、Nodule、Effusion、Pleural_Thickening、Emphysema、Pneumonia、Fibrosis、Pneumothorax。
中文翻譯對照分別為:肺陷落 / 肺不張、疝氣 / 脫腸、心臟肥大、滲透、實變、腫塊、浮腫 / 水腫、結節、滲出、胸膜增厚、氣腫 / 肺氣腫、肺炎、纖維化、氣胸。
先前提過資料集中約有 10 萬張胸部前視圖 X 光影像,每張圖片大小為 1024 * 1024、格式為 PNG,下圖隨機展示些 ChestX-ray14 中的 X 光影像,並搭配額外的標注框,以顯示病灶所在。
ChestX-ray14圖片 + Box 標注(圖片來源: ChestX-ray14)
好吧,說實話就算把病灶框給我,我也看不出差異在哪裡 orz
另外雖說有 10 萬張胸部前視圖 X 光影像,但只有約 1000 張影像有標注框而已,所以這部分資訊,可能只能來當 test set 確認模型的效能,無法用來參與訓練。
再來看看影像的標記,會發現這是一個 Multilabel Classification,每張影像都會被標注上一或多種疾病。
在印出各個類別的資料個數,會發現除了疾病與疾病間極度不平衡外,如:滲透的影像有近兩萬張,但疝氣只有兩百多張;患病與未患病之間的影響也頗為懸殊,大約是 6 : 4。
Pathology | Total | Pathology | Total | ||||
---|---|---|---|---|---|---|---|
Atelectasis | 肺陷落 / 肺不張 | 11559 | 10.31% | Hernia | 疝氣 / 脫腸 | 227 | 0.20% |
Cardiomegaly | 心臟肥大 | 2776 | 2.48% | Infiltration | 滲透 | 19894 | 17.74% |
Consolidation | 實變 | 4667 | 4.16% | Mass | 腫塊 | 5782 | 5.16% |
Edema | 浮腫 / 水腫 | 2303 | 2.05% | Nodule | 結節 | 6331 | 5.65% |
Effusion | 滲出 | 13317 | 11.88% | Pleural_Thickening | 胸膜增厚 | 3385 | 3.02% |
Emphysema | 氣腫 / 肺氣腫 | 2516 | 2.24% | Pneumonia | 肺炎 | 1431 | 1.28% |
Fibrosis | 纖維化 | 1686 | 1.50% | Pneumothorax | 氣胸 | 5302 | 4.73% |
No Finding | 未患病 | 60361 | 53.84% |
P.S. 這數據因為我刪除過些影像,所以數字可能有出入,但概觀比例應該不受影響。
這樣的不平衡,預期會對訓練過程中造成一些影響。
資料集問題
除去資料不平衡外,資料集中還包含部分質量很差的影像,並不建議用於訓練。這部分 Azure 有列出一些黑名單,可以參考這些名單將不適用的影像加以排除。
但這份資料集最引人討論的並非影像本身,而是它的標籤。有位放射科醫生 Luke Oakden-Rayner (盧克·奧克登·雷納),這位醫生也曾在 2017 年 5 月的 Nature 上發表關於利用深度學習技術預測人類壽命的相關研究,是一名同時熟悉深度學習與醫療影像的研究者。
纖維化標記錯誤,紅色=明顯錯誤的標籤;橙色=懷疑態度(圖片來源: Luke Oakden-Rayner 網誌)
在他所提出的質疑中,他開宗明義講到:「我認為目前的 ChestXray14 資料集並不適合用於訓練醫用 AI 系統以進行診斷工作」。
他認為與人類醫生的視覺評估相比,這份資料集中的標籤準確度值得商榷,其標注並不準確或不清楚,且部分標籤屬於醫學上的次要發現,因此認為,無法匹配影像中顯示的疾病,並對這些標籤在臨床上的真實意義與實用性進行討論。
但,針對使用 NLP 挖掘疾病標籤的功效以及導致不良標籤質量的討論,Azure 倒是認為,即使標籤很髒,深度學習模型有時仍能夠學到良好的分類性能。
Google 裁決標籤
除了直接使用 ChestX-ray 的標籤進行訓練,有些財大氣粗的研究單位,會結合公開 ChestX-ray 與其他資料集,進行重新標注與 review。
像是 Google 用來診斷胸部 X 光片的最新研究,他們不僅引入美國國立衛生研究院的 ChestX-ray14 資料集,還取得自阿波羅醫院的胸部 X 光片,兩資料集總共約 60 萬張圖片。重新標注成 4 個重要的臨床病徵分類,分別是氣胸、結節和腫塊、骨折以及氣腔陰影。
不過雖說重新標注,但由於整體數量過於龐大,還是無法全由人工手動為影像上標籤,必須借助 NLP 擷取關鍵字為影像添加標籤,最後再藉由放射科醫生人工檢視約 37,000 張圖片,以提高資料集標籤的品質。
會特別提到這件事的原因是,Google 有對社群開放 ChestX-ray14 資料集中所有裁決標籤,以幫助社群對胸部 X 光片進行研究。
但數量比不上原先的資料集大小,僅包含 2,412 張圖像的訓練與驗證資料集,還有 1,962 張圖像的測試集,且與原先的資料集一樣存在資料傾斜的現象需要克服。
Pathology | train | test |
---|---|---|
Fracture | 114 | 72 |
Pneumothorax | 43 | 195 |
Airspace opacity | 1031 | 1135 |
Nodule or mass | 310 | 295 |
CheXNet
網路輸入為人體正面掃描的胸片,輸入時患肺炎的機率,為了更好的可視化,使用了熱力圖。
回到一開始的的目標 - CheXNet,這是吳恩達的研究團隊在 2017 年所提出的技術,能從胸部透視圖偵測肺炎,號稱水準超越專業放射科醫生(?)。
該網路在目前最大的開放式胸部透視圖資料庫 ChestX-ray14 訓練。也就是上一節所 Survey 的內容。
網路架構
CheXNet(圖片來源: Dosudo矽谷工程師 deep learning newsletter)
ChexNet 是 121 層的 CNN 網路,用的是 DenseNet、輸入是胸部正面 X 光片、而輸出是每個類別從 0~1 的肺炎機率,是一個 Multi-task Classification。
網路的訓練過程中,會將由 ChestX-ray14 的影像大小由 1024 x 1024 調整為 224 x 224,同時根據在 ImageNet 中圖片的均值和偏差進行正規化,並使用了隨機水平傾斜來做數據增強。
訓練時使用 Adam 作為 optimizer,並採用 binary cross entropy loss (BCELoss) 當 loss function。 最後替將 DenseNet 最後一層的 fully connected layer 加上 sigmoid 輸出各疾病機率。
最後的輸出除了各疾病機率外,為判斷學習成果並擁有更好的可視化效果,可使用了熱力圖(Class activation mapping),取得網路的分類關注區域。
實作
想要按照論文重新製作一個相同的模型還算簡單,因為大部分的框架都有提供現成 DenseNet 可供 import,只需要將最後一層改成所要輸出的類別數即可,以 pytroch 時作為例:
1 |
|
不過如果是自己刻模型,還必須自己重新訓練模型,對於我這個只是想看看成果的人來說有點費時,所以我這邊用了人家已經訓練完成模型 - PyTorch ChexNet(master / torch.1.1.0)
還找到如何 Azure 在架構 ChexNet 的手把手教學 XD
根據 ptrtoch 版本的 ChexNet 實做,要達到與論文的相同的效能大約需要:
結果
可以看到兩份實做都是以 AUROC(或稱 ROC-AUC)作為評價模型效能的指標,推測應該是為了克服資料不平衡而採用,兩份實做的數據如下:
Pathology | PyTorch AUROC | Azure AUC Score |
---|---|---|
Atelectasis | 0.8321 | 0.828543 |
Cardiomegaly | 0.9107 | 0.891449 |
Effusion | 0.8860 | 0.817697 |
Infiltration | 0.7145 | 0.907302 |
Mass | 0.8653 | 0.895815 |
Nodule | 0.8037 | 0.907841 |
Pneumonia | 0.7655 | 0.817601 |
Pneumothorax | 0.8857 | 0.881838 |
Consolidation | 0.8157 | 0.721818 |
Edema | 0.9017 | 0.868002 |
Emphysema | 0.9422 | 0.787202 |
Fibrosis | 0.8523 | 0.826822 |
P.T. | 0.7948 | 0.793416 |
Hernia | 0.9416 | 0.889089 |
可以看到所得的分數相當的漂亮,大約座落在 0.866 ,用此數據畫出來的 ROC 曲線也很”標準” XD
ROC 曲線
不過當我是用這組曲線去反推適合的門檻值時,發現門檻值似乎有點低?
Pathology | best_threshold |
---|---|
Atelectasis | 0.12584402 |
Cardiomegaly | 0.033162296 |
Effusion | 0.16826268 |
Infiltration | 0.18238032 |
Mass | 0.072381005 |
Nodule | 0.07161161 |
Pneumonia | 0.017619494 |
Pneumothorax | 0.0711597 |
Consolidation | 0.0655834 |
Edema | 0.039323617 |
Emphysema | 0.039765418 |
Fibrosis | 0.022241825 |
Pleural_Thickening | 0.04171453 |
Hernia | 0.0019557325 |
此外,我還印出 Precision Mean 與 Recall Mean,分數只有 0.696 與 0.242,這樣的分數感覺不太符合我預期的說…
最後來看看預測結果與熱力圖的效果:
由左而右分別是原始圖、熱力圖和標注框
隨機選了三組結果,剛好最對應到了三種 case:
- 最上面一組圖預測結果是錯的,由熱力圖看來關注點完全不對。
- 第二個預測結果是對的,熱力圖的關注點是有點偏,但算是有擦到邊,勉強可以算是有學到?
- 第三組圖,算是最完美的 case 了,預測對,熱力圖的關注點也與標注框吻合。
小結
整體來說,網路架構並沒有的創新,使用的是先前的研究,或許有時間再來複習一次 DenseNet 的論文。
另外論文中的這句提到對於放射科醫生來說,不知道病人先前的病史對於判斷正確有幫助,我還滿驚訝的,照理來說不是資料越多越好?
參考資料
- 【AI浪潮席捲醫療業】透視5大類醫療影像辨識的AI應用場景|iThome
- 智慧判讀醫療影像 AI將成醫師最強助手|DIGITIMES 智慧應用
- 【Research】Explore ChestX-ray Dataset|L简书
- 【3万患者11万图像14类病理】NIH公开大规模胸部X光数据集|云栖社区-阿里云
- Multi-class, Multi-label 以及 Multi-task 问题|金良山庄-CSDN博客
- Exploring the ChestXray14 dataset: problems|Luke Oakden-Rayner
- 机器之心报道:吴恩达的最新研究是否严谨?Nature论文作者撰文质疑AI医疗影像研究现状|虎嗅网
- 醫療影像AI的「九九八十一難」?|獨家深度 - 每日頭條
- Google訓練深度學習模型判讀多種肺部X光片病徵|iThome
- Google AI Blog: Developing Deep Learning Models for Chest X-rays with Adjudicated Image Labels
- 吳恩達團隊最新醫學影像成果:肺炎診斷準確率創新高|TechNews 科技新報
- 【论文阅读笔记】CheXNet: Radiologist-Level Pneumonia Detection on Chest X-Rays with Deep Learning|寸先生的AI道路
- CheXNet : 超越專業放射科醫生的肺部Xray醫學影像判讀技術|LDosudo矽谷工程師 deep learning newsletter