1. 程式人生 > >詳述目標檢測最常用的三個模型:Faster R-CNN、SSD和YOLO

詳述目標檢測最常用的三個模型:Faster R-CNN、SSD和YOLO

最近做一些關於Faster R-CNN、SSD和YOLO模型選擇和優化的專案,之前只瞭解Faster R-CNN系列目標檢測方法,於是抽空梳理一下這幾個檢測模型。先上兩張簡單的精確度和運算量的對比圖,有個粗略的瞭解,雖然圖中缺了YOLO,參考價值仍然很大:

下面開始分別詳述吧~

Faster R-CNN架構

傳統目標檢測方法大致分為如下三步:

深度學習特別是CNN的出現使得上述第二三步可以合併在一起做。Faster R-CNN步驟:

(1)由輸入圖片產生的區域候選         

(2)最後一層卷積輸出的所有通道

(2)最後一層卷積輸出的所有通道

pooling=>        

+

(3)ROI pooling

候選區的產生

RPN的核心思想是使用卷積神經網路直接產生region proposal,使用的方法本質上就是滑動視窗。RPN的設計比較巧妙,RPN只需在最後的卷積層上滑動一遍,因為anchor機制和邊框迴歸可以得到多尺度、多長寬比的region proposal,3*3滑窗對應的每個特徵區域同時預測輸入影象3種尺度(128,256,512),3種長寬比(1:1,1:2,2:1)的region proposal,這種對映的機制稱為anchor:

RPN利用基網路對影象用一系列的卷積和池化操作進行特徵提取,得到原始的feature maps(灰色區域),然後在原始的feature maps後面再接一個con+relu層,得到將要用於生成region proposal的feature maps。將feature maps中的每個點映射回原圖回原圖中心,得到一個基準點。根據設定好的尺度大小和長寬比,並圍繞基準點,生成k個anchors。Feature maps的每個點都有關於k個anchors的輸出,包括是否有目標,以及迴歸k個region proposal的座標值。

平移不變anchors:在feature maps上的每個點都可以預測得到k個region proposal。具體操作:將feature maps上的每個點對映到原圖,得到一個基準點,然後圍繞該基準點,通過設定好的固定的尺度大小和長寬比,生成k個anchors。在論文中,使用了3種尺度和3種長寬比的anchors,所以k=3*3=9,對於一個大小為W*H的feature map,將會產生W*H*k個anchors。而通過這種不同尺度和不同長寬比的設定,同樣實現了anchors的平移不變性。

RPN的損失函式:在訓練RPN的時候,先需要對得到的W*H*k個anchors進行正負樣本的劃分。將與gt box具有最大IOU的anchor以及與任何一個gt box的IOU大於0.7的anchor作為正樣本,將剩餘的與gt box的IOU小於0.3的anchor作為負樣本,其餘anchors均被忽略。對於每個anchor,後面會再接上一個用於二分類的softmax與用於bbox迴歸器。二分類softmax用於判斷anchor是否為目標概率,bbox迴歸器用於調整anchor的4個座標值。因此RPN的損失函式可定義為:

不帶*為預測值,帶*為真實值,其中,

其中x,y,h,w分別表示box的中心座標,高度與寬度。

ROI 池化:因為 Fast R-CNN 使用全連線層,所以我們應用 ROI 池化將不同大小的 ROI 轉換為固定大小。簡潔示例,我們先將8×8特徵圖轉換為預定義的 2×2 大小。

下圖左上角:特徵圖。

右上角:將 ROI(藍色區域)與特徵圖重疊。

左下角:將 ROI 拆分為目標維度。例如,對於 2×2 目標,我們將 ROI 分割為 4 個大小相似或相等的部分。

右下角:找到每個部分的最大值,得到變換後的特徵圖。

按上述步驟得到一個 2×2 的特徵圖塊,可以饋送至分類器和邊界框迴歸器中。

Train

整個Faster RCNN訓練過程可分為4步:

第一步:用在ImageNet資料集上訓練好的model初始化模型,訓練一個RPN網路;

第二步:用在ImageNet資料集上訓練好的model初始化模型,同時用第一步中訓練好的RPN網路生成的region proposal作為輸入,訓練一個Fast RCNN;

第三步:用第二步訓練好的Fast RCNN的網路引數初始化RPN網路,但是將RPN與Fast RCNN共享的網路層的learning rate設定為0,僅微調RPN獨有的網路層。

