1. 程式人生 > >目標檢測演算法另一分支的發展(one stage檢測演算法):YOLO、SSD、YOLOv2/YOLO 9000、YOLOv3

目標檢測演算法另一分支的發展(one stage檢測演算法):YOLO、SSD、YOLOv2/YOLO 9000、YOLOv3

目標檢測可以理解為是物體識別和物體定位的綜合,不僅僅要識別出物體屬於哪個分類,更重要的是得到物體在圖片中的具體位置。

目前的目標檢測演算法分為兩類:

一類是two-stage,two-stage檢測演算法將檢測問題劃分為兩個階段,首先產生候選區域(region proposals),然後對候選區域分類(一般還需要對位置精修),這一類的典型代表是R-CNN, Fast R-CNN, Faster R-CNN,Mask R-CNN家族。他們識別錯誤率低,漏識別率也較低,但速度較慢,不能滿足實時檢測場景。

另一類方式稱為one-stage檢測演算法,其不需要region proposal階段,直接產生物體的類別概率和位置座標值,經過單次檢測即可直接得到最終的檢測結果,

因此有著更快的檢測速度,比較典型的演算法如YOLO,SSD,YOLOv2,YOLOv3,Retina-Net德等。

YOLO(YOLOv1,you only look once):

論文:You Only Look Once: Unified, Real-Time Object Detection

論文地址:https://arxiv.org/pdf/1506.02640.pdf

YOLO演算法的全拼是You Only Look Once,顧名思義就是隻看一次,進一步把目標判定和目標識別兩個步驟合二為一,所以識別速度有了很大提升,達到每秒45幀,而在快速版YOLO(Fast YOLO,卷積層更少)中,可以達到每秒155幀,這樣就完全能滿足實時性要求(達到24幀每秒,人眼就認為是連續的)。

YOLO的網路結構:

YOLO網路主要分為三個部分:卷積層,目標檢測層,NMS篩選層。

卷積層:

即圖上Inference從左邊數第二個塊,採用Google inceptionV1網路,共20層。這一部分主要是進行特徵提取,從而提高模型泛化能力。但作者對inceptionV1進行了改造,他沒有使用inception module結構,而是用一個1x1的卷積,並聯一個3x3的卷積來替代。

目標檢測層:

提取出的特徵圖經過4個卷積層和2個全連線層,最後生成7x7x30的輸出。先經過4個卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7=49個網格,每個網格要預測兩個bounding box的座標(x,y,w,h)和box內是否包含物體的置信度confidence,以及物體屬於20類別中每一類的概率(yolo的訓練資料為voc2012,它是一個20分類的資料集)。所以一個網格對應一個(4x2+2+20) = 30維的向量。

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內有無物體的概率(類似於Faster R-CNN中RPN層的softmax預測anchor是前景還是背景的概率),並不預測box內物體屬於哪一類。

置信度:

其中前一項表示有無人工標記的物體落入了網格內,如果有則為1,否則為0。第二項代表bounding box和真實標記的box之間的重合度。它等於兩個box面積交集,除以面積並集。值越大則box越接近真實位置。

每個網格還需要預測它屬於20分類中每一個類別的概率。分類資訊是針對7X7=49個網格中的每個網格,而不是bounding box。故只需要20個,而不是40個。而confidence則是針對bounding box的,它只表示box內是否有物體,而不需要預測物體是20分類中的哪一個,故只需要2個引數。雖然分類資訊和confidence都是概率,但表達含義完全不同。

NMS篩選層:

篩選層是為了在多個bounding box中篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低於閾值的box,對剩下的box進行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體演算法可以回顧上面faster R-CNN小節)。這樣就得到了最終的最合適的幾個box和他們的類別。

YOLO的演算法過程:

YOLO v1的核心思想在於將目標檢測作為迴歸問題解決 ,YOLO v1首先會把原始圖片放縮到448×448的尺寸;

然後將圖片劃分成SxS個區域,論文中是劃分成7X7個區域。注意這裡的劃分不同於R-CNN類演算法,這裡的劃分區域,只是邏輯上的劃分;

