尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
近期,由Kaggle主辦,Leica Microsystems和NVIDIA讚助的HPAIC(Human Protein Atlas Image Classification)競賽正式結束。比賽為期三個月,共有來自全球的2236個隊伍參加,極鏈AI研究院與工程院最終獲得挑戰賽金牌。
比賽介紹
蛋白質是人體細胞中的「行動者」,執行許多共同促進生命的功能。蛋白質的分類僅限於一種或幾種細胞類型中的單一模式,但是為了完全理解人類細胞的複雜性,模型必須在一系列不同的人類細胞中對混合模式進行分類。
可視化細胞中蛋白質的圖像通常用於生物醫學研究,這些細胞可以成為下一個醫學突破的關鍵。然而,由於高通量顯微鏡的進步,這些圖像的生成速度遠遠超過人工評估的速度。因此,對於自動化生物醫學圖像分析以加速對人類細胞和疾病的理解,需要比以往更大的需求。
雖然這是生物學方面的競賽,但是其本質是機器視覺方向的圖像多標籤分類問題,參賽隊伍也包括許多機器視覺和機器學習領域的競賽專家。
數據分析
官方給我們提供了兩種類型的數據集,一部分是512×512的png圖像,一部分是2048×2048或3072×3072的TIFF圖像,數據集大概 268G, 其中訓練集:31072 x 4張,測試集:11702 x 4張。
一個蛋白質圖譜由4種染色方式組成(red,green,blue,yellow),圖像示例如下:
我們將4個通道合併成3通道(RYB)可視化的圖像如下所示:
在本次競賽中一共有28個類別,比如 Nucleoplasm、Nuclear membrane等,每個圖譜圖像都可以有一個或者多個標籤。標籤數量統計如下:
可以發現標籤數量集中在1-3個,但是仍然會有圖像有5個標籤,給比賽增加了一定的難度。
另一方面的難點是數據集中樣本數量很不均勻,圖像最多的類別有12885張,而圖像最少的類別只有11張圖像,這給競賽造成很大的困難,樣本數量分布情況可以在圖中看出。
在比賽過程中逐步有參賽者發現官方的額外數據集HPAv18,並得到官方授權,這些數據集有105678張,很大程度的擴大了樣本數量,同時給我們提供了很大的幫助。
環境資源
硬件方面我們使用了4塊NVIDIA TESLA P100顯卡,使用pytorch作為我們的模型訓練框架。
圖像預處理
HPAv18 圖像與官方給出的圖像有一定的差別,雖然也是由4中染色方式組成,但是每個染色圖像是一個RGB圖像,而不是官方的單通道圖像,而且RGB三個通道的值差別較大,我們對這些圖像做了預處理,對每個RGB圖像只取一個通道(r_out=r,g_out=g,b_out=b,y_out=b),並將這些圖像縮放到512×512和1024×1024兩種尺度。
對於TIFF文件,我們用了一周的時間把這個數據集下載下來,然後將所有圖像縮放到1024×1024。
數據增廣
我們比賽中使用的增廣方式有Rotation, Flip 和 Shear三種;因為我們不知道一張圖像中的多個細胞之間是否有關聯關係,所以比賽中沒有使用隨機裁剪的增廣方式。
模型
我們最終使用的基礎模型有Inceptionv3,Inceptionv4以及Xception三種,比賽前期我們測試了VGG,ResNet,ResNext,SeNet,但是效果不是很好,因此比賽末期沒有再進行進一步測試。
我們使用了512,650和800三種尺度來增加網路對圖像的理解,另外每個尺度進行10折交叉驗證,保證驗證集的劃分對網路整體的影響,以及用驗證集來評估模型預測的好壞和選擇模型及其對應的參數。不同模型交叉驗證時使用不同的隨機種子劃分驗證集和訓練集,以盡可能多的學到不同的樣本組合。
Inceptionv3和Inceptionv4的512的結果不好(0.55+ public leaderboard 閾值0.15),因此沒有做交叉驗證,只是用512尺度訓練了基礎模型,並用在650和800的微調中。
模型修改:
1.第一層卷積的輸入通道數由3修改為4,保持其他卷積參數不變,從而使網路應對4通道輸入;
2.修改最後一的池化層為全局池化層,保證在多尺度時可以使用同一個網路;
3.全局池化後增加一層128的全連接,然後接一層28的全連接。
訓練
訓練過程的參數如下:
loss: MultiLabelSoftMarginLoss
lr: 0.05(512,imagenet 預訓練),0.01(650和800,512預訓練);
lrscheduler: steplr(gamma=0.1,step=6)
optimizer: SGD (adam,rms not well)
epochs: 25, 600和800一般在12-20直接提前結束,取loss最低的模型
10 folds CV
sampling weights:[1.0, 5.97, 2.89, 5.75, 4.64, 4.27, 5.46, 3.2, 14.48, 14.84, 15.14, 6.92, 6.86, 8.12, 6.32, 19.24, 8.48, 11.93, 7.32, 5.48, 11.99, 2.39, 6.3, 3.0, 12.06, 1.0, 10.39, 16.5]
scale:512,600,800
獨立閾值
為每一個類別找到一個合適的閾值是一件很困難的事,但是多閾值是提升分數的關鍵,對我來說,大概可以提升0.005~0.008。 我們使用驗證集來找閾值,我們訓練單模型xception 512 ,驗證集占13%。調整每一類的閾值使得f1 score達到最優,不過我們發現稀有類別的閾值普遍很高,public lb會變差,因此我們只調整了驗證集1000張以上的類別,稀有類別控制閾值為0.15 通過這種方法找到的閾值在其他模型或者集成的時候同樣有效。
測試
比賽結束以後我們將比賽中訓練的模型重新提交查看private leaderboard成績,得到如下結果:
比賽過程中我們發現做了10 fold ensemble不一定比single fold好,因此我們在最終集成的時候部分模型只選擇了部分fold (根據loss選擇)。
檢索
我們使用檢索的方法(特徵使用inceptionv4 800 的128維特徵)查找test與hpa相似的圖片,使用餘弦相似度進行度量,我們發現了許多相似的甚至相同的圖片,直接使用相似度最高的300張圖片的結果進行替換,分數在public lb上提升0.01~0.015,不過在private LB中並沒有效果,官方在比賽過程中也說明部分test圖像由於與HPA中部分圖像重合,不再進行分數計算。
集成
我們將inceptionv3 inceptionv4以及xception 800的10fold 模型的特徵進行concat(先進行l2),得到3840維的新特徵,並在此基礎上設計了2層的全連接網路進行訓練, 並做10 fold CV,訓練過程中使用不容參數訓練過程如圖所示,我們取了loss最低的參數。結果融合後private lb:0.55150 public lb:0.62791。
雖然上面方法在public lb上分數較高,但是當與其他模型結果融合時,public LB的分數反而降了,因此我們降低了這個模型的權重。
最後的結果是通過加權融合的方式得到的,權重根據模型的public lb分數設置, inceptionv4 800和inceptionv3 800的權重最高,xception 650 最低,同時也用到了inceptionv4、xception其他尺度的部分fold。