第四步:固定共享的網路層,僅微調Fast RCNN所獨有的fc層。

SSD架構

SSD使用VGG-16-Atrous作為基礎網路,其中黃色部分為在VGG-16基礎網路上填加的特徵提取層。SSD與yolo不同之處是除了在最終特徵圖上做目標檢測之外,還在之前選取的5個特特徵圖上進行預測。可以看出,檢測過程不僅在填加特徵圖(conv8_2, conv9_2, conv_10_2, pool_11)上進行,為了保證網路對小目標有很好檢測效果,檢測過程也在基礎網路特徵圖(conv4_3, conv_7)上進行。

SSD 方法的核心就是 predict object(物體),以及其歸屬類別的 score(得分);同時,在feature map上使用小的卷積核去 predict 一系列 bounding boxes 的 box offsets,為了得到高精度的檢測結果,在不同層次的 feature maps 上去 predict object、box offsets,同時,還得到不同 aspect ratio 的 predictions。

相對於那些需要 object proposals 的檢測模型,SSD 方法完全取消了 proposals generation、pixel resampling 或者 feature resampling 這些階段,為了處理相同物體的不同尺寸的情況,SSD 結合了不同解析度的 feature maps 的 predictions,SSD將輸出一系列離散化(discretization) 的 bounding boxes,這些 bounding boxes是在不同層次(layers)上的feature maps上生成的,並且有著不同的 aspect ratio。需要計算出每一個 default box 中的物體其屬於每個類別的可能性,即score,得分,如對於一個數據集,總共有20類,則需要得出每一個 bounding box中物體屬於這20個類別的每一種的可能性,同時,要對這些 bounding boxes 的shape進行微調,以使得其符合物體的外接矩形。

先弄清楚 default map cell以及 feature box是什麼:

1、feature map cell就是將feature map切分成n*n的格子。

2、default box就是每一個格子上,生成一系列固定大小的 box,即圖中虛線所形成的一系列 boxes。

3、和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個點對應為原圖的一個區域的中心點,以這個點為中心,構造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box),每個anchor對應4個位置引數(x,y,w,h)和21個類別概率(voc訓練集為20分類問題,在加上anchor是否為背景,共21分類)。

Training

在訓練時,SSD與那些用region proposals + pooling方法的區別是,SSD訓練影象中的 groundtruth 需要賦予到那些固定輸出的 boxes 上,在前面也已經提到了,SSD輸出的是事先定義好的,一系列固定大小的 bounding boxes。如下圖中,狗狗的groundtruth是紅色的bounding boxes,但進行label標註的時候,要將紅色的groundtruth box賦予圖(c)中一系列固定輸出的 boxes 中的一個,即 圖(c)中的紅色虛線框。

像這樣定義的groundtruth boxes不止在SSD中用到。在 YOLO中、 Faster R-CNN中的 region proposal階段,以及在 MultiBox中都用到了,當這種將訓練影象中的groundtruth與固定輸出的boxes對應之後,就可以end-to-end的進行loss function的計算以及back-propagation的計算更新了。

損失函式

SSD訓練的目標函式(training objective)源自於 MultiBox 的目標函式,但是又將其拓展,使其可以處理多個目標類別。總的目標損失函式(objective loss function)就由localization loss(loc)與 confidence loss(conf)的加權求和,其中:localization loss(loc)是 Fast R-CNN中 Smooth L1 Loss,用在 predict box,confidence loss(conf)是Softmax Loss,輸入為每一類的置信度。SSD的損失函式由每個預設框的定位損失與分類損失構成(每個預設框的位置為(x, y, w, h)四個值):

訓練中會遇到一些問題:

1、如何將 groundtruth boxes 與 default boxes 進行配對,以組成 label 呢?

在開始的時候,用MultiBox中的best jaccard overlap 來匹配每一個ground truth box與default box,這樣就能保證每一個groundtruth box與唯一的一個default box 對應起來。但是又不同於 MultiBox ,SSD後面又將default box與任何的 groundtruth box配對,只要兩者之間的jaccard overlap 大於一個閾值,這裡的閾值一般設定為0.5。

2、多尺寸feature map上進行目標檢測

每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進行目標位置和類別的訓練和預測,從而達到多尺度檢測的目的,可以克服yolo對於寬高比不常見的物體,識別準確率較低的問題。在yolo v1中,只在最後一個卷積層上做目標位置和類別的訓練和預測,這是SSD相對於yolo能提高準確率的一個關鍵所在。SSD在每個卷積層上都會進行目標檢測和分類,最後由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當於多了很多寬高比例的bounding box,可以大大提高泛化能力。

