YOLO(一) 算法的原理及演變

第一次接觸到y(tǒng)olo這個算法是通過吳恩達的教學視頻了解到的,當時其實也算是第一次接觸到目標檢測算法。這里我們主要介紹下YOLO(You Only Look Once)?,F(xiàn)在已經(jīng)進化到了V3版本了。它不同于Faster RCNN這個分支走的兩部策略先進行前景識別在進行目標檢測,它是直接一步到位進行目標檢測。因此在識別的速度上優(yōu)于Faster RCNN(5 FPS), 而 YOLO_v1基礎(chǔ)版在Titan X GPU上可以達到45幀/s; 快速版可以達到150幀/s。但是在準確率上YOLO是稍差與Faster RCNN這個在之后會詳細介紹。順便提下如果想了解Faster RCNN原理可以參考Faster-RCNN的原理及演變

YOLO v1


我們知道YOLO其實就是 You Only Look Once, 意思是只需要看一眼就知道位置及對象,個人覺得蠻形象的。他不需要Faster RCNN的RPN結(jié)構(gòu),他其實選取anchor是預(yù)訂了候選框,將圖片劃分為7x7的網(wǎng)格,每個網(wǎng)格允許有2個不同的bounding box. 這樣一開始我們就有7x7x2個候選框(bounding box), 大致粗略覆蓋了圖像的整個區(qū)域。他的思想就是Faster RCNN在第一階段就算有了回歸框,在第二階段還是需要進行精調(diào),那還不如就先生成大致回歸框就ok了。

下面我們就來好好介紹一下這個模型。

一、模型結(jié)構(gòu)


細節(jié)模型結(jié)構(gòu)

其實將這個模型簡單話為:


縮略版模型結(jié)構(gòu)
  1. 其實前面就是提取特征后后面為7x7x30的輸出。下面說一下模型輸入輸出
階段 圖示
模型輸入 輸入的是原始圖像,但是需要resize到448x448
模型輸出 輸出為7x7x30向量
輸出向量表示
  1. 模型的輸出為什么是7x7x30呢?
    首先我們來看7x7表示的意思。


    image.png

    其實對于每一個grid代表了(448/7)的區(qū)域表達。當然這里的7x7也是可以調(diào)節(jié)大小的。

那30又是如何形成的通道大小的呢?

a. 2個bounding box的位置(8個通道)
每個bounding box需要4個數(shù)值來表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心點的x坐標,y坐標,bounding box的寬度,高度),2個bounding box共需要8個數(shù)值來表示其位置。

b. 2個bounding box 置信度(2個通道)

bounding box的置信度 =是否存在目標與iou值的乘積
image.png

c. 20分類概率(20個通道)
下面我們來說一下剩下20維度的分類通道。每一個通道代表一個類別的分類概率。因為YOLO支持識別20種不同的對象(人、鳥、貓、汽車、椅子等),所以這里有20個值表示該網(wǎng)格位置存在任一種對象的概率。但是我們一組圖片只能預(yù)測49個對象,可以理解為一個grid2個achor只能有一個預(yù)測準的對象(即計算IOU比例最大的那個anchor),所以7x7個對象

  1. 設(shè)置訓練樣本的細節(jié)?
    樣本中的每個Object歸屬到且僅歸屬到一個grid,即便有時Object跨越了幾個grid,也僅指定其中一個。具體就是計算出該Object的bounding box的中心位置,這個中心位置落在哪個grid,該grid對應(yīng)的輸出向量中該對象的類別概率是1(該gird負責預(yù)測該對象),所有其它grid對該Object的預(yù)測概率設(shè)為0(不負責預(yù)測該對象)。

  2. 說到這里大家有沒有發(fā)現(xiàn)YOLO一個缺點。
    雖然每個格子可以預(yù)測 B 個 bounding box,但是最終只選擇只選擇 IOU 最高的 bounding box 作為物體檢測輸出,即每個格子最多只預(yù)測出一個物體。當物體占畫面比例較小,如圖像中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。這是 YOLO 方法的一個缺陷。(可以該表grid大小例如改為12x12等方法)

  3. 例子


    樣本標簽與網(wǎng)絡(luò)實際輸出

圖中將自行車的位置放在bounding box1,但實際上是在訓練過程中等網(wǎng)絡(luò)輸出以后,比較兩個bounding box與自行車實際位置的IOU,自行車的位置(實際bounding box)放置在IOU比較大的那個bounding box(圖中假設(shè)是bounding box1),且該bounding box的置信度設(shè)為1

