普通的深度學習監督算法主要用來作分類,分類的目標是要識別出圖中所示是一隻貓。而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)競賽以及實際的應用中,還包括目標定位和目標檢測等任務。其中目標定位不只僅要識別出來是什麼物體(即分類),並且還要預測物體的位置,位置通常用邊框(bounding box)標記。而目標檢測實質是多目標的定位,即要在圖片中定位多個目標物體,包括分類和定位。算法
簡單來講,分類,定位和檢測的區別以下:網絡
目標檢測對於人類來講並不困難,經過對圖片中不一樣顏色模塊的感知很容易定位並分類出其中的目標物體,但對於計算機來講,面對的是RGB像素矩陣,很難從圖像中直接獲得「狗」和「貓」這樣的抽象概念並定位其位置,再加上有時候多個物體和雜亂的背景混雜在一塊兒,使得目標檢測更加困難。在傳統視覺領域,目標檢測就是一個很是熱門的研究方向,一些特定目標的檢測,好比人臉檢測和行人檢測已經有很是成熟的技術了。普通的目標檢測也有過不少的嘗試,可是效果老是差強人意。框架
傳統的目標檢測通常使用滑動窗口的框架,主要包括三個步驟:函數
傳統的目標檢測中,多尺度形變部件模型DPM(Deformable Part Model)是出類拔萃的,連續得到VOC(Visual Object Class)2007到2009的檢測冠軍,DPM把物體當作多個組成部分(好比人臉的鼻子、嘴巴等),用部件間的關係來描述物體,這個特性很是符合天然界不少物體的非剛體特徵。DPM能夠看作是HOG+SVM的擴展,很好的繼承了二者的優點。在人臉檢測、行人檢測等任務上取得了不錯的效果,可是DPM相對複雜,檢測速度也很慢,從而也出現了不少改進的方法。正當你們熱火朝天的改進DPM性能的時候,基於深度學習的目標檢測橫空出世,迅速蓋過了DPM的風頭,不少以前研究傳統目標檢測算法的研究者也開始轉向深度學習。性能
基於深度學習的目標檢測發展起來之後,其效果也一直難以突破。2013年R-CNN誕生了,VOC2007測試集的mAP被提高至48%,2014年經過修改網絡結構又飆升至66%,同時ILSVRC2013測試集的mAP也被提高至31.4%學習
R-CNN是Region-based Convolutional Neural Networks的縮寫,中文翻譯是基於區域的卷積神經網絡,是一種結合區域提名(Region Proposal)和卷積神經網絡(CNN)的目標檢測方法。R-CNN是第一個真正能夠工業級應用的解決方案,這也和深度學習自己的發展相似,神經網絡、卷積網絡都不是什麼新概念,但在本世紀忽然真正變得可行,而一旦可行以後再迅猛發展也不足爲奇了。測試
R-CNN這個領域目前研究很是活躍,前後出現了R-CNN,SPP-Net,Fast R-CNN,Faster R-CNN,R-FCN,YOLO,SSD等研究。這些創新工做其實不少時候是把一些傳統視覺領域的方法和深度學習結合起來了,好比選擇性搜索(Selective Search)和圖像金字塔(Pyramid)等編碼
深度學習相關的目標檢測方法大體能夠分爲兩派:翻譯
目前來講,基於區域提名的方法依然佔據上風,但端到端的方法速度上優點明顯,後續的發展拭目以待。rest
本小節主要介紹區域提名的方法,包括R-CNN,SPP-Net,Fast R-CNN,Faster R-CNN,R-FCN
如前面所述,早期的目標檢測,大都使用滑動窗口的方式進行窗口提名,這種方式本質是窮舉法,R-CNN採用的是Selective Search
如下是R-CNN的主要步驟:
事實上,R-CNN有許多缺點:
SPP-Net,其主要思想是去掉原始圖像上的crop/warp等操做,換成了在卷積特徵上的空間金字塔池化層(Spatial Pyramid Pooling,SPP),爲什麼要引入SPP層,主要緣由是CNN的全鏈接要求輸入圖片是大小一致的,而實際的輸入圖片每每大小不一,若是直接縮放到統一尺寸,頗有可能有的物體會充滿整個圖片,而有的物體可能只能再到圖片的一角。傳統的解決方案是進行不一樣位置的裁剪,但這些裁剪技術均可能會致使一些問題的出現,好比crop會致使物體不全,warp致使物體被拉伸後變形嚴重,SPP就是爲了解決這個問題的。SPP對整圖提取固定維度的特徵,再把圖片均分紅4份,每份提取相同的維度特徵,再把圖片均勻分紅16份,以此類推,能夠看出,不管圖片大小如何,提取出來的維度數據都是一致的,這樣就能夠統一送至全鏈接層了。SPP的思想在後來的R-CNN模型中也被普遍用到。
SPP-Net網絡,其實實質是在最後一層卷積層後加了一個SPP層,將維度不一的卷積特徵轉換爲維度一致的全鏈接輸入。
SPP-Net作目標檢測的主要步驟爲:
SPP-Net解決了R-CNN區域提名時crop/warp帶來的誤差問題,提出了SPP層,使得輸入的候選框可大可小,但其餘方面依然和R-CNN同樣,於是依然存在很多問題,這就有了後面的Fast R-CNN
Fast R-CNN是要解決R-CNN和SPP-Net兩千個左右候選框帶來的重複計算問題,其主要思想爲:
Fast R-CNN的主要步驟以下:
Fast R-CNN比R-CNN的訓練速度(大模型)快8,8倍,測試時間快213倍,比SPP-Net訓練速度快2.6倍,測試速度快10倍左右。
Fast R-CNN使用Selective Serach來進行區域提名,速度依然不夠快。Faster R-CNN則直接利用RPN(Region Proposal Networks)網絡來計算候選框。RPN以一張任意大小的圖片爲輸入,輸出一批矩形區域提名,每一個區域對應一個目標分數和位置信息。
Faster R-CNN的主要步驟以下:
總之,Faster R-CNN拋棄了Selective Search,引入了RPN網絡,使得區域提名,分類,迴歸一塊兒共用卷積特徵,從而獲得了進一步的加速。可是Faster R-CNN須要對兩萬個Anchor Box先判斷是不是目標(目標斷定),而後再進行目標識別,分紅兩步。
前面的目標檢測方法均可以細分爲兩個子網絡:
R-FCN則是將最後的全鏈接層之類換爲了一個位置敏感的卷積網絡,從而讓全部的計算均可以共享。具體來講,先把每一個區域提名劃分爲K×K個網格,好比R-FCN原文中k的取值爲3,則對應的九個網格分別表示:左上top-left,上中top-center,右上top-right,...........,右下bottom-right,對應的九宮格,每一個Grid都有對應的編碼,但預測時候會有C+1個輸出,C表示類別數目,+1是由於有背景類別,所有的輸出通道數量爲K^2 * (C+1).須要注意的是九宮格,可是Pooling時候只有一個起做用,好比bottom-right層只有右下角的小塊起做用,那麼問題來了,這一層的其餘8個框有什麼做用呢?答案是她們能夠做爲其餘RoI(偏左或者偏上的RoI)的右下角。
R-FCN的步驟:
本節介紹端到端(End-to-End)的目標檢測方法,這些方法無需區域提名,包括YOLO和SSD.
YOLO的全拼是You Only Look Once,顧名思義就是隻看一次,進一步把目標斷定和目標識別合二爲一,因此識別的性能有了很大的提高,達到每秒45幀,而在快速版的YOLO(Fast YOLO,卷積層更少)中,能夠達到每秒155幀。針對一張圖片,YOLO的處理步驟爲:
YOLO將448*448大小的圖切成S*S的網格,目標中心點所在的擱置負責該目標的相關檢測,每一個網絡預測B個邊框及其置信度,以及C種類別的機率。YOLO中S = 7 ,B = 2,C取決於數據集中物體類別數量,好比VOC數據集就是C = 20,對於VOC數據集來講,YOLO就是把圖片統一縮放到448*448,而後每張圖片平均劃分爲7*7=49個小格子,每一個格子預測2個矩形框及其置信度,以及20中類別的機率。
YOLO簡化了真個目標檢測的流程,速度提高也很大,可是YOLO仍是有很多能夠改進的地方,好比S*S的網格就是一個比較啓發式的策略,若是兩個小目標同時落入一個格子中,模型也只能預測一個;另外一個問題是Loss函數對不一樣大小的bbox未作區分。
SSD的全拼是Single Shot MultiBox Detector,衝着YOLO的缺點來的。SSD的網絡分爲兩部分,前面是用於圖像分類的標準網絡,後面的網絡是用於檢測的多尺度特徵映射層,從而達到檢測不一樣大小的目標,SSD在保持YOLO高速的同時效果也提高了不少,主要是借鑑了Faster R-CNN中的Anchor機制,同時使用了多尺度。可是從原理依然能夠看出,Default Box的新裝以及網格大小是事先固定的,那麼對特定圖片小目標的提取會不夠好。
基於深度學習的目標檢測整體上分爲兩派: