0
本文作者: 三川 | 2017-05-02 18:44 |
雷鋒網(wǎng)按:本文刊載于 Oreilly,雷鋒網(wǎng)編譯。閱讀原文地址請(qǐng)點(diǎn)此 。
玩過(guò)圖像分類(lèi)的開(kāi)發(fā)者不少,許多人或許對(duì)圖像分割(image segmentation)也不陌生,但圖像注解(image caption)的難度,無(wú)疑比前兩者更進(jìn)一步。
原因無(wú)他:利用神經(jīng)網(wǎng)絡(luò)來(lái)生成貼合實(shí)際的圖像注釋?zhuān)枰Y(jié)合最新的計(jì)算機(jī)視覺(jué)和機(jī)器翻譯技術(shù),缺一不可。對(duì)于為輸入圖像生成文字注解,訓(xùn)練神經(jīng)圖像注解模型能使其成功幾率最大化,并能生成新奇的圖像描述。舉個(gè)例子,下圖便是在 MS COCO 數(shù)據(jù)集上訓(xùn)練的神經(jīng)圖像注解生成器,所輸出的潛在注解。
左圖注解:一個(gè)灰衣男子揮舞棒子,黑衣男子旁觀;右圖注解:一輛大巴車(chē)“坐”在一個(gè)人旁邊
本文是一篇中級(jí)教程,旨在教給大家如何在 Flickr30k 數(shù)據(jù)集上訓(xùn)練圖像注解生成模型,使用的是谷歌 Show and Tell 模型的變體。我們使用 TensorFlow 框架來(lái)創(chuàng)建、訓(xùn)練、測(cè)試模型,因?yàn)?nbsp;TensorFlow 相對(duì)容易使用,并且有不斷增長(zhǎng)的龐大用戶(hù)社群。
近來(lái)深度學(xué)習(xí)在 CV(計(jì)算機(jī)視覺(jué))和 NLP(自然語(yǔ)言處理)領(lǐng)域的成功,激發(fā)了 AI 研究人員在這兩者的交叉領(lǐng)域探索新的應(yīng)用。而作為結(jié)果的注解生成模型,需要平衡對(duì)視覺(jué)線(xiàn)索和自然語(yǔ)言的理解。
這兩門(mén)傳統(tǒng)上涇渭分明、并不相關(guān)的領(lǐng)域之間所產(chǎn)生的交集,有潛力在業(yè)內(nèi)產(chǎn)生廣泛的影響。該技術(shù)有一些直接應(yīng)用場(chǎng)景,比如為 YouTube 視頻生成簡(jiǎn)介,又比如為無(wú)標(biāo)簽圖像做注解,但其價(jià)值遠(yuǎn)不止于此。類(lèi)似于傳統(tǒng)的 CV 技術(shù)試圖讓現(xiàn)實(shí)世界變得讓計(jì)算機(jī)更容易接觸更容易理解,該技術(shù)有潛力讓現(xiàn)實(shí)世界變得對(duì)于我們來(lái)說(shuō)更容易理解。它可以作為我們的導(dǎo)游、日常生活的視覺(jué)輔助,比如意大利 AI 公司 Eyra 的為視覺(jué)障礙患者開(kāi)發(fā)的可穿戴設(shè)備 Horus (古埃及神話(huà)中的荷魯斯之眼)。
首先,你需要安裝 TensorFlow。
其次,你需要 pandas, opencv2 以及 Jupyter 來(lái)跑相關(guān)代碼。但是,為了簡(jiǎn)化安裝過(guò)程,我們強(qiáng)烈推薦你在我們的 GitHub 資源庫(kù)里跟隨 Docker 的安裝指南。
你還需要下載 Flickr30k 數(shù)據(jù)集的圖像注解和 image embeddings。下載鏈接也在 GitHub 資源庫(kù)里。
現(xiàn)在教程開(kāi)始。
在高層級(jí),這就是我們將要訓(xùn)練的模型。每一幅圖像將會(huì)用深度 CNN 編碼成 4,096 維的矢量表示。一個(gè)語(yǔ)言生成 RNN 會(huì)隨后對(duì)其按次序解碼,成為自然語(yǔ)言描述。
作為一個(gè)歷史悠久的 CV 任務(wù),圖像分類(lèi)背后有許多強(qiáng)大模型。圖像分類(lèi)能把圖像中相關(guān)聯(lián)的形狀、物體的視覺(jué)信息拼湊到一起,把圖像放入物體類(lèi)別中。針對(duì)其他 CV 任務(wù)的機(jī)器學(xué)習(xí)模型,建立在圖像分類(lèi)的基礎(chǔ)之上,比如物體識(shí)別和圖像分割。它們不僅能對(duì)提供的信息進(jìn)行識(shí)別,還能學(xué)習(xí)如何解讀 2D 空間,調(diào)和兩種理解,并決定圖像中物體信息的位置分布。
對(duì)于注釋生成,這引發(fā)了兩個(gè)問(wèn)題:
我們?nèi)绾纬浞掷脠D像分類(lèi)模型的成功,從圖像提取重要信息?
我們的模型,該如何調(diào)和對(duì)語(yǔ)言和圖像的理解?
我們可以利用已有的模型,推動(dòng)圖像注解。遷移學(xué)習(xí)使得——在不同任務(wù)上訓(xùn)練神經(jīng)網(wǎng)絡(luò)而學(xué)習(xí)到的數(shù)據(jù)變形,能用于我們的數(shù)據(jù)。在我們的例子中,VGG-16 圖像分類(lèi)模型導(dǎo)入 224x224 分辨率的圖像,生成對(duì)分類(lèi)圖像非常有用的 4,096 維特征矢量。
我們可以把 VGG-16 模型的表示(即 image embedding)用于訓(xùn)練其他模型上面。受篇幅限制,本文對(duì) VGG-16 的架構(gòu)不欲詳述,并預(yù)先計(jì)算好了 4,096 維特征,來(lái)加速訓(xùn)練。
載入 VGG 圖像特征和圖像注解比較直接:
def get_data(annotation_path, feature_path):
annotations = pd.read_table(annotation_path, sep='\t', header=None, names=['image', 'caption'])
return np.load(feature_path,'r'), annotations['caption'].values
理解注解
有了圖像表示,我們需要模型來(lái)學(xué)習(xí)把它解碼為可理解的注解。由于文本的序列本質(zhì),我們需利用 RNN/LSTM 中的循環(huán)。對(duì)于序列中的給定詞語(yǔ),這些網(wǎng)絡(luò)被訓(xùn)練,用以預(yù)測(cè)下一個(gè)詞語(yǔ)以及圖像表示。
LSTM 單元允許模型在注解詞語(yǔ)序列中,更好地選擇使用哪條信息、記憶什么、又要忘記什么。TensorFlow 提供了一個(gè) wrapper 函數(shù),來(lái)對(duì)給定輸入、輸出維度生成 LSTM 層。
為了把詞語(yǔ)轉(zhuǎn)換成適合 LSTM 輸入的固定長(zhǎng)度表示,我們使用了一個(gè) embedding 層,它能學(xué)習(xí)把詞語(yǔ)映射到 256 維的特征(或 word-embedding)。Word-embedding 幫助我們把詞語(yǔ)表示為矢量,相近的詞語(yǔ)矢量在語(yǔ)義上也是近似的。
在 VGG-16 圖像分類(lèi)器里,卷積層提取了 4,096 維表示,傳入最終的 softmax 層進(jìn)行分類(lèi)。由于 LSTM 單元需要 256 維文本特征作為輸入,我們需要把圖像表示轉(zhuǎn)譯為針對(duì)目標(biāo)注解的表示。為實(shí)現(xiàn)這一點(diǎn),我們使用了另一個(gè) embedding 層,學(xué)習(xí)把 4,096 維圖像特征映射到 256 維文本特征的空間。
整體上,這就是谷歌 Show and Tell 模型看起來(lái)的樣子:
上圖中, {s0, s1, ..., sN}代表了注解中我們想要預(yù)測(cè)的詞語(yǔ), {wes0, wes1, ..., wesN-1} 是每個(gè)詞的 word embedding 矢量。LSTM 的輸出 {p1, p2, ..., pN} 是模型生成的概率分布,針對(duì)句子中的下一個(gè)詞。該模型被訓(xùn)練來(lái)最小化每個(gè)詞語(yǔ)對(duì)數(shù)概率(log probabilities )的負(fù)數(shù)總和。
訓(xùn)練之后,我們有了一個(gè)模型。給定圖像和所有此前的詞語(yǔ),它能給出下一步某個(gè)詞出現(xiàn)在注解中的概率。如何用它來(lái)生成新注解呢?
最簡(jiǎn)單的辦法,是拿來(lái)一個(gè)輸入圖像,輸出下一個(gè)可能性最高的詞語(yǔ),創(chuàng)建一個(gè)簡(jiǎn)單的圖像注解。
這在許多情況下會(huì)奏,但“貪婪”地使用每一個(gè)概率最大的詞語(yǔ),未必能獲得整體上概率最大的注解。
繞過(guò)這個(gè)難題的一個(gè)潛在方案,是采用一個(gè)名為"Beam Search"的方法。該算法會(huì)對(duì)長(zhǎng)度 t 以?xún)?nèi)的 k 個(gè)最佳語(yǔ)句集反復(fù)考量,作為候選來(lái)生成 t + 1 大小的句子,只保留結(jié)果中的 k 個(gè)最佳選擇。這允許開(kāi)發(fā)者探索一個(gè)較大的優(yōu)質(zhì)注解空間,同時(shí)讓推理在計(jì)算上可追蹤。在下面的例子里,算法保持了一個(gè) k = 2 的候選句子列表,即每個(gè)垂直時(shí)間步到每個(gè)加粗詞語(yǔ)的路線(xiàn)。
對(duì)于學(xué)習(xí)把圖像映射到人類(lèi)級(jí)別的文字注解,該神經(jīng)圖像注解生成器提供了一個(gè)十分有用的框架。銅鼓偶在大量圖像—注解成對(duì)數(shù)據(jù)上訓(xùn)練,該模型學(xué)會(huì)了通過(guò)視覺(jué)特征抓取相關(guān)語(yǔ)義信息。
但對(duì)于靜態(tài)圖片而言,嵌入我們的注解生成器,將會(huì)聚焦于圖像中對(duì)分類(lèi)有用的特征,而不是對(duì)注解生成有用的特征。為提升每個(gè)特征里涵蓋的與任務(wù)相關(guān)的信息,我們可以訓(xùn)練圖像嵌入模型(用來(lái)對(duì)特征進(jìn)行編碼的 VGG-16 網(wǎng)絡(luò))作為注解生成模型的一部分。這使得我們能為圖像編碼器調(diào)參,以更符合注解生成器的角色。
另外,如果我們仔細(xì)觀察生成的注解,會(huì)發(fā)現(xiàn)它們基本是日常、常見(jiàn)的情形。下圖便是例子:
幾乎可以肯定,這圖片是“長(zhǎng)頸鹿站在一棵樹(shù)旁邊”。但是,如果我們看看其他圖片,會(huì)立刻發(fā)現(xiàn)無(wú)論對(duì)于哪一張生成的注解都是“長(zhǎng)頸鹿站在一棵樹(shù)旁邊”。這是因?yàn)橛?xùn)練集中的長(zhǎng)頸鹿都出現(xiàn)在樹(shù)旁邊。
首先,如果你想要提升該模型,你需要看看谷歌的開(kāi)源 Show and Tell 神經(jīng)網(wǎng)絡(luò)。它用 MS COCO 數(shù)據(jù)集和 Inception-v3 圖像嵌入訓(xùn)練。
現(xiàn)有的前沿圖像注解模型會(huì)包含一個(gè)視覺(jué)注意力機(jī)制(visual attention mechanism),使得模型能發(fā)現(xiàn)圖像中感興趣的部分,因而能在生成注解時(shí)選擇性地聚焦。
另外,如果你對(duì)注解生成的前沿執(zhí)行非常好奇,不妨看看這一篇論文:Show, Attend, and Tell: Neural Image Caption Generation with Visual Attention。
雷鋒網(wǎng)提醒:作者已將本文所有 Python 代碼上傳于 GitHub,請(qǐng)戳這里。
從初級(jí)到高級(jí),理論+實(shí)戰(zhàn),一站式深度了解 TensorFlow!
本課程面向深度學(xué)習(xí)開(kāi)發(fā)者,講授如何利用 TensorFlow 解決圖像識(shí)別、文本分析等具體問(wèn)題。課程跨度為 10 周,將從 TensorFlow 的原理與基礎(chǔ)實(shí)戰(zhàn)技巧開(kāi)始,一步步教授學(xué)員如何在 TensorFlow 上搭建 CNN、自編碼、RNN、GAN 等模型,并最終掌握一整套基于 TensorFlow 做深度學(xué)習(xí)開(kāi)發(fā)的專(zhuān)業(yè)技能。
兩名授課老師佟達(dá)、白發(fā)川身為 ThoughtWorks 的資深技術(shù)專(zhuān)家,具有豐富的大數(shù)據(jù)平臺(tái)搭建、深度學(xué)習(xí)系統(tǒng)開(kāi)發(fā)項(xiàng)目經(jīng)驗(yàn)。
時(shí)間:每周二、四晚 20:00-21:00
開(kāi)課時(shí)長(zhǎng):總學(xué)時(shí) 20 小時(shí),分 10 周完成,每周2次,每次 1 小時(shí)
線(xiàn)上授課地址:http://www.mooc.ai/
相關(guān)文章:
教你從零開(kāi)始在 TensorFlow 上搭建 RNN(完整代碼)!
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。