Kaggle的座頭鯨識別挑戰比賽在最近落下帷幕,全球共2131個團隊參加了比賽。
這是近期Kaggle上頗受歡迎的一次競賽,常用的分類方法無法處理大量的無標註資料,只有對傳統的方法進行創新,才能夠獲得高分。
下面文摘菌為大家介紹比賽中排名TOP10的團隊如何完成比賽,以及其他幾隻團隊的相關經驗。
注:該團隊由Vladislav Shakhray,Artsiom Sanakoyeu海德堡大學的博士組成,以及Kaggle Top-5 大神Pavel Pleskov。
本文作者Vladislav Shakhray,文摘菌對其編譯如下。
比賽連結: https://www.kaggle.com/c/humpback-whale-identification
問題描述
在比賽中,主要是構建演算法來識別影像中的鯨魚個體,而難點在於訓練樣本的嚴重不均衡以及存在近三分之一的無標註資料。
在超過2000個鯨魚類別,只有一個訓練樣本,這使得常用的分類方法很難使用。更重要的是,無論鯨魚是否是新的種類,這都是比賽的重要組成部分,結果證明這是非常重要的。
競賽的衡量標準是MAP @ 5(平均精度為5),能夠為每個測試影像提交最多5個預測。 我們在測試集上的最高成績是0.959 MAP @ 5。
驗證和初始設定
在本次比賽前幾個月,同一比賽的另一個版本在Kaggle上舉行,但是,正如競賽發起人所指出的那樣,現在的版本包含更多清潔的資料。我們決定以多種方式利用之前比賽的成果和資料:
1.使用之前競爭對手的資料,我們使用image hashing來收集超過2000個驗證樣本。 當我們稍後驗證我們的成果時,這一方法非常重要。
2.我們從訓練資料集中刪除了new_whale類,因為它不在其元素之間共享任何邏輯影像特徵。
3.有些影像根本沒有對齊。 幸運的是,在之前一版kaggle比賽的成功解決方案中有一個公開可用的預訓練邊界框模型。我們用它來檢測鯨魚周圍的精確邊界框並相應地裁剪影像。
4.由於影像的顏色不同,所有資料在訓練前都轉換為灰色。
方法1:孿生神經網路Siamese Networks(Vladislav)
我們的第一個架構是一個具有眾多分支架構和自定義損失的孿生神經網路(Siamese Networks),其中包括許多卷積和密集層。 我們使用的分支架構包括:
ResNet-18, ResNet-34, Resnet-50
SE-ResNeXt-50
Martin Piotte公開分享的類似ResNet的自定義分支
我們透過在每4個時期的分數矩陣上求解線性分配問題來使用顯著陰性(hard-negative mining)和顯著陽性挖掘(hard- positive mining)。 在矩陣中新增了一些隨機化以簡化訓練過程。
使用漸進式學習(Progressive learning),解析度策略為229x229 - > 384x384 - > 512x512。 也就是說,我們首先在229x229影像上訓練我們的網路,幾乎沒有用正則化和更大的學習率。 在收斂之後,我們重置學習速率並增加正則化,從而再次對更高解析度的影像(例如384×484)訓練網路。
此外,由於資料的性質,使用了大量增強,包括隨機亮度,高斯噪聲,隨機剪裁和隨機模糊。
此外,我們採用智慧翻轉增強策略,極大地幫助建立了更多的訓練資料。 具體地,對於屬於相同的鯨魚X,Y的每對訓練影像,我們建立了另外一個訓練對翻轉(X),翻轉(Y)。 另一方面,對於每對不同的鯨魚,我們建立了另外三個例子:翻轉(X),Y,Y,翻轉(X)和翻轉(X),翻轉(Y)。
一個顯示隨機翻轉策略不適用於一對相同鯨魚照片的例子。 請注意當我們翻轉圖片時,兩張圖片的翻轉效果不同,因為我們關心鯨魚尾部的寄生藻的位置。
使用Adam最佳化器最佳化模型,初始學習率為1e-4,接近訓練結束時減少5倍。 批次大小設定為64。
模型是用Keras編寫的。在單個2080Ti上花費2-3天(取決於影像解析度),訓練模型大約400-600個週期。
使用ResNet-50效能最佳的單一模型得分為0.929 LB。
方法2:度量學習Metric Learning(Artsiom)
我們使用的另一種方法是使用保證金損失進行度量學習。 我們使用了許多ImageNet預訓練的架構,其中包括:
ResNet-50, ResNet-101, ResNet-152
DenseNet-121, DenseNet-169
這些網路主要由448x448 - > 672x672策略逐步訓練。
我們使用了Adam最佳化器,在100個訓練週期後將學習率降低了10倍。 我們還為整個訓練使用批次大小為96的訓練方法。
由Sanakoyeu,Tschernezki等人開發的度量學習(metric learning)方法能夠讓成績迅速提升。
度量學習在CVPR 2019上釋出,它所做的是每個週期它將訓練資料以及嵌入層分成簇。在訓練組塊和學習者之間建立雙射之後,模型分別訓練它們,同時累積分支網路的梯度。
程式碼及文章連結:https://github.com/CompVis/metric-learning-divide-and-conquer
由於巨大的種類數量不平衡,我們使用了大量的增強,包括隨機翻轉,旋轉,變焦,模糊,光照,對比度,飽和度變化。 之後,計算查詢特徵向量和列車庫特徵向量之間的點積,並且選擇具有最高點積值的類作為TOP-1預測。 隱含地幫助類不平衡的另一個技巧是對屬於相同鯨魚id的火車影像的特徵向量進行平均。
這些模型使用PyTorch實現,需要單個Titan Xp 2-4天(取決於影像解析度)來訓練。 值得一提的是,具有DenseNet-169架構表現最佳的單一模型得分為0.931LB。
方法3:特徵分類(Artsiom)
當我和Artsiom聯手時,我們做的第一件事就是使用從我們所有模型中提取並連線(應用PCA分析)的特徵來訓練分類模型。
分類的主要部分由兩個密集的層組成,其間會刪失資訊。由於我們使用了預先計算的特徵,因此模型訓練得非常快。
透過這種方法我們獲得了0.924 LB,並讓整個集合更富多樣性。
方法4:新鯨魚分類(Pavel)
本次比賽最複雜的部分之一是正確分類新鯨魚(大約30%的影像屬於新類別鯨魚)。
解決這個問題的流行策略是使用一個簡單的閾值。也就是說,如果給定的影像X屬於某個已知類別鯨魚的最大機率小於閾值,則將其歸類為新鯨魚。然而,我們認為可能有更好的方法來解決這個問題。
對於每個表現最佳的模型和集合,我們選取了TOP-4預測,按降序排序。然後,對於其他的每個模型,我們將他們的機率用於所選擇的這4個類。目標是根據這些特徵來預測鯨魚是否屬於新類別。
Pavel建立了一個非常強大的包含LogRegression,SVM,幾個k-NN模型和LightGBM的混合模型。這個混合模型在交叉驗證中給出了0.9655 的ROC-AUC值,並且將LB得分提高了2%。
綜合
由我們的模型構建混合模型相當不容易。難度在於我的模型的輸出是非標準化機率矩陣(從0到1),而Artsiom提供的輸出矩陣由歐幾里德距離組成(範圍從0到無窮大)。
我們嘗試了許多方法將Artsiom的矩陣轉換為機率,其中包括:
1、類似tSNE的轉換:
2、Softmax
3、透過應用函式 1 / (1 + distances)簡單地反轉範圍
4、其他可以反轉矩陣範圍的函式
不幸的是,前兩種方法根本不起作用,而使用大多數函式將範圍剪下至[0,1]的結果大致相同。我們最終選擇在驗證集上具有最高mAP @ 5的函式。
令人驚訝的是,最好的是1 / (1 + log(1 + log(1 + distances)))。
其他團隊使用的方法
大衛現在是Kaggle Grandmaster(等級為12),在Private LB上排名第四,並在Kaggle Discussions論壇上分享了他的解決方案。
https://www.kaggle.com/c/humpback-whale-identification/discussion/82356
他使用全解析度影像並使用傳統的關鍵點匹配技術,利用SIFT和ROOTSIFT。為了解決假陽性問題,大衛訓練了一個U-Net從背景分割鯨魚。有趣的是,他使用後期處理給只有一個訓練樣本的類別更多的機會躋身TOP-1預測。
我們也考慮過嘗試基於SIFT的方法,但我們確信它肯定會比頂級神經網路表現得差。
在我看來,我們能從中學會的是,永遠不應被深度學習的力量所矇蔽,從而低估了傳統方法的能力。
單純分類
由Dmytro Mishkin,Anastasiia Mishchuk和Igor Krashenyi組成的Pure Magic thanks radek團隊(第7名),追求將metric learning(triplet loss)和分類結合起來,正如Dmytro在他的文章中描述的那樣。
在訓練分類模型一段時間時,他們嘗試使用Center Loss來減少過擬合,並在應用softmax之前進行temperature scaling。在使用的眾多主幹架構中,最好的是SE-ResNeXt-50,它能夠達到0.955LB。
temperature scaling:https://arxiv.org/pdf/1706.04599.pdf
他們的解決方案比這更加多樣化,我強烈建議你參考原文。
正如Ivan Sosin在文章中(他的團隊BratanNet在本次比賽中排名第9)所述,他們使用了CosFace和ArcFace方法。下面是來自於原文:
Cosface和Arcface作為面部識別任務新近發現的SOTA脫穎而出。其主要思想是在餘弦相似空間中將同類的例子相互拉近並分開不同的類別。通常是分類任務使用cosface或arcface,因此最終的損失函式是CrossEntropy
當使用像InceptionV3或SE-ResNeXt-50這樣的較大主幹網路時,他們注意到了過擬合,因而他們切換到較輕量的網路,如ResNet-34,BN-Inception和DenseNet-121。
文章連結:https://www.kaggle.com/c/humpback-whale-identification/discussion/82427
該團隊還使用了精心挑選的擴充和眾多網路修正方法,如CoordConv和GapNet。
他們方法中特別有趣的是他們處理新類別鯨魚的方式。下面是原文:
一開始我們就意識到必須對新鯨魚做一些處理,以便將它們納入訓練中。簡單的方法是給每個新鯨魚分配一個1/5004的可能屬於每一類別的機率。在加權取樣方法的幫助下,它帶來了一些提升。
但後來我們意識到可以使用softmax預測來自於訓練集中的新鯨魚。所以我們想到了distillation。我們選擇distillation代替偽標籤,因為新鯨魚的標籤應該與訓練的標籤不同,雖然它可能不是真的。
為了進一步提升模型效能,我們將帶有偽標籤的測試圖片新增到訓練集中。最終,我們的單一模型可以透過snapshot ensembling達到0.958。不幸的是,以這種方式訓練的ensembling並沒有在分數上有任何的提高。也許是因為偽標籤和distillation造成的多樣性減少。
最後的思考
令人驚訝的是,儘管私人測試集佔到全部測試集的近80%,但是最終結果幾乎沒有大的改變。我相信比賽的主辦方已經提供了一個非常有趣的問題,以及經過很好地處理的資料。
這是我參加的第一場Kaggle比賽,毫無疑問,它表現出了Kaggle比賽的有趣,迷人,激勵和教育性。我要祝賀由於這次比賽而成為Expert,Master和Grandmaster的人。我還要感謝ODS.ai社群提供的精彩討論和支援。
最後,我要再一次特別感謝我的隊友Artsiom Sanakoyeu和Pavel Pleskov,為我帶來了一次難忘的Kaggle比賽經歷。
相關報導:
https://towardsdatascience.com/a-gold-winning-solution-review-of-kaggle-humpback-whale-identification-challenge-53b0e3ba1e84