1. 程式人生 > >阿里天池之江杯零樣本影象目標識別Top1%方案分享

阿里天池之江杯零樣本影象目標識別Top1%方案分享

比賽結束了一週多了,歷時近三個月,也是我第一次做零樣本識別。名次是32/3224,雖然不太滿意,但學到了很多東西。在這篇博文做一次總結,並將公開我們的程式碼。

零樣本識別概念

零樣本識別不同於傳統的分類識別,傳統的分類識別所有的label以及每個label對應的影象都可以用來訓練,而且訓練一個較好的分類器通常需要大量的訓練影象。零樣本識別的訓練集並不包含測試集的label,因此需要識別一個從來沒有見過label。但是,僅僅使用不包含測試集label的訓練集去訓練網路並不能對未知類別進行分類,因此需要其他的先驗知識:Arrtibute 和 word embedding。雖然訓練集不包含任何關於測試集的資訊,但是Attribute 和 Word embedding包含有測試集的資訊。 Attribute描述的是測試集每類的特徵,例如,Attribute包含:是否是動物、是否是傢俱、藍色、紫色…當這個測試集的label屬於這個屬性,則這個屬性置1。而word embedding根據測試集的單詞,用統計的方法或者語言模型的方法來生成,屬於NLP的內容。因此,做零樣本的一種常規步驟是:

  1. 訓練CNN網路用來提取特徵。
  2. 訓練zero-shot部分完成CNN特徵與word embedding類別的對映。

比賽採用的方法

比賽採用CVPR2018論文的方法:
Learning to Compare: Relation Network for Few-Shot Learning
這篇論文最大的特點是: CNN特徵與Attribute特徵concatenate後使用全連線來建立兩者之間的關係。
之前最早使用的DEM:
Learning a Deep Embedding Model for Zero-Shot Learning。 這篇論文中,對CNN特徵和Attribute特徵做差值求平均,尋找最小的差值來實現對類別的判斷。這種方法相當於將Attribute域對映到CNN特徵域,進而尋找最接近的CNN特徵域的特徵。這種方法的缺陷在於Attribute與CNN的關係通過求差值而得到,而不是學習來的。可以參考的程式碼地址:

https://github.com/wpwei/ZJL_zero_shot_learning_competition
但是Relation Network將CNN特徵和Attribute特徵concatenate到一起,使用全連線實現對未知類別的分類。CNN特徵和Attribute特徵連線在一起再用FC學習兩者之間的關係,可以更好地實現關係的匹配。而不是限制在用差值來尋找最接近的類別。參考程式碼地址:https://github.com/lzrobots/LearningToCompare_ZSL
因此,本次比賽採用Relation Network的方法實現。
基本操作相似,沒有非常大的變化。其中,修改了CNN特徵在ZSL中的操作。之前是使用CNN提取到2048維向量,再與Attribute網路用FC得到的2048維向量做concatenate,但是我們發現,在CNN提取到的2048維向量之後再加一個全連線FC,再輸出一個2048維向量,會有更好的效果。我們對此的解釋是:原本是Attribute提取到的特徵對映到CNN特徵域,但是這樣就太過於受限。CNN特徵域後加入一個FC,可以實現將CNN特徵域對映到另一個域下,同時Attribute也一起對映到該域下。這種做法不會受限於CNN提取到特徵的影響,因此有更好的效果。