3、Choosing scales and aspect ratios for default boxes

大部分 CNN 網路在越深的層,feature map的尺寸(size)會越來越小。這樣做不僅僅是為了減少計算與記憶體的需求,還有個好處就是,最後提取的 feature map 就會有某種程度上的平移與尺度不變性。同時為了處理不同尺度的物體,一些文章將影象轉換成不同的尺度,將這些影象獨立的通過CNN網路處理,再將這些不同尺度的影象結果進行綜合,但是其實,如果使用同一個網路中的、不同層上的feature maps,也可以達到相同的效果,同時在所有物體尺度中共享引數,可以用 CNN前面的layers來提高影象分割的效果,因為越底層的layers保留的影象細節越多。因此,SSD同時使用lower feature maps、upper feature maps 來predict detections,上圖展示了SSD中使用的兩種不同尺度的feature map。

一般來說,一個CNN網路中不同的layers有著不同尺寸的感受野(receptive fields)。這裡的感受野指的是輸出的feature map上的一個節點,其對應輸入影象上尺寸的大小。所幸的是,SSD結構中default boxes不必要與每一層layer的 receptive fields 對應,而是採用feature map中特定的位置來負責影象中特定的區域以及物體特定的尺寸,設定每一個default box的中心結合在feature maps上,所有不同尺度、不同aspect ratios的default boxes在進行預測 predictions 之後,我們得到許多個predictions,包含了物體的不同尺寸、形狀。

4、Hard negative mining

訓練集給定了輸入影象以及每個物體的真實區域(ground true box),將default box和真實box最接近的選為正樣本,然後在剩下的default box中選擇任意一個與真實box IOU大於0.5的,作為正樣本,而其他的則作為負樣本。在生成一系列的predictions之後,會產生很多個符合ground truth box的predictions boxes,但同時,不符合ground truth boxes也很多,而且negative boxes遠多於 positive boxes,這會造成negative boxes、positive boxes之間的不均衡,訓練時難以收斂,因此,SSD先將每一個物體位置上對應 predictions(default boxes)是negative的boxes進行排序,按照default boxes的confidence的大小選擇最高的幾個出來,SSD將正負樣本比例定位為1:3,這樣可以更快的優化,訓練也更穩定。

5、既想利用已經訓練好的模型進行fine-tuning,又想改變網路結構得到更加 dense的score map。

這個解決辦法就是採用 Hole 演算法。如下圖 (a) (b) 所示,在以往的卷積或者 pooling中,一個filter中相鄰的權重作用在feature map上的位置都是物理上連續的。如下圖 (c) 所示,為了保證感受野不發生變化,某一層的 stride 由 2 變為 1 以後,後面的層需要採用 hole 演算法,具體來講就是將連續的連線關係是根據 hole size 大小變成 skip 連線的(圖 (c) 為了顯示方便直接畫在本層上了)。不要被(c)中的padding為2嚇著了,其實2個 padding不會同時和一個 filter 相連。pool4的stride由2變為1,則緊接著的conv5_1、conv5_2 和 conv5_3中hole size 為2。接著pool5由2變為1 ,則後面的fc6中 hole size 為4。 

6、SSD使用的VGG-16作為基礎網路,VGG-16雖然精度與darknet-19相當,但運算速度慢。

Result

SSD模型對bounding box的size非常的敏感。也就是說,SSD對小物體目標較為敏感,在檢測小物體目標上表現較差。其實這也算情理之中,因為對於小目標而言,經過多層卷積之後,就沒剩多少資訊了。雖然提高輸入影象的size可以提高對小目標的檢測效果,但是對於小目標檢測問題,還是有很多提升空間的,同時,積極的看,SSD 對大目標檢測效果非常好,SSD對小目標檢測效果不好,但也比YOLO要好。另外,因為SSD使用了不同aspect ratios的default boxes,SSD 對於不同aspect ratios的物體檢測效果也很好,使用更多的 default boxes,結果也越好。Atrous使得SSD又好又快 ,通常卷積過程中為了使特徵圖尺寸保持不變,都會在邊緣打padding,但人為加入的padding值會引入噪聲,而使用atrous卷積能夠在保持感受野不變的條件下,減少padding噪聲,SSD訓練過程中並沒有使用atrous卷積,但預訓練過程使用的模型為VGG-16-atrous,意味著作者給的預訓練模型是使用atrous卷積訓練出來的。使用atrous版本VGG-16作為預訓模型比較普通VGG-16要提高0.7%mAP。

