看圖說話(Image Caption),就是讓計算機對圖像進行文字描述,是結合CV和NLP兩個領域的一種比較綜合的任務,Image Caption模型的輸入是一幅圖像,輸出是對該幅圖像進行描述的一段文字。這項任務要求模型可以識別圖片中的物體、理解物體間的關係,並用一句自然語言表達出來。
論文:
《Show and Tell: A Neural Image Caption Generator》(arXiv:1411.4555)
《Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge》(arXiv:1609.06647)
算法理解:
對於訓練集的一張圖片 I ,其對應的描述爲序列 S={S1,S2,...}(其中 Si 代表句子中的詞)。對於模型 θ,給定輸入圖片I ,模型生成序列 S的概率爲
拆解成連乘的形式後,問題就變成了建模條件概率 P(St|S0,S1,...,St−1,I;θ)。通常來說,RNN是當仁不讓的第一選擇,因爲理論上它可以保留全部上文信息(對於“長時依賴”問題,使用LSTM來緩解),而不像 n-gram 或者 CNN 那樣只能取一個窗口。
將似然函數取對數,得到對數似然函數:
模型的訓練目標就是最大化全部訓練樣本的對數似然之和:
式中 (I,S) 爲訓練樣本。這種極大似然估計的方式等價於使用對數損失函數的經驗風險最小化。
訓練好模型後,對於生成過程,則是根據輸入的一張圖片 I,推斷出最可能的序列來輸出:
當然,計算全部序列的概率然後選出概率最大的序列當然是不可行的,因爲每個位置都有詞表規模的詞作爲候選,搜索規模會隨序列的長度而指數級增長,所以需要用beam search來縮小搜索空間。這時自然就會聯繫到自然語言翻譯,encoder-decoder架構。
模型結構:
借鑑機器翻譯的encoder-decoder:RNN-RNN結構,
encoder採用CNN提取圖片特徵,預訓練模型inceptionV3,將softmax前的固定512維的特徵向量取出。成爲image-embedding
decoder採用LSTM模型,初始時刻輸入image-embedding的特徵向量,輸入序列S={S1,S2,...}經word-embedding後形成512維詞向量。輸入LSTM中512個units。目標序列爲輸入序列右移一個位置。
beam search:搜索局部最優序列算法。減少運算量,可增加描述的豐富性。inference時應用beam search算法,beam size =3
訓練:先單訓LSTM,到loss在2以下時候,趨於穩定後,再聯合CNN一起訓練。困惑度(perplexity)來指導調參
代碼實現:基於tesorflow/model中的im2txt模型,
數據集使用flickr8k,flickr30k,mscoco數據集,格式要求:tfrecord
數據生成和模型訓練,注意config的修改
注意tensorflow不同版本的差異
嘗試優化器,steps
inference結果示例: