識別座頭鯨,Kaggle競賽第一名解決方案解讀
不久之前,Kaggle座頭鯨識別挑戰賽結束,Earhian(喬健) YourVenn(王乙衡)、Tom 57、A.L.四位選手組成的團隊奪得了第一名。本文主要介紹了冠軍團隊的解決方案。
圖注:Kaggle座頭鯨識別挑戰賽 leaderboard
為了幫助鯨魚保護,科學家們使用照片監視系統 (Photo Surveillance Systems) 來監視海洋活動。他們使用鯨魚尾巴這一獨一無二的標記來在連續的影象中識別鯨魚,並對它們的活動進行細緻地分析。在過去的四十年裡,大部分工作基於科學家們的手工作業,這也使得大量的資料未被充分利用。
在這一競賽中,我們是要構建演算法來識別影象中的鯨魚個體,而難點在於訓練樣本的嚴重不均衡以及存在近三分之一的無標註(new whale)資料。
1.概述
這是一個few shot learning和細粒度分類的問題。比賽初期,我們使用了softmax + 固定閾值的方法,僅對有標註的樣本進行訓練並通過閾值插入new whale的預測,但是沒有取得很好的效果(MAP@5 < 0.9)。為了將new whale加入網路中訓練,我們針對每一類鯨魚進行二分類(如下圖所示),並且使用triplet loss來做特徵度量。通過大量實驗,SE-resneXt154被作為最優的backbone,取得了單模型0.96的baseline,在追加了一系列tricks之後,單fold模型達到了0.969 (private LB: 0.97+ 榜上第三名)。最後,藉助4 fold cross validation,以及類別平衡後處理,得到了最終public & private兩榜第一名的0.973。
2.網路輸入
我們使用RGB + Mask的四通道輸入(Mask來源於我們訓練的分割模型,通過論壇中開源的450張標註資料訓練即取得了很好的效果: MAP for local cross validation: 0.96+ )。
3.鯨魚水平翻轉,並賦予新的id(+0.006~0.007)
論壇中,選手Heng CherKeng 提出“根據鯨魚尾部不對稱的特性(見下圖),將其翻轉可以得到新的類別”這一假設。這個假設沒有得到很多的贊同票,但在我們的實驗中取得了非常好的效果。賽後我們也獲悉,第三名Pudae使用了同樣的技巧亦提高了分數。
4. 偽標籤(+0.002)
在模型得到public 0.96+的分數時,我們做了一次偽標籤:將預測置信度為1的測試樣本加入到訓練集中。
5. 類間平衡(+0.001~0.002)
我們發現隨著模型效能的提升,預測結果中top1對應的不同類別數也在增加(見下圖)。所以我們用了以下策略:
假設五個預測為:class_1 class_2 class_3 class_4 class_5
如果1) class_1的置信度減去class_2的置信度 < 0.3, 2) 並且class_2沒在top1中出現過,3) 而class_1在top2中多次出現,則交換class_1與class_2的位置。
最後,感謝隊友們的努力:@Yiheng Wang, @Peiyuan Liao and @Thomas Tilli。感謝@ Heng CherKeng,祝賀3位新的Grandmaster!@SeuTao, @David, @Weimin Wang。
我們已經將方案程式碼進行了整理並開源:
-
https://github.com/earhian/Humpback-Whale-Identification-1st-
英文版本可從Kaggle論壇檢視:
-
https://www.kaggle.com/c/humpback-whale-identification/discussion/82366