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