1. 程式人生 > >計算機如何理解影象?

計算機如何理解影象?

from:https://community.bigquant.com/t/topic/129422?utm_source=suanfazu&utm_campaign=L3

可能很多人都看過李飛飛的這個演講:李飛飛: 我們怎麼教計算機理解圖片? 4沒有看過的可以去看一下,講得非常棒。她在演講中提到如何才叫理解一幅影象。

近些年深度學習在影象領域可以說取得了爆炸式的發展。首先是影象分類(image classification)這一塊,自2012年Krizhevsky 【1】提出利用深度卷積神經網路(CNN)進行影象分類後,影象分類的準確率年年提高,去年2015年甚至將分類錯誤率降低到了5%以下,直接逼近甚至超過了人類的分類準確率。 然後是目標檢測(object detection)這一塊,藉著CNN的東風,Girshick Kaiming He 兩位大神分別提出R-CNN、SPP net、Fast R-CNN、Faster R-CNN這些網路模型,甚至Kaiming He 去年的一篇文章直接將網路深度加深到前無古人的152層,這些工作帶領目標識別領域進入了一個前所未有的發展高峰期。好,既然現在計算機已經能做到這麼好了,我們可以說計算機已經理解影象了嗎?李飛飛在演講中告訴我們,不,還遠沒有。給計算機輸入如下一副影象,我們不是希望它將這幅影象分到“馬”這個類別中,也不是希望它告訴我這是馬,這是人,這是狗,我希望它能告訴我“一個人騎在一匹馬上,他的狗坐在馬前面”,甚至我希望它能告訴我“在一個陽光明媚的下午,一個穿著牛仔衣服的年輕小夥坐在一匹健壯的馬上,他的愛犬坐在馬的前面,他們相互對望著,看起來非常開心”,這樣,我們才能說計算機‘理解’了影象。那麼怎麼才能做到這一點呢?怎麼才能讓計算機準確地描述影象中的目標以及他們之間的相互關係呢?我相信這才是本文問題的關鍵。

image

接下來的這些內容,我是假設大家都對CNN、RNN、LSTM、word embedding等比較熟悉的.如有不熟悉可以參考《 CNN(卷積神經網路)、RNN(迴圈神經網路)、DNN(深度神經網路)的內部網路結構有什麼區別? 2》,會對理解下面內容有所幫助。

如何讓計算機根據一副影象自動生成它的文字描述?為了解決這個問題,我們得首先跳到另外一個領域,就是機器翻譯領域。機器翻譯面對的是這樣一個問題,輸入一段文字(比如英語),輸出用另一種語言(比如法語)表達同樣意思的一段文字,要求輸出的句子是連貫的、語法正確的並且同時要和輸入的文字表達同樣的意思。過去可能有很多別的方法,但基本都是基於句法規則的,生成的句子顯得不太自然(相信大家以前用Google翻譯的時候都體會過)。但近些年來,人們發現用深度神經網路來做機器翻譯,可以取得非常好的效果。

機器翻譯(machine translation)

思路是這樣的,將輸入句子(source sentence)和目標句子(target sentence)表示在同一個向量空間,當輸入一個句子時,將其encode成一個向量,這個向量包含了句子的語義資訊,然後將這個向量decode,得到目標句子。接下來我們按照encode和decode分成兩個部分來介紹。

Encode

如何將一個句子表示成一個向量形式,同時又要不丟失語義資訊?這篇文章【2】中給出了一種基於卷積操作的方法。如下圖所示:

image

我們可以通過word2vec將句子中每個詞表示成一個K維的向量形式,這裡每個詞向量是表示了詞的語義資訊的,然後進行幾次縱向的卷積操作,最後可以得到一個1*K維的向量,這個向量就被當成
是這個句子的向量表達。

文章【3】中是通過一個RNN來對輸入句子進行encode的,如下圖:

image

把源句子中的詞一個一個順序輸入,RNN對輸入的詞進行如下操作:

image

每一個當前狀態的輸出是基於之前所有詞的輸入,因此文章【3】中將最後一個時刻隱藏層的表達當做整個句子的向量表示。

但我們知道用梯度下降演算法進行訓練時,會出現梯度彌散的現象,解決的辦法是隱藏層使用LSTM,於是文章【4】就是利用LSTM進行的encode,其實就是將上文【3】中的f()函式用LSTM代替,同樣是利用最後一個時刻隱藏層的向量當做整個句子的向量表示。

Decode

上面講了如何對一個句子進行encode表示成一個向量形式,那麼如何把這個向量空間中的一個向量進行decode來得到一個完整句子呢?其實基本也都是用的RNN來進行decode的。

image

我們將源句子的向量表示和目標句子中第i時刻的詞的詞向量一起作為RNN網路的輸入,如下面公式所示,s表示源句子的向量表示(source sentence),V(f_i)表示的第i個詞的詞向量,通過隱藏層計算後,再通過一個softmax函式生成一個K維的向量(這個K表示詞典的長度),向量中每一維的值表示基於前面的詞以及源句子後,出現下一個詞的概率。在訓練階段,我們進行優化使目標句子中的下一個詞出現的概率儘可能的大;在test階段,我們將預測概率最大的一個詞的詞向量作為下一個時刻的輸入,不斷迴圈往復,直到生成完整的目標句子(一般句子的開頭和結尾都會給一個特殊的標籤來表達的)。