二、 損失函數(shù)


損失函數(shù)

總的來說,就是用網(wǎng)絡(luò)輸出與樣本標簽的各項內(nèi)容的誤差平方和作為一個樣本的整體誤差。
損失函數(shù)中的幾個項是與輸出的30維向量中的內(nèi)容相對應(yīng)的。

損失類別 公式 細節(jié)內(nèi)容
分類loss
公式第5行1_i^{obj}意味著存在對象的網(wǎng)格才計入誤差。
bouding box loss
寬度和高度先取了平方根,因為如果直接取差值的話,大的對象對差值的敏感度較低,小的對象對差值的敏感度較高,所以取平方根可以降低這種敏感度的差異,使得較大的對象和較小的對象在尺寸誤差上有相似的權(quán)重。
bounding box confidence loss
乘以\lambda_{noobj}調(diào)節(jié)不存在對象的bounding box的置信度的權(quán)重(相對其它誤差)。YOLO設(shè)置 \lambda_{noobj}=0.5,即調(diào)低不存在對象的bounding box的置信度誤差的權(quán)重。

三、 YOLO v1 缺陷

缺點
YOLO 對相互靠的很近的物體,還有很小的群體檢測效果不好,這是因為一個網(wǎng)格中只預(yù)測了兩個框,并且只屬于一類。
同一類物體出現(xiàn)的新的不常見的長寬比和其他情況時,泛化能力偏弱。
由于損失函數(shù)的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。在實現(xiàn)中,最主要的就是怎么設(shè)計損失函數(shù),讓這個三個方面得到很好的平衡。作者簡單粗暴的全部采用了 sum-squared error loss 來做這件事。
YOLO 采用了多個下采樣層,網(wǎng)絡(luò)學到的物體特征并不精細,因此也會影響檢測效果。

注意:

  1. 乘以\lambda調(diào)節(jié)bounding box位置誤差的權(quán)重(相對分類誤差和置信度誤差)。YOLO設(shè)置\lambda_{coord}=5,即調(diào)高位置誤差的權(quán)重。
  2. 都帶有1_i^{obj}意味著只有"負責"(IOU比較大)預(yù)測的那個bounding box的數(shù)據(jù)才會計入誤差。

細節(jié):
YOLO的最后一層采用線性激活函數(shù),其它層都是Leaky ReLU。訓練中采用了drop out和數(shù)據(jù)增強(data augmentation)來防止過擬合。更多細節(jié)請參考原論文

YOLO v2


在67 FPS,YOLOv2在PASCAL VOC 2007上獲得76.8%的mAP。在40 FPS時,YOLOv2獲得78.6%mAP,這比使用ResNet和SSD 更快的R-CNN更好。憑借如此優(yōu)異的成績,YOLOv2于2017年CVPR發(fā)布并獲得超過1000次引用。YOLO有兩個缺點:一個缺點在于定位不準確,另一個缺點在于和基于region proposal的方法相比召回率較低。因此YOLOv2主要是要在這兩方面做提升。另外YOLOv2并不是通過加深或加寬網(wǎng)絡(luò)達到效果提升,反而是簡化了網(wǎng)絡(luò)。

下面主要從兩點來介紹下YOLO v2的提升之處。分別是Better以及Faster.

一、Better

  1. Batch Normalization
    相當于對每一層的輸入做了歸一化, 加快收斂,并刪除后面的dropout,提升2%的mAP。

  2. High-Resolution Classifier, 將輸入大小由224x224改448x448。因為yolov2模型只使用了卷積層和池化層,模型可以隨時調(diào)整圖片的輸入大小。
    原來的YOLO網(wǎng)絡(luò)在預(yù)訓練的時候采用的是224224的輸入(這是因為一般預(yù)訓練的分類模型都是在ImageNet數(shù)據(jù)集上進行的),然后在detection的時候采用448448的輸入,這會導致從分類模型切換到檢測模型的時候,模型還要適應(yīng)圖像分辨率的改變。而YOLOv2則將預(yù)訓練分成兩步:先用224224的輸入從頭開始訓練網(wǎng)絡(luò),大概160個epoch(表示將所有訓練數(shù)據(jù)循環(huán)跑160次),然后再將輸入調(diào)整到448448,再訓練10個epoch。注意這兩步都是在ImageNet數(shù)據(jù)集上操作。最后再在檢測的數(shù)據(jù)集上fine-tuning,也就是detection的時候用448*448的圖像作為輸入就可以順利過渡了。作者的實驗表明這樣可以提高幾乎 4%的MAP。

  3. Convolutional With Anchor Boxes
    原來的YOLO是利用全連接層直接預(yù)測bounding box的坐標,而YOLOv2借鑒了Faster R-CNN的思想,引入anchor。首先將原網(wǎng)絡(luò)的全連接層和最后一個pooling層去掉,使得最后的卷積層可以有更高分辨率的特征;然后縮減網(wǎng)絡(luò),用416416大小的輸入代替原來448448。這樣做的原因在于希望得到的特征圖都有奇數(shù)大小的寬和高,奇數(shù)大小的寬和高會使得每個特征圖在劃分cell的時候就只有一個center cell(比如可以劃分成77或99個cell,center cell只有一個,如果劃分成88或1010的,center cell就有4個)。為什么希望只有一個center cell呢?因為大的object一般會占據(jù)圖像的中心,所以希望用一個center cell去預(yù)測,而不是4個center cell去預(yù)測。網(wǎng)絡(luò)最終將416416的輸入變成1313大小的feature map輸出,也就是縮小比例為32。
    我們知道原來的YOLO算法將輸入圖像分成77的網(wǎng)格,每個網(wǎng)格預(yù)測兩個bounding box,因此一共只有98個box,但是在YOLOv2通過引入anchor boxes,預(yù)測的box數(shù)量超過了1千(以輸出feature map大小為1313為例,每個grid cell有9個anchor box的話,一共就是13139=1521個,當然由后面第4點可知,最終每個grid cell選擇5個anchor box)。順便提一下在Faster RCNN在輸入大小為1000*600時的boxes數(shù)量大概是6000,在SSD300中boxes數(shù)量是8732。顯然增加box數(shù)量是為了提高object的定位準確率。作者的實驗證明:雖然加入anchor使得MAP值下降了一點(69.5降到69.2),但是提高了recall(81%提高到88%)。

  4. Dimension Clusters
    我們知道在Faster R-CNN中anchor box的大小和比例是按經(jīng)驗設(shè)定的,然后網(wǎng)絡(luò)會在訓練過程中調(diào)整anchor box的尺寸。但是如果一開始就能選擇到合適尺寸的anchor box,那肯定可以幫助網(wǎng)絡(luò)越好地預(yù)測detection。所以作者采用k-means的方式對訓練集的bounding boxes做聚類,試圖找到合適的anchor box。
    另外作者發(fā)現(xiàn)如果采用標準的k-means(即用歐式距離來衡量差異),在box的尺寸比較大的時候其誤差也更大,而我們希望的是誤差和box的尺寸沒有太大關(guān)系。所以通過IOU定義了如下的距離函數(shù),使得誤差和box的大小無關(guān):



    如下圖Figure2,左邊是聚類的簇個數(shù)核IOU的關(guān)系,兩條曲線分別代表兩個不同的數(shù)據(jù)集。在分析了聚類的結(jié)果并平衡了模型復雜度與recall值,作者選擇了K=5,這也就是Figure2中右邊的示意圖是選出來的5個box的大小,這里紫色和黑色也是分別表示兩個不同的數(shù)據(jù)集,可以看出其基本形狀是類似的。而且發(fā)現(xiàn)聚類的結(jié)果和手動設(shè)置的anchor box大小差別顯著。聚類的結(jié)果中多是高瘦的box,而矮胖的box數(shù)量較少。



    Table1中作者采用的5種anchor(Cluster IOU)的Avg IOU是61,而采用9種Anchor Boxes的Faster RCNN的Avg IOU是60.9,也就是說本文僅選取5種box就能達到Faster RCNN的9中box的效果。

    5、Direct Location prediction
    作者在引入anchor box的時候遇到的第二個問題:模型不穩(wěn)定,尤其是在訓練剛開始的時候。作者認為這種不穩(wěn)定主要來自預(yù)測box的(x,y)值。我們知道在基于region proposal的object detection算法中,是通過預(yù)測下圖中的tx和ty來得到(x,y)值,也就是預(yù)測的是offset。另外關(guān)于文中的這個公式,個人認為應(yīng)該把后面的減號改成加號,這樣才能符合公式下面的example。這里xa和ya是anchor的坐標,wa和ha是anchor的size,x和y是坐標的預(yù)測值,tx和ty是偏移量。文中還特地舉了一個例子:A prediction of tx = 1 would shift the box to the right by the width of the anchor box, a prediction of tx = -1 would shift it to the left by the same amount.

    在這里作者并沒有采用直接預(yù)測offset的方法,還是沿用了YOLO算法中直接預(yù)測相對于grid cell的坐標位置的方式。
    前面提到網(wǎng)絡(luò)在最后一個卷積層輸出13*13大小的feature map,然后每個cell預(yù)測5個bounding box,然后每個bounding box預(yù)測5個值:tx,ty,tw,th和to(這里的to類似YOLOv1中的confidence)??聪聢D,tx和ty經(jīng)過sigmoid函數(shù)處理后范圍在0到1之間,這樣的歸一化處理也使得模型訓練更加穩(wěn)定;cx和cy表示一個cell和圖像左上角的橫縱距離;pw和ph表示bounding box的寬高,這樣bx和by就是cx和cy這個cell附近的anchor來預(yù)測tx和ty得到的結(jié)果。



    如果對上面的公式不理解,可以看Figure3,首先是cx和cy,表示grid cell與圖像左上角的橫縱坐標距離,黑色虛線框是bounding box,藍色矩形框就是預(yù)測的結(jié)果。
  5. Fine-Grained Features
    這里主要是添加了一個層:passthrough layer。這個層的作用就是將前面一層的2626的feature map和本層的1313的feature map進行連接,有點像ResNet。這樣做的原因在于雖然13*13的feature map對于預(yù)測大的object以及足夠了,但是對于預(yù)測小的object就不一定有效。也容易理解,越小的object,經(jīng)過層層卷積和pooling,可能到最后都不見了,所以通過合并前一層的size大一點的feature map,可以有效檢測小的object。(其實就是將前面一層大的feature(比較容易檢測到小物體)與后面小的feature map結(jié)合在一起)

  6. Multi-Scale Training
    為了讓YOLOv2模型更加robust,作者引入了Muinti-Scale Training,簡單講就是在訓練時輸入圖像的size是動態(tài)變化的,注意這一步是在檢測數(shù)據(jù)集上fine tune時候采用的,不要跟前面在Imagenet數(shù)據(jù)集上的兩步預(yù)訓練分類模型混淆,本文細節(jié)確實很多。具體來講,在訓練網(wǎng)絡(luò)時,每訓練10個batch(文中是10個batch,個人認為會不會是筆誤,不應(yīng)該是10個epoch?),網(wǎng)絡(luò)就會隨機選擇另一種size的輸入。那么輸入圖像的size的變化范圍要怎么定呢?前面我們知道本文網(wǎng)絡(luò)本來的輸入是416416,最后會輸出1313的feature map,也就是說downsample的factor是32,因此作者采用32的倍數(shù)作為輸入的size,具體來講文中作者采用從{320,352,…,608}的輸入尺寸。
    這種網(wǎng)絡(luò)訓練方式使得相同網(wǎng)絡(luò)可以對不同分辨率的圖像做detection。雖然在輸入size較大時,訓練速度較慢,但同時在輸入size較小時,訓練速度較快,而multi-scale training又可以提高準確率,因此算是準確率和速度都取得一個不錯的平衡。
    Table3就是在檢測時,不同輸入size情況下的YOLOv2和其他object detection算法的對比??梢钥闯鐾ㄟ^multi-scale training的檢測模型,在測試的時候,輸入圖像在尺寸變化范圍較大的情況下也能取得mAP和FPS的平衡。High Resolution Classifier的提升非常明顯(近4%),另外通過結(jié)合dimension prior+localtion prediction這兩種方式引入anchor也能帶來近5%mAP的提升。