如果一個標註的物件的中心落在某個區域上,那麼這個區域負責預測這個物體。每個區域需要預測2個bounding box的位置和置信度。每個邊界框對應於5個輸出,分別是x,y,w,h和置信度。其中x,y代表邊界框的中心離開其所在網格單元格邊界的偏移。w,h代表邊界框真實寬高相對於整幅影象的比例。x,y,w,h這幾個引數都已經被限制到了區間[0,1]上;

置信度:

根據上一步得到7X7X2個bounding box,根據置信度的閾值去除可信度比較低的bounding box,最後用NMS演算法去除重疊度比較高的bounding box;

最後,對每個區域還要預測它屬於20分類中每一個類別的概率。

YOLO的loss函式:

YOLO的loss函式包含三部分:位置誤差、confidence誤差、分類誤差。具體公式如下:

三種誤差均採用了均方差演算法。其中yolo中位置誤差權重為5,類別誤差權重為1。由於我們不是特別關心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權重為0.5,包含物體的權重則為1。

綜上,YOLO在訓練過程中Loss函式計算如下式所示:

YOLO的優點與缺點:

YOLO將目標檢測任務轉換成迴歸問題,大大加快了檢測的速度。同時由於網路預測每個目標視窗時使用的是全域性資訊,使得false positive比例大幅降低(充分利用上下文資訊);

YOLO演算法的精準性和召回率相對於Fast T-CNN來說比較差,其對於背景的誤判率比Fast R-CNN的誤判率低很多;

由於YOLO使用整圖特徵在7*7的粗糙網格內迴歸,對目標的定位並不是很精準,檢測精度不高;

由於YOLO的輸出層為全連線層,因此在檢測時,YOLO訓練模型只支援與訓練影象相同的輸入解析度。其它解析度需要縮放成該解析度後才可訓練或測試。

YOLO對於影象上較小的目標檢測效果不好。雖然每個格子可以預測2個bounding box,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測輸出,即每個格子最多隻預測出一個物體。當物體佔畫面比例較小,如影象中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。

SSD(Single Shot MultiBox Detector,單次多盒檢測器):

論文:SSD:Single Shot MultiBox Detector

論文地址:https://arxiv.org/pdf/1512.02325.pdf

RCNN系列(R-CNN、SPPnet、Fast R-CNN以及Faster R-CNN)的two stage的方法要預先回歸一次邊框,然後再進行骨幹網路訓練,所以精度要高,但速度上比較慢。對了解決速度上的問題,YOLO演算法只做一次邊框迴歸和打分,這使得演算法的執行速度很快。但是也由於只做一次邊框迴歸並打分,YOLO對於小目標的訓練非常不充分,對小目標的檢測效果非常差。簡而言之,YOLO系列對於目標的尺度比較敏感,而且對於尺度變化較大的物體泛化能力比較差。

針對YOLO和Faster R-CNN的各自不足與優勢,WeiLiu等人提出了Single Shot MultiBox Detector,簡稱為SSD。SSD整個網路採取了one stage的思想,以此提高檢測速度。並且網路中融入了Faster R-CNN中的anchors思想,並且做了特徵分層提取並依次計算邊框迴歸和分類操作,由此可以適應多種尺度目標的訓練和檢測任務。

SSD網路主體設計的思想是特徵分層提取,並依次進行邊框迴歸和分類。因為不同層次的特徵圖能代表不同層次的語義資訊,低層次的特徵圖能代表低層語義資訊(含有更多的細節),能提高語義分割質量,適合小尺度目標的學習。高層次的特徵圖能代表高層語義資訊,能光滑分割結果,適合對大尺度的目標進行深入學習。所以作者提出的SSD的網路理論上能適合不同尺度的目標檢測。SSD基本已經可以滿足我們手機端上實時物體檢測需求了。

SSD的網路結構:

下圖是SSD與YOLO網路結構的對比:

SSD演算法的主網路結構是VGG16,虛線框內的是VGG16的前5層網路,後面的Conv6和Conv7是將VGG16的後兩層全連線層網路(fc6, fc7)轉換而來。在之後並增加了4個卷積層來構造網路結構。

SSD網路結構也分為三部分:卷積層、目標檢測層和NMS篩選層

卷積層:

SSD論文采用了VGG16的前5層網路,其實這也是幾乎所有目標檢測神經網路的慣用方法。先用一個CNN網路來提取特徵,然後再進行後續的目標定位和目標分類識別。

