近期,由Kaggle主辦,Leica Microsystems和NVIDIA贊助的HPAIC(Human Protein Atlas Image Classification)競賽正式結束。比賽爲期三個月,共有來自全球的2236個隊伍參加,極鏈AI研究院與工程院最終得到挑戰賽金牌。網絡
蛋白質是人體細胞中的「行動者」,執行許多共同促進生命的功能。蛋白質的分類僅限於一種或幾種細胞類型中的單一模式,可是爲了徹底理解人類細胞的複雜性,模型必須在一系列不一樣的人類細胞中對混合模式進行分類。框架
可視化細胞中蛋白質的圖像一般用於生物醫學研究,這些細胞能夠成爲下一個醫學突破的關鍵。然而,因爲高通量顯微鏡的進步,這些圖像的生成速度遠遠超過人工評估的速度。所以,對於自動化生物醫學圖像分析以加速對人類細胞和疾病的理解,須要比以往更大的需求。機器學習
雖然這是生物學方面的競賽,可是其本質是機器視覺方向的圖像多標籤分類問題,參賽隊伍也包括許多機器視覺和機器學習領域的競賽專家。學習
官方給咱們提供了兩種類型的數據集,一部分是512x512的png圖像,一部分是2048x2048或3072x3072的TIFF圖像,數據集大概 268G, 其中訓練集:31072 x 4張,測試集:11702 x 4張。測試
一個蛋白質圖譜由4種染色方式組成(red,green,blue,yellow),圖像示例以下:設計
咱們將4個通道合併成3通道(RYB)可視化的圖像以下所示:3d
在本次競賽中一共有28個類別,好比 Nucleoplasm、Nuclear membrane等,每一個圖譜圖像均可以有一個或者多個標籤。標籤數量統計以下:cdn
能夠發現標籤數量集中在1-3個,可是仍然會有圖像有5個標籤,給比賽增長了必定的難度。blog
另外一方面的難點是數據集中樣本數量很不均勻,圖像最多的類別有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),並將這些圖像縮放到512x512和1024x1024兩種尺度。
對於TIFF文件,咱們用了一週的時間把這個數據集下載下來,而後將全部圖像縮放到1024x1024。
咱們比賽中使用的增廣方式有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 最低,同時也用到了inceptionv四、xception其餘尺度的部分fold。