深度學習與計算機視覺 看這一篇就夠了
人工智能是人類一個非常美好的夢想,跟星際漫游和長生不老一樣。我們想制造出一種機器,使得它跟人一樣具有一定的對外界事物感知能力,比如看見世界。
本文引用地址:http://www.ex-cimer.com/article/201708/363733.htm在上世紀50年代,數(shù)學家圖靈提出判斷機器是否具有人工智能的標準:圖靈測試。即把機器放在一個房間,人類測試員在另一個房間,人跟機器聊天,測試員事先不知道另一房間里是人還是機器 。經(jīng)過聊天,如果測試員不能確定跟他聊天的是人還是機器的話,那么圖靈測試就通過了,也就是說這個機器具有與人一樣的感知能力。
但是從圖靈測試提出來開始到本世紀初,50多年時間有無數(shù)科學家提出很多機器學習的算法,試圖讓計算機具有與人一樣的智力水平,但直到2006年深度學習算法的成功,才帶來了一絲解決的希望。
眾星捧月的深度學習
深度學習在很多學術領域,比非深度學習算法往往有20-30%成績的提高。很多大公司也逐漸開始出手投資這種算法,并成立自己的深度學習團隊,其中投入最大的就是谷歌,2008年6月披露了谷歌腦項目。2014年1月谷歌收購DeepMind,然后2016年3月其開發(fā)的Alphago算法在圍棋挑戰(zhàn)賽中,戰(zhàn)勝了韓國九段棋手李世石,證明深度學習設計出的算法可以戰(zhàn)勝這個世界上最強的選手。
在硬件方面,Nvidia最開始做顯示芯片,但從2006及2007年開始主推用GPU芯片進行通用計算,它特別適合深度學習中大量簡單重復的計算量。目前很多人選擇Nvidia的CUDA工具包進行深度學習軟件的開發(fā)。
微軟從2012年開始,利用深度學習進行機器翻譯和中文語音合成工作,其人工智能小娜背后就是一套自然語言處理和語音識別的數(shù)據(jù)算法。
百度在2013年宣布成立百度研究院,其中最重要的就是百度深度學習研究所,當時招募了著名科學家余凱博士。不過后來余凱離開百度,創(chuàng)立了另一家從事深度學習算法開發(fā)的公司地平線。
Facebook和Twitter也都各自進行了深度學習研究,其中前者攜手紐約大學教授Yann Lecun,建立了自己的深度學習算法實驗室;2015年10月,F(xiàn)acebook宣布開源其深度學習算法框架,即Torch框架。Twitter在2014年7月收購了Madbits,為用戶提供高精度的圖像檢索服務。
前深度學習時代的計算機視覺
互聯(lián)網(wǎng)巨頭看重深度學習當然不是為了學術,主要是它能帶來巨大的市場。那為什么在深度學習出來之前,傳統(tǒng)算法為什么沒有達到深度學習的精度?
在深度學習算法出來之前,對于視覺算法來說,大致可以分為以下5個步驟:特征感知,圖像預處理,特征提取,特征篩選,推理預測與識別。早期的機器學習中,占優(yōu)勢的統(tǒng)計機器學習群體中,對特征是不大關心的。
我認為,計算機視覺可以說是機器學習在視覺領域的應用,所以計算機視覺在采用這些機器學習方法的時候,不得不自己設計前面4個部分。
但對任何人來說這都是一個比較難的任務。傳統(tǒng)的計算機識別方法把特征提取和分類器設計分開來做,然后在應用時再合在一起,比如如果輸入是一個摩托車圖像的話,首先要有一個特征表達或者特征提取的過程,然后把表達出來的特征放到學習算法中進行分類的學習。
過去20年中出現(xiàn)了不少優(yōu)秀的特征算子,比如最著名的SIFT算子,即所謂的對尺度旋轉(zhuǎn)保持不變的算子。它被廣泛地應用在圖像比對,特別是所謂的structure from motion這些應用中,有一些成功的應用例子。另一個是HoG算子,它可以提取物體,比較魯棒的物體邊緣,在物體檢測中扮演著重要的角色。
這些算子還包括Textons,Spin image,RIFT和GLOH,都是在深度學習誕生之前或者深度學習真正的流行起來之前,占領視覺算法的主流。
幾個(半)成功例子
這些特征和一些特定的分類器組合取得了一些成功或半成功的例子,基本達到了商業(yè)化的要求但還沒有完全商業(yè)化。
一是八九十年代的指紋識別算法,它已經(jīng)非常成熟,一般是在指紋的圖案上面去尋找一些關鍵點,尋找具有特殊幾何特征的點,然后把兩個指紋的關鍵點進行比對,判斷是否匹配。
然后是2001年基于Haar的人臉檢測算法,在當時的硬件條件下已經(jīng)能夠達到實時人臉檢測,我們現(xiàn)在所有手機相機里的人臉檢測,都是基于它或者它的變種。
第三個是基于HoG特征的物體檢測,它和所對應的SVM分類器組合起來的就是著名的DPM算法。DPM算法在物體檢測上超過了所有的算法,取得了比較不錯的成績。
但這種成功例子太少了,因為手工設計特征需要大量的經(jīng)驗,需要你對這個領域和數(shù)據(jù)特別了解,然后設計出來特征還需要大量的調(diào)試工作。說白了就是需要一點運氣。
另一個難點在于,你不只需要手工設計特征,還要在此基礎上有一個比較合適的分類器算法。同時設計特征然后選擇一個分類器,這兩者合并達到最優(yōu)的效果,幾乎是不可能完成的任務。
仿生學角度看深度學習
如果不手動設計特征,不挑選分類器,有沒有別的方案呢?能不能同時學習特征和分類器?即輸入某一個模型的時候,輸入只是圖片,輸出就是它自己的標簽。比如輸入一個明星的頭像,出來的標簽就是一個50維的向量(如果要在50個人里識別的話),其中對應明星的向量是1,其他的位置是0。
這種設定符合人類腦科學的研究成果。
1981年諾貝爾醫(yī)學生理學獎頒發(fā)給了David Hubel,一位神經(jīng)生物學家。他的主要研究成果是發(fā)現(xiàn)了視覺系統(tǒng)信息處理機制,證明大腦的可視皮層是分級的。他的貢獻主要有兩個,一是他認為人的視覺功能一個是抽象,一個是迭代。抽象就是把非常具體的形象的元素,即原始的光線像素等信息,抽象出來形成有意義的概念。這些有意義的概念又會往上迭代,變成更加抽象,人可以感知到的抽象概念。
像素是沒有抽象意義的,但人腦可以把這些像素連接成邊緣,邊緣相對像素來說就變成了比較抽象的概念;邊緣進而形成球形,球形然后到氣球,又是一個抽象的過程,大腦最終就知道看到的是一個氣球。
模擬人腦識別人臉,也是抽象迭代的過程,從最開始的像素到第二層的邊緣,再到人臉的部分,然后到整張人臉,是一個抽象迭代的過程。
再比如看到圖片中的摩托車,我們可能在腦子里就幾微秒的時間,但是經(jīng)過了大量的神經(jīng)元抽象迭代。對計算機來說最開始看到的根本也不是摩托車,而是RGB圖像三個通道上不同的數(shù)字。
所謂的特征或者視覺特征,就是把這些數(shù)值給綜合起來用統(tǒng)計或非統(tǒng)計的形式,把摩托車的部件或者整輛摩托車表現(xiàn)出來。深度學習的流行之前,大部分的設計圖像特征就是基于此,即把一個區(qū)域內(nèi)的像素級別的信息綜合表現(xiàn)出來,利于后面的分類學習。
如果要完全模擬人腦,我們也要模擬抽象和遞歸迭代的過程,把信息從最細瑣的像素級別,抽象到“種類”的概念,讓人能夠接受。
卷積的概念
計算機視覺里經(jīng)常使卷積神經(jīng)網(wǎng)絡,即CNN,是一種對人腦比較精準的模擬。
什么是卷積?卷積就是兩個函數(shù)之間的相互關系,然后得出一個新的值,他是在連續(xù)空間做積分計算,然后在離散空間內(nèi)求和的過程。實際上在計算機視覺里面,可以把卷積當做一個抽象的過程,就是把小區(qū)域內(nèi)的信息統(tǒng)計抽象出來。
比如,對于一張愛因斯坦的照片,我可以學習n個不同的卷積和函數(shù),然后對這個區(qū)域進行統(tǒng)計。可以用不同的方法統(tǒng)計,比如著重統(tǒng)計中央,也可以著重統(tǒng)計周圍,這就導致統(tǒng)計的和函數(shù)的種類多種多樣,為了達到可以同時學習多個統(tǒng)計的累積和。
上圖中是,如何從輸入圖像怎么到最后的卷積,生成的響應map。首先用學習好的卷積和對圖像進行掃描,然后每一個卷積和會生成一個掃描的響應圖,我們叫response map,或者叫feature map。如果有多個卷積和,就有多個feature map。也就說從一個最開始的輸入圖像(RGB三個通道)可以得到256個通道的feature map,因為有256個卷積和,每個卷積和代表一種統(tǒng)計抽象的方式。
在卷積神經(jīng)網(wǎng)絡中,除了卷積層,還有一種叫池化的操作。池化操作在統(tǒng)計上的概念更明確,就是一個對一個小區(qū)域內(nèi)求平均值或者求最大值的統(tǒng)計操作。
帶來的結(jié)果是,如果之前我輸入有兩個通道的,或者256通道的卷積的響應feature map,每一個feature map都經(jīng)過一個求最大的一個池化層,會得到一個比原來feature map更小的256的feature map。
在上面這個例子里,池化層對每一個2X2的區(qū)域求最大值,然后把最大值賦給生成的feature map的對應位置。如果輸入圖像是100×100的話,那輸出圖像就會變成50×50,feature map變成了一半。同時保留的信息是原來2X2區(qū)域里面最大的信息。
操作的實例:LeNet網(wǎng)絡
Le顧名思義就是指人工智能領域的大牛Lecun。這個網(wǎng)絡是深度學習網(wǎng)絡的最初原型,因為之前的網(wǎng)絡都比較淺,它較深的。LeNet在98年就發(fā)明出來了,當時Lecun在AT&T的實驗室,他用這一網(wǎng)絡進行字母識別,達到了非常好的效果。
怎么構(gòu)成呢?輸入圖像是32×32的灰度圖,第一層經(jīng)過了一組卷積和,生成了6個28X28的feature map,然后經(jīng)過一個池化層,得到得到6個14X14的feature map,然后再經(jīng)過一個卷積層,生成了16個10X10的卷積層,再經(jīng)過池化層生成16個5×5的feature map。
從最后16個5X5的feature map開始,經(jīng)過了3個全連接層,達到最后的輸出,輸出就是標簽空間的輸出。由于設計的是只要對0到9進行識別,所以輸出空間是10,如果要對10個數(shù)字再加上26個大小字母進行識別的話,輸出空間就是62。62維向量里,如果某一個維度上的值最大,它對應的那個字母和數(shù)字就是就是預測結(jié)果。
壓在駱駝身上的最后一根稻草
從98年到本世紀初,深度學習興盛起來用了15年,但當時成果泛善可陳,一度被邊緣化。到2012年,深度學習算法在部分領域取得不錯的成績,而壓在駱駝身上最后一根稻草就是AlexNet。
AlexNet由多倫多大學幾個科學家開發(fā),在ImageNet比賽上做到了非常好的效果。當時AlexNet識別效果超過了所有淺層的方法。此后,大家認識到深度學習的時代終于來了,并有人用它做其它的應用,同時也有些人開始開發(fā)新的網(wǎng)絡結(jié)構(gòu)。
其實AlexNet的結(jié)構(gòu)也很簡單,只是LeNet的放大版。輸入是一個224X224的圖片,是經(jīng)過了若干個卷積層,若干個池化層,最后連接了兩個全連接層,達到了最后的標簽空間。
去年,有些人研究出來怎么樣可視化深度學習出來的特征。那么,AlexNet學習出的特征是什么樣子?在第一層,都是一些填充的塊狀物和邊界等特征;中間的層開始學習一些紋理特征;更高接近分類器的層級,則可以明顯看到的物體形狀的特征。
最后的一層,即分類層,完全是物體的不同的姿態(tài),根據(jù)不同的物體展現(xiàn)出不同姿態(tài)的特征了。
可以說,不論是對人臉,車輛,大象或椅子進行識別,最開始學到的東西都是邊緣,繼而就是物體的部分,然后在更高層層級才能抽象到物體的整體。整個卷積神經(jīng)網(wǎng)絡在模擬人的抽象和迭代的過程。
為什么時隔20年卷土重來?
我們不禁要問:似乎卷積神經(jīng)網(wǎng)絡設計也不是很復雜,98年就已經(jīng)有一個比較像樣的雛形了。自由換算法和理論證明也沒有太多進展。那為什么時隔20年,卷積神經(jīng)網(wǎng)絡才能卷土重來,占領主流?
這一問題與卷積神經(jīng)網(wǎng)絡本身的技術關系不太大,我個人認為與其他一些客觀因素有關。
首先,卷積神經(jīng)網(wǎng)絡的深度太淺的話,識別能力往往不如一般的淺層模型,比如SVM或者boosting。但如果做得很深,就需要大量數(shù)據(jù)進行訓練,否則機器學習中的過擬合將不可避免。而2006及2007年開始,正好是互聯(lián)網(wǎng)開始大量產(chǎn)生各種各樣的圖片數(shù)據(jù)的時候。
另外一個條件是運算能力。卷積神經(jīng)網(wǎng)絡對計算機的運算要求比較高,需要大量重復可并行化的計算,在當時CPU只有單核且運算能力比較低的情況下,不可能進行個很深的卷積神經(jīng)網(wǎng)絡的訓練。隨著GPU計算能力的增長,卷積神經(jīng)網(wǎng)絡結(jié)合大數(shù)據(jù)的訓練才成為可能。
最后一點就是人和。卷積神經(jīng)網(wǎng)絡有一批一直在堅持的科學家(如Lecun)才沒有被沉默,才沒有被海量的淺層方法淹沒。然后最后終于看到卷積神經(jīng)網(wǎng)絡占領主流的曙光。
深度學習在視覺上的應用
計算機視覺中比較成功的深度學習的應用,包括人臉識別,圖像問答,物體檢測,物體跟蹤。
人臉識別
這里說人臉識別中的人臉比對,即得到一張人臉,與數(shù)據(jù)庫里的人臉進行比對;或同時給兩張人臉,判斷是不是同一個人。
這方面比較超前的是湯曉鷗教授,他們提出的DeepID算法在LWF上做得比較好。他們也是用卷積神經(jīng)網(wǎng)絡,但在做比對時,兩張人臉分別提取了不同位置特征,然后再進行互相比對,得到最后的比對結(jié)果。最新的DeepID-3算法,在LWF達到了99.53%準確度,與肉眼識別結(jié)果相差無幾。
圖片問答問題
這是2014年左右興起的課題,即給張圖片同時問個問題,然后讓計算機回答。比如有一個辦公室靠海的圖片,然后問“桌子后面有什么”,神經(jīng)網(wǎng)絡輸出應該是“椅子和窗戶”。
這一應用引入了LSTM網(wǎng)絡,這是一個專門設計出來具有一定記憶能力的神經(jīng)單元。特點是,會把某一個時刻的輸出當作下一個時刻的輸入。可以認為它比較適合語言等,有時間序列關系的場景。因為我們在讀一篇文章和句子的時候,對句子后面的理解是基于前面對詞語的記憶。
圖像問答問題是基于卷積神經(jīng)網(wǎng)絡和LSTM單元的結(jié)合,來實現(xiàn)圖像問答。LSTM輸出就應該是想要的答案,而輸入的就是上一個時刻的輸入,以及圖像的特征,及問句的每個詞語。
物體檢測問題
Region CNN
深度學習在物體檢測方面也取得了非常好的成果。2014年的Region CNN算法,基本思想是首先用一個非深度的方法,在圖像中提取可能是物體的圖形塊,然后深度學習算法根據(jù)這些圖像塊,判斷屬性和一個具體物體的位置。
為什么要用非深度的方法先提取可能的圖像塊?因為在做物體檢測的時候,如果你用掃描窗的方法進行物體監(jiān)測,要考慮到掃描窗大小的不一樣,長寬比和位置不一樣,如果每一個圖像塊都要過一遍深度網(wǎng)絡的話,這種時間是你無法接受的。
所以用了一個折中的方法,叫Selective Search。先把完全不可能是物體的圖像塊去除,只剩2000左右的圖像塊放到深度網(wǎng)絡里面判斷。那么取得的成績是AP是58.5,比以往幾乎翻了一倍。有一點不盡如人意的是,region CNN的速度非常慢,需要10到45秒處理一張圖片。
Faster R-CNN方法
而且我在去年NIPS上,我們看到的有Faster R-CNN方法,一個超級加速版R-CNN方法。它的速度達到了每秒七幀,即一秒鐘可以處理七張圖片。技巧在于,不是用圖像塊來判斷是物體還是背景,而把整張圖像一起扔進深度網(wǎng)絡里,讓深度網(wǎng)絡自行判斷哪里有物體,物體的方塊在哪里,種類是什么?
經(jīng)過深度網(wǎng)絡運算的次數(shù)從原來的2000次降到一次,速度大大提高了。
Faster R-CNN提出了讓深度學習自己生成可能的物體塊,再用同樣深度網(wǎng)絡來判斷物體塊是否是背景?同時進行分類,還要把邊界和給估計出來。
Faster R-CNN可以做到又快又好,在VOC2007上檢測AP達到73.2,速度也提高了兩三百倍。
YOLO
去年FACEBOOK提出來的YOLO網(wǎng)絡,也是進行物體檢測,最快達到每秒鐘155幀,達到了完全實時。它讓一整張圖像進入到神經(jīng)網(wǎng)絡,讓神經(jīng)網(wǎng)絡自己判斷這物體可能在哪里,可能是什么。但它縮減了可能圖像塊的個數(shù),從原來Faster R-CNN的2000多個縮減縮減到了98個。
同時取消了Faster R-CNN里面的RPN結(jié)構(gòu),代替Selective Search結(jié)構(gòu)。YOLO里面沒有RPN這一步,而是直接預測物體的種類和位置。
YOLO的代價就是精度下降,在155幀的速度下精度只有52.7,45幀每秒時的精度是63.4。
SSD
在arXiv上出現(xiàn)的最新算法叫Single Shot MultiBox Detector,即SSD。
它是YOLO的超級改進版,吸取了YOLO的精度下降的教訓,同時保留速度快的特點。它能達到58幀每秒,精度有72.1。速度超過Faster R-CNN 有8倍,但達到類似的精度。
物體跟蹤
所謂跟蹤,就是在視頻里面第一幀時鎖定感興趣的物體,讓計算機跟著走,不管怎么旋轉(zhuǎn)晃動,甚至躲在樹叢后面也要跟蹤。
深度學習對跟蹤問題有很顯著的效果。DeepTrack算法是我在澳大利亞信息科技研究院時和同事提出的,是第一在線用深度學習進行跟蹤的文章,當時超過了其它所有的淺層算法。
今年有越來越多深度學習跟蹤算法提出。去年十二月ICCV 2015上面,馬超提出的Hierarchical Convolutional Feature算法,在數(shù)據(jù)上達到最新的記錄。它不是在線更新一個深度學習網(wǎng)絡,而是用一個大網(wǎng)絡進行預訓練,然后讓大網(wǎng)絡知道什么是物體什么不是物體。
將大網(wǎng)絡放在跟蹤視頻上面,然后再分析網(wǎng)絡在視頻上產(chǎn)生的不同特征,用比較成熟的淺層跟蹤算法來進行跟蹤,這樣利用了深度學習特征學習比較好的好處,同時又利用了淺層方法速度較快的優(yōu)點。效果是每秒鐘10幀,同時精度破了記錄。
最新的跟蹤成果是基于Hierarchical Convolutional Feature,由一個韓國的科研組提出的MDnet。它集合了前面兩種深度算法的集大成,首先離線的時候有學習,學習的不是一般的物體檢測,也不是ImageNet,學習的是跟蹤視頻,然后在學習視頻結(jié)束后,在真正在使用網(wǎng)絡的時候更新網(wǎng)絡的一部分。這樣既在離線的時候得到了大量的訓練,在線的時候又能夠很靈活改變自己的網(wǎng)絡。
基于嵌入式系統(tǒng)的深度學習
回到ADAS問題(慧眼科技的主業(yè)),它完全可以用深度學習算法,但對硬件平臺有比較高的要求。在汽車上不太可能把一臺電腦放上去,因為功率是個問題,很難被市場所接受。
現(xiàn)在的深度學習計算主要是在云端進行,前端拍攝照片,傳給后端的云平臺處理。但對于ADAS而言,無法接受長時間的數(shù)據(jù)傳輸?shù)模蛟S發(fā)生事故后,云端的數(shù)據(jù)還沒傳回來。
那是否可以考慮NVIDIA推出的嵌入式平臺?NVIDIA推出的嵌入式平臺,其運算能力遠遠強過了所有主流的嵌入式平臺,運算能力接近主流的頂級CPU,如臺式機的i7。那么慧眼科技在做工作就是要使得深度學習算法,在嵌入式平臺有限的資源情況下能夠達到實時效果,而且精度幾乎沒有減少。
具體做法是,首先對網(wǎng)絡進行縮減,可能是對網(wǎng)絡的結(jié)構(gòu)縮減,由于識別場景不同,也要進行相應的功能性縮減;另外要用最快的深度檢測算法,結(jié)合最快的深度跟蹤算法,同時自己研發(fā)出一些場景分析算法。三者結(jié)合在一起,目的是減少運算量,減少檢測空間的大小。在這種情況下,在有限資源上實現(xiàn)了使用深度學習算法,但精度減少的非常少。
評論