因為 COCO 資料集中的檢測目標更小,我們在所有的layers上,使用更小的default boxes。SSD一開始會生成大量的bounding boxes,所以有必要用 Non-maximum suppression(NMS)來去除大量重複的 boxes。 

YOLO架構

YOLO之前的物體檢測方法主要是通過region proposal產生大量的可能包含待檢測物體的potential bounding box,再用分類器去判斷每個bounding box裡是否包含有物體,以及物體所屬類別的probability或者confidence,通過post-processing來改善bounding boxes,消除重複的檢測目標,如R-CNN,Fast-R-CNN,Faster-R-CNN等,YOLO不同於這些物體檢測方法,它將物體檢測任務當做一個regression問題來處理,使用一個神經網路,直接從一整張影象來預測出bounding box的座標、box中包含物體的置信度和類別probabilities,由於YOLO的物體檢測流程是在一個神經網路裡完成的,所以可以end to end來優化物體檢測效能。不像其他物體檢測系統使用了滑窗或region proposal,分類器只能得到影象的區域性資訊,YOLO在訓練和測試時都能夠看到一整張影象的資訊,因此YOLO在檢測物體時能很好的利用上下文資訊,從而不容易在背景上預測出錯誤的物體資訊,和Fast-R-CNN相比,YOLO的背景錯誤不到Fast-R-CNN的一半。雖然相較於其他的state-of-the-art 物體檢測系統,YOLO在物體定位時更容易出錯,但是在背景上預測出不存在的物體(false positives)的情況會少一些。而且,YOLO比DPM、R-CNN等物體檢測系統能夠學到更加抽象的物體的特徵,這使得YOLO可以從真實影象領域遷移到其他領域,如藝術。YOLO對小物體的檢測效果不好(尤其是密集的小物體,因為一個柵格只能預測2個物體),由於損失函式的問題,定位誤差是影響檢測效果的主要原因,尤其是大小物體的處理上,還有待加強。

使用YOLO來檢測物體,其流程是非常簡單明瞭的,主要分為三個部分:卷積層,目標檢測層,NMS篩選層: 
1、將影象resize到448 * 448作為神經網路的輸入 
2、執行神經網路,得到一些bounding box座標、box中包含物體的置信度和class probabilities 
3、進行非極大值抑制,篩選Boxes

YOLO網路結構由24個卷積層與2個全連線層構成,網路入口為448x448(v2為416x416),圖片進入網路先經過resize,網路的輸出結果為一個張量,維度為:

其中,S為劃分網格數,B為每個網格負責目標個數,C為類別個數。該表示式含義為:

(1)每個小格會對應B個邊界框,邊界框的寬高範圍為全圖,表示以該小格為中心尋找物體的邊界框位置。

(2) 每個邊界框對應一個分值,代表該處是否有物體及定位準確度:

(3)每個小格會對應C個概率值,找出最大概率對應的類別P(Class|object)P(Class|object),並認為小格中包含該物體或者該物體的一部分,雖然每個格子可以預測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測輸出,即每個格子最多隻預測出一個物體。從上面可以看出整個影象只是被計算了一次,真正做到了降低計算量,提高了檢測實時性。

YOLO將輸入影象分成SxS個格子,若某個物體Ground truth的中心位置的座標落入到某個格子,那麼這個格子就負責檢測中心落在該柵格中的物體。程式碼中side∗side即為原圖中S∗S的小格。為什麼side位置的輸出會對應到原圖中小格的位置呢?因為訓練過程中會使用對應位置的GT監督網路收斂,測試過程中每個小格自然對應原圖小格上目標的檢測。

每個格子預測B個bounding box及其置信度(confidence score),以及C個類別概率。bbox資訊(x,y,w,h)為物體的中心位置相對格子位置的偏移及寬度和高度,均被歸一化。置信度反映是否包含物體以及包含物體情況下位置的準確性,定義為Pr(Object)×IOUtruthpred,其中Pr(Object)∈{0,1}。