二、Faster

1、Darknet-19
在YOLO v1中,作者采用的訓練網(wǎng)絡(luò)是基于GooleNet,這里作者將GooleNet和VGG16做了簡單的對比,GooleNet在計算復雜度上要優(yōu)于VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5準確率要稍低于后者(88% VS 90%)。而在YOLO v2中,作者采用了新的分類模型作為基礎(chǔ)網(wǎng)絡(luò),那就是Darknet-19。Table6是最后的網(wǎng)絡(luò)結(jié)構(gòu):Darknet-19只需要5.58 billion operation。這個網(wǎng)絡(luò)包含19個卷積層和5個max pooling層,而在YOLO v1中采用的GooleNet,包含24個卷積層和2個全連接層,因此Darknet-19整體上卷積卷積操作比YOLO v1中用的GoogleNet要少,這是計算量減少的關(guān)鍵。最后用average pooling層代替全連接層進行預(yù)測。這個網(wǎng)絡(luò)在ImageNet上取得了top-5的91.2%的準確率。

2、Training for Classification
這里的2和3部分在前面有提到,就是訓練處理的小trick。這里的training for classification都是在ImageNet上進行預(yù)訓練,主要分兩步:1、從頭開始訓練Darknet-19,數(shù)據(jù)集是ImageNet,訓練160個epoch,輸入圖像的大小是224224,初始學習率為0.1。另外在訓練的時候采用了標準的數(shù)據(jù)增加方式比如隨機裁剪,旋轉(zhuǎn)以及色度,亮度的調(diào)整等。2、再fine-tuning 網(wǎng)絡(luò),這時候采用448448的輸入,參數(shù)的除了epoch和learning rate改變外,其他都沒變,這里learning rate改為0.001,并訓練10個epoch。結(jié)果表明fine-tuning后的top-1準確率為76.5%,top-5準確率為93.3%,而如果按照原來的訓練方式,Darknet-19的top-1準確率是72.9%,top-5準確率為91.2%。因此可以看出第1,2兩步分別從網(wǎng)絡(luò)結(jié)構(gòu)和訓練方式兩方面入手提高了主網(wǎng)絡(luò)的分類準確率。