目標檢測層:

這一層由5個卷積層和一個平均池化層組成。去掉了最後的全連線層。SSD認為目標檢測中的物體,只與周圍資訊相關,它的感受野不是全域性的,故沒必要也不應該做全連線。

多尺度目標檢測和分類:

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

具體來說就是:

對其中5種不同的卷積層的輸出(feature map)分別用兩個不同的 3×3的卷積核進行卷積,一個輸出分類用的confidence,每個default box 生成21個類別confidence;一個輸出迴歸用的 localization,每個 default box生成4個座標值(x, y, w, h);此外,這5個feature map還經過 PriorBox 層生成 prior box(生成的是座標)。上述5個feature map中每一層的default box的數量是給定的(8732個)。最後將前面三個計算結果分別合併然後傳給loss層。

在5個卷積層上的feature map都會進行目標檢測和分類,最後由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當於多了很多寬高比例的bounding box,可以大大提高泛化能力。

SSD中的anchors:

和faster R-CNN相似,SSD也提出了anchor的概念。SSD網路中作者設定Conv9輸出的feature map的每個點(每個點對應為原圖的一個區域的中心點)預設生成6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應4個位置引數(x,y,w,h)和21個類別概率(voc訓練集為20分類問題,在加上anchor是否為背景,共21分類),那麼每個Default Box將生成一個20 + 1 + 4 = 25維的特徵向量

如下圖:

注意:

論文中提出了一個feature cell 的概念,如下圖中有兩層的feature map ,大小分別為8*8和4*4,feature cell可以認為是其中的一個方格。在每個feature cell中再進行default box的定義,根據不同的scale和aspectratio來確定defaultbox的形狀。如在下圖(b)、(c)中,每一個featurecell中有4個defaultbox,並且每個default box的shape是不一樣的,但是它們的scale是一樣的。除了feature cell的中心有一個比feature cell還要小的default box。

 

另外,在訓練階段,SSD將正負樣本比例定位1:3。訓練集給定了輸入影象以及每個物體的真實區域(ground true box),將default box和真實box最接近的選為正樣本。然後在剩下的default box中選擇任意一個與真實box IOU大於0.5的,作為正樣本。而其他的則作為負樣本。由於絕大部分的box為負樣本,會導致正負失衡,故根據每個box類別概率排序,使正負比例保持在1:3。SSD認為這個策略提高了4%的準確率。

此外,SSD採用了資料增強。生成與目標物體真實box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機選取這些patch參與訓練,並對他們進行隨機水平翻轉等操作。SSD認為這個策略提高了8.8%的準確率。

NMS篩選層:

SSD的NMS篩選層和yolo的篩選層基本一致,同樣先過濾掉類別概率低於閾值的default box,再採用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標檢測輸出的default box。

SSD的演算法過程:

SSD網路的詳細結構:

輸入一幅圖片(200x200),將其輸入到預訓練好的分類網路中來獲得不同大小的特徵對映,這裡的分類網路是修改自VGG16的網路。其中將VGG16的FC6和FC7層轉化為卷積層,如上圖上的Conv6和Conv7,並去掉所有的Dropout層和FC8層。添加了Atrous演算法(hole演算法),將Pool5從2x2-S2變換到3x3-S1;

然後抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2層輸出的feature map,分別在這些feature map層上面的每一個點構造6個不同尺度大小的default box,然後分別進行檢測和分類,生成多個default box,如上圖,一共生成8732個default box;

將不同的feature map獲得的default box結合起來,經過NMS(非極大值抑制)方法來抑制掉一部分重疊或者不正確的default box,生成最終的default box集合(即檢測結果);

SSD演算法的loss函式:

SSD演算法的loss函式分為兩部分:計算相應的default box與目標類別的confidence loss以及相應的位置迴歸。

其中N是match到Ground Truth的default box數量;而alpha引數用於調整confidence loss和location loss之間的權重,預設alpha=1。

位置迴歸仍採用 Smooth L1 loss:

confidence loss是典型的softmax loss:

SSD演算法的優缺點:

SSD演算法的執行速度超過YOLO,精度超過Faster-rcnn(在一定條件下,對於稀疏場景的大目標而言);