YOLOv1網路借鑑了GoogLeNet分類網路結構。不同的是,YOLO未使用inception module,而是使用1x1卷積層(此處1x1卷積層的存在是為了跨通道資訊整合)+3x3卷積層簡單替代。YOLO能夠做到在輸出中同時包含圖片bounding box(檢測框)的分類資訊和位置資訊,試著想象這樣的情況,我們用1*1的卷積小方格去卷積一張7*7的圖片,顯然,卷積的輸出也是7*7,但是我們可以做一些神奇的事情,卷積視窗filter出了被視窗過濾後的類別 ! 我們可以為每個過濾後的小視窗(cell)賦予一個類別,比如下圖,是自行車Bicycle的類別中的畫素過濾為上圖紫色。當然,也有可能一些小方格輸入多個類別,比如,可能屬於貓同時屬於自行車,這樣,我們自然地在卷積的同時, 把類別資訊和位置資訊同時包含進去了。

上述是便於理解的例子,大家不要真的以為YOLO第一層卷積就使用了1*1的卷積視窗!事實上,YOLO原理是這樣,但每一層視窗是大一點3*3的卷積核。

損失函式

YOLO全部使用了均方和誤差作為loss函式。由三部分組成:座標誤差、IOU誤差和分類誤差。

幾點解釋:

1、YOLO將輸入影象劃分為S*S的柵格,每一個柵格預測B個bounding boxes,以及這些bounding boxes的confidence scores。confidence scores反映了模型對於這個柵格的預測,該柵格是否含有物體,以及這個box的座標預測的有多準:

每一個柵格還要預測C個conditional class probability(條件類別概率):Pr(Classi|Object)。即在一個柵格包含一個Object的前提下,它屬於某個類的概率。

2、在測試階段,將每個柵格的conditional class probabilities與每個 bounding box的confidence相乘,這樣可得到每個bounding box的具體類別的confidence score,乘積既包含了bounding box中預測的class的 probability資訊,也反映了bounding box是否含有Object和bounding box座標的準確度:

論文使用的 S=7,即將一張影象分為7×7=49個柵格,每一個柵格預測B=2個boxes(每個box有 x,y,w,h,confidence,5個預測值),同時C=20(PASCAL資料集中有20個類別)。 因此,最後的prediction是7×7×30 { 即S * S * ( B * 5 + C) }的Tensor。

3、在 YOLO中,每個柵格預測多個bounding box,但在網路模型的訓練中,希望每一個物體最後由一個bounding box predictor來負責預測。因此,當前哪一個predictor預測的bounding box與ground truth box的IOU最大,這個predictor就負責predict object,這會使得每個predictor可以專門的負責特定的物體檢測。隨著訓練的進行,每一個predictor對特定的物體尺寸、長寬比的物體的類別的預測會越來越好。

4、卷積層的輸出可能是對同一個檢測目標的許多個檢測框,我們有高效的非極大值抑制演算法來選擇最好的檢測框。

5、anchor機制。yolov2為了提高精度與召回率,使用了Faster-RCNN中的anchor機制。解釋:在每個網格設定k個參考anchor,訓練以GT anchor作為基準計算分類與迴歸損失,測試時直接在每個格子上預測k個anchor box,每個anchor box為相對於參考anchor的offset與w,h的refine,這樣把原來每個格子中邊界框位置的全圖迴歸(yolov1)轉換為對參考anchor位置的精修(yolov2),至於每個格子中設定多少個anchor(即k等於幾),作者使用了k-means演算法離線對voc及coco資料集中目標的形狀及尺度進行了計算,發現當k = 5時並且選取固定5比例值時,anchors形狀及尺度最接近voc與coco中目標的形狀,並且k也不能太大,否則模型太複雜,計算量很大。

升級版YOLO v2

yolov1基礎上的延續,新的基礎網路,多尺度訓練,全卷積網路,Faster-RCNN的anchor機制,更多的訓練技巧等等改進使得yolov2速度與精度都大幅提升。相比YOLO,YOLO v2在識別種類、精度、速度、和定位準確性等方面都有大大提升。

YOLO v2改進之處:

1、Batch Normalization: v1中大量用了Batch Normalization,同時在定位層後邊用了dropout,v2中取消了dropout,在卷積層全部使用Batch Normalization。

2、高解析度分類器:v1中使用224 × 224訓練分類器網路,擴大到448用於檢測網路。v2將ImageNet以448×448 的解析度微調最初的分類網路,迭代10 epochs。

3、Anchor Boxes:v1中直接在卷積層之後使用全連線層預測bbox的座標,v2借鑑Faster R-CNN的思想預測bbox的偏移,移除了全連線層,並且刪掉了一個pooling層使特徵的解析度更大一些,另外調整了網路的輸入(448->416)以使得位置座標是奇數只有一箇中心點(yolo使用pooling來下采樣,有5個size=2,stride=2的max pooling,而卷積層沒有降低大小,因此最後的特徵是416/(2^5)=13),v1中每張圖片預測7x7x2=98個box,而v2加上Anchor Boxes能預測超過1000個,檢測結果從69.5mAP,81% recall變為69.2 mAP,88% recall。

YOLO v2對Faster R-CNN的手選先驗框方法做了改進,取樣k-means在訓練集bbox上進行聚類產生合適的先驗框,由於使用歐氏距離會使較大的bbox比小的bbox產生更大的誤差,而IOU與bbox尺寸無關,因此使用IOU參與距離計算,使得通過這些anchor boxes獲得好的IOU分值。距離公式:

D(box,centroid)=1−IOU(box,centroid)D(box,centroid)=1−IOU(box,centroid),使用聚類進行選擇的優勢是達到相同的IOU結果時所需的anchor box數量更少,使得模型的表示能力更強,任務更容易學習,k-means演算法過程是:將每個bbox的寬和高相對整張圖片的比例(wr,hr)進行聚類,得到k個anchor box,由於darknet,程式碼中需要配置檔案中region層的anchors引數是絕對值大小,因此需要將這個比例值乘上卷積層的輸出特徵的大小。如輸入是416x416,那麼最後卷積層的特徵是13x13。

4、細粒度特徵(fine grain features):在Faster R-CNN 和 SSD 均使用了不同的feature map以適應不同尺度大小的目標。YOLOv2使用了一種不同的方法,簡單新增一個 pass through layer,把淺層特徵圖(26x26)連線到深層特徵圖(連線新加入的三個卷積核尺寸為3 * 3的卷積層到最後一層的輸入)。通過疊加淺層特徵圖相鄰特徵到不同通道(而非空間位置),類似於Resnet中的identity mapping。這個方法把26x26x512的特徵圖疊加成13x13x2048的特徵圖,與原生的深層特徵圖相連線,使模型有了細粒度特徵。此方法使得模型的效能獲得了1%的提升。

5、Multi-Scale Training: 和YOLOv1訓練時網路輸入的影象尺寸固定不變不同,YOLOv2(在cfg檔案中random=1時)每隔幾次迭代後就會微調網路的輸入尺寸。訓練時每迭代10次,就會隨機選擇新的輸入影象尺寸。因為YOLOv2的網路使用的downsamples倍率為32,所以使用32的倍數調整輸入影象尺寸{320,352,…,608}。訓練使用的最小的影象尺寸為320 x 320,最大的影象尺寸為608 x 608。 這使得網路可以適應多種不同尺度的輸入。

6、網路結構:YOLOv2對v1的基礎網路做了更改,如下

分類網路

YOLOv2提出了一種新的分類模型Darknet-19。借鑑了很多其它網路的設計概念。主要使用3x3卷積並在pooling之後channel數加倍(VGG);global average pooling替代全連線做預測分類,並在3x3卷積之間使用1x1卷積壓縮特徵表示(Network in Network);使用 batch normalization 來提高穩定性,加速收斂,對模型正則化。Darknet-19的結構如下(Darknet-19-arch:包含 19 conv + 5 maxpooling。):

訓練:使用Darknet框架在ImageNet 1000類上訓練160 epochs,學習率初始為0.1,以4級多項式衰減,weight decay=0.0005, momentum=0.9。使用標準的資料增廣方法:random crops,rotations,(hue,saturation),exposure shifts。之後將輸入從224放大至448,學習率調整為0.001,迭代10 epochs。結果達到top-1 accuracy 76.5% ,top-5 accuracy 93.3%。

檢測網路

