如何用深度學習進行CT影像肺結節探測(附有基於Intel Extended Caffe的3D Faster RCNN代碼開源)
近期宜遠智能參加阿里天池醫療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也刪除該連通區。最後只留下一個最大的連通區域。
左邊是原始圖,右邊是切完肺的。
在實際中預處理中,我們可視化了每個肺的部分切片,存在一些bad case。主要有以下3種,我們也對這3種情況做了優化:
- 把肺邊緣結節切掉。因為閾值導致的,把二值化環境-600改成-150有改善。
- 切出來全部為黑的(未找到任何肺部區域)。有些ct圖是從頭部開始掃描的,導致影響了連通區域判斷,需要手動查看該mhd文件,看裡面的從第個切片到第幾個切片是肺部,在做完二值化操作後,人為把前面和後面的切片全部設置為0。
- 切出來只有一側肺部情況。
有些患者兩個肺的大小差別比較大,需要調整閾值,放寬閾值標註,把大於6000 mm2的區域到切片的中心區域的距離大於62mm也刪除該連通區,改為大於1500 mm2的區域到切片的中心區域的距離大於92mm也刪除該連通區。並且在最後一步,不只保留最大的連通區,同時保留最大的兩個連通區。
2.模型網路結構
我們的網路如圖所示,整體上是採用Unet+Resnet的思想。裡面每個Resnet Block都是由多個卷積層和bn層和relu層組成的。我們只展示主體結構(整體深度大概150多層):
3.整體優化思路
3.1 數據優化
- 肺部切割優化:這塊其實沒有完美的方法能把所有的肺一次性都切好。具體的思路我們已經在第1章數據預處理部分寫出來了:我們會先切一遍,然後將切肺中切的不好的,再調參數重新切一次。
- 10mm 以下結節的訓練數據增強。我們在沒做數據增強的情況下跑出來的模型,在驗證集上漏掉了不少10mm以下的結節,所以對這部分的結節做了增強。
3.2 工業界優化思路:模型架構 > 模型網路
我們的優化思路非常的工業界,用更多的計算資源,和更複雜的模型架構,並不把大量的時間用在調模型網路上面。
3.3 層次化Hard Mining
業界兩套網路的做法比較普遍,比如用Unet切割或Faster RCNN檢測,用3D CNN分類,如下圖所示。
我們用的是如下統一的一套模型架構,即3D Faster RCNN的RPN網路,沒有後續的全連接做分類,也並沒有
再在後面接一套3D CNN來做降假陽。能減少需要調節的網路參數。
該hard mining的過程,其實就是用上一層的模型作為下一層的輸入,每一層的訓練數據都選取比上一層更難分的。
這套架構,無需2套網路,只需要選擇一套較深的網路。
根據我們的經驗,採取層次化模型訓練,第二層模型froc能比第一層效果提升0.05,第三層能比第二層提升0.02。
3.4 LOSS 函數的設計
在計算loss函數的時候,我們做了2點優化。
1.在使用hard mining的時候,每個batchsize裡面負例的個數會明顯多於正例。為了防止算loss的時候被負例主導。我們將loss函數分成3個部分,負例的loss,正例的loss和邊框的loss。
2.在上一節提到的層次化hard mining,我們在最後一層訓練模型的時候,會修改loss函數的計算,對於分錯的負例和正例,做加權。這個思路和focal loss是很像的。
比如:
紅框裡面的部分,本來是負例,卻以很大的概率被分成正例,這部分在算loss的時候權值就大些。紅框外面的部分權值就小些。
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效果會明顯。在資源受限的實際場合或者現實的生產環境,我們有兩點啟發:
- 學會認同重複造輪子的基礎性工作。第一輪比賽我們是pytorch框架,第二輪按要求在caffe上實現,特別是在Intel Extended Caffe對3D支持有限,重寫了不少很基礎的模塊,這種貌似重複造輪子的工作,對我們提出了更高的要求,但也鍛煉了我們深入到框架底層的能力,從而對不同框架的性能特點有更深的認識,這種重寫甚至還因此幫我們找到我們第一版pytorch代碼里detect部分存在的一個bug。
- 根據資源靈活優化訓練策略乃至模型。我們的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平台。對我們的開源代碼及相關醫學影像處理有任何疑問、建議、合作與求職意向,可聯繫:
tkots_wu@sina.com JohnnyGambler
csshshi@comp.hkbu.edu.hk 施少懷
End.
推薦閱讀:
※開啟正確的數據分析師成長之路
※當我們在讀唐詩時,我們在讀什麼?
※猴子 的 Live - 如何零基礎從事數據分析
※簡單兩步,大幅提高python數據處理速度
※大數據那些事(21):腰斬的大象之Hortonworks
TAG:深度学习DeepLearning | 大数据 | 医疗数据 |