SSD需要人工設定prior box的min_size,max_size和aspect_ratio值。網路中default box的基礎大小和形狀不能直接通過學習獲得,而是需要手工設定。而網路中每一層feature使用的default box大小和形狀恰好都不一樣,導致除錯過程非常依賴經驗;

SSD雖然採用了pyramdial feature hierarchy的思路,但是對小目標的recall依然一般,相對於Faster RCNN的優勢不明顯。這可能是因為SSD使用conv4_3的低階feature去檢測小目標,而低階特徵卷積層數少,存在特徵提取不充分的問題;

如果場景是密集的包含多個小目標的,建議用Faster-rcnn,針對特定的網路進行優化,也可以繼續加速;。果你的應用對速度要求很苛刻,那麼肯定首先考慮SSD,至於那些測試集上的評估結果,和真實的資料還是有很大的差距,演算法的效能也需要進一步進行評估。

YOLOv2/YOLO 9000:

論文: YOLO9000: Better, Faster, Stronger

論文地址:https://arxiv.org/pdf/1612.08242.pdf

這篇論文一共介紹了YOLO v2和YOLO9000兩個模型,二者略有不同。前者主要是YOLO的升級版(關於YOLO v1的介紹可以參考:YOLO v1演算法詳解),後者的主要檢測網路也是YOLO v2,同時對資料集做了融合,使得模型可以檢測9000多類物體。而提出YOLO9000的原因主要是目前檢測的資料集資料量較小,因此利用數量較大的分類資料集來幫助訓練檢測模型。

論文主要包括三個部分:Better,Faster,Stronger,其中前面兩部分基本上講的是YOLO v2,最後一部分講的是YOLO9000。

YOLO有兩個缺點:一個缺點在於定位不準確,另一個缺點在於和基於region proposal的方法相比召回率較低。因此YOLOv2主要是要在這兩方面做提升。另外YOLOv2並不是通過加深或加寬網路達到效果提升,反而是簡化了網路。大概看一下YOLOv2的表現:YOLOv2演算法在VOC 2007資料集上的表現為67 FPS時,MAP為76.8,在40FPS時,MAP為78.6。

YOLOv2精度的改進(Better):

Batch Normalization(批標準化):

BN(Batch Normalization)層簡單講就是對網路的每一層的輸入都做了歸一化,這樣網路就不需要每層都去學資料的分佈,收斂會快點。原來的YOLO演算法(採用的是GoogleNet網路提取特徵)是沒有BN層的,因此在YOLOv2中作者為每個卷積層都添加了BN層。另外由於BN可以規範模型,所以本文加入BN後就把dropout去掉了。實驗證明添加了BN層可以提高2%的mAP。

High Resolution Classifier(高解析度分類器):

fine-tuning的作用不言而喻,現在基本跑個classification或detection的模型都不會從隨機初始化所有引數開始,所以一般都是用預訓練的網路來fine-tuning自己的網路,而且預訓練的網路基本上都是在ImageNet資料集上跑的,一方面資料量大,另一方面訓練時間久,而且這樣的網路都可以在相應的github上找到。 

原來的YOLO網路在預訓練的時候採用的是224*224的輸入(這是因為一般預訓練的分類模型都是在ImageNet資料集上進行的),然後在detection的時候採用448*448的輸入,這會導致從分類模型切換到檢測模型的時候,模型還要適應影象解析度的改變。而YOLOv2則將預訓練分成兩步:先用224*224的輸入從頭開始訓練網路,大概160個epoch(表示將所有訓練資料迴圈跑160次),然後再將輸入調整到448*448,再訓練10個epoch。注意這兩步都是在ImageNet資料集上操作。最後再在檢測的資料集上fine-tuning,也就是detection的時候用448*448的影象作為輸入就可以順利過渡了。作者的實驗表明這樣可以提高几乎4%的MAP。

Convolutional With Anchor Boxes:

YOLOv1中,輸入圖片最終被劃分為7x7的gird cell,每個單元格預測2個邊界框。YOLOv1最後採用的是全連線層直接對邊界框進行預測,其中邊界框的寬與高是相對整張圖片大小的,而由於各個圖片中存在不同尺度和長寬比(scales and ratios)的物體,YOLOv1在訓練過程中學習適應不同物體的形狀是比較困難的。

