在深度學習中有一類研究熱點,目標檢測,從2012年AlexNet到2016年,尤爲是2015年開始,深度學習中的深層的卷積神經網絡發展迅猛,其中不但衍生出了例如VGG, GoogleNet等愈加區域標準化的深層網絡,也相繼提出一系列檢測加速的策略,例如針對快速提取proposal的方法,像selective search, edge box, BING, RPN等,這些方法的發展和完善,使得基於深度學習的目標檢測精度愈來愈高,並且速度愈來愈快,我整理了這一發展過程,對其中的部分方法進行講解,準備有限,有不足或者疑問的地方請你們多多指教,其中一些參考文章和網站不在PPT中,但也對相關做者表示感謝。程序員
我講解的內容主要分爲三部分歸納爲BBS,基於深度學習目標檢測的背景,幾個近幾年的比較經典的卷積神經網絡,以及最後的總結。算法
這裏列舉了幾個經典的CNN網絡,須要指出的是,這裏除了AlexNet, GoogleNet, VGG外,其餘都是能夠進行目標檢測的,可是做爲經典,所以有必要在這裏向它致敬,今天演講的內容主要是這幾個網絡。14年以前,深度學習雖然也有很多人關注,可是成果相對較少,最重要的一個緣由,我我的以爲就是入門門檻過高,除了一些牛逼的實驗室和大神能玩得轉外,其餘人想搞都很是吃力,可是14年以後就是另外一番景象,深度學習如同秋風掃落葉般,侵入了計算機視覺的各個領域,一些普通實驗室和我的,也能迅速地開展相關的研究。編程
緣由我以爲主要是兩個:第一是顯卡性能的提高和成本下降,2012年AleXNet訓練的時候,引入了兩塊GTX 580,每塊具備1.5G顯存,顯存頻率2GHz,足足訓練了五六天,在2014年市面上能見到的較好的顯卡仍是NVIDIA GTX 800系列,無論是顯存大小仍是顯存頻率都不夠給力,而你們都知道深度學習後來被推崇的主要緣由,就是其速度快,可是當年並非這樣,想要進行該領域的研究,須要更好的專業級顯卡,硬件成本要求過高,這一條就將不少人拒之門外;2015年以後新推出GTX 900系列,TITAN 系列等,在計算能力上提高了不少個level,價錢也能夠接受,960如今應該不超過2000塊,TITAN X國內大概8000多,這裏說的GPU主要指的是NVIDIA旗下的,在GPU加速運算這塊AMD棋差一招,如今已經無法跟NVIDAI競爭。windows
並且NVIDIA如今也向學者免費提供顯卡,顯卡型號是TITAN X,我4月份的時候,向官方遞交了申請書,5月初就收到了對方重新加坡寄來的顯卡,仍是很給力的,有興趣的同窗能夠去嘗試一下。markdown
第二個緣由就是相關的開發包的完善和成熟,例如2014年開源,影響力巨大的caffe深度學習框架,適宜NVIDIA GPU加速運算的開發包CUDA、CUDNN,以及其餘編程開發環境對於深度學習的推動例如Python, Matlab和你們經常使用的開源庫OpenCV,Google在caffe公佈後,也耐不住寂寞,在2015年也公佈了它的深度學習框架TensorFlow。網絡
就目前來看,caffe框架支持C++,Python和Matlab環境,具備較大的用戶羣,如今開源的大部分工程都是基於caffe框架的,tensorflow主要支持Python環境,目前基於此進行研究的開源工程不多,這兩個框架我都進行了研究,因此專門拿出來說講,我的建議若是是想要開始學習,直接學習caffe較好,相關的開源demo和文檔更多,在GitHub和Stack overflow兩大程序員網站上相關的討論也較多,學習上手較快,還有其餘的一些框架,就再也不多講。app
如今進入主題,基於深度學習的目標檢測問題,是這兩年的熱點問題之一,首先讓咱們來看三個概念,Recognition, Detection 和 Segmentation(略)。框架
就這三類數據,對經常使用的一些數據集,進行簡單的羅列。機器學習
以上是三個常見的較大的數據集。函數
常見的評估方法,IoU, AP, mAP。
這裏解釋一下常常見到的評價指標,Top-1 / Top-5 error是什麼意思。給定一個測試樣本,以及正確的label,對模型預測樣本屬於各個label的機率值進行降序排列,若是預測所屬類別可能性比較靠前的N箇中沒有正確的label,那就認爲預測失敗。至關因而對預測的要求下降要求,不求可能性最大的那種結果就是正確的,可是至少可能性較大的幾種類別裏,要含有正確的結果,下面給出的公式至關因而Top-1 error。
這是經典CNN網絡AlexNet的結構,包括5層卷積層+3層全鏈接層,在文章裏爲了進行分類,還在最後一層全鏈接層後加了一層softmax層,在第1,2,5層卷積層後加了LRN層和Max Pooling層。這篇論文對於網絡框架的一些實現細節,進行了不少論證工做,也是後來不少網絡都以此爲藍本,進行新的拓展。
講述幾點做者的主張:不用simgoid和tanh做爲激活函數,而用ReLU做爲激活函數,緣由是:加速收斂。由於sigmoid和tanh都是飽和(saturating)的。何爲飽和?多是他們的導數越接近目標,對應的導數越小,而ReLu的導數對於大於0的部分恆爲1。因而ReLU確實能夠在BP的時候可以將梯度很好地傳到較前面的網絡。
LRN操做能夠提升網絡的泛化能力,下降分類的錯誤率。論文裏下降了2個百分點的錯誤率,其中,x,y是像素位置,求和含義是,把該位置上n幾個臨近的卷積核產生的feature map上的值加起來,N是這一層中全部的卷積核數量,K, alpha, beta是一組參數,取值通常都是固定的。
論文中對於pooling時,是否應該存在overlapping,進行討論,所謂的overlapping就是指pooling窗口在移動的過程當中跟前面的窗口要不要保持必定的重疊度,分析後做者認爲保持必定的重疊度,能夠必定程度上減弱過擬合問題和下降分類偏差。
爲了不過擬合,使用了兩種策略,一種是數據拓充(Data Augmentation),也使用了兩種方法:第一種是隨機Crop,訓練的時候,將輸入的256x256的圖像,隨機裁剪成爲224x224+水平翻轉拓展了2048倍,測試階段,產生5x2個crop, 即使拓展了這麼多,其實避免過擬合的程度也頗有限,論文裏錯誤率下降了一個百分點,訓練關鍵仍是原始數據要多。第二種是對RGB空間作PCA,即主成分分析,而後對主成分作一個輕微的高斯擾動,進一步下降錯誤率。
另一種策略稱爲Dropout,深層網絡常常具備大量的參數,雖然對於非線性問題具備較強的描述和學習能力,可是訓練過程當中過擬合也是很讓人頭疼的,有人提出將幾個不一樣的網絡的預測結果融合在一塊兒,可是分別訓練這樣的網絡代價很大,Dropout方法就解決了這個問題,在訓練的過程當中把部隱單元drop掉,若是訓練過程當中設置一組不一樣的drop組合,就能夠在一次訓練過程當中獲得幾個不一樣的網絡的疊加效果。
讓咱們來看,真正開始利用卷積神經網絡進行目標檢測的R-CNN,縮寫的全稱是Regions with CNN features, 我在前面講述過,CNN並不能直接進行目標檢測,只能進行識別或者分類,也就是說,給定一個圖片或者圖片區域,它只能回答你,裏面是否含有某類目標的可能性,那怎麼樣才能進行目標檢測呢?最簡單的作法就是,我使用一個滑動窗口,把整幅圖像都遍歷一遍,找出全部類別評分比較高的區域,而後進行標記,可是這種作法,想想就會發現很大的不足,首先天然場景裏圖片中目標的大小時不肯定的,使用固定大小的滑動窗效果不行,可是搞出更復雜多變的滑動窗,計算量上一下就吃不消,若是能有一種有效的策略,提供較少許的可能存在待檢測目標的區域,上面提到的問題就能很好的解決。利用CNN訓練的特徵對提取的目標候選區進行分類,這就是R-CNN的核心思想。
咱們能夠把R-CNN的結構分紅獨立的三塊:定位使用的selective search,提取出2k個候選區,特徵提取使用的是深層卷積神經網絡CNN,文中是去掉最後一層softmax層的AlexNet,分類方法選擇了L-SVM,對於每一個類別使用NMS非最大抑制方法,捨棄掉部分region,獲得檢測結果。R-CNN的成功之處在於:a.使用CNN獲取更高級別的目標特徵取代了人工設計特徵提取方法;b.使用類別獨立的region proposal提取方法(Selective Search)減小了檢測搜索的空間。它指出了一條使用深度學習進行目標檢測的可行方案,其後的不少方法,基本都是參照這個流程,在各個子模塊進行優化和改進。固然不足也很明顯,提取proposal方法較慢(CPU, 2s/img);在檢測時,對於提取的proposal所有warp到固定的size而後輸入到CNN網絡中並非最佳方法(後來在Fast R-CNN中解決了這一問題)。
關於proposal提取方法,在至關長的一段時間裏都是研究的熱點,這裏引用了15年的一篇論文,它對當時比較流行的一些方法(或者說是能夠找到源碼的方法)進行了分析和評價,它把這些方法大體分爲兩類,一種是Grouping,將圖像過度割,而後再聚合在一塊兒的,好比R-CNN使用的selective search,另外一種是Window scoring 生成大量的窗口並打分,而後過濾掉低分的窗口,還有介於二者之間的例如multibox,這裏沒有列舉;還有一些其餘很好的方法,好比Faster R-CNN使用的RPN、HyperNet、YOLO方法等,由於在論文發表以後提出,因此沒被列在內。
這是一張基於VOC07和ImageNet 的各類提取proposal方法能力的測試圖,做者分析發現:(1)MCG, EdgeBox,SelectiveSearch, Rigor和Geodesic在不一樣proposal數目下表現都不錯;(2)若是隻限制小於1000的proposal,MCG,endres和CPMC效果最好;(3)若是一開始沒有較好地定位好候選框的位置,隨着IoU標準嚴格,recall會降低比較快的包括了Bing, Rahtu, Objectness和Edgeboxes。其中Bing降低尤其明顯;(4)在AR這個標準下,MCG表現穩定;Endres和Edgeboxes在較少proposal時候表現比較好,當容許有較多的proposal時候,Rigor和SelectiveSearch的表現會比其餘要好;(5)PASCAL和ImageNet上,各個OP方法都是比較類似的,這說明了這些OP方法的泛化性能都不錯。
簡單講解一下Selective search的方法原理,前面已經說了它是一張基於Grouping的方法,首先對圖像進行過度割,過度割後的區域塊和相鄰的區域塊之間計算類似度,把類似度最高的兩個合併,而後重複上面的過程,直到整幅圖像被合併成爲一個區域,迭代中止;所以它是一種由粗到細,具備必定層次的方法。
這是層次聚類的算法僞碼,很容易理解。
爲了使得聚類不單一化,也就是產生儘量多樣的候選區域,文章對於類似度進行了多種描述,顏色空間上進行了多種轉換,同時區域的紋理、大小、填充孔洞,以及起始的區域等特徵都會影響類似度。總得來講,這種方法仍是很不錯的,可是就是計算量有點大。
在SPP-net前,因爲CNN網絡結構的特色,全鏈接層須要固定長度的輸出,所以廣泛做法都是使輸出圖像的大小固定,因爲全部圖像卷積層操做都是同樣的,就能夠保證輸入到全鏈接層的向量大小是相同的。有兩種方法,第一種是Crop,從原圖上按照必定方式裁剪出固定大小的圖像,第二種是warp,就是把使用bounding-box標註的目標區域,拉伸成固定大小,這兩種方式都具備必定弊端,那就是傳入網絡訓練的圖像與原始數據並不一致。
SPP-net的思路就是想要解決樣本rescaling問題,提出直接使用任意尺度的圖像輸入網絡進行訓練,從而增長尺度不變性,減小過擬合問題。
若是原圖輸入是224x224,對於conv5出來後的輸出,是13x13x256的,能夠理解成有256個這樣的filter,每一個filter對應一張13x13的reponse map。若是像上圖那樣將reponse map分紅4x4 2x2 1x1三張子圖,作max pooling後,出來的特徵就是固定長度的(16+4+1)x256那麼多的維度了。若是原圖的輸入不是224x224,出來的特徵依然是(16+4+1)x256;能夠理解成將原來固定大小爲(3x3)窗口的pool5改爲了自適應窗口大小,窗口的大小和reponse map成比例,保證了通過pooling後出來的feature的長度是一致的。
與R-CNN相似,檢測上仍然使用相同的方法,Selective search + SVM,可是作了一些優化,使得速度提高很多,雖然SPP-net提出這種對訓練圖像大小不作限制的思想,並無被繼續使用,可是spatial pyramid pooling layer的方法,在後來的Fast R-CNN, Faster R-CNN和HyperNet方法中得以延續:RoI Pooling layer,用以把region proposal對應區域的feature map轉換成固定大小的feature map,而後輸入到全鏈接層中。
再看卷積神經網絡結構上的發展,有影響力比較大的兩個深層卷積神經網絡GoogleNet 和 VGG,這兩個網絡結構在ILSVRC 2014年分類挑戰賽上分別得到了第一名和第二名的好成績。這是兩篇論文裏分別對網絡精度的描述。
先看GoogleNet,論文提出了兩種基本模式,首先是簡單模式,3個使用不一樣大小卷積核的卷積層和一個pooling層,在一層裏,依次分別進行,而後使用concat層把輸出鏈接在一塊兒,另一個模式是在其中兩個卷積層以前和pooling層以後,添加具備更小卷積核的卷積層,而後再用concat層進行鏈接。
這是總體網絡結構的基本框架,這裏每一個inceptiond都是一個基礎模型b,加起來一共有22層深,若是把5個pooling層也算進來,就有27層深(表格中全部的inception都是前面基礎模型中的b結構,深度爲2)。
這是具體的網絡結構圖,由於太長了,我把它轉成水平。做者總結認爲,這種網絡結構,相比於較淺的、較窄的網絡結構,雖然增長了部分計算量,可是卻能取得明顯的效果增益。在實際測試中,效果確實也要比傳統的網絡效果更好。
這是VGG的網絡框架,從A到E一共6種,網絡深度從11層到19層不等,論文也對卷積核大小進行了探討,感興趣的能夠閱讀原文。相對於這就是2014年以前基於深度學習進行目標檢測的主要成果,固然還不少關於數據預處理,檢測proposal提取方法,網絡結構優化的嘗試等沒有在上文描述中出現,可是我以爲前面講述的幾個方法在當時已經算是集大成者,各方面性能表現都很驚豔,比傳統的機器學習方法優越很多。
如今來說2015年以後的該領域的一些發展,首先是Fast R-CNN。在R-CNN和SPP-net以後,做者分析他們存在如下三個不足:第一:訓練的時候,提取proposal、CNN特徵提取,SVM分類,和bbox 迴歸是分開隔離的,而Fast R-CNN實現了端到端的聯合訓練(提取proposal除外),這種思路在之後的檢測方法中延續;第二,訓練時間和內存開銷大,R-CNN提取特徵給SVM訓練時候須要中間要大量的磁盤空間存放特徵,Fast R-CNN去掉了SVM這一步,全部的特徵都暫存在顯存中,不須要額外的磁盤空間;第三,檢測速度慢,在測試的時候,須要把提取的proposal(前面提到是2k個)都輸入到網絡中提取特徵,做者測試,若是使用VGG16網絡,一張圖像在GPU模式下消耗的時間是47s。咱們看一下Fast R-CNN的網絡結果,輸入一張圖像和多個proposals,論文裏也稱爲RoI, 通過卷積網絡獲得feature map,再把這些feature map輸入到RoI pooling layer池化成一個固定大小的feature map, 通過全鏈接層後展開爲一個特徵向量,而後將特徵向量同時應用於softmax和bbox regressor,前者是用於類別機率估計,後者用於對bounding box的位置進行迴歸。在提取過量proposal的時候,實際中,這些proposal多數都是相互重疊的,所以按照R-CNN的作法,把這些相互重疊的proposal依次輸入到網絡中打分,就會致使一個很嚴重的問題,那些重疊部分會被反覆計算feature(使用的是同一個網絡,就至關於把一張圖不一樣部分反覆算了不少遍),這樣的計算浪費是很沒有必要的,而Fast R-CNN避免了這個問題,它對一張圖像只計算一次卷積feature map,而對於proposal對應的圖像區域,它把他們在卷積feature map上對應的區域分別取出,經過RoI pooling layer 生成固定大小的feature map,而後進行後面的分類以及bbox迴歸。這點改變是它速度提高的重要緣由之一。
介紹一下RoI pooling layer,前面講述單層的SPP layer將這個卷積輸出的ROI對應的feature map下采樣爲大小固定的feature map再傳入全鏈接層,方法也很簡單,在前面講述SPP-net的時候,已經講過爲了可以輸入任意尺度的圖像,在卷積層輸出的最後,添加空間金字塔池化層,使輸出的特徵向量具備固定的大小,這裏也是一樣的道理,只不過是爲了使不一樣size的RoI區域可以輸出統一,方便後面的分類以及bbox 迴歸。Fast R-CNN只是用了一層spp layer 獲得固定大小的feature map,論文裏設置的是7x7,爲何不使用更多層,主要是出於兩方面的考慮:一個是會增長計算量,下降速度,另外一個就是由於在訓練時,做者使用了ImageNet預訓練結果進行網絡參數的初始化,若是把這裏的池化層拓展爲多個spp layer那些模型的參數就沒辦法直接使用,就必須從新訓練。
關於尺度不變性,論文裏引用了SPP-net的方法,brute force, 也就是簡單認爲object不須要預先resize到相似的scale再傳入網絡,直接將image定死爲某種scale,直接輸入網絡來訓練就行了,而後指望網絡本身可以學習到scale-invariance的表達。image pyramids (multi scale),也就是要生成一個金字塔,而後對於object,在金字塔上找到一個大小比較接近227x227的投影版本,而後用這個版本去訓練網絡。憑感受能夠看出,方法2應該比方法1更加好,做者也在討論了,方法2的表現確實比方法1好,可是好的不算太多,大概比方法高1個mAP左右,可是時間要慢很多,因此做者實際採用的是第一個策略,也就是single scale。這裏,Fast R-CNN測試之因此比SPP-net快,很大緣由是由於這裏,由於SPP-net用了方法2,而Fast R-CNN用了方法1。
做者分析,在整張圖像分類過程當中,在計算全鏈接層上計算花費的時間要比卷積層少,可是對於目標檢測來講倒是相反的,由於要處理的RoI數量比較多,像圖上顯示的在forward pass過程程中,fc6和fc7佔了44.9%的時間,所以做者提出經過利用SVD分解的方法,將大規模的全鏈接矩陣縮減到很小的數據量,論文裏講述,將fc6 25088x4096的矩陣壓縮爲1024個奇異值,fc7 4096x4096 壓縮爲256個奇異值,雖然在精度上降低了0.3%,可是速度上卻提高了30%。
Fast R-CNN 將R-CNN用於分類的分類器,從SVM換成了softmax,可是這二者到底哪個究竟更好,做者也進行了探討,這是一組對比試驗,其中S,M,L分別都是網絡模型,S指的就是AlexNet,M指的是VGG_CNN_M_1024,L指的是VGG16網絡深度依次增長,能夠看出使用softmax的結果比SVM都要好一些,並且做者指出,在ROI打分的時候,softmax會提供各個類別的score,而svm提供的是one-vs-rest,前者對於分類來講可能更有利。
這是一個R-CNN, SPP-net,Fast R-CNN的速度對比表,能夠看出速度提高的仍是很明顯的。論文就不少其餘細節也都進行了討論,例如網絡更新是否應該所有更新仍是部分更新問題,數據量的問題等,這裏就不作介紹了。
再來看2015年另一篇論文,Faster R-CNN。 在Fast R-CNN以後,一些研究者也逐漸意識到,提取proposal成爲了提高目標檢測速度和精度的瓶頸,R-CNN,SPP-net和Fast R-CNN提取proposal的方法都還依賴於selective search。在提取proposal是在CPU中進行的,單幅影像耗時差很少2s,即使通過Fast R-CNN的優化加速後,想要作到視頻實時處理,速度仍然還不夠。因而Faster R-CNN就提出來,應該把提取proposal也交給CNN來作。在Fast R-CNN中,目標檢測是在卷積feature map上基於區域進行的,那是否是也能夠直接從卷積feature map上產生proposal呢?答案是確定的。這就是Faster R-CNN的核心思想:RPN提取proposal+Fast R-CNN分類。圖中顯示的就是RPN的示意圖,其中conv feature map就是卷積層最後輸出的feature map,使用滑動窗口,這裏給出的3x3的滑動窗口,把其中的高維特徵展開降維成256維的低維向量,把獲得的特徵向量分別輸入到兩個並列的層裏,一個box-regression layer(reg)和一個box-classification layer(cls)。
在RPN網絡中,滑動窗口中心所在位置,咱們成爲sliding position, 在每一個sliding position會按照必定的規則產生一系列的box,這些相關的box就被成爲anchors,論文裏指出每一個sliding position 會按照3個不一樣的尺度,產生3個不一樣長寬比(1:1, 1:2, 2:1)一共9個anchors, 假設一幅feature map大小是WxH,那麼它所產生的anchors數量就是:WHk,在數據處理的時候,做者把圖像都rescale 到1000x600大小,獲得的卷積feature map爲60x40,因此每張圖能夠產生anchors 有60x40x9約爲20k個,這是遠遠過量的,並且速度很快,經過對IoU進行非最大抑制後,餘下2k的anchors投入訓練,在檢測的時候,這個數目還好降得更低,減爲了300個。
速度和精度上的提高效果都比較顯著。
這是HyperNet的網絡結構。經歷了Fast R-CNN和Faster R-CNN後,人們開始從新審視這些算法的檢測結果,不難發現,因爲深層卷積網絡的使用,使得人們可以經過卷積和池化快速獲得proposal windows對應的高維特徵,可是最後卷積層輸出的feature map都是很是粗糙的(feature map上很小的區域,對應到原圖上就具備很大的感覺野),這就很容易致使定位不許確的問題,當面臨檢測小物體時,這種弊端就更加突顯,每每獲得的bbox與ground truth誤差較多。這是HyperNet的考慮,做者以爲有必要提出一種策略下降這種由於conv feature map的過於粗糙而產生的定位誤差,而解決方法就是,既然頂層的conv層縮水太厲害,那就把它在擴大,也就是這裏使用的Deconv 對高層特徵進行上採樣,同時還聯合淺層的conv來增長網絡判別和定位的能力,從而獲得更加精細化的定位。這就是HyperNet的核心思想。
與Fast R-CNN,Faster R-CNN同樣在訓練時都將訓練數據rescale成爲1000x600或600x1000。不一樣卷積層上的feature map融合時,因爲具備不一樣的分辨率,須要統一到相同size,所以對於淺層feature map經過pooling降採樣,對於深層feature map經過去卷積化Deconv進行上採樣,而後經過LRN操做進行數據歸一化,以後經過concat層把數據聯接在一塊兒。做者分析這樣作的優點有三點:a.多尺度的特徵描述; b.獲得的feature map大小對於目標檢測更爲合適(合成的Hyper feature map 大小是250x150,而Faster R-CNN爲60x40); c.計算更加高效,沒有冗餘計算,全部的feature都已經在生成proposal和檢測以前完成,以後不須要再進行特徵提取。關於proposal提取方法(參考的論文就是Faster R-CNN做者提出的,感受跟RPN很像,可是效果要好一些)。
加速策略(略)。
速度上比Fast R-CNN快了很多,跟Faster R-CNN差很少,可是精度上比前二者都更高。
還有一些很好的其餘算法,這裏沒有列舉出來,可是從這些列出的算法中,能夠看出一些內容: 1.目標檢測在融入了深度學習後,發展迅速,尤爲是近幾年,檢測的速度不斷加快,精度也在不斷提升; 2.總體目標雖然是快速高效地完成檢測,但研究的熱點內容逐漸從如何更好地構建深層神經網絡,轉變到快速高效地提取proposal,再到如何更準確地定位和實時處理問題; 3.基本的卷積神經網絡結構已經在2014年左右奠基了基本格局,由基本網絡例如AlexNet, VGG,GoogLeNet等衍生出的檢測網絡比比皆是; 4.提取proposal的方法,始終都是提升檢測速度的關鍵,逐漸從利用原圖信息提取proposal,轉變爲利用conv feature map提取的方式,例如RPN,HyperNet等; 5.訓練測試的pipeline,從特徵提取,定位和分類獨立進行,轉變爲全都在神經網絡裏完成的end-to-end模式; 6.仍然有較大的提高空間,從各類檢測方法的評估來看,mAP精度還有不小的提高空間(目前還停留在80%如下),而想要實現實時處理(如YOLO),就要以犧牲精度爲代價。