天池醫療AI大賽[第一季] Rank8解決方案

今年5月,機緣巧合之下,參加了天池醫療AI大賽,也算是我第一次參加比賽,經過接近半年的馬拉松,終於10月落下帷幕,作為第一次參加比賽,能在接近3000支隊伍中拿到第8名,感覺已經比較滿意,不過也有許多遺憾之處,在此主要介紹一下我們比賽的方案。

一、比賽介紹

1.1任務介紹

本次大賽要求參賽者使用患者的CT影像數據(mhd格式)訓練模型演算法,在測試數據集中找出CT影像中的肺部結節的位置並給出是一個真正肺結節的概率

初賽在線下自由完成,複賽必須在線上使用PAI平台的定製版的Caffe

1.2 數據介紹

本次大賽數據集包含數千份高危患者的低劑量肺部CT影像(mhd格式)數據,原始圖像為三維圖像,每個影像包含一系列胸腔的多個軸向切片。這個三維圖像由不同數量的二維圖像組成,其二維圖像數量可以基於不同因素變化,比如掃描機器、患者。Mhd文件具有包含關於患者ID的必要信息的頭部,以及諸如切片厚度的掃描參數。訓練集和驗證集的所有數據全部都有結節

數據的特點:3D類型圖像(一個ct文件幾百M)

1.3 評價指標

本次比賽使用跟LUNA16比賽一樣的評價標準。賽題組會根據參賽者給出的坐標信息判斷結節是否檢測正確。如果結節落在以參考標準為中心半徑為R的球體中,則認為檢測正確。根據提供的結節檢測概率,計算一個FROC曲線。Sensitivity在1/8, 1/4, 1/2, 1, 2, 4和8一共7個不同的誤報情況下的平均值作為最終評判標準。FROC曲線可以看成類似分類問題中ROC曲線的指標。

此次比賽,我們的方案是分割+分類的傳統方法,分割部分使用UNET,找出疑似節點,而分類部分使用ResNet結構神經網路,最後初賽數據集得分最高的froc為0.750,複賽數據集得分最高的為0.600。

二 方法概述

我們的演算法分為三步(如下圖所示):

1. 基於3D CNN+Unet/Inception/Resnet的分割網路,用以找出疑似結點。最後找到許多疑似結節。

2. 基於ResNet的分類網路,判斷每一個疑似結點是否是真陽性,並給出概率。

3. 利用boost的方法訓練多個一樣的模型,不斷的提升分類的準確率(無奈之舉,複賽模型融合效果遠不如初賽)。

三 分割網路

分割網路的目標是找出結節的位置。

分割網路結構我們採用了類似Unet的形式,Unet網路的receptive filed 很大,可以融合全局特徵和局部特徵,使網路可以同時利用深層網路的語義信息以及淺層網路的紋理信息。

3.1 數據處理

1. 對原始數據進行歸一化處理,使像素值得範圍為[0, 1]。

2. 從原圖上切出64*64*64的立方體塊

3. 預測的Label大小與輸入相同,結點範圍內的值為1(白色區域),其他地方為0(黑色區域)。

下圖是原圖和生成的mask(都是3D的)

3.2 數據增強

1. 以結點為中心切塊時,提供一個隨機大小的偏移,以提高樣本的多樣性。

2. 因標記的結點數量比較少(初賽數據訓練+驗證共1244),因此對切下的立方體,進行八個方向的翻轉,以增加樣本的數量。

3.3 模型結構

分割網路的每個單元採用的是ResNet+Inception的結構,ResNet的殘差鏈接可以有效緩解深層網路梯度消失的問題,可以極快地加速超深神經網路的訓練。 而Inception結構將不同的卷積層通過並聯的方式結合在一起,它主要改進了網路內部計算資源的利用率,讓我們能在固定計算資源下增加神經網路深度和寬度,另外,Inception 結構還遵循了 Hebbian 原則並增加了多尺度處理,增加了網路對多尺度的適應性

Unet是一個在醫學圖像處理領域,應用很廣泛的網路結構,是一種全卷積神經網路,輸入和輸出都是圖像,沒有全連接層。較淺的高解析度層用來解決像素定位的問題,較深的層用來解決像素分類的問題。U-NET 構造了一個收縮網路和一個擴張網路,形成了一個 U 型結構。收縮過程通過不斷的卷積(convolution)和池化(pooling)操作提取圖片特徵。擴張過程與收縮過程相對應,通過上採樣(upsampling)和卷積操作來獲取圖片的特徵。U-NET 的特點在於收縮網路和擴張網路是相互映射的關係,在擴張的過程中,通過合併與之映射的收縮層特徵補全丟失的邊界信息,提升預測邊緣信息的準確性。與SegNet,VGG 等網路結構相比,U-NET 具有訓練時間短,結構簡單,樣本需求少等優勢。

3.3.1 特徵提取的結構單元

我們的網路是ResNet+Inception+Unet結合的產物,首先定義了下採樣單元,它結合了ResNet和Inception的優勢,每一個下採樣單元保持輸入與輸出通道數相同,尺寸縮減為原來的一半。我們把這種自己設計的結構稱為ReceptionBlock,一個ReceptionBlock的結構如下圖所示(如果不是下採樣,左邊的卷積可以去掉),

3.3.2上採樣結構單元

3.3.3 分割網路整體架構

最後整體的Unet網路架構如下所示,

整個網路中,通過四次下採樣,使圖像尺寸變到原來的1/16,然後四次上採樣,使輸出大小與輸入一致,每個下採樣後可能有1個或0個特徵提取單元。 除了Unet架構外,我們還嘗試了另一種並非Unet架構的分割網路,網路結構如下

最後對比發現,第一種網路分割結果結點檢測到的數目多,但是伴隨的假陽性也增多,第二種網路檢測到的結點數目略少,但是假陽性數目比之第一種有顯著的下降。 最後我們只使用第二種模型,未和第一種模型進行融合,這是一個大失誤。

3.4 分割的損失函數

訓練分割網路,我們採用 Dice Loss作為損失函數,Dice Loss定義如下:

Dice 係數是一種集合相似度函數,用來評判兩個樣本之間的相似程度,兩個樣本相似度越好,Dice係數越大,相應的損失就越小,故可採用1-Dice作為損失。這種損失比傳統分割過程中使用的BCELoss有更好的效果。

3.5測試階段

測試階段利用分割網路生成的mask圖,輔以數字圖象處理常用的一些工具(濾波,腐蝕,膨脹),找出疑似結節的中心座標和半徑。

3.5.1 數據處理

測試階段送入網路的立方體塊可以儘可能的大,以避免在切塊的過程中切到結點(結節如果剛好在邊緣,很可能無法正確檢出),使檢測的準確率降低。我們在測試時,考慮到內存的大小,將原始圖像切成64*448*448的立方體塊。由於Z軸尺寸偏小,有很大的可能導致結點被切到,因此我們從兩個不同的起點出發,將原始圖像切成塊,分別送入分割網路,最後將兩次的平均值作為分割網路的輸出結果。

3.5.2 RPN檢測

對於分割網路輸出的結果,我們首先進行兩次膨脹操作,將相近的激活連在一起,然後進行連通塊提取的方法提取疑似結點。

首先簡單說下什麼是連通域,在圖像中,最小的單位是像素,每個像素周圍有8個鄰接像素,常見的鄰接關係有2種:4鄰接與8鄰接。4鄰接一共4個點,即上下左右,如下左圖所示。8鄰接的點一共有8個,包括了對角線位置的點,如下右圖所示。

如果像素點A與B鄰接,我們稱A與B連通,於是我們不加證明的有如下的結論: 如果A與B連通,B與C連通,則A與C連通。 在視覺上看來,彼此連通的點形成了一個區域,而不連通的點形成了不同的區域。這樣的一個所有的點彼此連通點構成的集合,我們稱為一個連通區域。 下面這符圖中,如果考慮4鄰接,則有3個連通區域;如果考慮8鄰接,則有2個連通區域。

skiimage 庫中定義了連通域提取的函數: tt

labels = measure.label(probs,connectivity=2) ttnregions = measure.regionprops(labels) n

此方法可得到一系列連通塊的位置坐標,以這些位置作為檢測到的疑似結點的中心,並從原圖相應位置切下一個立方體塊(48*48*48)作為後續分類網路的數據。t

四 分類網路

分割網路檢測的疑似結點中含有大量的假陽性,比例大約是1:20,因此需要一個分類網路進行假陽性衰減,判別每一個疑似結點是否是真陽性,並給出屬於真養性的概率。

4.1 數據處理

分割網路檢測處的疑似結點作為分類網路的輸入數據,進行與分割階段相同的歸一化,翻轉以及隨機平移。由於正負樣本比例懸殊,在訓練分類網路的時候,控制正負樣本比例為1:3,比1:1或者不控制比例訓的準確率更高。t

4.2 模型介紹

分類網路是基於ResNet的,輸入大小為40*40*40,網路結構如下所示:

4.3 模型的融合:

單個網路的分類準確率並不是太高,對分類通過boost方法提高準確率,分類利用的同一個模型,訓練的是同一批數據,但是每次訓練的時候,利用boost的方法給每一個樣本設置一個權重,這個idea來自我們實驗室一個同學的思路,他們在看知乎看山杯的比賽中,利用此方法獲得了第二名(zhuanlan.zhihu.com/p/29)。初賽的時候,我們訓練了三個不一樣的模型,簡單的融合效果已經能達到0.75,但是複賽的時候,初賽的模型效果不好,因此我們嘗試這種方法,確實有所提升。

五 代碼簡介

我們隊的代碼已全部開源,初賽用PyTorch實現,複賽為Caffe實現。 另外最初的時候,我使用TensorFlow為主,後來在隊友的強烈安利之下,將代碼全部遷移到了PyTorch中。PyTorch代碼也是這三份代碼中質量最高,效果最好,實現最完善的一個版本,建議感興趣的讀者以此為主。

六 總結與展望

通過比賽對object detection領域的相關技術,如FasterRCNN,YOLO,SSD等演算法都有所了解,雖未採用,卻也積累了相關的知識,希望以後能在實際的應用中使用這些技術。最後感謝比賽期間 intel和阿里同事的熱情幫助,也感謝感謝大賽組委會舉辦本次比賽,給予一次難得學習與實戰的機會。最後,感謝隊友們的支持與合作。

一開始隊友安利PyTorch我是拒絕的,畢竟毫不容易才學會了TF,再學個框架實在太麻煩。但是在用過TensorFlow之後再用PyTorch真的感覺如沐春風!!

請幫忙在天池 文章詳情 點個贊,代碼鏈接也放在那裡了

推薦閱讀:

商湯、雲從、依圖、曠視和格靈深瞳五家公司的深度學習演算法實現手段差別和公司產品優勢有哪些?
當我們在談論K-means:數據概述
第八周筆記:聚類(clustering)
快速讓你理解人工智慧相關名詞
人工智慧應用到化學領域,可惜老白沒能等到這一天。

TAG:深度学习DeepLearning | 机器学习 |