作者在YOLOv2中借鑑了Faster R-CNN中的anchor思想,引入了anchor。 

Faster R-CNN中的anchor:

首先將原網路的全連線層和最後一個pooling層去掉,使得最後的卷積層可以有更高解析度的特徵。通過縮減網路,讓圖片輸入解析度為416 * 416,這一步的目的是為了讓後面產生的卷積特徵圖寬高都為奇數,奇數大小的寬和高會使得每個特徵圖在劃分cell的時候就只有一個center cell(比如可以劃分成7*7或9*9個cell,center cell只有一個,如果劃分成8*8或10*10的,center cell就有4個)。

為什麼希望只有一個center cell呢?因為大的object一般會佔據影象的中心,所以希望用一個center cell去預測,而不是4個center cell去預測。最後,YOLOv2使用了卷積層降取樣(factor為32),使得輸入卷積網路的416 * 416圖片最終得到13 * 13的卷積特徵圖(416/32=13,也就是縮小比例為32)。

加入了anchor boxes後,可以預料到的結果是召回率上升,準確率下降。我們來計算一下,假設每個cell預測9個建議框,那麼總共會預測13 * 13 * 9 = 1521個boxes,而之前的網路僅僅預測7 * 7 * 2 = 98個boxes。具體資料為:沒有anchor boxes,模型recall為81%,mAP為69.5%;加入anchor boxes,模型recall為88%,mAP為69.2%。這樣看來,準確率只有小幅度的下降,而召回率則提升了7%,說明可以通過進一步的工作來加強準確率,的確有改進空間。

Dimension Clusters(維度聚類):

我們知道在Faster R-CNN中anchor box的大小和比例是按經驗設定的,然後網路會在訓練過程中調整anchor box的尺寸。但是如果一開始就能選擇到合適尺寸的anchor box,那肯定可以幫助網路越好地預測detection。所以作者採用k-means的方式對訓練集的bounding boxes做聚類,試圖找到合適的anchor box。 

和以前的精選boxes維度不同,作者使用了K-means聚類方法類訓練bounding boxes,可以自動找到更好的boxes寬高維度。傳統的K-means聚類方法使用的是歐氏距離函式,也就意味著較大的boxes會比較小的boxes產生更多的error,聚類結果可能會偏離。為此,作者採用的評判標準是IOU得分(也就是boxes之間的交集除以並集),這樣的話,error就和box的尺度無關了。

最終的距離函式為:

作者通過改進的K-means對訓練集中的boxes進行了聚類,判別標準是平均IOU得分,聚類結果如下圖:

上圖中我們可以看到,平衡複雜度和IOU之後,最終得到k值為5,意味著作者選擇了5種大小的box維度來進行定位預測,這與手動精選的box維度不同。結果中扁長的框較少,而瘦高的框更多(這符合行人的特徵),這種結論如不通過聚類實驗恐怕是發現不了的。

當然,作者也做了實驗來對比兩種策略的優劣,如下圖,使用聚類方法,僅僅5種boxes的召回率就和Faster R-CNN的9種相當。說明K-means方法的引入使得生成的boxes更具有代表性,為後面的檢測任務提供了便利。

Direct Location prediction(直接位置預測):

作者在引入anchor box的時候遇到的第二個問題:模型不穩定,尤其是在訓練剛開始的時候。作者認為這種不穩定主要來自預測box的(x,y)值。我們知道在基於region proposal的object detection演算法(比如Faster R-CNN)中,是通過預測下圖中的tx和ty來得到(x,y)值,也就是預測的是offset。該公式沒有任何約束,中心點可能會出現在影象任何位置,這就有可能導致迴歸過程震盪,甚至無法收斂。

tx=1時,box將向右偏移一個anchor box的寬度;當tx=-1時,box將向左偏移一個anchor box的寬度。

關於上面的這個公式,論文中是減號,實際上應該是“+”號,上圖已經更正過。依據是Faster R-CNN中的公式:

顯然Faster R-CNN裡面的公式,和論文中這個公式將減號變成加號是一致的。