在分類網路中移除最後一個1x1的層,在最後新增3個3x3x1024的卷積層,再接上輸出是類別個數的1x1卷積。對於輸入影象尺寸為Si x Si,最終3x3卷積層輸出的feature map是Oi x Oi(Oi=Si/(2^5)),對應輸入影象的Oi x Oi個柵格,每個柵格預測anchors種boxes大小,每個box包含4個座標值,1個置信度和classes個條件類別概率,所以輸出維度是Oi x Oi x anchors x (5 + classes)。新增跨層跳躍連線(借鑑ResNet等思想),融合粗細粒度的特徵:將前面最後一個3x3x512卷積的特徵圖,對於416x416的輸入,該層輸出26x26x512,直接連線到最後新加的三個3x3卷積層的最後一個的前邊。將26x26x512變形為13x13x1024與後邊的13x13x1024特徵按channel堆起來得到13x13x3072。從yolo-voc.cfg檔案可以看到,第25層為route層,逆向9層拿到第16層26 * 26 * 512的輸出,並由第26層的reorg層把26 * 26 * 512 變形為13 * 13 * 2048,再有第27層的route層連線24層和26層的輸出,堆疊為13 * 13 * 3072,由最後一個卷積核為3 * 3的卷積層進行跨通道的資訊融合並把通道降維為1024。

升級版YOLO v3

YOLO的V1和V2都不如SSD的演算法,主要原因是V1的448尺寸和V2版本的416尺寸都不如SSD的300,以上結論都是實驗測試的,V3版本的416跟SSD512差不多好,但速度快很多。yolov2有個毛病就是對小物體的檢測不敏感,而增加了多尺度預測之後,yolov3在對小物體檢測方便有了好轉,但是現在的毛病是對中、大size的物體表現的不是那麼好。

YOLO v3改進之處:

1、Loss不同:YOLO V3替換了V2中的Softmax loss為Logistic loss,而且每個GT只匹配一個先驗框。YOLOv3不使用Softmax對每個框進行分類,主要考慮因素有兩個:Softmax使得每個框分配一個類別(score最大的一個),而對於Open Images這種資料集,目標可能有重疊的類別標籤,因此Softmax不適用於多標籤分類;Softmax可被獨立的多個logistic分類器替代,且準確率不會下降,分類損失採用binary cross-entropy loss.

2、預測方式不同:V2用了5個anchor,V3用了9個anchor,提高了IOU。yolov3在三個(num=3)不同的尺度預測boxes,yolov3使用的特徵提取模型通過FPN(feature pyramid network)網路上進行改變,最後預測得到一個3-d tensor,包含bounding box資訊,物件資訊以及多少個類的預測資訊。尺度1: 在基礎網路之後新增一些卷積層再輸出box資訊;尺度2: 從尺度1中的倒數第二層的卷積層上取樣(x2)再與最後一個16x16大小的特徵圖相加,再次通過多個卷積後輸出box資訊。相比尺度1變大兩倍;尺度3:與尺度2類似,使用了32x32大小的特徵圖。yolov3使用這樣的方式使得模型可以獲取到更多的語義資訊,模型得到了更好的表現。yolov3依然使用k-Means聚類來得到bounding box的先驗(引數anchors是kmeans計算出來的anchor box的長寬的絕對值(與網路輸入大小相關)),選擇9個簇以及3個尺度,然後將這9個簇均勻的分佈在這3個尺度上。

3、Detection策略和backbone不同:V2只有一個detection,V3設定有3個,分別是一個下采樣的,Feature map為13*13,還有2個上取樣的eltwise sum,Feature map分別為26*26和52*52,也就是說,V3的416版本已經用到了52的Feature map,而V2把多尺度考慮到訓練的data取樣上,最後也只是用到了13的Feature map,這應該是對小目標影響最大的地方。yolov3的特徵提取模型是一個雜交的模型,它使用了yolov2,Darknet-19以及Resnet,這個模型使用了很多有良好表現的3*3和1*1的卷積層,也在後邊增加了一些shortcut connection結構,其中,3*3的卷積增加channel,而1*1的卷積在於壓縮3*3卷積後的特徵表示,這波操作很具有實用性,最終它有53個卷積層。沒有繼續增加層數是因為作者認為Resnet模型後邊有太多層並且不是很有效。Darknet-53如下:

YOLO V2是一個縱向自上而下的網路架構,隨著通道數目的不斷增加,FLOPS是不斷增加的,而V3網路架構是橫縱交叉的,看著卷積層多,其實很多通道的卷積層沒有繼承性,另外,雖然V3增加了anchor centroid,但是對GT的估計變得更加簡單,每個GT只匹配一個先驗框,而且每個尺度只預測3個框,V2預測5個框,這樣的話也降低了複雜度。

邊界框的預測

