目標檢測任務
目標檢測的任務是找出圖像或視頻中的感興趣目標,同時檢測出它們的位置和大小,是機器視覺領域的核心問題之一。
目標檢測過程中有很多不確定因素,如圖像中目標數(shù)量不確定,物體有不同的外觀、形狀、姿態(tài),加之物體成像時會有光照、遮擋等因素的干擾,導致檢測算法有一定的難度。
two stage與one stage
進入深度學習時代以來,物體檢測發(fā)展主要集中在兩個方向:two stage 算法如 R-CNN 系列和one stage 算法如 YOLO、SSD 等。兩者的主要區(qū)別在于 two stage 算法需要先生成 proposal(一個有可能包含待檢物體的預選框),然后進行細粒度的物體檢測。而 one stage 算法會直接在網(wǎng)絡中提取特征來預測物體分類和位置。
Two-Stage算法(段到段):
使用各種CNN卷積神經(jīng)網(wǎng)絡作為backbone主干網(wǎng)絡,進行特征提取,然后進行一步粗分類(區(qū)分前景和后景)和粗定位(anchor),也就是說在上圖的“產(chǎn)生候選區(qū)域CNN特征”之前還應該有一個框“使用RPN網(wǎng)絡產(chǎn)生候選區(qū)CNN特征”。
two-stage常見算法:
One-Stage算法(端到端):
one-stage算法使用CNN卷積特征,直接回歸物體的類別概率和位置坐標值。
two-stage與one-stage對比:
-
two-stage精度高但速度慢,one-stage速度快但精度稍遜;
-
two-stage目標檢測器采用了兩段結構采樣來處理類別不均衡的問題(意思就是在同一張圖片中需要進行檢測的目標太少,不需要檢測的背景信息太多),一階段中:rpn使正負樣本更加均衡(先粗分類,區(qū)分前后景),再粗回歸,使用Anchor來擬合bbox,然后再二階段精調;
-
One stage detector 的一個通病就是既要做定位又要做classification。最后幾層1x1 conv layer的loss混在一起,并沒有什么專門做detection或者專門做bbox regression的參數(shù),那每個參數(shù)的學習難度就大一點;
-
Two stage detector 的第一個stage相當于先拿一個one stage detector來做一次前景后景的classification + detection。這個任務比one stage detector的直接上手N class classification + detection要簡單很多。有了前景后景,就可以選擇性的挑選樣本使得正負樣本更加均衡,然后拿著一些參數(shù)重點訓練classification。訓練classification的難度也比直接做混合的classification和regression 簡單很多;
-
two-stage其實就是把一個復雜的大問題拆分成更為簡單的小問題。各個參數(shù)有專攻,Two Stage Detector 在這個方面是有優(yōu)勢的。但one stage detector 里如果用了 focal loss 和 separate detection/classification head 那效果跟 two stage detector 應該是一樣的。
優(yōu)缺點對比:
|
one-stage |
two-stage |
優(yōu)勢 |
速度快 |
精度高 定位、檢出率 |
避免背景錯誤,產(chǎn)生false positives |
Anchor機制 |
|
學到物體的 泛化特征 |
共享計算量 |
|
劣勢 |
精度低 定位、檢出率 |
速度慢 |
小物體的 檢測效果不好 |
訓練時間長 |
|
|
誤報率高 |
Coovally部分內置目標檢測算法介紹
Two-Stage算法示例
Faster R-CNN
Faster R-CNN 取代selective search,直接通過一個Region Proposal Network (RPN)生成待檢測區(qū)域,這么做,在生成RoI區(qū)域的時候,時間也就從2s縮減到了10ms。下圖是Faster R-CNN整體結構。
由上圖可知,F(xiàn)aster R-CNN由共享卷積層、RPN、RoI pooling以及分類和回歸四部分組成:
-
首先使用共享卷積層為全圖提取特征feature maps;
-
將得到的feature maps送入RPN,RPN生成待檢測框(指定RoI的位置),并對RoI的包圍框進行第一次修正;
-
RoI Pooling Layer根據(jù)RPN的輸出在feature map上面選取每個RoI對應的特征,并將維度置為定值;
-
使用全連接層(FC Layer)對框進行分類,并且進行目標包圍框的第二次修正。尤其注意的是,F(xiàn)aster R-CNN真正實現(xiàn)了端到端的訓練(end-to-end training)。Faster R-CNN最大特色是使用了RPN取代了SS算法來獲取RoI,以下對RPN進行分析。
RPN
經(jīng)典的檢測方法生成檢測框都非常耗時,如OpenCV adaboost使用滑動窗口+圖像金字塔生成檢測框;或如R-CNN使用SS(Selective Search)方法生成檢測框。
而Faster R-CNN則拋棄了傳統(tǒng)的滑動窗口和SS方法,直接使用RPN生成檢測框,這也是Faster R-CNN的巨大優(yōu)勢,能極大提升檢測框的生成速度。下圖為RPN的工作原理:
上圖展示了RPN網(wǎng)絡的具體結構。
可以看到RPN網(wǎng)絡實際分為2條支線,上面一條支線通過softmax來分類anchors獲得前景foreground和背景background(檢測目標是foreground),下面一條支線用于計算anchors的邊框偏移量,以獲得精確的proposals。
而最后的proposal層則負責綜合foreground anchors和偏移量獲取proposals,同時剔除太小和超出邊界的proposals。其實整個網(wǎng)絡到了Proposal Layer這里,就完成了相當于目標定位的功能。
anchor:簡單地說,RPN依靠一個在共享特征圖上滑動的窗口,為每個位置生成9種預先設置好長寬比與面積的目標框(即anchor)。
分類和定位
Faster R-CNN中的RoI Pooling Layer與 Fast R-CNN中原理一樣。
在RoI Pooling Layer之后,就是Faster R-CNN的分類器和RoI邊框修正訓練。分類器主要是分這個提取的RoI具體是什么類別(人,車,馬等),一共C+1類(包含一類背景)。
RoI邊框修正和RPN中的anchor邊框修正原理一樣,同樣也是SmoothL1 Loss,值得注意的是,RoI邊框修正也是對于非背景的RoI進行修正,對于類別標簽為背景的RoI,則不進行RoI邊框修正的參數(shù)訓練。
One-Stage算法示例
1. Yolo
針對于two-stage目標檢測算法普遍存在的運算速度慢的缺點,Yolo創(chuàng)造性的提出了one-stage,也就是將物體分類和物體定位在一個步驟中完成。
Yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實現(xiàn)one-stage。
通過這種方式,Yolo可實現(xiàn)45幀每秒的運算速度,完全能滿足實時性要求(達到24幀每秒,人眼就認為是連續(xù)的)。
整個系統(tǒng)如下圖所示:
主要分為三個部分:卷積層,目標檢測層,NMS篩選層。
卷積層
采用Google inceptionV1網(wǎng)絡,對應到上圖中的第一個階段,共20層。
這一層主要是進行特征提取,從而提高模型泛化能力。但作者對inceptionV1進行了改造,他沒有使用inception module結構,而是用一個1x1的卷積,并聯(lián)一個3x3的卷積來替代(可以認為只使用了inception module中的一個分支,應該是為了簡化網(wǎng)絡結構)。
目標檢測層
先經(jīng)過4個卷積層和2個全連接層,最后生成7x7x30的輸出。
先經(jīng)過4個卷積層的目的是為了提高模型泛化能力。
Yolo將一副448x448的原圖分割成了7x7個網(wǎng)格,然后每個單元格負責去檢測那些中心點落在該格子內的目標。
NMS篩選層
篩選層是為了在多個結果中(多個bounding box)篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低于閾值的box,對剩下的box進行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體算法可以回顧上面faster R-CNN小節(jié))。
這樣就得到了最終的最合適的幾個box和他們的類別。
Yolo損失函數(shù)
yolo的損失函數(shù)包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下:
誤差均采用了均方差算法,Yolo算法開創(chuàng)了one-stage檢測的先河,它將物體分類和物體檢測網(wǎng)絡合二為一,都在全連接層完成。故它大大降低了目標檢測的耗時,提高了實時性。
但它的缺點也十分明顯:
-
每個網(wǎng)格只對應兩個bounding box,當物體的長寬比不常見(也就是訓練數(shù)據(jù)集覆蓋不到時),效果很差;
-
原始圖片只劃分為7x7的網(wǎng)格,當兩個物體靠的很近時,效果很差;
-
最終每個網(wǎng)格只對應一個類別,容易出現(xiàn)漏檢(物體沒有被識別到);
-
對于圖片中比較小的物體,效果很差。
2. SSD
Faster R-CNN準確率mAP較高,漏檢率recall較低,但速度較慢。而Yolo則相反,速度快,但準確率和漏檢率不盡人意。
SSD綜合了他們的優(yōu)缺點,對輸入300x300的圖像,在voc2007數(shù)據(jù)集上test,能夠達到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。
SSD和Yolo一樣都是采用一個CNN網(wǎng)絡來進行檢測,但是卻采用了多尺度的特征圖,SSD網(wǎng)絡結構如下圖:
和Yolo一樣,也分為三部分:卷積層,目標檢測層和NMS篩選層。
卷積層
SSD論文采用了VGG16的基礎網(wǎng)絡,其實這也是幾乎所有目標檢測神經(jīng)網(wǎng)絡的慣用方法。先用一個CNN網(wǎng)絡來提取特征,然后再進行后續(xù)的目標定位和目標分類識別。
目標檢測層
這一層由5個卷積層和一個平均池化層組成。去掉了最后的全連接層。SSD認為目標檢測中的物體,只與周圍信息相關,它的感受野不是全局的,故沒必要也不應該做全連接。SSD的特點如下:
-
多尺寸feature map上進行目標檢測。每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進行目標位置和類別的訓練和預測,從而達到多尺度檢測的目的,可以克服yolo對于寬高比不常見的物體,識別準確率較低的問題。而yolo中,只在最后一個卷積層上做目標位置和類別的訓練和預測。這是SSD相對于yolo能提高準確率的一個關鍵所在。
如上所示,在每個卷積層上都會進行目標檢測和分類,最后由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當于多了很多寬高比例的bounding box,可以大大提高泛化能力。
-
設置先驗框。在Yolo中,每個單元預測多個邊界框,但是其都是相對這個單元本身(正方塊),但是真實目標的形狀是多變的,Yolo需要在訓練過程中自適應目標的形狀。而SSD和Faster R-CNN相似,也提出了anchor的概念。卷積輸出的feature map,每個點對應為原圖的一個區(qū)域的中心點。以這個點為中心,構造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應4個位置參數(shù)(x,y,w,h)和21個類別概率(voc訓練集為20分類問題,在加上anchor是否為背景,共21分類)。
SSD的檢測值也與Yolo不太一樣。對于每個單元的每個先驗框,其都輸出一套獨立的檢測值,對應一個邊界框,主要分為兩個部分。第一部分是各個類別的置信度或者評分,值得注意的是SSD將背景也當做了一個特殊的類別,如果檢測目標共有 個類別,SSD其實需要預測 個置信度值,其中第一個置信度指的是不含目標或者屬于背景的評分。后面當我們說 個類別置信度時,請記住里面包含背景那個特殊的類別,即真實的檢測類別只有 個。在預測過程中,置信度最高的那個類別就是邊界框所屬的類別,特別地,當?shù)谝粋€置信度值最高時,表示邊界框中并不包含目標。第二部分就是邊界框的location,包含4個值 ,分別表示邊界框的中心坐標以及寬高。但是真實預測值其實只是邊界框相對于先驗框的轉換值(paper里面說是offset,但是覺得transformation更合適,參見R-CNN。
另外,SSD采用了數(shù)據(jù)增強。生成與目標物體真實box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機選取這些patch參與訓練,并對他們進行隨機水平翻轉等操作。SSD認為這個策略提高了8.8%的準確率。
篩選層
和yolo的篩選層基本一致,同樣先過濾掉類別概率低于閾值的default box,再采用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標檢測輸出的default box。
審核編輯 :李倩
-
算法
+關注
關注
23文章
4607瀏覽量
92840 -
目標檢測
+關注
關注
0文章
209瀏覽量
15605 -
深度學習
+關注
關注
73文章
5500瀏覽量
121113
原文標題:目標檢測一階段與二階段算法簡介
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論