如何用深度學習進行CT影像肺結節探測

如何用深度學習進行CT影像肺結節探測

近期宜遠智能參加阿里天池醫療AI大賽,用3D Faster RCNN模型在CT影像的肺結節探測上,取得了較好的成績,特別是在計算資源充足的情況下,模型效果表現優異。這是他們的經驗分享(https://tianchi.aliyun.com/competition/new_articleDetail.html?raceId=231601&postsId=2898&from=part ),末尾還附有代碼開源地址。

1.數據預處理

首先用SimpleITK把mhd圖片讀入,對每個切片使用Gaussian filter然後使用閾值-600把肺部圖片二值化,然後再分析該切片的面積,去掉面積小於30mm2的區域和離心率大於0.99的區域,找到3D的連通區域。

只保留0.68L到8.2L體積的區域,並且如果大於6000 mm2的區域到切片的中心區域的距離大於62mm也刪除該連通區。最後只留下一個最大的連通區域。

左邊是原始圖,右邊是切完肺的。

如何用深度學習進行CT影像肺結節探測

在實際中預處理中,我們可視化了每個肺的部分切片,存在一些bad case。主要有以下3種,我們也對這3種情況做了優化:

  1. 把肺邊緣結節切掉。因為閾值導致的,把二值化環境-600改成-150有改善。

  2. 切出來全部為黑的(未找到任何肺部區域)。有些ct圖是從頭部開始掃描的,導致影響了連通區域判斷,需要手動查看該mhd文件,看裡面的從第個切片到第幾個切片是肺部,在做完二值化操作後,人為把前面和後面的切片全部設置為0。

  3. 切出來只有一側肺部情況。

有些患者兩個肺的大小差別比較大,需要調整閾值,放寬閾值標註,把大於6000 mm2的區域到切片的中心區域的距離大於62mm也刪除該連通區,改為大於1500 mm2的區域到切片的中心區域的距離大於92mm也刪除該連通區。並且在最後一步,不只保留最大的連通區,同時保留最大的兩個連通區。

2.模型網絡結構

我們的網絡如圖所示,整體上是採用Unet+Resnet的思想。裡面每個Resnet Block都是由多個卷積層和bn層和relu層組成的。我們只展示主體結構(整體深度大概150多層):

如何用深度學習進行CT影像肺結節探測

3.整體優化思路

3.1 數據優化

  1. 肺部切割優化:這塊其實沒有完美的方法能把所有的肺一次性都切好。具體的思路我們已經在第1章數據預處理部分寫出來了:我們會先切一遍,然後將切肺中切的不好的,再調參數重新切一次。

  2. 10mm 以下結節的訓練數據增強。我們在沒做數據增強的情況下跑出來的模型,在驗證集上漏掉了不少10mm以下的結節,所以對這部分的結節做了增強。

3.2 工業界優化思路:模型架構 > 模型網絡

我們的優化思路非常的工業界,用更多的計算資源,和更復雜的模型架構,並不把大量的時間用在調模型網絡上面。

3.3 層次化Hard Mining

業界兩套網絡的做法比較普遍,比如用Unet切割或Faster RCNN檢測,用3D CNN分類,如下圖所示。

如何用深度學習進行CT影像肺結節探測

我們用的是如下統一的一套模型架構,即3D Faster RCNN的RPN網絡,沒有後續的全連接做分類,也並沒有

再在後面接一套3D CNN來做降假陽。能減少需要調節的網絡參數。

如何用深度學習進行CT影像肺結節探測

該hard mining的過程,其實就是用上一層的模型作為下一層的輸入,每一層的訓練數據都選取比上一層更難分的。

如何用深度學習進行CT影像肺結節探測

這套架構,無需2套網絡,只需要選擇一套較深的網絡。

根據我們的經驗,採取層次化模型訓練,第二層模型froc能比第一層效果提升0.05,第三層能比第二層提升0.02。

3.4 LOSS 函數的設計

在計算loss函數的時候,我們做了2點優化。

1.在使用hard mining的時候,每個batchsize裡面負例的個數會明顯多於正例。為了防止算loss的時候被負例主導。我們將loss函數分成3個部分,負例的loss,正例的loss和邊框的loss。

如何用深度學習進行CT影像肺結節探測

2.在上一節提到的層次化hard mining,我們在最後一層訓練模型的時候,會修改loss函數的計算,對於分錯的負例和正例,做加權。這個思路和focal loss是很像的。

如何用深度學習進行CT影像肺結節探測

比如:

紅框裡面的部分,本來是負例,卻以很大的概率被分成正例,這部分在算loss的時候權值就大些。紅框外面的部分權值就小些。

如何用深度學習進行CT影像肺結節探測

4.本次比賽的關鍵點總結:

1) 解決了基於Intel extended Caffe的150多層深度網絡的 3D Faster RCNN RPN網絡收斂問題。

