華文網

手把手教你用TensorFlow實現看圖說話|教程+代碼

王新民 編譯整理

看圖說話這種技能,我們人類在幼稚園時就掌握了,

機器們前赴後繼學了這麼多年,也終於可以對圖像進行最簡單的描述。

O’reilly出版社和TensorFlow團隊聯合發佈了一份教程,詳細介紹了如何在Google的Show and Tell模型基礎上,用Flickr30k資料集來訓練一個圖像描述生成器。模型的創建、訓練和測試都基於TensorFlow。

如果你一時想不起O’reilly是什麼,量子位很願意幫你回憶:

好了,看教程:

準備工作

裝好TensorFlow;

安裝pandas、opencv2、Jupyter庫;

圖像描述生成模型

△ 圖像描述生成模型的網路示意圖。

該網路輸入馬的圖像,經由深度卷積神經網路Deep CNN和語言生成模型RNN(迴圈神經網路)學習訓練,最終得到字幕生成網路的模型。

這就是一個我們將要訓練的網路結構示意圖。深度卷積神經網路將每個輸入圖像進行編碼表示成一個4,096維的向量,利用迴圈神經網路的語言生成模型解碼該向量,

生成對輸入圖像的描述。

圖像描述生成是圖像分類的擴展

圖像分類是一種經典的電腦視覺任務,可以使用很多強大的經典分類模型。分類模型是通過將圖像中存在的形狀和物體的相關視覺資訊拼湊在一起,以實現對圖像中物體的識別。

機器學習模型可以被應用到電腦視覺任務中,例如物體檢測和圖像分割,不僅需要識別圖像中的資訊,

而且還要學習和解釋呈現出的2D空間結構,融合這兩種資訊,來確定物體在圖像中的位置資訊。想要實現字幕生成,我們需要解決以下兩個問題:

1. 我們如何在已有成功的圖像分類模型的基礎上,從圖像中獲取重要資訊?

2. 我們的模型如何在理解圖像的基礎上,融合資訊實現字幕生成?

運用遷移學習

我們可以利用現有的模型來説明提取圖像資訊。遷移學習允許我們用現有用於訓練不同任務的神經網路,

通過資料格式轉換,將這些網路應用到我們的資料之中。

在我們的實驗中,該vgg-16圖像分類模型的輸入圖像格式為224×224圖元,最終會產生一個4096維的特徵向量,連接到多層全連接網路進行圖像分類。

我們可以使用vgg-16網路模型的特徵提取層,用來完善我們的字幕生成網路。在這篇文章的工作中,我們抽象出vgg-16網路的特徵提取層和預先計算的4096維特徵,

這樣就省去了圖像的預訓練步驟,來加速全域網路訓練進程。

載入VGG網路特徵和實現圖像標注功能的代碼是相對簡單的:

def get_data(annotation_path, feature_path):理解圖像描述

現在,我們對圖像標注了多個物體標籤,我們需要讓模型學習將表示標籤解碼成一個可理解的標題。

由於文本具有連續性,我們利用RNN及LSTM網路,來訓練在給定已有前面單詞的情況下網路預測後續一系列描述圖像的句子的功能。

由於長短期記憶模型(LSTM)單位的存在,使得模型更好地在字幕單詞序列中提取到關鍵資訊,選擇性記住某些內容以及忘記某些無用的資訊。TensorFlow提供了一個封裝函數,用於在給定輸入和確定輸出維度的條件下生成一個LSTM網路層。

為了將單詞轉化成適合於LSTM網路輸入的具有固定長度的表示序列,我們使用一個嵌入層來學習如何將單詞映射到256維特徵,即詞語嵌入操作。詞語嵌入幫助將我們的單詞表示為向量形式,那麼類似的單詞向量就說明對應的句子在語義上也是相似的。

在VGG-16網路所構建的圖像分類器中,卷積層提取到的4,096維向量表示將通過softmax層進行圖像分類。由於LSTM單元更支援用256維文本特徵作為輸入,我們需要將圖像表示格式轉換為用於描述序列的表示格式。因此,我們添加了嵌入層,該層能夠將4,096維圖像特徵映射到另一個256維文本特徵的向量空間。

