圖文互搜:用CNN分100,000類圖像和文本

[Title]:Dual-Path Convolutional Image-Text Embedding

[arXiv]:http://cn.arxiv.org/abs/1711.05535

[Code]:layumi/Image-Text-Embedding

 

[Motivation]:

在這篇文章中我們嘗試了 用CNN分類113,287類圖像(MSCOCO)。

  • 實際上我們將每張訓練集中的圖像認爲成一類。(當然, 如果只用一張圖像一類,CNN肯定會過擬合)。同時,我們利用了5句圖像描述(文本),加入了訓練。所以每一類相當於 有6個樣本 (1張圖像+5句描述)。

  • 文章想解決的問題是instance-level的retrieval,也就是說 如果你在5000張圖的image pool中,要找“一個穿藍色衣服的金髮女郎在打車。” 實際上你只有一個正確答案。不像class-level 或category-level的 要找“女性“可能有很多個正確答案。所以這個問題更細粒度,也更需要detail的視覺和文本特徵。

  • 同時我們又觀察到好多之前的工作都直接使用 class-level的 ImageNet pretrained 網絡。但這些網絡實際上損失了信息(數量/顏色/位置)。以下三張圖在imagenet中可能都會使用Dog的標籤,而事實上我們可以用自然語言給出更精準的描述。也就是我們這篇論文所要解決的問題(instance-level的圖文互搜)。

 

 

[Related Work]:

可以click一下我之前的這個回答,還有學長的回答。

計算機視覺和自然語言處理,哪個更具有發展前景呢,還是各有千秋呢?

 

[Method]:

  1. 對於自然語言描述,我們採用了相對不那麼常用的CNN 結構,而不是LSTM結構。來並行訓練,finetune整個網絡。結構如圖。結構其實很簡單。

對於TextCNN,我們是用了類似ResNet的block。注意到句子是一維的,在實際使用中,我們用的是 1X2的conv。

 

2. Instance loss。 我們注意到,最終的目的是讓每一個圖像都有區分(discriminative)的特徵,自然語言描述也是。所以,爲什麼不嘗試把每一張圖像看成一類呢。(注意這個假設是無監督的,不需要任何標註。)

這種少樣本的分類其實在之前做行人重識別就常用,但行人重識別(1467類,每類9.6張圖像,有人爲ID的標註。)沒有像我們這麼極端。

Flickr30k:31,783類 (1圖像+5描述), 其中訓練圖像爲 29,783類

MSCOCO:123,287類 (1圖像 + ~5描述), 其中訓練圖像爲 113,287類

注意到 Flickr30k中其實有挺多挺像的狗的圖像。

不過我們仍舊將他們處理爲不同的類,希望也能學到細粒度的差別。

(而對於CUHK-PEDES,因爲同一個人的描述都差不多。我們用的是同一個人看作一個類,所以每一類訓練圖片多一些。CUHK-PEDES用了ID annotation,而MSCOCO和Flickr30k我們是沒有用的。)

 

3. 如何結合 文本和圖像一起訓練?

其實,文本和圖像很容易各學各的,來做分類。所以我們需要一個限制,讓他們映射到同一個高層語義空間。

我們採用了一個簡單的方法:在最後分類fc前,讓文本和圖像使用一個W,那麼在update過程中會用一個軟的約束,這就完成了(詳見論文 4.2)。 在實驗中我們發現光用這個W軟約束,結果就很好了。(見論文中StageI的結果)

 

4.訓練收斂麼?

收斂的。歡迎大家看代碼。就是直接softmax loss,沒有trick。

圖像分類收斂的快一些。文本慢一些。在Flickr30k上,ImageCNN收斂的快,

TextCNN是重新開始學的,同時是5個訓練樣本,所以相對慢一些。

 

5. instance loss 是無監督的麼?

instance loss的假設是無監督的,因爲我們沒有用到額外的信息 (類別標註等等)。而是用了 “每張圖就是一類” 這種信息。

 

6. 使用其他無監督方法,比如kmeans 先聚類,能不能達到類似instance loss的結果?

我們嘗試使用預訓練ResNet50提取pool5特徵,分別聚了3000和10000個類。

(聚類很慢,雖然開了多線程,聚10000個類花了1個多小時,當中還怕內存不足,死機。大家請慎重。)

在MSCOCO採用instance loss的結果更好一些。我們認爲聚類其實沒有解決,黑狗/灰狗/兩條狗都是 狗,可能會忽略圖像細節的問題。

 

7. 比結果的時候比較難。因爲大家的網絡都不太相同(不公平),甚至train/test劃分也不同(很多之前的論文都不註明,直接拿來比)。

所以在做表格的時候,我們儘量將所有方法都列了出來。註明不同split。

儘量VGG-19 和 VGG-19來比, ResNet-152 和ResNet-152比。歡迎大家詳見論文。

和我們這篇論文相關的,很多是魯老師的工作,真的推薦大家去看。

 

8. 更深的TextCNN一定更好麼?

這個問題是Reviewer提出的。

相關論文是 Do Convolutional Networks need to be Deep for Text Classification ?

確實,在我們額外的實驗中也發現了這一點。在兩個較大的數據集上,將文本那一路的Res50提升到Res152並沒有顯著提升。

 

9. 一些trick(在其他任務可能不work)

  • 因爲看過bidirectional LSTM一個自然的想法就是 bidirectional CNN,我自己嘗試了,發現不work。插曲:當時在ICML上遇到fb CNN翻譯的poster,問了,他們說,當然可以用啊,只是他們也沒有試之類的。

  • 本文中使用的Position Shift 就是把CNN輸入的文本,隨機前面空幾個位置。類似圖像jitter的操作吧。還是有明顯提升的。詳見論文。

  • 比較靠譜的數據增強 可能是用同義詞替換句子中一些詞。雖然當時下載了libre office的詞庫,但是最後還是沒有用。最後採用的是word2vec來初始化CNN的第一個conv層。某種程度上也含有了近義詞的效果。(相近詞,word vector也相近)

  • 可能數據集中每一類的樣本比較均衡(基本都是1+5個),也是一個我們效果好的原因。不容易過擬合一些“人多”的類。

 

[Results]

  • TextCNN 有沒有學出不同詞,不同的重要程度?(文章附錄)

我們嘗試了從句子中移除一些詞,看移除哪些對匹配score影響最大。

  • 一些圖文互搜結果(文章附錄)

  • 自然語言找行人

  • 細粒度的結果

論文中可能細節說得還不是很清楚,歡迎看代碼/交流。

 

 

--------------更多其他文章-------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章