YOLOv2中沒有采用這種預測方式,而是沿用了YOLOv1的方法,就是預測邊界框中心點相對於對應cell左上角位置的相對偏移值。

網路在最後一個卷積層輸出13*13的feature map,有13*13個cell,每個cell有5個anchor box來預測5個bounding box,每個bounding box預測得到5個值,分別為:tx、ty、tw、th和to(類似YOLOv1的confidence)。

為了將bounding box的中心點約束在當前cell中,使用sigmoid函式將tx、ty歸一化處理,將值約束在0~1,這使得模型訓練更穩定。

如上圖,cx和cy,表示cell與影象左上角的橫縱座標距離,黑色虛線框是bounding box,藍色矩形框就是預測的結果。

Fine-Grained Features(細粒度特徵)

這裡主要是添加了一個轉移層( passthrough layer)。這個層的作用就是將前面一層的26*26的feature map和本層的13*13的feature map進行連線,有點像ResNet。

這樣做的原因在於雖然13*13的feature map對於預測大的object以及足夠了,但是對於預測小的object就不一定有效。也容易理解,越小的object,經過層層卷積和pooling,可能到最後都不見了,所以通過合併前一層的size大一點的feature map,可以有效檢測小的object。

Multi-Scale Training(多尺度訓練):

原來的YOLO網路使用固定的448 * 448的圖片作為輸入,現在加入anchor boxes後,輸入變成了416 * 416。目前的網路只用到了卷積層和池化層,那麼就可以進行動態調整(意思是可檢測任意大小圖片)。為了讓YOLOv2模型更加robust,作者引入了Muinti-Scale Training,簡單講就是在訓練時輸入影象的size是動態變化的。

作者在訓練時每經過幾次迭代後就會微調網路。每經過10次訓練(10 epoch),就會隨機選擇新的圖片尺寸。YOLO網路使用的降取樣引數為32,那麼可以選擇的圖片尺寸就是{320,352,…,608}。從中隨機挑一個尺寸,接著按照這個尺寸調整網路進行訓練。

這種機制使得網路可以更好地預測不同尺寸的圖片,意味著同一個網路可以進行不同解析度的檢測任務,在小尺寸圖片上YOLOv2執行更快,在速度和精度上達到了平衡。

在小尺寸圖片檢測中,YOLOv2成績很好,輸入為228 * 228的時候,幀率達到90FPS,mAP幾乎和Faster R-CNN的水準相同。使得其在低效能GPU、高幀率視訊、多路視訊場景中更加適用。

在大尺寸圖片檢測中,YOLOv2達到了先進水平,VOC2007 上mAP為78.6%,仍然高於平均水準,下圖是YOLOv2和其他網路的成績對比:

YOLOv2速度的改進(Faster):

在YOLO v1中,作者採用的訓練網路是基於GooleNet,這裡作者將GooleNet和VGG16做了簡單的對比,GooleNet在計算複雜度上要優於VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5準確率要稍低於後者(88% VS 90%)。而在YOLO v2中,作者採用了新的分類模型作為基礎網路,那就是Darknet-19。

Darknet-19:

YOLOv2使用了一個新的分類網路作為特徵提取部分,參考了前人的先進經驗,比如類似於VGG,作者使用了較多的3 * 3卷積核,在每一次池化操作後把通道數翻倍。借鑑了network in network的思想,網路使用了全域性平均池化(global average pooling),把1 * 1的卷積核置於3 * 3的卷積核之間,用來壓縮特徵。也用了batch normalization(前面介紹過)穩定模型訓練。

最終得出的基礎模型就是Darknet-19,如下圖,包含19個卷積層、5個最大值池化層(maxpooling layers )。Darknet-19運算次數為55.8億次,imagenet圖片分類top-1準確率72.9%,top-5準確率91.2%。

Training for Classification:

這部分前面有提到,就是訓練處理的小trick。這裡的Training for Classification都是在ImageNet上進行預訓練。

YOLOv2的訓練主要包括三個階段:

第一階段:在ImageNet分類資料集上從頭開始預訓練Darknet-19,訓練160個epoch。輸入影象的大小是224*224,用的隨機梯度下降法,starting learning rate 為0.1,polynomial rate decay 為4,weight decay為0.0005 ,momentum 為0.9。訓練的時候仍然使用了很多常見的資料擴充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。