image
image

因此我們最後的目標函式表達如下,它表示的是輸入一個英文句子後,輸出一個對應的法語句子的概率是多少,我們希望這個值儘可能的大:

image

最後我們可以將這個網路完整表示為如下所示:

image

當然這是文章【3】中的示意圖,它是RNN-RNN的結構,對於【2】的CNN-RNN,將CNN產生的句子向量作為上圖中的C輸入即可,對於【4】的LSTM-LSTM將上圖中的隱藏層改為LSTM即可。

對於基於深度神經網路的機器翻譯我就簡單介紹到這裡,接下來我們回到正題,如何生成一幅影象的文字描述。

影象描述(Image Descriptions)

其實仔細去想,如果我們將一幅影象表示成一個向量形式,再對這個向量進行decode,其實原理上和機器翻譯非常類似。那麼我們如何將一副影象表示成向量形式呢?

比較普遍的做法是利用【1】中的CNN網路,首先將這個網路在ImageNet上預訓練,然後將倒數第二層的4096維向量作為這個影象的向量表示,通過一個線性變換將其表達為一個D維(和文字向量再同樣維度)的向量。 然後類似機器翻譯中的decode過程,將其作為RNN的輸入,最後產生一段文字,這段文字基本就可以認為是這幅影象的 一個文字描述。如下圖所示:

image

具體實現細節上稍微有些差異,比如【5】中使用的是LSTM模型、影象的向量只是作為0時刻輸入一次、每個詞向量表示為one-hot形式輸入:

image

它的部分結果如下:

image

而文章【6】中在每個時刻都將影象向量和當前的詞向量一起輸入:

image

它的部分結果如下:

image

李飛飛組似乎更關注影象各個目標的資訊,而不是全域性資訊,他們組一直在考慮如何將影象的各個區域(fragments of images)和文字中各個碎片(fragments of sentences)聯絡起來,生成dense descriptions of images【7】【8】,如下:

image

不過這樣做的原因感覺他們希望能提高影象—文字檢索的準確率,看成一個檢索的任務而不是直接生成description 的任務。

總結

生成一幅影象的文字描述是一件很有意義的事情。我們知道人們傳遞資訊一般有三種方式,文字、語音、影象,這三種資訊的傳遞方式各有各的特點。如果能構建一個橋樑將它們聯絡起來,將會更好的傳遞資訊,給人們帶來更多的便利以及想象空間。文字和語音的關聯上人們做了很多的研究,但是影象和文字之間人們似乎一直沒有很有效的將其連線起來。我上面說的這些都是非常好的努力,它幫助計算機更好的去理解影象,並且在影象—文字相關聯的一些任務(比如檢索、問答等)上可以帶來非常大的幫助。

另外非常值得一提的,我們這篇文章最開頭TED演講的主人公李飛飛教授,在將深度學習應用到影象相關領域的這個潮流中起到了非常重要的作用。當年是她著手構建了影象分類的資料庫ImageNet ,並且舉辦了一年一屆的ImageNet Large Scale Visual Recognition Challenge(ILSVRC)比賽,正是有這麼大量的資料集可以訓練以及這個比賽去促進大家,才使得Krizhevsky A的Deep CNN能夠有大量的資料訓練並且拿下2012屆比賽的冠軍,然後讓深度神經網路一下子火爆起來,然後促進了現在影象相關領域的巨大發展。

前段時間,李飛飛組又釋出了一篇文章【9】,這篇文章中又開放了一個非常龐大而細緻的資料集Visual Genome,在這個資料集裡包含了每幅影象中的物件、屬性、關係,這個資料集提供了一個多層次的圖片理解。我們期待這個資料集能像ImageNet一樣,進一步促進計算機去更好的理解影象,帶給我們更多的驚喜。

參考文獻

【1】Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

【2】Kalchbrenner N, Blunsom P. Recurrent Continuous Translation Models[C]//EMNLP. 2013, 3(39): 413.

【3】Cho K, Van Merriënboer B, Gulcehre C, et al. Learning phrase representations using RNN encoder-decoder for statistical machine translation[J]. arXiv preprint arXiv:1406.1078, 2014.

【4】Sutskever I, Vinyals O, Le Q V. Sequence to sequence learning with neural networks[C]//Advances in neural information processing systems. 2014: 3104-3112.Recognition. 2015: 3156-3164.

【6】Mao J, Xu W, Yang Y, et al. Explain images with multimodal recurrent neural networks[J]. arXiv preprint arXiv:1410.1090, 2014.

【7】Karpathy A, Joulin A, Li F F F. Deep fragment embeddings for bidirectional image sentence mapping[C]//Advances in neural information processing systems. 2014: 1889-1897.

【8】Karpathy A, Fei-Fei L. Deep visual-semantic alignments for generating image descriptions[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 3128-3137.

【9】Krishna R, Zhu Y, Groth O, et al. Visual Genome: Connecting Language and Vision Using Crowdsourced Dense Image Annotations[J]. arXiv preprint arXiv:1602.07332, 2016.