前言
圖片分類任務我們已經熟悉了,就是算法對其中的對象進行分類。而今天我們要了解構建神經網絡的另一個問題,即目標檢測問題。這意味著,我們不僅要用算法判斷圖片中是不是一輛汽車, 還要在圖片中標記出它的位置, 用邊框或紅色方框把汽車圈起來, 這就是目標檢測問題。其中“定位”的意思是判斷汽車在圖片中的具體位置。
近幾年來,目標檢測算法取得了很大的突破。比較流行的算法可以分為兩類,一類是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它們是two-stage的,需要先算法產生目標候選框,也就是目標位置,然后再對候選框做分類與回歸。而另一類是Yolo,SSD這類one-stage算法,其僅僅使用一個卷積神經網絡CNN直接預測不同目標的類別與位置。第一類方法是準確度高一些,但是速度慢,但是第二類算法是速度快,但是準確性要低一些。這可以在下圖中看到。
本文對常見目標檢測算法進行簡要綜述,并最后總結了目標檢測算法方向的一些大V方便大家學習查看。
1. R-CNN
目標檢測有兩個主要任務:物體分類和定位,為了完成這兩個任務,R-CNN借鑒了滑動窗口思想, 采用對區域進行識別的方案,具體是:
輸入一張圖片,通過指定算法從圖片中提取 2000 個類別獨立的候選區域(可能目標區域)
對于每個候選區域利用卷積神經網絡來獲取一個特征向量
對于每個區域相應的特征向量,利用支持向量機SVM 進行分類,并通過一個bounding box regression調整目標包圍框的大小
1.1. 提取候選區域
R-CNN目標檢測首先需要獲取2000個目標候選區域,能夠生成候選區域的方法很多,比如:
objectness
selective search
category-independen object proposals
constrained parametric min-cuts(CPMC)
multi-scale combinatorial grouping
Ciresan R-CNN 采用的是 Selective Search 算法。簡單來說就是通過一些傳統圖像處理方法將圖像分成很多小尺寸區域,然后根據小尺寸區域的特征合并小尺寸得到大尺寸區域,以實現候選區域的選取。
1.2. 提取特征向量
對于上述獲取的候選區域,需進一步使用CNN提取對應的特征向量,作者使用模型AlexNet (2012)。(需要注意的是 Alexnet 的輸入圖像大小是 227x227,而通過 Selective Search 產生的候選區域大小不一,為了與 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是無視候選區域的大小和形狀,統一變換到 227x227 的尺寸)。那么,該網絡是如何訓練的呢?訓練過程如下:
有監督預訓練:訓練網絡參數
樣本:ImageNet
這里只訓練和分類有關的參數,因為ImageNet數據只有分類,沒有位置標注
圖片尺寸調整為227x227
最后一層:4097維向量->1000向量的映射。
特定樣本下的微調 :訓練網絡參數
樣本:
采用訓練好的AlexNet模型進行PASCAL VOC 2007樣本集下的微調,學習率=0.001(PASCAL VOC 2007樣本集上既有圖像中物體類別標簽,也有圖像中物體位置標簽)
mini-batch為32個正樣本和96個負樣本(由于正樣本太少)
修改了原來的1000為類別輸出,改為21維【20類+背景】輸出。
1.3. SVM分類
通過上述卷積神經網絡獲取候選區域的特征向量,進一步使用SVM進行物體分類,關鍵知識點如下:
使用了一個SVM進行分類:向SVM輸入特征向量,輸出類別得分
用于訓練多個SVM的數據集是ImageNet數據
將2000×4096維特征(2000個候選框,每個候選框獲得4096的特征向量)與20個SVM組成的權值矩陣4096×20相乘(20種分類,SVM是二分類器,每個種類訓練一個SVM,則有20個SVM),獲得2000×20維矩陣表示每個建議框是某個物體類別的得分
分別對上述2000×20維矩陣中每列即每一類進行非極大值抑制剔除重疊建議框,得到該列即該類中得分最高的一些候選框;
SVM訓練:
樣本:
由于SVM是二分類器,需要為每個類別訓練單獨的SVM;
SVM訓練時,輸入正負樣本是在AlexNet CNN網絡輸出的4096維特征向量,輸出為該類的得分
由于負樣本太多,采用hard negative mining的方法在負樣本中選取有代表性的負樣本
1.4 邊框修正
使用一個回歸器進行邊框回歸:輸入為卷積神經網絡pool5層的4096維特征向量,輸出為x、y方向的縮放和平移,實現邊框的修正。在進行測試前仍需回歸器進行訓練。回歸器訓練
樣本:
在2014年R-CNN橫空出世的時候,顛覆了以往的目標檢測方案,精度大大提升。對于R-CNN的貢獻,可以主要分為兩個方面:1) 使用了卷積神經網絡進行特征提取 2) 使用bounding box regression進行目標包圍框的修正 但是,我們來看一下,R-CNN有什么問題:1) 耗時的selective search,對一張圖像,需要花費2s 2) 耗時的串行式CNN前向傳播,對于每一個候選框,都需經過一個AlexNet提取特征,為所有的候選框提取特征大約花費47s 3) 三個模塊(CNN特征提取、SVM分類和邊框修正)是分別訓練的,并且在訓練的時候,對于存儲空間的消耗很大
2. Fast R-CNN
面對R-CNN的缺陷,Ross在2015年提出的Fast R-CNN進行了改進,下面我們來概述一下Fast R-CNN的解決方案:
首先還是采用selective search提取2000個候選框RoI
使用一個卷積神經網絡對全圖進行特征提取
使用一個RoI Pooling Layer在全圖特征上摘取每一個RoI對應的特征
分別經過為21和84維的全連接層(并列的,前者是分類輸出,后者是回歸輸出) Fast R-CNN通過CNN直接獲取整張圖像的特征圖,再使用RoI Pooling Layer在特征圖上獲取對應每個候選框的特征,避免了R-CNN中的對每個候選框串行進行卷積(耗時較長)。
2.1 RoI Pooling Layer
對于每個RoI而言,需要從共享卷積層獲取的特征圖上提取對應的特征,并且送入全連接層進行分類。因此,RoI Pooling主要做了兩件事,第一件是為每個RoI選取對應的特征,第二件事是為了滿足全連接層的輸入需求,將每個RoI對應的特征的維度轉化成某個定值。RoI Pooling示意圖如下所示:
如上圖所示,對于每一個RoI,RoI Pooling Layer將其映射到特征圖對應位置,獲取對應特征。另外,由于每一個RoI的尺度各不相同,所以提取出來的特征向量region proposal維度也不盡相同,因此需要某種特殊的技術來做保證輸入后續全連接層的特征向量維度相同。ROI Pooling的提出便是為了解決這一問題的。其思路如下:
將region proposal劃分為目標H×W大小的分塊
對每一個分塊中做MaxPooling(每個分塊中含有多個網格,每個分塊獲取一個特征值)
將所有輸出值組合起來便形成固定大小為H×W的feature map
Fast R-CNN的貢獻可以主要分為兩個方面:
取代R-CNN的串行特征提取方式,直接采用一個CNN對全圖提取特征(這也是為什么需要RoI Pooling的原因)。
除了selective search,其他部分都可以合在一起訓練。Fast R-CNN也有缺點,體現在耗時的selective search還是依舊存在。
3. Faster R-CNN
Faster R-CNN 取代selective search,直接通過一個Region Proposal Network (RPN)生成待檢測區域,這么做,在生成RoI區域的時候,時間也就從2s縮減到了10ms。下圖是Faster R-CNN整體結構。
由上圖可知,Faster R-CNN由共享卷積層、RPN、RoI pooling以及分類和回歸四部分組成:
首先使用共享卷積層為全圖提取特征feature maps
將得到的feature maps送入RPN,RPN生成待檢測框(指定RoI的位置),并對RoI的包圍框進行第一次修正
RoI Pooling Layer根據RPN的輸出在feature map上面選取每個RoI對應的特征,并將維度置為定值
使用全連接層(FC Layer)對框進行分類,并且進行目標包圍框的第二次修正。尤其注意的是,Faster R-CNN真正實現了端到端的訓練(end-to-end training)。Faster R-CNN最大特色是使用了RPN取代了SS算法來獲取RoI,以下對RPN進行分析。
3.1 RPN
經典的檢測方法生成檢測框都非常耗時,如OpenCV adaboost使用滑動窗口+圖像金字塔生成檢測框;或如R-CNN使用SS(Selective Search)方法生成檢測框。而Faster R-CNN則拋棄了傳統的滑動窗口和SS方法,直接使用RPN生成檢測框,這也是Faster R-CNN的巨大優勢,能極大提升檢測框的生成速度。首先來看看RPN的工作原理:
上圖展示了RPN網絡的具體結構。可以看到RPN網絡實際分為2條支線,上面一條支線通過softmax來分類anchors獲得前景foreground和背景background(檢測目標是foreground),下面一條支線用于計算anchors的邊框偏移量,以獲得精確的proposals。而最后的proposal層則負責綜合foreground anchors和偏移量獲取proposals,同時剔除太小和超出邊界的proposals。其實整個網絡到了Proposal Layer這里,就完成了相當于目標定位的功能。anchor:簡單地說,RPN依靠一個在共享特征圖上滑動的窗口,為每個位置生成9種預先設置好長寬比與面積的目標框(即anchor)。這9種初始anchor包含三種面積(128×128,256×256,512×512),每種面積又包含三種長寬比(1:1,1:2,2:1)。示意圖如下所示:
由于共享特征圖的大小約為40×60,所以RPN生成的初始anchor的總數約為20000個(40×60×9)。其實RPN最終就是在原圖尺度上,設置了密密麻麻的候選anchor。進而去判斷anchor到底是前景還是背景,意思就是判斷這個anchor到底有沒有覆蓋目標,以及為屬于前景的anchor進行第一次坐標修正。
判斷前景或背景:對于所有的anchors,首先需要判斷anchor是是否為前景。對于第一個問題,RPN的做法是使用SoftmaxLoss直接訓練,在訓練的時候排除掉了超越圖像邊界的anchor;邊框修正:如圖綠色表示的是飛機的實際框標簽(ground truth),紅色的表示的其中一個候選區域(foreground anchor),即被分類器識別為飛機的區域,但是由于紅色區域定位不準確,這張圖相當于沒有正確檢測出飛機,所以我們希望采用一種方法對紅色的框進行微調,使得候選區域和實際框更加接近:
對于目標框一般使用四維向量來表示(x,y,w,h)(x,y,w,h) ,分別表示目標框的中心點坐標、寬、高,我們使用AA 表示原始的foreground anchor,使用GG 表示目標的ground truth,我們的目標是尋找一種關系,使得輸入原始的Anchor AA 經過映射到一個和真實框GG 更接近的回歸窗口G′G′ ,即:
給定:
尋找一種變換F,使得
那么如何去計算F 呢?這里我們可以通過平移和縮放實現
平移:
縮放:
上面公式中,我們需要學習四個參數,分別是
其中
表示的兩個框中心距離的偏移量
當輸入的anchor A與G相差較小時,可以認為這種變換是一種線性變換, 那么就可以用線性回歸來建模對目標框進行微調(注意,只有當anchors A和G比較接近時,才能使用線性回歸模型,否則就是復雜的非線性問題了)。接下來就是如何通過線性回歸獲得
線性回歸就是給定輸入的特征向量X ,學習一組參數W,使得線性回歸的輸出WX和真實值Y 的差很小。對于該問題,輸入X是特征圖,我們使用? 表示,同時訓練時還需要A到G變換的真實參數值:
輸出是
那么目標函數可以表示為:
其中?(A) 是對應anchor的特征圖組成的特征向量,ww 是需要學習的參數,d(A) 是得到預測值(表示x,y,w,h,也就是每一個變換對應一個上述目標函數),為了讓預測值和真實值差距最小,代價函數如下:
函數優化目標為:
需要說明,只有在G和A比較接近時,才可近似認為上述線性變換成立,下面對于原文中,A與G之間的平移參數和尺度因子為:
在得到每一個候選區域anchor A的修正參數之后,我們就可以計算出精確的anchor,然后按照物體的區域得分從大到小對得到的anchor排序,然后提出一些寬或者高很小的anchor(獲取其它過濾條件),再經過非極大值抑制抑制,取前Top-N的anchors,然后作為proposals(候選框)輸出,送入到RoI Pooling層。那么,RPN怎么實現呢?這個問題通過RPN的本質很好求解,RPN的本質是一個樹狀結構,樹干是一個3×3的卷積層,樹枝是兩個1×1的卷積層,第一個1×1的卷積層解決了前后景的輸出,第二個1×1的卷積層解決了邊框修正的輸出。來看看在代碼中是怎么做的:
從如上代碼中可以看到,對于RPN輸出的特征圖中的每一個點,一個1×1的卷積層輸出了18個值,因為是每一個點對應9個anchor,每個anchor有一個前景分數和一個背景分數,所以9×2=18。另一個1×1的卷積層輸出了36個值,因為是每一個點對應9個anchor,每個anchor對應了4個修正坐標的值,所以9×4=36。那么,要得到這些值,RPN網絡需要訓練。在訓練的時候,就需要對應的標簽。那么,如何判定一個anchor是前景還是背景呢?文中做出了如下定義:如果一個anchor與ground truth的IoU在0.7以上,那這個anchor就算前景(positive)。類似地,如果這個anchor與ground truth的IoU在0.3以下,那么這個anchor就算背景(negative)。在作者進行RPN網絡訓練的時候,只使用了上述兩類anchor,與ground truth的IoU介于0.3和0.7的anchor沒有使用。在訓練anchor屬于前景與背景的時候,是在一張圖中,隨機抽取了128個前景anchor與128個背景anchor。
3.3. 分類和定位
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邊框修正的參數訓練。對于分類器和RoI邊框修正的訓練,可以損失函數描述如下:
上式中u>=1表示RoI邊框修正是對于非背景的RoI而言的,實驗中,上式的λ取1。在訓練分類器和RoI邊框修正時,步驟如下所示:1) 首先通過RPN生成約20000個anchor(40×60×9)。2) 對20000個anchor進行第一次邊框修正,得到修訂邊框后的proposal。3) 對超過圖像邊界的proposal的邊進行clip,使得該proposal不超過圖像范圍。4) 忽略掉長或者寬太小的proposal。5) 將所有proposal按照前景分數從高到低排序,選取前12000個proposal。6) 使用閾值為0.7的NMS算法排除掉重疊的proposal。7) 針對上一步剩下的proposal,選取前2000個proposal進行分類和第二次邊框修正??偟膩碚f,Faster R-CNN的loss分兩大塊,第一大塊是訓練RPN的loss(包含一個SoftmaxLoss和SmoothL1Loss),第二大塊是訓練Faster R-CNN中分類器的loss(包含一個SoftmaxLoss和SmoothL1Loss),Faster R-CNN的總的loss函數描述如下:
4. Mask R-CNN
Mask R-CNN可以分解為如下的3個模塊:Faster-RCNN、RoI Align和Mask。算法框架如下:
圖6 Mask R-CNN算法框架
算法步驟:
首先,輸入一幅你想處理的圖片,然后進行對應的預處理操作,或者預處理后的圖片;
然后,將其輸入到一個預訓練好的神經網絡中(ResNeXt等)獲得對應的feature map;
接著,對這個feature map中的每一點設定預定個的RoI,從而獲得多個候選RoI;
接著,將這些候選的RoI送入RPN網絡進行二值分類(前景或背景)和BB回歸,過濾掉一部分候選的ROI;
接著,對這些剩下的RoI進行RoIAlign操作(即先將原圖和feature map的pixel對應起來,然后將feature map和固定的feature對應起來);
最后,對這些RoI進行分類(N類別分類)、BB回歸和MASK生成(在每一個ROI里面進行FCN操作)。Mask R-CNN是一個非常靈活的框架,可以增加不同的分支完成不同的任務,可以完成目標分類、目標檢測、語義分割、實例分割、人體姿勢識別等多種任務,如下圖所示。
4.1. ROI Align
Mask R-CNN使用RoIAlign取代了Faster RCNN中的RoIPooling,故下文對RoIPooling和RoIAlign進行分析與比較
如上圖所示,RoI Pooling和RoIAlign最大的區別是:前者使用了兩次量化操作,而后者并沒有采用量化操作,使用了線性插值算法,具體的解釋如下所示。
RoI Pooling
如上圖所示,為了得到固定大?。?X7)的feature map,我們需要做兩次量化操作:1)圖像坐標 — feature map坐標,2)feature map坐標 — RoI feature坐標。我們來說一下具體的細節,如圖我們輸入的是一張800x800的圖像,在圖像中有兩個目標(貓和狗),狗的BB大小為665x665,經過VGG16網絡后,我們可以獲得對應的feature map,如果我們對卷積層進行Padding操作,我們的圖片經過卷積層后保持原來的大小,但是由于池化層的存在,我們最終獲得feature map 會比原圖縮小一定的比例,這和Pooling層的個數和大小有關。
在該VGG16中,我們使用了5個池化操作,每個池化操作都是2x2Pooling,因此我們最終獲得feature map的大小為800/32 x 800/32 = 25x25(是整數),但是將狗的BB對應到feature map上面,我們得到的結果是665/32 x 665/32 = 20.78 x 20.78,結果是浮點數,含有小數,但是我們的像素值可沒有小數,那么作者就對其進行了量化操作(即取整操作),即其結果變為20 x 20,在這里引入了第一次的量化誤差;然而我們的feature map中有不同大小的ROI,但是我們后面的網絡卻要求我們有固定的輸入,因此,我們需要將不同大小的ROI轉化為固定的ROI feature,在這里使用的是7x7的ROI feature,那么我們需要將20 x 20的ROI映射成7 x 7的ROI feature,其結果是 20 /7 x 20/7 = 2.86 x 2.86,同樣是浮點數,含有小數點,我們采取同樣的操作對其進行取整吧,在這里引入了第二次量化誤差。其實,這里引入的誤差會導致圖像中的像素和特征中的像素的偏差,即將feature空間的ROI對應到原圖上面會出現很大的偏差。原因如下:比如用我們第二次引入的誤差來分析,本來是2,86,我們將其量化為2,這期間引入了0.86的誤差,看起來是一個很小的誤差呀,但是你要記得這是在feature空間,我們的feature空間和圖像空間是有比例關系的,在這里是1:32,那么對應到原圖上面的差距就是0.86 x 32 = 27.52。這個差距不小吧,這還是僅僅考慮了第二次的量化誤差。這會大大影響整個檢測算法的性能,因此是一個嚴重的問題。
RoIAlign
如上圖所示,為了得到為了得到固定大小(7X7)的feature map,RoIAlign技術并沒有使用量化操作,即我們不想引入量化誤差,比如665 / 32 = 20.78,我們就用20.78,不用什么20來替代它,比如20.78 / 7 = 2.97,我們就用2.97,而不用2來代替它。這就是RoIAlign的初衷。那么我們如何處理這些浮點數呢,我們的解決思路是使用“雙線性插值”算法。雙線性插值是一種比較好的圖像縮放算法,它充分的利用了原圖中虛擬點(比如20.56這個浮點數,像素位置都是整數值,沒有浮點值)四周的四個真實存在的像素值來共同決定目標圖中的一個像素值,即可以將20.56這個虛擬的位置點對應的像素值估計出來。如下圖所示,藍色的虛線框表示卷積后獲得的feature map,黑色實線框表示ROI feature,最后需要輸出的大小是2x2,那么我們就利用雙線性插值來估計這些藍點(虛擬坐標點,又稱雙線性插值的網格點)處所對應的像素值,最后得到相應的輸出。這些藍點是2x2Cell中的隨機采樣的普通點,作者指出,這些采樣點的個數和位置不會對性能產生很大的影響,你也可以用其它的方法獲得。然后在每一個橘紅色的區域里面進行max pooling或者average pooling操作,獲得最終2x2的輸出結果。我們的整個過程中沒有用到量化操作,沒有引入誤差,即原圖中的像素和feature map中的像素是完全對齊的,沒有偏差,這不僅會提高檢測的精度,同時也會有利于實例分割。
4.2. Mask
下圖闡述了Mask R-CNN的Mask branch:
在Mask R-CNN中的RoI Align之后有一個"head"部分,主要作用是將RoI Align的輸出維度擴大,這樣在預測Mask時會更加精確。在Mask Branch的訓練環節,作者沒有采用FCN式的SoftmaxLoss,反而是輸出了K個Mask預測圖(為每一個類都輸出一張),并采用average binary cross-entropy loss訓練,當然在訓練Mask branch的時候,輸出的K個特征圖中,也只是對應ground truth類別的那一個特征圖對Mask loss有貢獻。Mask R-CNN的訓練損失函數可以描述為:
5. Yolo
以上目標檢測模型都是two-stage算法,針對于two-stage目標檢測算法普遍存在的運算速度慢的缺點,Yolo創造性的提出了one-stage,也就是將物體分類和物體定位在一個步驟中完成。Yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實現one-stage。通過這種方式,Yolo可實現45幀每秒的運算速度,完全能滿足實時性要求(達到24幀每秒,人眼就認為是連續的)。整個系統如下圖所示。
主要分為三個部分:卷積層,目標檢測層,NMS篩選層
5.1 卷積層
采用Google inceptionV1網絡,對應到上圖中的第一個階段,共20層。這一層主要是進行特征提取,從而提高模型泛化能力。但作者對inceptionV1進行了改造,他沒有使用inception module結構,而是用一個1x1的卷積,并聯一個3x3的卷積來替代。(可以認為只使用了inception module中的一個分支,應該是為了簡化網絡結構)
5.2 目標檢測層
先經過4個卷積層和2個全連接層,最后生成7x7x30的輸出。先經過4個卷積層的目的是為了提高模型泛化能力。Yolo將一副448x448的原圖分割成了7x7個網格,然后每個單元格負責去檢測那些中心點落在該格子內的目標,如下圖所示,可以看到狗這個目標的中心落在左下角一個單元格內,那么該單元格負責預測這個狗。每個單元格會預測 個邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的準確度。前者記為
,當該邊界框是背景時(即不包含目標),此時
。而當該邊界框包含目標時,
。邊界框的準確度可以用預測框與實際框(ground truth)的IOU(intersection over union,交并比)來表征,記為
。因此置信度可以定義為
。很多人可能將Yolo的置信度看成邊界框是否含有目標的概率,但是其實它是兩個因子的乘積,預測框的準確度也反映在里面。邊界框的大小與位置可以用4個值來表征:
,其中
是邊界框的中心坐標,而
和
是邊界框的寬與高。還有一點要注意,中心坐標的預測值
是相對于每個單元格左上角坐標點的偏移值,并且單位是相對于單元格大小的,單元格的坐標定義如圖6所示。而邊界框的
和
預測值是相對于整個圖片的寬與高的比例,這樣理論上4個元素的大小應該在
范圍。這樣,每個邊界框的預測值實際上包含5個元素:
,其中前4個表征邊界框的大小與位置,而最后一個值是置信度。
bounding box坐標: 如上圖,7x7網格內的每個grid(紅色框),對應兩個大小形狀不同的bounding box(黃色框)。每個box的位置坐標為(x,y,w,h), x和y表示box中心點坐標,w和h表示box寬度和高度。通過與訓練數據集上標定的物體真實坐標(Gx,Gy,Gw,Gh)進行對比訓練,可以計算出初始bounding box平移和伸縮得到最終位置的模型。
bounding box置信度confidence:這個置信度只是為了表達box內有無物體的概率,并不表達box內物體是什么。
其中前一項表示有無人工標記的物體落入了網格內,如果有則為1,否則為0。第二項代表bounding box和真實標記的box之間的重合度。它等于兩個box面積交集,除以面積并集。值越大則box越接近真實位置。每個網格還需要預測它屬于20分類中每一個類別的概率。分類信息是針對每個網格的,而不是bounding box。故只需要20個,而不是40個。而confidence則是針對bounding box的,它只表示box內是否有物體,而不需要預測物體是20分類中的哪一個,故只需要2個參數。雖然分類信息和confidence都是概率,但表達含義完全不同。?
5.3 NMS篩選層
篩選層是為了在多個結果中(多個bounding box)篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低于閾值的box,對剩下的box進行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體算法可以回顧上面faster R-CNN小節)。這樣就得到了最終的最合適的幾個box和他們的類別。
5.4 Yolo損失函數
yolo的損失函數包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下
誤差均采用了均方差算法,其實我認為,位置誤差應該采用均方差算法,而分類誤差應該采用交叉熵。由于物體位置只有4個參數,而類別有20個參數,他們的累加和不同。如果賦予相同的權重,顯然不合理。故Yolo中位置誤差權重為5,類別誤差權重為1。由于我們不是特別關心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權重為0.5,包含物體的權重則為1。Yolo算法開創了one-stage檢測的先河,它將物體分類和物體檢測網絡合二為一,都在全連接層完成。故它大大降低了目標檢測的耗時,提高了實時性。但它的缺點也十分明顯
每個網格只對應兩個bounding box,當物體的長寬比不常見(也就是訓練數據集覆蓋不到時),效果很差。
原始圖片只劃分為7x7的網格,當兩個物體靠的很近時,效果很差
最終每個網格只對應一個類別,容易出現漏檢(物體沒有被識別到)。
對于圖片中比較小的物體,效果很差。這其實是所有目標檢測算法的通病,SSD對它有些優化,我們后面再看。
6. SSD
Faster R-CNN準確率mAP較高,漏檢率recall較低,但速度較慢。而Yolo則相反,速度快,但準確率和漏檢率不盡人意。SSD綜合了他們的優缺點,對輸入300x300的圖像,在voc2007數據集上test,能夠達到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。SSD和Yolo一樣都是采用一個CNN網絡來進行檢測,但是卻采用了多尺度的特征圖,SSD網絡結構如下圖:
和Yolo一樣,也分為三部分:卷積層,目標檢測層和NMS篩選層
6.1 卷積層
SSD論文采用了VGG16的基礎網絡,其實這也是幾乎所有目標檢測神經網絡的慣用方法。先用一個CNN網絡來提取特征,然后再進行后續的目標定位和目標分類識別。
6.2 目標檢測層
這一層由5個卷積層和一個平均池化層組成。去掉了最后的全連接層。SSD認為目標檢測中的物體,只與周圍信息相關,它的感受野不是全局的,故沒必要也不應該做全連接。SSD的特點如下:
6.2.1 多尺寸feature map上進行目標檢測
每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進行目標位置和類別的訓練和預測,從而達到多尺度檢測的目的,可以克服yolo對于寬高比不常見的物體,識別準確率較低的問題。而yolo中,只在最后一個卷積層上做目標位置和類別的訓練和預測。這是SSD相對于yolo能提高準確率的一個關鍵所在。
如上所示,在每個卷積層上都會進行目標檢測和分類,最后由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當于多了很多寬高比例的bounding box,可以大大提高泛化能力。
6.2.2 設置先驗框
在Yolo中,每個單元預測多個邊界框,但是其都是相對這個單元本身(正方塊),但是真實目標的形狀是多變的,Yolo需要在訓練過程中自適應目標的形狀。而SSD和Faster R-CNN相似,也提出了anchor的概念。卷積輸出的feature map,每個點對應為原圖的一個區域的中心點。以這個點為中心,構造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應4個位置參數(x,y,w,h)和21個類別概率(voc訓練集為20分類問題,在加上anchor是否為背景,共21分類)。
SSD的檢測值也與Yolo不太一樣。對于每個單元的每個先驗框,其都輸出一套獨立的檢測值,對應一個邊界框,主要分為兩個部分。第一部分是各個類別的置信度或者評分,值得注意的是SSD將背景也當做了一個特殊的類別,如果檢測目標共有 個類別,SSD其實需要預測
個置信度值,其中第一個置信度指的是不含目標或者屬于背景的評分。后面當我們說
個類別置信度時,請記住里面包含背景那個特殊的類別,即真實的檢測類別只有
個。在預測過程中,置信度最高的那個類別就是邊界框所屬的類別,特別地,當第一個置信度值最高時,表示邊界框中并不包含目標。第二部分就是邊界框的location,包含4個值
,分別表示邊界框的中心坐標以及寬高。但是真實預測值其實只是邊界框相對于先驗框的轉換值(paper里面說是offset,但是覺得transformation更合適,參見R-CNN(https://arxiv.org/abs/1311.2524) 另外,SSD采用了數據增強。生成與目標物體真實box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機選取這些patch參與訓練,并對他們進行隨機水平翻轉等操作。SSD認為這個策略提高了8.8%的準確率。
6.3 篩選層
和yolo的篩選層基本一致,同樣先過濾掉類別概率低于閾值的default box,再采用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標檢測輸出的default box。
7 其他模型
針對Yolo準確率不高,容易漏檢,對長寬比不常見物體效果差等問題,結合SSD的特點,提出了YoloV2。它主要還是采用了Yolo的網絡結構,在其基礎上做了一些優化和改進,如下:
網絡采用DarkNet-19:19層,里面包含了大量3x3卷積,同時借鑒inceptionV1,加入1x1卷積核全局平均池化層。結構如下
去掉全連接層:和SSD一樣,模型中只包含卷積和平均池化層(平均池化是為了變為一維向量,做softmax分類)。這樣做一方面是由于物體檢測中的目標,只是圖片中的一個區塊,它是局部感受野,沒必要做全連接。而是為了輸入不同尺寸的圖片,如果采用全連接,則只能輸入固定大小圖片了。
batch normalization:卷積層后加入BN,對下一次卷積輸入的數據做歸一化??梢栽谠龃髮W習率的前提下,同樣可以穩定落入局部最優解。從而加速訓練收斂,在相同耗時下,增大了有效迭代次數。
使用anchors:借鑒faster R-CNN和SSD,對于一個中心點,使用多個anchor,得到多個bounding box,每個bounding box包含4個位置坐標參數(x y w h)和21個類別概率信息。而在Yolo中,每個grid(對應anchor),僅預測一次類別,而且只有兩個bounding box來進行坐標預測。
pass through layer:Yolo原本最終特征圖為13x13x256。YoloV2還利用了之前的26x26的特征圖進行目標檢測。26x26x256的feature map分別按行和列隔點采樣,得到4幅13x13x256的feature map,將他們組織成一幅13x13x2048的feature map。這樣做的目的是提高小物體的識別率。因為越靠前的卷積,其感受野越小,越有利于小物體的識別。
高分辨率輸入Training:Yolo采用224x224圖片進行預訓練,而YoloV2則采用448x448
Multi-Scale Training:輸入不同尺寸的圖片,迭代10次,就改變輸入圖片尺寸。由于模型中去掉了全連接層,故可以輸入不同尺寸的圖片了。從320x320,到608x608 Yolo和YoloV2只能識別20類物體,為了優化這個問題,提出了Yolo9000,可以識別9000類物體。它在YoloV2基礎上,進行了imageNet和coco的聯合訓練。這種方式充分利用imageNet可以識別1000類物體和coco可以進行目標位置檢測的優點。當使用imageNet訓練時,只更新物體分類相關的參數。而使用coco時,則更新全部所有參數。
審核編輯 :李倩
-
神經網絡
+關注
關注
42文章
4785瀏覽量
101269 -
算法
+關注
關注
23文章
4632瀏覽量
93456 -
圖像
+關注
關注
2文章
1089瀏覽量
40599
原文標題:最全綜述 | 圖像目標檢測
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
紅外圖像小目標檢測系統該怎么設計?
一種基于圖像平移的目標檢測框架
一種圖像拼接的運動目標檢測方法
基于深度學習的目標檢測研究綜述
![基于深度學習的<b class='flag-5'>目標</b><b class='flag-5'>檢測</b>研究<b class='flag-5'>綜述</b>](https://file.elecfans.com/web1/M00/F1/DE/o4YBAGC24DOAHECBAAAARmu_22A208.png)
評論