作者嘗試了常規的預測方式(Faster R-CNN),然而並不奏效: x,y的偏移作為box的長寬的線性變換:

與之前yolo版本一樣,yolov3的anchor boxes也是通過聚類的方法得到的,仍採用之前的logistic方式。yolov3對每個bounding box預測四個座標值(tx, ty, tw, th),對於預測的cell(一幅圖劃分成S×S個網格cell)根據影象左上角的偏移(cx, cy),以及預設的anchor box的寬和高pw,ph可以對bounding box按如下的方式進行預測:

在訓練這幾個座標值的時候採用了sum of squared error loss(平方和距離誤差損失),因為這種方式的誤差可以很快的計算出來。yolov3對每個bounding box通過邏輯迴歸預測一個物體的得分,如果預測的這個bounding box與真實的邊框值大部分重合且比其他所有預測的要好,那麼這個值就為1。如果overlap沒有達到一個閾值(yolov3中這裡設定的閾值是0.5),那麼這個預測的bounding box將會被忽略,也就是會顯示成沒有損失值。

Result

相比RCNN系列物體檢測方法,YOLO具有以下缺點:識別物體位置精準性差;召回率低,在每個網格中預測兩個bbox這種約束方式減少了對同一目標的多次檢測(R-CNN使用的region proposal方式重疊較多),從而減少了候選框的數量,相比R-CNN使用Selective Search產生2000個proposal(RCNN測試時每張超過40秒),YOLO僅使用7x7x2個。YOLO v1吸收了SSD的長處(加了 BN 層,擴大輸入維度,使用了 Anchor,訓練的時候資料增強),進化到了YOLO v2;吸收SSD和FPN的長處, 仿ResNet的Darknet-53,仿SqueezeNet的縱橫交叉網路,又進化到YOLO v3。

每個網格只對應兩個bounding box,當物體的長寬比不常見(也就是訓練資料集覆蓋不到時),效果很差。原始圖片只劃分為7x7的網格,當兩個物體靠的很近時,效果很差,最終每個網格只對應一個類別,容易出現漏檢(物體沒有被識別到)。對於圖片中比較小的物體,效果很差。這其實是所有目標檢測演算法的通病,SSD和YOLO v3對它有點優化。YOLO v3的測試表現:

本人親測,三大目標檢測方法中,雖然Faster R-CNN已經出來兩年了,但它對小目標的檢測效果還是最好,SSD檢測的速度是最快的,尤其是SSD mobilenet,YOLO v3吸取了前兩者的一些優點,比Faster R-CNN快、比SSD檢測小目標準,效果中規中矩,但個人還是覺得Faster R-CNN用起來更舒服,畢竟是rgb做出來的,不過這也只是我的資料集上跑出的經驗,僅作參考罷了。

以前沒寫過CSDN部落格,還不太熟悉怎麼去用那些格式工具,格式有些簡單,先這樣子吧,能看就行~

參考文件

https://www.cnblogs.com/makefile/p/YOLOv3.html

http://blog.51cto.com/gloomyfish/2095418

https://blog.c

sdn.net/bigbug_sec/article/details/79739133

https://blog.csdn.net/gzq0723/article/details/79936613

https://blog.csdn.net/hrsstudy/article/details/70305791

https://www.cnblogs.com/fariver/p/7446921.html

http://nooverfit.com/wp/%E6%9C%BA%E5%99%A8%E8%A7%86%E8%A7%89-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E8%A1%A5%E4%B9%A0%E8%B4%B4%E4%B9%8Byolo-you-only-look-once/

http://nooverfit.com/wp/%E6%9C%BA%E5%99%A8%E8%A7%86%E8%A7%89%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E8%A1%A5%E4%B9%A0%

E8%B4%B4%E4%B9%8Br-cnn%E7%B3%BB%E5%88%97-r-cnn-fast-r-cnn-faster-r-cnn/

https://yq.aliyun.com/articles/598428?spm=a2c4e.11153940.bloghomeflow.53.384b291atAvOnV

https://blog.csdn.net/qq_31050167/article/details/79190887

https://mp.weixin.qq.com/s/M_i38L2brq69BYzmaPeJ9w?

https://blog.csdn.net/qq_31050167/article/details/79190887
--------------------- 
作者:三顆心123 
來源:CSDN 
原文:https://blog.csdn.net/weixin_42273095/article/details/81699352 
版權宣告:本文為博主原創文章,轉載請附上博文連結!