實踐 | 如何使用深度學習為照片自動生成文字描述?

七月線上實驗室發表於2018-05-21

  《深度學習 集訓營》明晚(週二)晚8點開營,全程實戰!提供GPU環境、就業指導及內推,2個月挑戰年薪50萬!點選文末“閱讀原文”試聽


影象描述涉及到為給定影象(比如照片)生成人類可讀的文字描述。這個問題對人類而言非常簡單,但對機器來說卻非常困難,因為它既涉及到理解影象的內容,還涉及到將理解到的內容翻譯成自然語言。

 

最近,在為影象自動生成描述(稱為「字幕」)的問題上,深度學習方法已經替代了經典方法並實現了當前最佳的結果。在這篇文章中,你將瞭解可以如何使用深度神經網路模型為照片等影象自動生成描述。

 

讀完本文之後,你將瞭解:

  • 為影象生成文字描述的難點以及將計算機視覺和自然語言處理領域的突破結合起來的必要性。

  • 神經特徵描述模型(即特徵提取器和語言模型)的組成元素。

  • 可以如何將這些模型元素組合到編碼器-解碼器(Encoder-Decoder)中,也許還會用到注意機制。


概述

這篇文章分為三部分,分別是:

1. 使用文字描述影象

2. 神經描述模型

3. 編碼器-解碼器結構


使用文字描述影象

描述影象是指為影象(比如某個物體或場景的照片)生成人類可讀的文字描述。


這個問題有時候也被稱為「自動影象標註」或「影象標註」。


這個問題對人類而言輕而易舉,但對機器來說卻非常困難。

 

快速一瞥足以讓人類指出和描述一個視覺場景的豐富細節。但事實證明,我們的視覺識別模型難以掌握這樣出色的能力。

——《用於生成影象描述的深度視覺-語義對齊》,2015

 

要解決這個問題,既需要理解影象的內容,也需要將其中的含義用詞語表達出來,並且所表達出的詞語必須以正確的方式串接起來才能被理解。這需要將計算機視覺和自然語言處理結合起來,是廣義的人工智慧領域的一大難題。

 

自動描述影象內容是人工智慧領域的一個基本問題,該問題將計算機視覺和自然語言處理連線到了一起。

——《Show and Tell:一種神經影象描述生成器》,2015

 

此外,這個問題也有不同的難度;讓我們通過例子看看這個問題的三種不同變體。


1. 分類影象

從數百個或數千個已知分類中為影象分配一個類別標籤。

將影象分類到已知類別的示例;來自《檢測鱷梨到西葫蘆:我們已經實現了什麼與我們將會實現什麼?》,2013

 

2. 描述影象

生成影象內容的文字描述。

為照片生成描述的示例;來自《用於視覺識別和描述的長期迴圈卷積網路》,2015


3. 標註影象

為影象中的特定區域生成文字描述。

用描述標註影象區域的示例;來自《用於生成影象描述的深度視覺-語義對齊》,2015

 

這個問題還可以延伸到隨時間描述視訊中的影象。

 

在這篇文章中,我們關注的重點是描述影象,我們稱之為影象描述(image captioning)。


神經描述模型

神經網路模型已經主導了自動描述生成領域;這主要是因為這種方法得到了當前最佳的結果。

 

在端到端的神經網路模型之前,生成影象描述的兩種主要方法是基於模板的方法和基於最近鄰並修改已有描述的方法。

 

在將神經網路用於生成描述之前,有兩種方法佔主導地位。第一種涉及到生成描述模板,該模板會基於目標檢測和屬性發現(attribute discovery)的結果進行填充。第二種方法是首先從一個大型資料庫中檢索有描述的相似影象,然後修改這些檢索到的描述以符合查詢的情況。…… 在現在占主導地位的神經網路方法出現後,這兩種方法都已經失去了人們的支援。

——《Show and Tell:一種神經影象描述生成器》,2015

 

用於描述的神經網路模型涉及到兩個主要元素:

1. 特徵提取

2. 語言模型


特徵提取模型

特徵提取模型是一種神經網路。給定一張影象,它可以提取出顯著的特徵,通常用固定長度的向量表示。


提取出的特徵是該影象的內部表徵,不是人類可以直接理解的東西。


用作特徵提取子模型的通常是深度卷積神經網路(CNN)。這種網路可以在影象描述資料集中的影象上直接訓練。


或者可以使用預訓練的模型(比如用於影象分類的當前最佳的模型),或者也可以使用混合方法,即使用預訓練的模型並根據實際問題進行微調。


使用為 ILSVRC 挑戰賽在 ImageNet 資料集上開發的表現最好的模型是很常見的做法,比如 Oxford Vision Geometry Group 模型,簡稱 VGG。


……我們探索了多種解決過擬合的技術。避免過擬合的最明顯方法是將我們系統中的 CNN 元件的權重初始化為一個預訓練的模型。

——《Show and Tell:一種神經影象描述生成器》,2015


特徵提取器


語言模型

一般而言,當一個序列已經給出了一些詞時,語言模型可以預測該序列的下一個詞的概率。


對於影象描述,語言模型這種神經網路可以基於網路提取出的特徵預測描述中的詞序列並根據已經生成的詞構建描述。


