【博客存檔】深度學習之Neural Image Caption

前言

如何對圖像進行文本描述是人工智慧中,計算機視覺與自然語言處理的交叉學科,前端時間TensorFlow官方model中有推出Neural Image Caption,之前也在南京deeplearning meetup分享中提到這塊的東西,因為當時還沒有跑完,沒有做進一步描述,這段時間也在仔細看了相關的幾篇paper和項目,主要是stanford的neuraltalk,neuraltalk2, Deep Visual-Semantic Alignments for Generating Image Descriptions, Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge, Show and tell: A neural image caption generator。算是對Image Caption做了一個基本的了解,接下來這篇文章會詳細描述下如何做Image Caption這一項集合了計算機視覺與自然語言處理工作的任務。

Paper原理

主要對比了Google和stanford的兩篇paper,感覺差不多,感覺stanford的paper寫的更詳細、更細節;基本上包括以下幾個部分:

Representing images

Deep Visual-Semantic Alignments for Generating Image Descriptions 這篇paper裡面使用的RCNN(Region Convolutional Neural Network)(Rich feature hierarchies for accurate object detection and semantic segmentation),主要用來做object detection,使用的是ImageNet 200 classes的pre-trained的model,使用top 19個檢測的位置加上全圖,然後計算每一個bounding box的所有像素通過pre-trained模型後到分類器的4096維向量,即將bounding box下的所有像素做CNN的計算,類似於做特徵表示:

經過改公式後每一張圖像可以表示為{v_i,|i=1,..,20},W_m是h*4096的矩陣,作者實驗中h在1000到1600之間,每一張圖像可以由20個h維向量表示。Google的paper中,直接把inception-v3最後分類之前的向量表示作為Image的representation,認為這部分的Image representation已經有足夠的表徵力了,在這部分處理的很簡單。可以看看ShowAndTellModel 和ops下的image_embedding,im2txt中使用的是slim,這裡要看懂代碼需要稍微了解下slim的model還有怎麼讀入model即可。

Representing sentences

傳統的方法是講所有的獨立的詞映射為詞向量,但是這類方法沒有考慮詞的順序和句子中詞的上下文信息。一種提升的方法是用二元組的方法,但是這個一定程度上也會有其他的問題,stanford那篇文章使用的是bidirectional Recurrent Neural Network(雙向RNN?NLP這塊我不是特別懂,有弄錯的可以評論指出來下)去來算詞向量,主要是建模單詞序列的問題,將每一個詞轉換為h維向量,建模會考慮每一個單詞的不定長的向下文影響:

W_w是使用word2vec生成的詞的向量表示(在實際中,作者發現即使是使用隨機初始化,最終結果的性能也相差不大),用來作為初始化,II_t是詞在詞庫中的index, h_t^b和h_t^f分別從不同方向來建模context,最終的結果是詞的表示會考慮到周圍(前後)上下文的影響,這裡就解決了如何去表示sentences。

Alignment object

前面描述了如果將圖像與和句子表示成為計算機能夠理解的向量,這裡文章中設定了一個image-sentence score來表示句子描述與圖像匹配程度,,從裡面有提到使用點乘,一種相似度度量的標準來作為圖像和句子之間的得分:

而stanford的這篇paer中使用了一種簡化的方法來衡量圖像和句子的得分:

有了相似性度量的方法後,接下來是定義loss函數,也就是說定義怎麼讓計算機去找更優的目標函數:

圖中S_kk表示訓練數據中存在的image-sentence pair,這個公式實質感覺是感覺做了一個trade-off,雙層循環遍歷訓練數據中的sentence之後在遍歷image數據,來找最大化,這個目標函數的意思就是保證所有訓練數據中的圖像生成的sentences的得分最大化,能夠保證aligned的image-sentences pairs相對於misaligned的image-sentences pairs有更高的得分。而google的paper則是另外一種設計方法,和stanford的那篇paper不同的是,這裡使用LSTM,建模前後依賴關係,而不像stanford的會在image和sentence向量化之後考慮最大化sentence-images pair的得分:

通過訓練數據集中的image和sentence的向量化數據,建模sentence各個word之間的關係,通過最小化所有sentences的word的在每個LSTM step中的正確性:

整個設計考量比stanford的更簡單,更粗暴。

code

兩篇paper都在github上有各自的開源項目:neuraltalk,neuraltalk2,這兩個是torch的實現,基本源於上面說的stanford的paper,im2text,跑了下各自的代碼,談談個人感受吧,在測試多個圖像之後,個人主觀(純屬個人意見)感覺im2text的性能整體感覺不如neuraltalk2,從模型原理上來看不如stanford的那篇paper的模型設計嚴謹,而且RCNN可能在object detection下的性能更好的體現在對圖像內容尤其是region信息這塊,後續的與此相應地相似度度量設計和目標函數的設計,主觀上感覺更加嚴謹,不過這個是我的個人感覺,可能完全不正確,希望看到這篇博客的對image caption研究比較深的能夠給點對比意見。再從代碼可讀性來說,可能我python和tensorflow比較熟,所以感覺代碼這塊im2text寫的比較好,代碼量不多,大家有興趣的可以感受下,不過如果要重現結果的話,還是用點比較好的GPU,我使用k20,跑了大概兩周到三周的樣子。

照例貼出一些跑的例子:


推薦閱讀:

[乾貨|實踐] TensorBoard可視化
YJango的前饋神經網路--代碼LV1
TensorFlow與中文手寫漢字識別

TAG:计算机视觉 | 深度学习DeepLearning | TensorFlow |