3、Training for Detection
在前面第2步之后,就開始把網(wǎng)絡(luò)移植到detection,并開始基于檢測的數(shù)據(jù)再進行fine-tuning。首先把最后一個卷積層去掉,然后添加3個33的卷積層,每個卷積層有1024個filter,而且每個后面都連接一個11的卷積層,11卷積的filter個數(shù)根據(jù)需要檢測的類來定。比如對于VOC數(shù)據(jù),由于每個grid cell我們需要預(yù)測5個box,每個box有5個坐標值和20個類別值,所以每個grid cell有125個filter(與YOLOv1不同,在YOLOv1中每個grid cell有30個filter,還記得那個7730的矩陣嗎,而且在YOLOv1中,類別概率是由grid cell來預(yù)測的,也就是說一個grid cell對應(yīng)的兩個box的類別概率是一樣的,但是在YOLOv2中,類別概率是屬于box的,每個box對應(yīng)一個類別概率,而不是由grid cell決定,因此這邊每個box對應(yīng)25個預(yù)測值(5個坐標加20個類別值),而在YOLOv1中一個grid cell的兩個box的20個類別值是一樣的)。另外作者還提到將最后一個33*512的卷積層和倒數(shù)第二個卷積層相連。最后作者在檢測數(shù)據(jù)集上fine tune這個預(yù)訓練模型160個epoch,學習率采用0.001,并且在第60和90epoch的時候?qū)W習率除以10,weight decay采用0.0005。

YOLO v3


這里yolo v3相對于yolo v2有三點:1. 利用多尺度特征進行對象檢測 2. 調(diào)整基礎(chǔ)網(wǎng)絡(luò)結(jié)構(gòu)

  1. 利用多尺度特征進行對象檢測


    image.png

    YOLOv3采用了3個尺度的特征圖(當輸入為416×416時):(13×13),(26×26),(52×52),YOLOv3每個位置使用3個先驗框,所以使用k-means得到9個先驗框,并將其劃分到3個尺度特征圖上,尺度更大的特征圖使用更小的先驗框

  2. 調(diào)整基礎(chǔ)網(wǎng)絡(luò)結(jié)構(gòu)
    YOLO V3特征提取網(wǎng)絡(luò)使用了殘差模型,相比YOLO V2使用的Darknet-19,其包含53個卷積層所以稱為Darknet-53.其網(wǎng)絡(luò)結(jié)構(gòu)如下圖


    Darknet-53
參考:
  1. YOLO v1深入理解
  2. 從YOLOv1到Y(jié)OLOv3,目標檢測的進化之路
  3. YOLO2詳解
  4. 目標檢測網(wǎng)絡(luò)之 YOLOv3
  5. <機器愛學習>YOLOv2 / YOLO9000 深入理解
  6. 目標檢測之YOLO V2 V3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容