常用的方法是使用迴圈神經網路作為語言模型,比如長短期記憶網路(LSTM)。每個輸出時間步驟都會在序列中生成一個新詞。


然後每個生成的詞都會使用一個詞嵌入(比如 word2vec)進行編碼,該編碼會作為輸入被傳遞給解碼器以生成後續的詞。


對該模型的一種改進方法是為輸出序列收集詞在詞彙庫中的概率分佈並搜尋它以生成多個可能的描述。這些描述可以根據似然(likelihood)進行評分和排序。常見的方式是使用波束搜尋(Beam Search)進行這種搜尋。


語言模型可以使用從影象資料集提取出的預計算的特徵單獨訓練得到;也可以使用特徵提取網路或某些組合方法來聯合訓練得到。

語言模型


編碼器-解碼器架構

構建子模型的一種常用方法是使用編碼器-解碼器架構,其中兩個模型是聯合訓練的。


這種模型的基礎是將影象編碼成緊湊的表徵的卷積神經網路,後面跟著一個迴圈神經網路來生成對應的句子。這種模型的訓練目標是最大化給定影象的句子的似然。

——《Show and Tell:一種神經影象描述生成器》,2015


這種架構原本是為機器翻譯開發的,其中輸入的序列(比如法語)會被一個編碼器網路編碼成固定長度的向量。然後一個分立的解碼器網路會讀取這些編碼並用另一種語言(比如英語)生成輸出序列。


除了能力出色外,這種方法的好處是可以在該問題上訓練單個端到端模型。


當將該方法用於影象描述時,編碼器網路使用了深度卷積神經網路,解碼器網路則是 LSTM 層的堆疊。


在機器翻譯中,「編碼器」RNN 會讀取源句子並將其轉換成資訊豐富的固定長度的向量表徵,這種表徵又會被用作「解碼器」RNN 的初始隱藏狀態,進而生成目標句子。我們在這裡提出遵循這種優雅的方案,並使用深度卷積神經網路(CNN)替代編碼器 RNN。

——《Show and Tell:一種神經影象描述生成器》,2015

CNN 和 LSTM 架構的示例,來自《Show and Tell:一種神經影象描述生成器》,2015


使用注意機制的描述模型

編碼器-解碼器的一個侷限性是使用了單個固定長度的表徵來儲存提取出的特徵。


在機器翻譯中,這個問題通過在更豐富的編碼上開發的注意機制而得到了解決,從而讓解碼器可以學習在生成翻譯中的每個詞時應該注意哪裡。


這種方法也已經被用於改進用於影象描述的編碼器-解碼器架構的表現水平——讓解碼器可以學習在生成描述中每個詞時應該關注影象中的哪些部分。


受近來描述生成方面的進步的激勵和在機器翻譯和目標識別中成功應用注意機制的啟發,我們調查了在生成描述時可以關注影象中突出部分的模型。

——《Show and Tell:一種神經影象描述生成器》,2015


這種方法的一大優勢是可以準確視覺化在生成描述中的每個詞時所注意的位置。


我們還通過視覺化展示了模型在生成輸出序列中對應的詞時自動學習關注突出物件的方式。

——《Show and Tell:一種神經影象描述生成器》,2015


用例子理解最簡單,如下:

使用注意的影象描述示例,來自《Show and Tell:一種神經影象描述生成器》,2015


進階閱讀

如果你還想進一步更深入地瞭解影象描述,可以參看這裡給出的資源。


論文

  • 《Show and Tell:一種神經影象描述生成器(Show and Tell: A Neural Image Caption Generator)》,2015:https://arxiv.org/abs/1411.4555

  • 《Show, Attend and Tell:使用視覺注意的神經影象描述生成(Show, Attend and Tell: Neural Image Caption Generation with Visual Attention)》,2015:https://arxiv.org/abs/1502.03044

  • 《用於視覺識別和描述的長期迴圈卷積網路(Long-term recurrent convolutional networks for visual recognition and description)》,2015:https://arxiv.org/abs/1411.4389

  • 《用於生成影象描述的深度視覺-語義對齊(Deep Visual-Semantic Alignments for Generating Image Descriptions)》,2015:https://arxiv.org/abs/1412.2306


文章

  • 維基百科:自動影象標註:https://en.wikipedia.org/wiki/Automatic_image_annotation

  • Show and Tell:在 TensorFlow 中開源的影象描述:https://research.googleblog.com/2016/09/show-and-tell-image-captioning-open.html

  • Andrej Karpathy 和李飛飛:使用卷積網路和迴圈網路的自動影象描述;視訊:https://www.youtube.com/watch?v=xKt21ucdBY0 ;幻燈片:https://cs.stanford.edu/people/karpathy/sfmltalk.pdf


專案

  • 用於生成影象描述的深度視覺-語義對齊,2015:http://cs.stanford.edu/people/karpathy/deepimagesent/

  • NeuralTalk2:執行在 GPU 上的有效影象描述 Torch 程式碼,來自 Andrej Karpathy:https://github.com/karpathy/neuraltalk2


原文連結:https://machinelearningmastery.com/how-to-caption-photos-with-deep-learning/

編譯:機器之心


相關文章