--- title:【Survey】CheXNet: 肺部 X-Ray 醫學影像判讀技術 date: 2020-01-21 is_modified: false disqus: cynthiahackmd categories: - "智慧計算 › 人工智慧" tags: - "AI/ML" - "電腦視覺 CV" - "醫學影像" - "X-Rays" --- {%hackmd @CynthiaChuang/Github-Page-Theme %} <br> 前一陣子工作上在 Survey 的東西,想了解深度學習在醫療影像上目前的近況、模型訓練的難易度和應用場景...等。 最後挑選了吳恩達的團隊所設計的 [CheXNet](https://arxiv.org/abs/1711.05225) 來入手。 <!--more--> ## AI 醫療影像 所謂的==醫療影像==一直是窺視人體內部結構與組成的主要方法,常見的拍攝方式包括 X 光攝影、超音波影像、電腦斷層掃描(CT)、核磁共振造影(MRI)和心血管造影...等等。 不同的拍攝技術會決定影像性質、維度與張數多寡,這些因素也會直接影響深度學習的模型建立與應用場景。 <p class="illustration"> <img src="https://i.imgur.com/ruIHb7k.png" alt="X 光判讀"> X 光判讀(圖片來源: <a href="https://www.seinsights.asia/article/3289/3270/6005">社企流</a>) </p> 舉例來說,X 光是利用組織間對輻射吸收能力不同來成像,其吸收能力與密度呈正比,並將原本三維的空間關係疊壓在二維平面上成像。因此,涵蓋的資訊較為龐雜,且病灶可能會被組織或器官給遮擋。反之,電腦斷層可以用三維重建技術計算恢復物體人體的斷層面影像。 但電腦斷層影像的單筆資料較大,會造成訓練上的困難,且電腦斷層並非常規檢查,整體資料量也較少。反之,X 光是初階檢查因此容易累積出大量資料,滿足訓練的先決條件。兩者各有利弊,需視訓練目標來挑選資料。 <br> 一般來說,深度學習在醫療影像應用上,較適合需要透過影像判別腫瘤位置、偵測骨頭裂縫線條...等單純且單一的識別工作。之後再將識別結果交由醫師,醫師可進一步參考臨床資訊進行最終的診斷。 在現階段過程中,對於 AI 系統定位仍僅止於助手或是診療工具,醫師必須知曉工具的能力與限制,最後的決策仍以醫師為主。就實務層面來說,這也是最不涉及醫生利益,與診斷所產生的醫療糾紛的定位。 <br> 此外,AI 在醫學影像領域中,另一個需要克服的困難是資料部份,雖然各大醫療院所在長年累月下累積了大量的醫學影像,但這些影像的儲存方式並非為 AI 應用而設計,且再考慮到不同廠商、機器之間可能會儲存方式的差異,因此必須要進一步整理與提取成可供深度學習使用的資料。 此外還有標注的部份,不論是採用半監督式或是監督式學習都需要進行資料的標注,但請專業人員進行標注不僅成本昂貴,且相當費時,因此如何得到高品質的訓練資料將是訓練過程中的一大挑戰。 ## ChestX-ray14 說到資料集,在來看吳恩達的 CheXNet 之前,先來看看它所使用的資料集—ChestX-ray14。 ### 資料集簡介 為目前最大規模的肺部 X 光資料集,由 [NIH 美國國立衛生研究院](https://www.nih.gov/news-events/news-releases/nih-clinical-center-provides-one-largest-publicly-available-chest-x-ray-datasets-scientific-community)所提供([載點](https://nihcc.app.box.com/v/ChestXray-NIHCC))。 ChestX-ray 資料集包含 30 萬名病人與 10 萬張胸部前視圖 X 光影像(約 42G),研究人員對數據採用 NLP 方法從病例報告中提取關鍵字對影像進行標注,1-14 類分別對應 14 種肺部疾病,第 15 類表示未發現疾病。據稱,該數據庫使用 NLP 標注準確率超過 90%。 <br> :::info 關於資料標注的相關研究,請參考 [X. Wang, Y. Peng, L. Lu, Z. Lu, M. Bagheri, and R.M. Summers. ChestX-ray8: Hospital-scale Chest X-ray Database and Benchmarks on Weakly-Supervised Classification and Localization of Common Thorax Diseases. 2017 ](https://arxiv.org/abs/1705.02315)。ChestX-ray14 Data 的描述,請看論文的附件 B 。 ::: ### 資料集內容 14 種肺部疾病包含:Atelectasis、Hernia、Cardiomegaly、Infiltration、Consolidation、Mass、Edema、Nodule、Effusion、Pleural_Thickening、Emphysema、Pneumonia、Fibrosis、Pneumothorax。 中文翻譯對照分別為:肺陷落 / 肺不張、疝氣 / 脫腸、心臟肥大、滲透、實變、腫塊、浮腫 / 水腫、結節、滲出、胸膜增厚、氣腫 / 肺氣腫、肺炎、纖維化、氣胸。 <br> 先前提過資料集中約有 10 萬張胸部前視圖 X 光影像,每張圖片大小為 1024 * 1024、格式為 PNG,下圖隨機展示些 ChestX-ray14 中的 X 光影像,並搭配額外的標注框,以顯示病灶所在。 <p class="illustration"> <img src="https://i.imgur.com/CZ53CBj.png" alt="ChestX-ray14"> ChestX-ray14圖片 + Box 標注(圖片來源: <a href="https://arxiv.org/abs/1705.02315">ChestX-ray14</a>) </p> 好吧,說實話就算把病灶框給我,我也看不出差異在哪裡 orz 另外雖說有 10 萬張胸部前視圖 X 光影像,但只有約 1000 張影像有標注框而已,所以這部份資訊,可能只能來當 test set 確認模型的效能,無法用來參與訓練。 <br> 再來看看影像的標記,會發現這是一個 Multilabel Classification,每張影像都會被標注上一或多種疾病。 在印出各個類別的資料個數,會發現除了疾病與疾病間極度不平衡外,如:滲透的影像有近兩萬張,但疝氣只有兩百多張;患病與未患病之間的影響也頗為懸殊,大約是 6 : 4。 <br> | 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. 這數據因為我刪除過些影像,所以數字可能有出入,但概觀比例應該不受影響。 <br> 這樣的不平衡,預期會對訓練過程中造成一些影響。 ### 資料集問題 除去資料不平衡外,資料集中還包含部份質量很差的影像,並不建議用於訓練。這部份 Azure 有列出一些[黑名單](https://github.com/Azure/AzureChestXRay/tree/master/AzureChestXRay_AMLWB/Code/src/finding_lungs),可以參考這些名單將不適用的影像加以排除。 <br> 但這份資料集最引人討論的並非影像本身,而是它的==標籤==。有位放射科醫生 Luke Oakden-Rayner (盧克·奧克登·雷納),這位醫生也曾在 2017 年 5 月的 Nature 上發表關於[利用深度學習技術預測人類壽命的相關研究](https://www.nature.com/articles/s41598-017-01931-W),是一名同時熟悉深度學習與醫療影像的研究者。 <p class="illustration"> <img src="https://i.imgur.com/GFQFd3T.png" alt="纖維化(Fibrosis)"> 纖維化標記錯誤,紅色=明顯錯誤的標籤;橙色=懷疑態度(圖片來源: <a href="https://lukeoakdenrayner.wordpress.com/2017/12/18/the-chestxray14-dataset-problems/?fbclid=IwAR0oc-Zwz4EOPyp_rDvs8i__6ODgjWNqv-LHJ2B0t5KZiEIkwmF_o3hcUsU">Luke Oakden-Rayner 網誌</a>) </p> 在他所提出的[質疑](https://lukeoakdenrayner.wordpress.com/2017/12/18/the-chestxray14-dataset-problems/?fbclid=IwAR0oc-Zwz4EOPyp_rDvs8i__6ODgjWNqv-LHJ2B0t5KZiEIkwmF_o3hcUsU)中,他開宗明義講到:「我認為目前的 ChestXray14 資料集並==不適合==用於訓練醫用 AI 系統以進行診斷工作」。 他認為與人類醫生的視覺評估相比,這份資料集中的標籤準確度值得商榷,其標注並不準確或不清楚,且部分標籤屬於醫學上的次要發現,因此認為,無法匹配影像中顯示的疾病,並對這些標籤在臨床上的真實意義與實用性進行討論。 <br> 但,針對使用 NLP 挖掘疾病標籤的功效以及導致不良標籤質量的討論,Azure 倒是[認為](https://github.com/Azure/AzureChestXRay#criticisms),即使標籤很髒,深度學習模型有時仍能夠學到良好的分類性能。 ### Google 裁決標籤 除了直接使用 ChestX-ray 的標籤進行訓練,有些~~財大氣粗~~的研究單位,會結合公開 ChestX-ray 與其他資料集,進行重新標注與 review。 像是 Google 用來[診斷胸部 X 光片的最新研究](https://ai.googleblog.com/2019/12/developing-deep-learning-models-for.html),他們不僅引入美國國立衛生研究院的 ChestX-ray14 資料集,還取得自阿波羅醫院的胸部 X 光片,兩資料集總共約60萬張圖片。重新標注成 4 個重要的臨床病徵分類,分別是氣胸、結節和腫塊、骨折以及氣腔陰影。 不過雖說重新標注,但由於整體數量過於龐大,還是無法全由人工手動為影像上標籤,必須借助 NLP 擷取關鍵字為影像添加標籤,最後再藉由放射科醫生人工檢視約 37,000 張圖片,以提高資料集標籤的品質。 會特別提到這件事的原因是,Google 有對社群[開放](https://console.cloud.google.com/storage/browser/gcs-public-data--healthcare-nih-chest-xray-labels/) ChestX-ray14 資料集中所有裁決標籤,以幫助社群對胸部 X 光片進行研究。 但數量比不上原先的資料集大小,僅包含 2,412 張圖像的訓練與驗證資料集,還有 1,962 張圖像的測試集,且與原先的資料集一樣存在==資料傾斜==的現象需要克服。 <br> | Pathology | train | test | | ---------- | ----------|---------- | |Fracture | 114 |72| |Pneumothorax|43|195| |Airspace opacity|1031|1135| |Nodule or mass|310|295 ## CheXNet <p class="illustration"> <img src="https://i.imgur.com/vZxoroP.png"> 網路輸入為人體正面掃描的胸片,輸入時患肺炎的機率,為了更好的可視化,使用了熱力圖。 </p> 回到一開始的的目標 - CheXNet,這是吳恩達的研究團隊在 2017 年所提出的技術,能從胸部透視圖偵測肺炎,號稱水準超越專業放射科醫生(?)。 該網路在目前最大的開放式胸部透視圖資料庫 ChestX-ray14 訓練。也就是上一節所 Survey 的內容。 ### 網路架構 <p class="illustration"> <img src="https://i.imgur.com/PxR7kqH.png" alt="CheXNet"> CheXNet(圖片來源: <a href="https://dosudodl.wordpress.com/2017/11/17/chexnet-%E8%B6%85%E8%B6%8A%E5%B0%88%E6%A5%AD%E6%94%BE%E5%B0%84%E7%A7%91%E9%86%AB%E7%94%9F%E7%9A%84%E8%82%BA%E9%83%A8xray%E9%86%AB%E5%AD%B8%E5%BD%B1%E5%83%8F%E5%88%A4%E8%AE%80%E6%8A%80%E8%A1%93/">Dosudo矽谷工程師 deep learning newsletter</a>) </p> 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 時作為例: ```python= import torch.nn as nn import torchvision class DenseNet121(nn.Module): def __init__(self, classCount, isTrained): super(DenseNet121, self).__init__() self.densenet121 = torchvision.models.densenet121(pretrained=isTrained) kernelCount = self.densenet121.classifier.in_features self.densenet121.classifier = nn.Sequential(nn.Linear(kernelCount, classCount), nn.Sigmoid()) def forward(self, x): x = self.densenet121(x) return x ``` <br> 不過如果是自己刻模型,還必須自己重新訓練模型,對於我這個只是想看看成果的人來說有點費時,所以我這邊用了人家已經訓練完成模型 - PyTorch ChexNet([master](https://github.com/zoogzog/chexnet) / [torch.1.1.0](https://github.com/dgrechka/chexnet/tree/torch.1.1.0)) 還找到如何 Azure 在架構 ChexNet 的[手把手教學](https://github.com/Azure/AzureChestXRay) XD <br> 根據 ptrtoch 版本的 ChexNet 實做,要達到與論文的相同的效能大約需要: :::info The training was done using single Tesla P100 GPU and took approximately 22h. ::: ### 結果 可以看到兩份實做都是以 AUROC(或稱 [ROC-AUC](/Es5Mfu8SQuOxPnI-Sj7HXw#ROC-AUC-(Area-Under-Curve)))作為評價模型效能的指標,推測應該是為了克服資料不平衡而採用,兩份實做的數據如下: | 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| <br> 可以看到所得的分數相當的漂亮,大約座落在 0.866 ,用此數據畫出來的 ROC 曲線也很"標準" XD <p class="illustration"> <img src="https://i.imgur.com/2Lw1L70.png" alt="ROC 曲線"> ROC 曲線 </p> 不過當我是用這組曲線去反推適合的門檻值時,發現門檻值似乎有點低? | 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| <br> 此外,我還印出 Precision Mean 與 Recall Mean,分數只有 0.696 與 0.242,這樣的分數感覺不太符合我預期的說... <br> 最後來看看預測結果與熱力圖的效果: <p class="illustration"> <img src="https://i.imgur.com/kQ2SSuA.png" alt="熱力圖"> 由左而右分別是原始圖、熱力圖和標注框 </p> 隨機選了三組結果,剛好最對應到了三種 case: 1. 最上面一組圖預測結果是錯的,由熱力圖看來關注點完全不對。 2. 第二個預測結果是對的,熱力圖的關注點是有點偏,但算是有擦到邊,勉強可以算是有學到? 3. 第三組圖,算是最完美的 case 了,預測對,熱力圖的關注點也與標注框吻合。 ## 小結 整體來說,網路架構並沒有的創新,使用的是先前的研究,或許有時間再來複習一次 DenseNet 的[論文](https://arxiv.org/abs/1608.06993)。 另外論文中的這句提到==對於放射科醫生來說,不知道病人先前的病史對於判斷正確有幫助==,我還滿驚訝的,照理來說不是資料越多越好? ## 參考資料 1. [【AI浪潮席捲醫療業】透視5大類醫療影像辨識的AI應用場景|iThome](https://www.ithome.com.tw/news/129973) 2. [智慧判讀醫療影像 AI將成醫師最強助手|DIGITIMES 智慧應用](https://www.digitimes.com.tw/iot/article.asp?cat=158&id=0000568416_WGI3445R2PT5R15ZCDZ5W) 3. [【Research】Explore ChestX-ray Dataset|L简书](https://www.jianshu.com/p/617f0d30c8d2) 4. [【3万患者11万图像14类病理】NIH公开大规模胸部X光数据集|云栖社区-阿里云](https://yq.aliyun.com/articles/222235) 5. [Multi-class, Multi-label 以及 Multi-task 问题|金良山庄-CSDN博客](https://blog.csdn.net/golden1314521/article/details/51251252) 6. [Exploring the ChestXray14 dataset: problems|Luke Oakden-Rayner](https://lukeoakdenrayner.wordpress.com/2017/12/18/the-chestxray14-dataset-problems/?fbclid=IwAR0oc-Zwz4EOPyp_rDvs8i__6ODgjWNqv-LHJ2B0t5KZiEIkwmF_o3hcUsU) 7. [机器之心报道:吴恩达的最新研究是否严谨?Nature论文作者撰文质疑AI医疗影像研究现状|虎嗅网](https://www.huxiu.com/article/226463.html) 8. [醫療影像AI的「九九八十一難」?|獨家深度 - 每日頭條](https://kknews.cc/zh-tw/tech/gzjx8gl.html) 9. [Google訓練深度學習模型判讀多種肺部X光片病徵|iThome](https://www.ithome.com.tw/news/134637?fbclid=IwAR2bRVnEGGW07MYUms4T-WwTpQKhUCt78FoBjEu0QZK0M6lgl1MuSOfgC0c) 10. [Google AI Blog: Developing Deep Learning Models for Chest X-rays with Adjudicated Image Labels](https://ai.googleblog.com/2019/12/developing-deep-learning-models-for.html) 11. [吳恩達團隊最新醫學影像成果:肺炎診斷準確率創新高|TechNews 科技新報](https://technews.tw/2017/11/17/chexnet-radiologist-level-pneumonia-detection-on-chest-x-rays-with-deep-learning/) 12. [【论文阅读笔记】CheXNet: Radiologist-Level Pneumonia Detection on Chest X-Rays with Deep Learning|寸先生的AI道路](https://blog.csdn.net/cskywit/article/details/79141831/) 13. [CheXNet : 超越專業放射科醫生的肺部Xray醫學影像判讀技術|LDosudo矽谷工程師 deep learning newsletter](https://dosudodl.wordpress.com/2017/11/17/chexnet-%E8%B6%85%E8%B6%8A%E5%B0%88%E6%A5%AD%E6%94%BE%E5%B0%84%E7%A7%91%E9%86%AB%E7%94%9F%E7%9A%84%E8%82%BA%E9%83%A8xray%E9%86%AB%E5%AD%B8%E5%BD%B1%E5%83%8F%E5%88%A4%E8%AE%80%E6%8A%80%E8%A1%93/) {%hackmd @CynthiaChuang/Github-Page-Footer %}