第二階段:將網路的輸入調整為448*448,繼續在ImageNet資料集上fine-tuning分類模型,訓練10個epoch。引數的除了epoch和learning rate改變外,其他都沒變,這裡learning rate改為0.001。高解析度下訓練的分類網路在top-1準確率76.5%,top-5準確率93.3%。

Training for Detection:

在前面Training for Classification之後,就該訓練detection網路了,作者去掉了原網路最後一個卷積層,轉而增加了三個3 * 3 * 1024的卷積層(可參考darknet中cfg檔案),並且在每一個上述卷積層後面跟一個1 * 1的卷積層,輸出維度是檢測所需的數量。對於VOC資料集,預測5種boxes大小,每個box包含5個座標值和20個類別,所以總共是5 * (5+20)= 125個輸出維度。同時也添加了轉移層(passthrough layer ),從最後那個3 * 3 * 512的卷積層連到倒數第二層,使模型有了細粒度特徵。最後作者在檢測資料集上fine tune這個預訓練模型160個epoch,學習率採用0.001,並且在第60和90epoch的時候將學習率除以10,weight decay採用0.0005。

YOLOv2分類的改進(Stronger):

帶標註的檢測資料集量比較少,而帶標註的分類資料集量比較大,因此YOLO9000主要通過結合分類和檢測資料集使得訓練得到的檢測模型可以檢測約9000類物體。

如何做到呢?

一方面要構造資料集,另一方面要解決模型訓練問題,前者採用WordTree解決,後者採用Joint classification and detection。

如何做資料集的融合:

大家都知道,不同的資料集有不同的作用,通常我們採用一個數據集進行訓練,而作者提出了新的思路:

通過ImageNet訓練分類,COCO和VOC資料集來訓練檢測,這是一個很有價值的思路,可以讓我們在公網上達到比較優的效果。 通過將兩個資料集混合訓練,如果遇到來自分類集的圖片則只計算分類的Loss,遇到來自檢測集的圖片則計算完整的Loss。

這裡面是有問題的,ImageNet對應分類有9000種,而COCO則只提供80種目標檢測,這中間如何Match?答案就是multi-label模型,即假定一張圖片可以有多個label,並且不要求label間獨立。

由於ImageNet的類別是從WordNet選取的,作者採用以下策略重建了一個樹形結構(稱為分層樹):

遍歷Imagenet的label,然後在WordNet中尋找該label到根節點(指向一個物理物件)的路徑;

如果路徑只有一條,那麼就將該路徑直接加入到分層樹結構中;

否則,從剩餘的路徑中選擇一條最短路徑,加入到分層樹。

這個分層樹我們稱之為 Word Tree,作用就在於將兩種資料集按照層級進行結合。

下圖是COCO和ImageNet資料集以及WordTree的示意圖。在WordTree中用顏色區分了COCO資料集和ImageNet資料集的label節點。

分類時的概率計算借用了決策樹思想,某個節點的概率值等於該節點到根節點的所有條件概率之積。

另外,softmax操作也同時應該採用分組操作,下圖上半部分為ImageNet對應的原生Softmax,下半部分對應基於Word Tree的Softmax:

通過上述方案構造WordTree,得到對應9418個分類,通過重取樣保證Imagenet和COCO的樣本資料比例為4:1。

如何給模型訓練?

文中採用的是Joint classification and detection(聯合分類和檢測),即在訓練期間,我們混合來自檢測和分類資料集的影象。 當我們的網路看到標記為檢測的影象時,我們可以基於完整的YOLOv2丟失功能進行反向傳播。 當它看到分類影象時,我們只反向傳播體系結構的分類特定部分的損失。

也就是說,通過這種聯合訓練,YOLO9000學習使用COCO中的檢測資料在影象中查詢物件,並學習使用來自ImageNet的資料對各種物件進行分類。YOLO9000的主網路基本和YOLOv2類似,只不過每個grid cell只採用3個box prior。

最終效果:

1)低解析度 - 228 * 228,幀率達到90FPS,mAP幾乎與Faster媲美;

2)高解析度,在VOC2007 上mAP達到78.6%,同時FPS=40;