可以從2個方向來解決(線下Phi卡平臺均已驗證過)。

a)將 drop out設置為 0.1。缺點是會容易過擬合。

b)先訓練一個crop size為32的模型

用這個模型做pre train model,訓練crop size 64的模型

依次類推。

直到完成crop size為128的模型訓練

由於時間關係,我們並未比較這2種思路的效果。比賽中使用的是第1個思路,收斂的更快些。

2) 提出層次化Hard Mining的訓練框架。並沒有採用常見的,unet做分割+3D CNN降假陽 或者 2d faster rcnn做檢測+3D CNN降假陽的思路。我們只用了一套網絡。減少了需要調節的網絡參數。

3) 重新設計了loss函數,防止負例主導loss的計算, 並且在降低loss的過程中,更聚焦於分錯的訓練樣本。

5. 經驗總結:

我們團隊雖然過往深度學習架構經驗多,但對醫學影像處理的know how屬於尚在探索之中。所以,我們的優化思路,是用更多的計算資源,和更復雜的模型架構,來彌補沒有專用模型網絡積累的短板。在第一輪比賽時通過調用比較充足的計算資源時效果比較顯著,但在第二輪限定計算資源的多CPU的框架上,比較受限於計算資源及時間。

在計算資源比較充沛的情況下,選取比較深的Resnet效果會明顯。在資源受限的實際場合或者現實的生產環境,我們有兩點啟發:

  1. 學會認同重複造輪子的基礎性工作。第一輪比賽我們是pytorch框架,第二輪按要求在caffe上實現,特別是在Intel Extended Caffe對3D支持有限,重寫了不少很基礎的模塊,這種貌似重複造輪子的工作,對我們提出了更高的要求,但也鍛鍊了我們深入到框架底層的能力,從而對不同框架的性能特點有更深的認識,這種重寫甚至還因此幫我們找到我們第一版pytorch代碼裡detect部分存在的一個bug。

  2. 根據資源靈活優化訓練策略乃至模型。我們的3D Faster RCNN 初期在Extended Caffe 上過於耗時,但因為在計算資源充足環境下我們的做法比較有效,所以沒有去考慮一些更快的檢測算法,比如SSD、YOLO等,這點也算是路徑依賴的教訓了。

代碼開源說明:

我們在GitHub (https://github.com/YiYuanIntelligent/3DFasterRCNN_LungNoduleDetector ) 開源了核心代碼,特別是將我們基於Intel Extended Caffe的3D Faster RCNN RPN訓練模塊發佈到社區,相信這也是業內首個Intel extended Caffe版的150層網絡3D Faster RCNN開源,希望對Intel 的深度學習社區用戶有幫助。

該代碼對醫學影像的處理也展示了有效性,相信對醫學影像領域AI實踐的發展,對技術如何造福大眾,能起到一些幫助。

通過開源,希望有同行提出性能優化、功能擴充等的修改建議,互相促進。

宜遠智能是一家專注於大健康領域的AI創新企業,團隊由多名AI博士、來自騰訊的算法高手、醫療領域專家構成。目前提供醫學影像圖像分析平臺及服務。還提供專業皮膚AI方案以及基於阿里雲市場的測膚API平臺。對我們的開源代碼及相關醫學影像處理有任何疑問、建議、合作與求職意向,可聯繫:

[email protected] JohnnyGambler

[email protected] 施少懷

End.


分享到:


相關文章: