object detection個人理解,就是在給定的圖片中精確找到物體所在位置,並標註出物體的類別。object detection要解決的問題就是物體在哪裏,是什麼這整個流程的問題。然而,這個問題可不是那麼容易解決的,物體的尺寸變化範圍很大,擺放物體的角度,姿態不定,並且能夠出如今圖片的任何地方,更況且物體還能夠是多個類別。算法
object detection技術的演進:
RCNN->SppNET->Fast-RCNN->Faster-RCNN網絡
從圖像識別的任務提及
這裏有一個圖像任務:
既要把圖中的物體識別出來,又要用方框框出它的位置。
框架
上面的任務用專業的說法就是:圖像識別+定位
圖像識別(classification):
輸入:圖片
輸出:物體的類別
評估方法:準確率
函數
定位(localization):
輸入:圖片
輸出:方框在圖片中的位置(x,y,w,h)
評估方法:檢測評價函數 intersection-over-union ( IOU )
性能
卷積神經網絡CNN已經幫咱們完成了圖像識別(斷定是貓仍是狗)的任務了,咱們只須要添加一些額外的功能來完成定位任務便可。學習
定位的問題的解決思路有哪些?
思路一:看作迴歸問題
看作迴歸問題,咱們須要預測出(x,y,w,h)四個參數的值,從而得出方框的位置。優化
步驟1:
• 先解決簡單問題, 搭一個識別圖像的神經網絡
• 在AlexNet VGG GoogleLenet上fine-tuning一下spa
步驟2:
• 在上述神經網絡的尾部展開(也就說CNN前面保持不變,咱們對CNN的結尾處做出改進:加了兩個頭:「分類頭」和「迴歸頭」)
• 成爲classification + regression模式
設計
步驟3:
• Regression那個部分用歐氏距離損失
• 使用SGD訓練3d
步驟4:
• 預測階段把2個頭部拼上
• 完成不一樣的功能
這裏須要進行兩次fine-tuning
第一次在ALexNet上作,第二次將頭部改爲regression head,前面不變,作一次fine-tuning
Regression的部分加在哪?
有兩種處理方法:
• 加在最後一個卷積層後面(如VGG)
• 加在最後一個全鏈接層後面(如R-CNN)
regression太難作了,應千方百計轉換爲classification問題。
regression的訓練參數收斂的時間要長得多,因此上面的網絡採起了用classification的網絡來計算出網絡共同部分的鏈接權值。
思路二:取圖像窗口
• 仍是剛纔的classification + regression思路
• 我們取不一樣的大小的「框」
• 讓框出如今不一樣的位置,得出這個框的斷定得分
• 取得分最高的那個框
左上角的黑框:得分0.5
右上角的黑框:得分0.75
左下角的黑框:得分0.6
右下角的黑框:得分0.8
根據得分的高低,咱們選擇了右下角的黑框做爲目標位置的預測。
注:有的時候也會選擇得分最高的兩個框,而後取兩框的交集做爲最終的位置預測。
疑惑:框要取多大?
取不一樣的框,依次從左上角掃到右下角。很是粗暴啊。
總結一下思路:
對一張圖片,用各類大小的框(遍歷整張圖片)將圖片截取出來,輸入到CNN,而後CNN會輸出這個框的得分(classification)以及這個框圖片對應的x,y,h,w(regression)。
這方法實在太耗時間了,作個優化。
原來網絡是這樣的:
優化成這樣:把全鏈接層改成卷積層,這樣能夠提提速。
物體檢測(Object Detection)
當圖像有不少物體怎麼辦的?難度但是一下暴增啊。
那任務就變成了:多物體識別+定位多個物體
那把這個任務看作分類問題?
當作分類問題有何不妥?
• 你須要找不少位置, 給不少個不一樣大小的框
• 你還須要對框內的圖像分類
• 固然, 若是你的GPU很強大, 恩, 那加油作吧…
看作classification, 有沒有辦法優化下?我可不想試那麼多框那麼多位置啊!
有人想到一個好方法:
找出可能含有物體的框(也就是候選框,好比選1000個候選框),這些框之間是能夠互相重疊互相包含的,這樣咱們就能夠避免暴力枚舉的全部框了。
大牛們發明好多選定候選框的方法,好比EdgeBoxes和Selective Search。
如下是各類選定候選框的方法的性能對比。
有一個很大的疑惑,提取候選框用到的算法「選擇性搜索」到底怎麼選出這些候選框的呢?那個就得好好看看它的論文了,這裏就不介紹了。
R-CNN橫空出世
基於以上的思路,RCNN的出現了。
步驟一:訓練(或者下載)一個分類模型(好比AlexNet)
步驟二:對該模型作fine-tuning
• 將分類數從1000改成20
• 去掉最後一個全鏈接層
步驟三:特徵提取
• 提取圖像的全部候選框(選擇性搜索)
• 對於每個區域:修正區域大小以適合CNN的輸入,作一次前向運算,將第五個池化層的輸出(就是對候選框提取到的特徵)存到硬盤
步驟四:訓練一個SVM分類器(二分類)來判斷這個候選框裏物體的類別
每一個類別對應一個SVM,判斷是否是屬於這個類別,是就是positive,反之nagative
好比下圖,就是狗分類的SVM
步驟五:使用迴歸器精細修正候選框位置:對於每個類,訓練一個線性迴歸模型去斷定這個框是否框得完美。
RCNN的進化中SPP Net的思想對其貢獻很大,這裏也簡單介紹一下SPP Net。
SPP Net
SPP:Spatial Pyramid Pooling(空間金字塔池化)
它的特色有兩個:
1.結合空間金字塔方法實現CNNs的對尺度輸入。
通常CNN後接全鏈接層或者分類器,他們都須要固定的輸入尺寸,所以不得不對輸入數據進行crop或者warp,這些預處理會形成數據的丟失或幾何的失真。SPP Net的第一個貢獻就是將金字塔思想加入到CNN,實現了數據的多尺度輸入。
以下圖所示,在卷積層和全鏈接層之間加入了SPP layer。此時網絡的輸入能夠是任意尺度的,在SPP layer中每個pooling的filter會根據輸入調整大小,而SPP的輸出尺度始終是固定的。
2.只對原圖提取一次卷積特徵
在R-CNN中,每一個候選框先resize到統一大小,而後分別做爲CNN的輸入,這樣是很低效的。
因此SPP Net根據這個缺點作了優化:只對原圖進行一次卷積獲得整張圖的feature map,而後找到每一個候選框zaifeature map上的映射patch,將此patch做爲每一個候選框的卷積特徵輸入到SPP layer和以後的層。節省了大量的計算時間,比R-CNN有一百倍左右的提速。
Fast R-CNN
SPP Net真是個好方法,R-CNN的進階版Fast R-CNN就是在RCNN的基礎上採納了SPP Net方法,對RCNN做了改進,使得性能進一步提升。
R-CNN與Fast RCNN的區別有哪些呢?
先說RCNN的缺點:即便使用了selective search等預處理步驟來提取潛在的bounding box做爲輸入,可是RCNN仍會有嚴重的速度瓶頸,緣由也很明顯,就是計算機對全部region進行特徵提取時會有重複計算,Fast-RCNN正是爲了解決這個問題誕生的。
大牛提出了一個能夠看作單層sppnet的網絡層,叫作ROI Pooling,這個網絡層能夠把不一樣大小的輸入映射到一個固定尺度的特徵向量,而咱們知道,conv、pooling、relu等操做都不須要固定size的輸入,所以,在原始圖片上執行這些操做後,雖然輸入圖片size不一樣致使獲得的feature map尺寸也不一樣,不能直接接到一個全鏈接層進行分類,可是能夠加入這個神奇的ROI Pooling層,對每一個region都提取一個固定維度的特徵表示,再經過正常的softmax進行類型識別。另外,以前RCNN的處理流程是先提proposal,而後CNN提取特徵,以後用SVM分類器,最後再作bbox regression,而在Fast-RCNN中,做者巧妙的把bbox regression放進了神經網絡內部,與region分類和併成爲了一個multi-task模型,實際實驗也證實,這兩個任務可以共享卷積特徵,並相互促進。Fast-RCNN很重要的一個貢獻是成功的讓人們看到了Region Proposal+CNN這一框架實時檢測的但願,原來多類檢測真的能夠在保證準確率的同時提高處理速度,也爲後來的Faster-RCNN作下了鋪墊。
畫一畫重點:
R-CNN有一些至關大的缺點(把這些缺點都改掉了,就成了Fast R-CNN)。
大缺點:因爲每個候選框都要獨自通過CNN,這使得花費的時間很是多。
解決:共享卷積層,如今不是每個候選框都當作輸入進入CNN了,而是輸入一張完整的圖片,在第五個卷積層再獲得每一個候選框的特徵
原來的方法:許多候選框(好比兩千個)-->CNN-->獲得每一個候選框的特徵-->分類+迴歸
如今的方法:一張完整圖片-->CNN-->獲得每張候選框的特徵-->分類+迴歸
因此容易看見,Fast RCNN相對於RCNN的提速緣由就在於:不過不像RCNN把每一個候選區域給深度網絡提特徵,而是整張圖提一次特徵,再把候選框映射到conv5上,而SPP只須要計算一次特徵,剩下的只須要在conv5層上操做就能夠了。
在性能上提高也是至關明顯的:
Faster R-CNN
Fast R-CNN存在的問題:存在瓶頸:選擇性搜索,找出全部的候選框,這個也很是耗時。那咱們能不能找出一個更加高效的方法來求出這些候選框呢?
解決:加入一個提取邊緣的神經網絡,也就說找到候選框的工做也交給神經網絡來作了。
作這樣的任務的神經網絡叫作Region Proposal Network(RPN)。
具體作法:
• 將RPN放在最後一個卷積層的後面
• RPN直接訓練獲得候選區域
RPN簡介:
• 在feature map上滑動窗口
• 建一個神經網絡用於物體分類+框位置的迴歸
• 滑動窗口的位置提供了物體的大致位置信息
• 框的迴歸提供了框更精確的位置
一種網絡,四個損失函數;
• RPN calssification(anchor good.bad)
• RPN regression(anchor->propoasal)
• Fast R-CNN classification(over classes)
• Fast R-CNN regression(proposal ->box)
速度對比
Faster R-CNN的主要貢獻是設計了提取候選區域的網絡RPN,代替了費時的選擇性搜索,使得檢測速度大幅提升。
最後總結一下各大算法的步驟:
RCNN
1. 在圖像中肯定約1000-2000個候選框 (使用選擇性搜索)
2. 每一個候選框內圖像塊縮放至相同大小,並輸入到CNN內進行特徵提取
3. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
4. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置
Fast RCNN
1. 在圖像中肯定約1000-2000個候選框 (使用選擇性搜索)
2. 對整張圖片輸進CNN,獲得feature map
3. 找到每一個候選框在feature map上的映射patch,將此patch做爲每一個候選框的卷積特徵輸入到SPP layer和以後的層
4. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
5. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置
Faster RCNN
1. 對整張圖片輸進CNN,獲得feature map
2. 卷積特徵輸入到RPN,獲得候選框的特徵信息
3. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
4. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置
總的來講,從R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走來,基於深度學習目標檢測的流程變得愈來愈精簡,精度愈來愈高,速度也愈來愈快。能夠說基於region proposal的R-CNN系列目標檢測方法是當前目標檢測技術領域最主要的一個分支。