建立和訓練模型

下圖展示了看圖說話模型的原理:

在該圖中,{s0,s1,…,sN}表示我們試圖預測的描述單詞,{wes0,wes1,…,wesN-1}是每個單詞的字嵌入向量。LSTM的輸出{p1,p2,…,pN}是由該模型基於原有的單詞序列為下一個單詞生成的概率分佈。該模型的訓練目標是為了最大化每個單詞對數概率的總和指標。

def build_model(self):通過推斷生成描述

訓練後,我們得到一個模型,能夠根據圖像和標題的已有單詞給出下一個單詞出現的概率。 那麼我們該如何用這個網路來產生新的字幕?

最簡單的方法是根據輸入圖像並反覆運算輸出下一個最可能的單詞,來構建單個標題。

def build_generator(self, maxlen, batchsize=1):

在許多情況下,這種方法是比較有效的。但是通過貪心演算法來選取最可能的單詞序列,我們可能不會得到一句連貫通順的字幕序列。

為避免這種情況,一個解決辦法是使用一種叫做“集束搜索(Beam Search)”的演算法。該演算法反覆運算地使用k個長度為t的最佳句子集合來生成長度為t+1的候選句子,並且能夠自動找到最優的k值。這個演算法在易於處理推理計算的同時,也在探索生成更合適的標題長度。在下面的示例中,在搜索每個垂直時間步長的粗體字路徑中,此演算法能夠列出一系列k=2的最佳候選句子。

局限性和討論

神經網路實現的圖像描述生成器,為學習從影像對應到自然語言圖像描述提供了一個有用的框架。通過對大量圖像和對應標題的集合進行訓練,該模型能夠從視覺特徵中捕獲相關的語義資訊。

然而,使用靜態圖像時,字幕生成器將專注於提取對圖像分類有用的圖像特徵,而不一定是對字幕生成有用的特徵。為了提高每個特徵中所包含相關任務資訊的數量,我們可以將圖像嵌入模型,即用於編碼特徵的VGG-16網路,來作為字幕生成模型進行訓練,使網路在反向傳播過程中對圖像編碼器進行微調,以更好地實現字幕生成的功能。

此外,如果我們真正仔細研讀生成的字幕序列,我們會注意到都是比較普通而且變化不大的句子。拿如下的圖像作為例子:

△ 一隻長頸鹿站在樹的旁邊

此圖片的對應生成字幕是“長頸鹿站在樹旁邊”。但是如果我們觀察其他圖片,我們可能會注意到,對於任何帶有長頸鹿照片,它可能都會生成標題“一隻長頸鹿站在樹的旁邊”,因為在訓練集中,帶有長頸鹿的圖像樣本經常出現在樹林附近。

後續工作

首先,如果你想改進這裡字幕生成的模型,可以看看穀歌的開源項目Show and Tell network,是利用MS COCO資料集和一個三層圖像嵌入模型進行訓練生成的預測網路。

目前最先進的圖像字幕模型引入了視覺注意機制,其允許模型關注圖像中特定的區域並且生成字幕時選擇性地關注特定類別的資訊。

此外,如果您對這種最先進的字幕生成功能實現感興趣,請查看Yoshua Bengio的論文:Show, Attend, and Tell: Neural Image Caption Generation with Visual Attention。

qbitbot,注明“加入門群”並介紹一下你自己,如果符合要求,我們會拉你入群。

由於長短期記憶模型(LSTM)單位的存在,使得模型更好地在字幕單詞序列中提取到關鍵資訊,選擇性記住某些內容以及忘記某些無用的資訊。TensorFlow提供了一個封裝函數,用於在給定輸入和確定輸出維度的條件下生成一個LSTM網路層。

為了將單詞轉化成適合於LSTM網路輸入的具有固定長度的表示序列,我們使用一個嵌入層來學習如何將單詞映射到256維特徵,即詞語嵌入操作。詞語嵌入幫助將我們的單詞表示為向量形式,那麼類似的單詞向量就說明對應的句子在語義上也是相似的。

在VGG-16網路所構建的圖像分類器中,卷積層提取到的4,096維向量表示將通過softmax層進行圖像分類。由於LSTM單元更支援用256維文本特徵作為輸入,我們需要將圖像表示格式轉換為用於描述序列的表示格式。因此,我們添加了嵌入層,該層能夠將4,096維圖像特徵映射到另一個256維文本特徵的向量空間。

建立和訓練模型

下圖展示了看圖說話模型的原理:

在該圖中,{s0,s1,…,sN}表示我們試圖預測的描述單詞,{wes0,wes1,…,wesN-1}是每個單詞的字嵌入向量。LSTM的輸出{p1,p2,…,pN}是由該模型基於原有的單詞序列為下一個單詞生成的概率分佈。該模型的訓練目標是為了最大化每個單詞對數概率的總和指標。

def build_model(self):通過推斷生成描述

訓練後,我們得到一個模型,能夠根據圖像和標題的已有單詞給出下一個單詞出現的概率。 那麼我們該如何用這個網路來產生新的字幕?

最簡單的方法是根據輸入圖像並反覆運算輸出下一個最可能的單詞,來構建單個標題。

def build_generator(self, maxlen, batchsize=1):

在許多情況下,這種方法是比較有效的。但是通過貪心演算法來選取最可能的單詞序列,我們可能不會得到一句連貫通順的字幕序列。

為避免這種情況,一個解決辦法是使用一種叫做“集束搜索(Beam Search)”的演算法。該演算法反覆運算地使用k個長度為t的最佳句子集合來生成長度為t+1的候選句子,並且能夠自動找到最優的k值。這個演算法在易於處理推理計算的同時,也在探索生成更合適的標題長度。在下面的示例中,在搜索每個垂直時間步長的粗體字路徑中,此演算法能夠列出一系列k=2的最佳候選句子。

局限性和討論

神經網路實現的圖像描述生成器,為學習從影像對應到自然語言圖像描述提供了一個有用的框架。通過對大量圖像和對應標題的集合進行訓練,該模型能夠從視覺特徵中捕獲相關的語義資訊。

然而,使用靜態圖像時,字幕生成器將專注於提取對圖像分類有用的圖像特徵,而不一定是對字幕生成有用的特徵。為了提高每個特徵中所包含相關任務資訊的數量,我們可以將圖像嵌入模型,即用於編碼特徵的VGG-16網路,來作為字幕生成模型進行訓練,使網路在反向傳播過程中對圖像編碼器進行微調,以更好地實現字幕生成的功能。

此外,如果我們真正仔細研讀生成的字幕序列,我們會注意到都是比較普通而且變化不大的句子。拿如下的圖像作為例子:

△ 一隻長頸鹿站在樹的旁邊

此圖片的對應生成字幕是“長頸鹿站在樹旁邊”。但是如果我們觀察其他圖片,我們可能會注意到,對於任何帶有長頸鹿照片,它可能都會生成標題“一隻長頸鹿站在樹的旁邊”,因為在訓練集中,帶有長頸鹿的圖像樣本經常出現在樹林附近。

後續工作

首先,如果你想改進這裡字幕生成的模型,可以看看穀歌的開源項目Show and Tell network,是利用MS COCO資料集和一個三層圖像嵌入模型進行訓練生成的預測網路。

目前最先進的圖像字幕模型引入了視覺注意機制,其允許模型關注圖像中特定的區域並且生成字幕時選擇性地關注特定類別的資訊。

此外,如果您對這種最先進的字幕生成功能實現感興趣,請查看Yoshua Bengio的論文:Show, Attend, and Tell: Neural Image Caption Generation with Visual Attention。

qbitbot,注明“加入門群”並介紹一下你自己,如果符合要求,我們會拉你入群。