天天看點

Kaggle: Humpback Whale Identification鲸魚識别挑戰賽

鲸魚識别挑戰賽

Kaggle: Humpback Whale Identification鲸魚識别挑戰賽

Humpback Whale Identification

獎金區的 solution 和 code 整理:

  • 1st solution pytorch
  • 2nd 知乎 pytorch
  • 3rd solution pytorch
  • 4th solution 暫無代碼
  • 5th solution blog 暫無代碼

首次 Kaggle 競賽,收貨一個銅牌

Kaggle: Humpback Whale Identification鲸魚識别挑戰賽

資料分析

訓練資料有 25,361 張,測試集有 7,960 張,共有 5004 + 1 (new_whale) 類的鲸魚,未知身份的鲸魚統一标記為 new_whale。在訓練集中,屬于 new_whale 的圖像有 9,664 張,隻有一張圖像的類别有 2,073 類,資料的類别分布極不均衡,僅有單一圖像的類别太多,這是一個 one-shot 的識别問題,使用分類來做不會得到較好的結果,需要使用度量學習,不過也有例外,第三名就是使用分類的方法,使用了 ArcFace,加上關鍵點,得到了 0.97113 的準确率。

Kaggle: Humpback Whale Identification鲸魚識别挑戰賽

鲸魚尾部圖像樣例

Kaggle: Humpback Whale Identification鲸魚識别挑戰賽
Kaggle: Humpback Whale Identification鲸魚識别挑戰賽
Kaggle: Humpback Whale Identification鲸魚識别挑戰賽
Kaggle: Humpback Whale Identification鲸魚識别挑戰賽

評價名額

Mean Average Precision @ 5 ([email protected]):

Kaggle: Humpback Whale Identification鲸魚識别挑戰賽

具體的名額介紹,可以看這個 kaggle kernel:https://www.kaggle.com/pestipeti/explanation-of-map5-scoring-metric

建立本地驗證集

保留僅有一張圖像的類别,剩下的抽取 512 個 ID,每個 ID 随機抽取 1 張,new_whale 中抽取 230 張 (根據測試集中的 new_whale 比例),共 742 張作為本地驗證機,與 LB 分數相差不多

我的方法

  • 分類

    使用分類的方法來做,首先 new_whale 不能算為一類,應該去掉 new_whale 類,使用剩下的 5004 類進行訓練,在測試集上設定一個門檻值,當模型預測該張圖像類别的機率低于門檻值時,加入 new_whale 類。但是分類的方法無法将 new_whale 的 9664 張圖像加入訓練,這是巨大的浪費,另外圖像數量過少的類别,即使使用了 weightSampler 和 data augmentatipn 也無法得到較好的結果。我使用這種方法僅得到了 LB/PB:0.56911/0.56356 的分數;

  • Siamese network

    這是一個識别的問題,是以使用 Siamese 網絡來進行識别,使用 kaggle kernel 訓練 300 個epoch 後可以得到0.90 左右的分數,但是訓練時間要 一周以上。使用 Siamese 網絡的關鍵是進行 hard negative example mining,即挖掘難以識别的樣本進行着重訓練,這個 baseline 中使用 lap 庫進行線性規劃,挖掘 hard example,我想轉化到 pytorch,但是hard negative example mining 部分沒有複現成功,網絡輸入的圖像配對政策僅為随機選取,分數僅能達到 0.7 左右;

  • ReID

    這題的關鍵是将 new_whale 部分的資料加入訓練,是以可以考慮使用 ReID 的方法,使用 ReID baseline 可以達到 0.87 左右的分數;

  • 二分類

    還是那句話,這題的關鍵是将 new_whale 部分的資料加入訓練,是以也可以使用分類的方法,但是将直接分成 5004 類轉化為建構 5004 個二分類的分類器,每一個分類器判斷改張圖像是否屬于該類,這樣轉化後可以将 new_whale 類加入訓練,訓練圖像的數量增加很多,分數可以達到0.96 左右(第一名與第二名的大佬所說),但是我用這種方法僅得到了 0.9 的分數,看來還是調參不行,任重而道遠;

通用的 trick

  • 輸入圖像長寬比為 2:1 (可調)
  • TTA (test time augmentation)
  • data distillation: 恰好之前舉行過 playground 的比賽,但是 featured 和 playground 部分的資料沒有和在一起,這給了我們使用資料蒸餾的機會,可以參考 Data Distillation: Towards Omni-Supervised Learning,将 playground 和 test 中的資料加如訓練
  • ensemble:模型內建,特征層面的內建,結果的內建,甚至是直接結果檔案的內建
  • 将圖像進行水準翻轉(fliplr),由于鲸魚的尾部圖像不具有對稱性,是以可以将水準翻轉的圖像當作一個新的類别,可以極大提高分數:來自 Heng
  • bounding box:bounding box 可以從這下載下傳:https://www.kaggle.com/suicaokhoailang/resnet50-bounding-boxes-0-628-lb/data
  • mask: mask 可以從這裡下載下傳 https://www.kaggle.com/c/humpback-whale-identification/discussion/78453,第一名的方案中就使用了 mask,與原圖像組合在一起變成 4 通道的輸入;

    Kaggle: Humpback Whale Identification鲸魚識别挑戰賽

可視化

kaggle kernel

Kaggle: Humpback Whale Identification鲸魚識别挑戰賽

我的 code

github: pytorch https://github.com/xungeer29/Humpback-Whale-Identification

參賽感受

Kaggler 就是一群追求極緻的人,kaggle 上的比賽就是一堆人一起将一個項目做到極緻,真的是極緻,每個細節都追求極緻!!!

希望今年能拿個金牌

繼續閱讀