YOLO v2 在大尺寸圖片上能夠實現高精度,在小尺寸圖片上執行更快,可以說在速度和精度上達到了平衡。

    

YOLOv3:

論文:YOLOv3: An Incremental Improvement

論文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf

YOLOv3是到目前為止,速度和精度最均衡的目標檢測網路。通過多種先進方法的融合,將YOLO系列的短板(速度很快,不擅長檢測小物體等)全部補齊。達到了令人驚豔的效果和拔群的速度。

                                                      圖:YOLOv3與其他網路的mAP與執行時間對比

多標籤分類預測:

在YOLO9000之後,我們的系統使用維度聚類(dimension clusters )作為anchor boxes來預測邊界框,網路為每個邊界框預測4個座標。

在YOLOv3中使用邏輯迴歸預測每個邊界框(bounding box)的物件分數。 如果先前的邊界框比之前的任何其他邊界框重疊ground truth物件,則該值應該為1。如果以前的邊界框不是最好的,但是確實將ground truth物件重疊了一定的閾值以上,我們會忽略這個預測,按照進行。我們使用閾值0.5。與YOLOv2不同,我們的系統只為每個ground truth物件分配一個邊界框。如果先前的邊界框未分配給grounding box物件,則不會對座標或類別預測造成損失。

在YOLOv3中,每個框使用多標籤分類來預測邊界框可能包含的類。該演算法不使用softmax,因為它對於高效能沒有必要,因此YOLOv3使用獨立的邏輯分類器。在訓練過程中,我們使用二元交叉熵損失來進行類別預測。對於重疊的標籤,多標籤方法可以更好地模擬資料。

跨尺度預測:

YOLOv3採用多個尺度融合的方式做預測。原來的YOLO v2有一個轉移層( passthrough layer),假設最後提取的feature map的size是13*13,那麼這個層的作用就是將前面一層的26*26的feature map和本層的13*13的feature map進行連線,有點像ResNet。這樣的操作也是為了加強YOLO演算法對小目標檢測的精確度。

這個思想在YOLO v3中得到了進一步加強,在YOLO v3中採用類似FPN的上取樣(upsample)和融合做法(最後融合了3個scale,其他兩個scale的大小分別是26*26和52*52),在多個scale的feature map上做檢測,對於小目標的檢測效果提升還是比較明顯的。

尺度1: 在基礎網路之後新增一些卷積層再輸出box資訊;

尺度2: 從尺度1中的倒數第二層的卷積層上取樣(x2)再與最後一個16x16大小的特徵圖相加,再次通過多個卷積後輸出box資訊.相比尺度1變大兩倍;

尺度3: 與尺度2類似,使用了32x32大小的特徵圖。

雖然在YOLO v3中每個網格預測3個邊界框,看起來比YOLO v2中每個grid cell預測5個邊界框要少,但因為YOLO v3採用了多個尺度的特徵融合,所以邊界框的數量要比之前多很多。

網路結構的改變:

YOLO v3使用新的網路來實現特徵提取。在Darknet-19中新增殘差網路的混合方式,使用連續的3×3和1×1卷積層,但現在也有一些shortcut連線,YOLO v3將其擴充為53層並稱之為Darknet-53。

這個新網路比Darknet-19功能強大得多,而且比ResNet-101或ResNet-152更有效。

 

上圖是不同的網路在ImageNet上的表現。每個網路都使用相同的設定進行訓練,並以256×256的單精度測試進行測試。執行時間是在Titan X上以256×256進行測量的。因此,Darknet-53可與state-of-the-art的分類器相媲美,但浮點運算更少,速度更快。Darknet-53比ResNet-101更好,速度更快1:5倍。 Darknet-53與ResNet-152具有相似的效能,速度提高2倍。

Darknet-53也可以實現每秒最高的測量浮點運算。這意味著網路結構可以更好地利用GPU,從而使其評估效率更高,速度更快。

總結:

YOLO檢測演算法進行目標檢測,取得了較高的檢測速度和檢測準確率。該演算法不僅對於實物有著很好的效果,對於其他目標,如藝術作品等同樣具有很好的相容性。YOLO演算法相比其他演算法更符合工業界對目標檢測演算法實時性的要求,簡單易實現,對於嵌入式很友好。