計算機如何理解圖像?
國外有組織已經能夠做到讓計算機識別圖像,認清圖片里有幾個人,在做什麼,根據背景判斷時間天氣。請問他們是如何實現的,講一講概念就好,在我印象里,計算機的圖像處理無非就是坐標,RGB。計算機並不具備理解圖像的能力,僅擁有圖像對比能力。所以,能不能給我梳理一下概念。
根據題主對問題的描述,我認為將問題改成「計算機如何『理解』圖像?」會更合適。
可能很多人都看過李飛飛的這個演講:李飛飛: 我們怎麼教計算機理解圖片?,沒有看過的可以去看一下,講得非常棒。她在演講中提到如何才叫理解一幅圖像。
近些年深度學習在圖像領域可以說取得了爆炸式的發展。首先是圖像分類(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層,這些工作帶領目標識別領域進入了一個前所未有的發展高峰期。好,既然現在計算機已經能做到這麼好了,我們可以說計算機已經理解圖像了嗎?李飛飛在演講中告訴我們,不,還遠沒有。給計算機輸入如下一副圖像,我們不是希望它將這幅圖像分到「馬」這個類別中,也不是希望它告訴我這是馬,這是人,這是狗,我希望它能告訴我「一個人騎在一匹馬上,他的狗坐在馬前面」,甚至我希望它能告訴我「在一個陽光明媚的下午,一個穿著牛仔衣服的年輕小伙坐在一匹健壯的馬上,他的愛犬坐在馬的前面,他們相互對望著,看起來非常開心」,這樣,我們才能說計算機『理解』了圖像。那麼怎麼才能做到這一點呢?怎麼才能讓計算機準確地描述圖像中的目標以及他們之間的相互關係呢?我相信這才是題主想要問的問題。
接下來的這些內容,我是假設大家都對CNN、RNN、LSTM、word embedding等比較熟悉的,如果不熟悉,可以去看一看我們之前的這篇回答(CNN(卷積神經網路)、RNN(循環神經網路)、DNN(深度神經網路)的內部網路結構有什麼區別? - Ph.D(er) 的回答),將會對你理解接下來的內容非常有幫助。
如何讓計算機根據一副圖像自動生成它的文字描述?為了解決這個問題,我們得首先跳到另外一個領域,就是機器翻譯領域。機器翻譯面對的是這樣一個問題,輸入一段文字(比如英語),輸出用另一種語言(比如法語)表達同樣意思的一段文字,要求輸出的句子是連貫的、語法正確的並且同時要和輸入的文字表達同樣的意思。過去可能有很多別的方法,但基本都是基於句法規則的,生成的句子顯得不太自然(相信大家以前用Google翻譯的時候都體會過)。但近些年來,人們發現用深度神經網路來做機器翻譯,可以取得非常好的效果。
機器翻譯(machine
translation)
思路是這樣的,將輸入句子(source sentence)和目標句子(target sentence)表示在同一個向量空間,當輸入一個句子時,將其encode成一個向量,這個向量包含了句子的語義信息,然後將這個向量decode,得到目標句子。接下來我們按照encode和decode分成兩個部分來介紹。
Encode
如何將一個句子表示成一個向量形式,同時又要不丟失語義信息?這篇文章【2】中給出了一種基於卷積操作的方法。如下圖所示:
我們可以通過word2vec將句子中每個詞表示成一個K維的向量形式,這裡每個詞向量是表示了詞的語義信息的,然後進行幾次縱向的卷積操作,最後可以得到一個1*K維的向量,這個向量就被當成是這個句子的向量表達。
文章【3】中是通過一個RNN來對輸入句子進行encode的,如下圖:
把源句子中的詞一個一個順序輸入,RNN對輸入的詞進行如下操作:
每一個當前狀態的輸出是基於之前所有詞的輸入,因此文章【3】中將最後一個時刻隱藏層的表達當做整個句子的向量表示。
但我們知道用梯度下降演算法進行訓練時,會出現梯度彌散的現象,解決的辦法是隱藏層使用LSTM,於是文章【4】就是利用LSTM進行的encode,其實就是將上文【3】中的f()函數用LSTM代替,同樣是利用最後一個時刻隱藏層的向量當做整個句子的向量表示。
Decode
上面講了如何對一個句子進行encode表示成一個向量形式,那麼如何把這個向量空間中的一個向量進行decode來得到一個完整句子呢?其實基本也都是用的RNN來進行decode的。
我們將源句子的向量表示和目標句子中第i時刻的詞的詞向量一起作為RNN網路的輸入,如下面公式所示,s表示源句子的向量表示(source sentence),V(f_i)表示的第i個詞的詞向量,通過隱藏層計算後,再通過一個softmax函數生成一個K維的向量(這個K表示詞典的長度),向量中每一維的值表示基於前面的詞以及源句子後,出現下一個詞的概率。在訓練階段,我們進行優化使目標句子中的下一個詞出現的概率儘可能的大;在test階段,我們將預測概率最大的一個詞的詞向量作為下一個時刻的輸入,不斷循環往複,直到生成完整的目標句子(一般句子的開頭和結尾都會給一個特殊的標籤來表達的)。
因此我們最後的目標函數表達如下,它表示的是輸入一個英文句子後,輸出一個對應的法語句子的概率是多少,我們希望這個值儘可能的大:
最後我們可以將這個網路完整表示為如下所示:
當然這是文章【3】中的示意圖,它是RNN-RNN的結構,對於【2】的CNN-RNN,將CNN產生的句子向量作為上圖中的C輸入即可,對於【4】的LSTM-LSTM將上圖中的隱藏層改為LSTM即可。
對於基於深度神經網路的機器翻譯我就簡單介紹到這裡,接下來我們回到正題,如何生成一幅圖像的文字描述。
圖像描述(Image Descriptions)
其實仔細去想,如果我們將一幅圖像表示成一個向量形式,再對這個向量進行decode,其實原理上和機器翻譯非常類似。那麼我們如何將一副圖像表示成向量形式呢?
比較普遍的做法是利用【1】中的CNN網路,首先將這個網路在ImageNet上預訓練,然後將倒數第二層的4096維向量作為這個圖像的向量表示,通過一個線性變換將其表達為一個D維(和文本向量再同樣維度)的向量。
然後類似機器翻譯中的decode過程,將其作為RNN的輸入,最後產生一段文本,這段文本基本就可以認為是這幅圖像的
一個文本描述。如下圖所示:
具體實現細節上稍微有些差異,比如【5】中使用的是LSTM模型、圖像的向量只是作為0時刻輸入一次、每個詞向量表示為one-hot形式輸入:
它的部分結果如下:
而文章【6】中在每個時刻都將圖像向量和當前的詞向量一起輸入:
它的部分結果如下:
李飛飛組似乎更關注圖像各個目標的信息,而不是全局信息,他們組一直在考慮如何將圖像的各個區域(fragments of images)和文本中各個碎片(fragments of sentences)聯繫起來,生成dense descriptions of images【7】【8】,如下:
不過這樣做的原因感覺他們希望能提高圖像—文本檢索的準確率,看成一個檢索的任務而不是直接生成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.
【5】Vinyals O,
Toshev A, Bengio S, et al. Show and tell: A neural image caption generator[C]//Proceedings
of the IEEE Conference on Computer Vision and Pattern 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.
【非常高興看到大家喜歡並贊同我們的回答。應許多知友的建議,最近我們開通了同名公眾號:PhDer,也會定期更新我們的文章,如果您不想錯過我們的每篇回答,歡迎掃碼關注~ 】
http://weixin.qq.com/r/5zsuNoHEZdwarcVV9271 (二維碼自動識別)
opencv就是做計算機視覺的,題主可以用用
騰訊一個團隊之前寫了幾篇關於語義分析的文章,網上可以搜到,感覺寫的很全面很深入,大家可以看一看。語義分析的一些方法(三) 鄙人在這裡提一些自己的拙見:現在AI這麼火,image understanding真的很有前景;數據量越來越大,非監督學習是趨勢;deep learning原理還沒完全搞明白,只是單純的用起來效果好(極好),這個工業界用用就好,但現在學術圈也都全面被攻陷了,網路層數一味地越搞越深,感覺dl遲早藥丸。。。歡迎拍磚
你聽說過 初見RNN與LSTM 嗎
我給你講一下計算機識別驗證碼的過程,可能會有幫助。要識別一套驗證碼,首先需要建立這套驗證碼的識別庫,也就是每個字元對應的特徵。這個特徵大概就是記錄這個字元長什麼樣。然後程序在讀取到一張驗證碼之後一般會進行圖像分割,去雜點雜線處理,圖像二值化處理等。這一系列處理之後再與識別庫中的字元進行對比。其中值得說的是二值法,大概就是將圖像上大於某一顏色值得直接變成黑色,其它變成白色,也就是0和1,這樣便於與識別庫做比較。你說的那個圖像識別應該也是處理過圖像後,再與事先建立起的識別庫進行比較。只不過的庫更大,包含的東西更多,也有可能是用到了公共圖庫。以上為個人知識範圍內的猜測。
目前計算機還只能有限地識別圖像,和理解圖像不知道差了多少個十萬八千里
我覺得應該類比一下我們人如何去「理解」一幅圖像,從我自身看來,理解一副圖像時也是要先認識到圖像中有哪一些目標及圖像的背景,然後在腦海中嘗試用語言來勾勒出圖像傳達出來的意思,這裡面需要大量的先驗知識,包括我們作為人來說,學習到的語言知識,計算機無非就是按照我們理解圖像的方式來理解圖像,在擁有了大量的數據、知識後肯定能比我們做的更快。
我到不認為現在的計算機能夠理解圖像,它只不過是高級點的模式匹配而已
相反,我倒認為,cv只有結合推理,才能有最強大的識圖能力
然而,現在貌似都在用傳統的方法刷分,卻沒人想著要這麼做。。。計算機本身不具備智能,它能理解圖像,是靠人寫出智能的程序、工具。利用人對圖像中的物體、場景等的先驗知識,或者統計機器學習的方法,設計合理的特徵與演算法,完成特定的圖像理解任務。簡單說,圖像理解=圖像本身+標註信息或先驗知識
計算機計算性能超群,所以主要難題還是如何把圖像特徵數據化,數據化到數學公式可以計算處理或者選擇的程度。如果解決了這個問題,那就是特別重大的突破了。
李飛飛:如何教計算機理解圖我想你應該看這個視頻,在網易公開課上能找到。
一種方法是把圖像分割成最基本的單元(像素、像元)等,然後將各點依次按3種基本色劃分並記錄下這一點的三個顏色的分量數值,圖像就被保存下來了。而還原時只要做個相反操作,把數值按著順序還原到屏幕上就可以了。
聽說過chinese room 嗎
我膚淺的理解就是把照片數值化,通過人類標識一個照片的內容,把數值特徵記錄,以後遇到類似的特徵就把之前人標識出來的東西復現
推薦閱讀:
※怎麼樣才能踏入機器視覺這個行業?
※虛擬視點視頻的實時合成(real-time view synthesis )是否已經能夠實現?
※如何看待微軟 HoloLens 團隊大批人員跳槽 perceptiveIO?
※opencv如何精準定位十字?
※如何開始學慣用fpga進行圖像處理?