YOLOv1到YOLOv3的演變過程及每個算法詳解


1,YOLOv1算法的簡介

YOLO算法使用深度神經網絡進行對象的位置檢測以及分類,主要的特點是速度夠快,而且准確率也很高,采用直接預測目標對象的邊界框的方法,將候選區和對象識別這兩個階段合二為一,

與faster rcnn區分開來,是一刀流的檢測方法。

Yolo算法不再是窗口滑動了,而是直接將原始圖片分割成互不重合的小方塊,然后通過卷積最后生產這樣大小的特征圖,基於上面的分析,可以認為特征圖的每個元素也是對應原始圖片的一個小

方塊,然后用每個元素來可以預測那些中心點在該小方格內的目標,這就是Yolo算法的朴素思想,

最新的YOLOv3算法再以往的結構上做出了改進,增加了多尺度檢測,以及更深的網絡結構darknet53,這是比較主要的改進,還有某些細節上的變動。

 

2,YOLOv1算法的原理

 

實際操作如圖所示,分為7*7個小格子,每個格子預測兩個bounding box。

如果一個目標的中心落入一個網格單元中,該網格單元負責檢測 該目標。

對每一個切割的小單元格預測(置信度,邊界框的位置),每個bounding box需要4個數值來表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心點的x坐標,y坐標,bounding box的寬度,高度)

置信度定義為是否存在目標iou值的乘積,

 

還要得到分類的概率結果;20個分類每個類別的概率。

7*7*30中的30=(20類概率+2*5(置信度,邊框位置))

 

 

 2.1    YOLOv1的網絡結構

YOLO采用單個的卷積神經網絡進行預測,YOLO的整個結構就是輸入圖片經過神經網絡的變換得到一個輸出的張量 。   步驟如下:

(1)將輸入圖像調整為448×448,(2)在圖像 上運行單個卷積網絡,以及(3)由模型的置信度對所得到的檢測進行閾值處理

首先,YOLO速度非常快。由於我們將檢測視為回歸問題,所以不需要復雜的流程。測試時在一張新圖像 上簡單的運行我們的神經網絡來預測檢測

其次,YOLO在進行預測時,會對圖像進行全面地推理。與基於滑動窗口和區域提出的技術不同,YOLO在訓練期間和測試時會看到整個圖像,所以它隱式地編碼了

關於類的上下文信息以及它們的外觀。快速R-CNN是一種頂級的檢測方法,但是它看不到更大的上下文信息,所以在圖像中會將背景塊誤檢為目標。與快速R-CNN相比,YOLO的背景誤檢數量少了一半

然后,由於YOLO具有高度泛化能力,因此在應用於新領域或碰到意外的輸入時不太可能出故障。

 

所使用的卷積結構如圖所示:受到GoogLeNet圖像分類模型的啟發。網絡有24個卷積層,后面是2個全連接層,最后輸出層用線性函數做激活函數,其它層激活函數都是Leaky ReLU。

我們 只使用1*1降維層,后面是3*3卷積層,

 

3, YOLOv1的損失函數和訓練過程

YOLO的損失函數定義如下:

 

YOLO在ImageNet分類任務上以一半的分辨率(224*224的輸入圖像)預訓練卷積層,然后將分辨 率加倍來進行檢測。

訓練中采用了drop out和數據增強(data augmentation)來防止過擬合.

4.    預測過程以及結果的處理

直接把訓練好的YOLO網絡模型輸入一張圖片,得到一個7*7*30的結果向量,通過NMS(非極大值抑制)來選擇最終的結果;

NMS就是通過打分來選出最好的結果,與這個結果重疊的對象去掉,是一個不斷迭代的過程。

                                                          score = 某個對象的概率 * 置信度

 

所以對於每個網格有20*2個得分,每個對象有49*2個得分;這里的2是bounding box的個數;

具體的過程是:

1,設置一個分數閾值,低於的直接置為0;

2,遍歷對於每個對象:

         選出分數最高的那個及其bounding box放到輸出列表中;

         將其他的與上面選出的分數最高的那個計算IOU,設置一個閾值,大於閾值的表示重疊度較高,把分數置為0;

         如果所有的bounding box都在輸出列表中或者分數為0,那么這個對象的NMS就結束

     對接下來的對象執行此過程

3.得出輸出結果;

 

 4. YOLOv1的特點總結

YOLO的一個貢獻是將檢測問題轉化為了回歸問題,相信這句話很多人見過很多次了。那到底是什么意思呢?指的就是之前faster RCNN是先分兩步

先提取region proposal,也就是判斷是前景還是背景的問題,之后再分類,具體看前景是什么東西。而YOLO直接通過regression一次既產生坐標,又產生每種類別的概率。

YOLO的特點在於快,其中一方面來源於regression機制,還有一個原因就在於region proposal的提取過程了。再YOLO中很少提region proposal的概念,

但是為了類比faster RCNN我們可以這樣理解,YOLO中粗暴地分成了7X7的網格,每個位置默認可能屬於2個object,那么事實上就是提取了98個region proposal,

而faster RCNN是一種滑動窗口機制,每個feature map上都回歸出9個anchor,大約一共20k個anchor,在通過非極大值抑制等方法最終會得到300個region proposal。

兩者之間候選框差別巨大,因此,faster RCNN會准一點也是情理之中,而既然每個位置都要精修,當然效率就會低很多,也就不能滿足實時性要求了。另外,YOLO

精簡了網絡,比VGG要稍微計算量小一些,可能也會加快一些速度,但這些計算量比起前面提到的兩點已經不足為道。

YOLO對邊界框預測強加空間約束,因為每個網格單元只預測兩個盒子,只能有一個類別。這個空間約束限制了我 們的模型可以預測的鄰近目標的數量。我們的模型與群組中出現的小物體(比如鳥群)進行斗爭。

 

 

YOLOV2和YOLO9000(持續更新,未完善,對於world tree部分不是很明白)

 YOLO9000主要是在保持速度和准確率的情況下繼續增強對識別類別的能力,經過在IMAGE NET上的分類庫上進行預訓練分類模塊之后,整個yolo可以對9000類物體進行識別檢測。

YOLOv2所做的改進主要如下表格:

下面把主要的改進解釋一下:

本部分直接參考:https://zhuanlan.zhihu.com/p/47575929

 

1)batch normalization(批歸一化)

批歸一化使mAP有2.4的提升。

批歸一化有助於解決反向傳播過程中的梯度消失和梯度爆炸問題,降低對一些超參數(比如學習率、網絡參數的大小范圍、激活函數的選擇)的敏感性,並且每個batch分別進行歸一化的時候,起到了一定的正則化效果(YOLO2不再使用dropout),從而能夠獲得更好的收斂速度和收斂效果。

2)使用高分辨率圖像微調分類模型

mAP提升了3.7。

圖像分類的訓練樣本很多,而標注了邊框的用於訓練對象檢測的樣本相比而言就比較少了,因為標注邊框的人工成本比較高。所以對象檢測模型通常都先用圖像分類樣本訓練卷積層,提取圖像特征。但這引出的另一個問題是,圖像分類樣本的分辨率不是很高。所以YOLO v1使用ImageNet的圖像分類樣本采用 224*224 作為輸入,來訓練CNN卷積層。然后在訓練對象檢測時,檢測用的圖像樣本采用更高分辨率的 448*448 的圖像作為輸入。但這樣切換對模型性能有一定影響。

所以YOLO2在采用 224*224 圖像進行分類模型預訓練后,再采用 448*448 的高分辨率樣本對分類模型進行微調(10個epoch),使網絡特征逐漸適應 448*448 的分辨率。然后再使用 448*448 的檢測樣本進行訓練,緩解了分辨率突然切換造成的影響。

 

3)采用先驗框(Anchor Boxes)

召回率大幅提升到88%,同時mAP輕微下降了0.2。

借鑒Faster RCNN的做法,YOLO2也嘗試采用先驗框(anchor)。在每個grid預先設定一組不同大小和寬高比的邊框,來覆蓋整個圖像的不同位置和多種尺度,這些先驗框作為預定義的候選區在神經網絡中將檢測其中是否存在對象,以及微調邊框的位置。

同時YOLO2移除了全連接層。另外去掉了一個池化層,使網絡卷積層輸出具有更高的分辨率。

之前YOLO1並沒有采用先驗框,並且每個grid只預測兩個bounding box,整個圖像98個。YOLO2如果每個grid采用9個先驗框,總共有13*13*9=1521個先驗框。所以,相對YOLO1的81%的召回率,YOLO2的召回率大幅提升到88%。同時mAP有0.2%的輕微下降。

不過YOLO2接着進一步對先驗框進行了改良。

 

4)聚類提取先驗框尺度

聚類提取先驗框尺度,結合下面的約束預測邊框的位置,使得mAP有4.8的提升。

之前先驗框都是手工設定的,YOLO2嘗試統計出更符合樣本中對象尺寸的先驗框,這樣就可以減少網絡微調先驗框到實際位置的難度。YOLO2的做法是對訓練集中標注的邊框進行聚類分析,以尋找盡可能匹配樣本的邊框尺寸。

聚類算法最重要的是選擇如何計算兩個邊框之間的“距離”,對於常用的歐式距離,大邊框會產生更大的誤差,但我們關心的是邊框的IOU。所以,YOLO2在聚類時采用以下公式來計算兩個邊框之間的“距離”。 \\ d(box, centroid) = 1 - IOU(box, centroid) centroid是聚類時被選作中心的邊框,box就是其它邊框,d就是兩者間的“距離”。IOU越大,“距離”越近。

YOLO2給出的聚類分析結果如下圖所示:

上圖左邊是選擇不同的聚類k值情況下,得到的k個centroid邊框,計算樣本中標注的邊框與各centroid的Avg IOU。顯然,邊框數k越多,Avg IOU越大。YOLO2選擇k=5作為邊框數量與IOU的折中。對比手工選擇的先驗框,使用5個聚類框即可達到61 Avg IOU,相當於9個手工設置的先驗框60.9 Avg IOU。

上圖右邊顯示了5種聚類得到的先驗框,VOC和COCO數據集略有差異,不過都有較多的瘦高形邊框。

 

5)約束預測邊框的位置

借鑒於Faster RCNN的先驗框方法,在訓練的早期階段,其位置預測容易不穩定。其位置預測公式為: \\ x=(t_x∗w_a)+x_a \\ y=(t_y∗h_a)+y_a

其中, x,y 是預測邊框的中心, x_a,y_a 是先驗框(anchor)的中心點坐標, w_a,h_a 是先驗框(anchor)的寬和高, t_x,t_y 是要學習的參數。 注意,YOLO論文中寫的是 x=(t_x∗w_a)-x_a ,根據Faster RCNN,應該是"+"。

由於 t_x,t_y 的取值沒有任何約束,因此預測邊框的中心可能出現在任何位置,訓練早期階段不容易穩定。YOLO調整了預測公式,將預測邊框的中心約束在特定gird網格內。 \\ b_x=σ(t_x)+c_x  \\ b_y=σ(t_y)+c_y  \\ b_w=p_we^{t_w}  \\ b_h=p_he^{t_h}  \\ Pr(object)∗IOU(b,object)=σ(t_o)

其中, b_x,b_y,b_w,b_h 是預測邊框的中心和寬高。 Pr(object)∗IOU(b,object) 是預測邊框的置信度,YOLO1是直接預測置信度的值,這里對預測參數 t_o 進行σ變換后作為置信度的值。 c_x,c_y 是當前網格左上角到圖像左上角的距離,要先將網格大小歸一化,即令一個網格的寬=1,高=1。 p_w,p_h 是先驗框的寬和高。 σ是sigmoid函數。 t_x,t_y,t_w,t_h,t_o 是要學習的參數,分別用於預測邊框的中心和寬高,以及置信度。

 

 

圖3 邊框預測

 

參考上圖,由於σ函數將 t_x,t_y 約束在(0,1)范圍內,所以根據上面的計算公式,預測邊框的藍色中心點被約束在藍色背景的網格內。約束邊框位置使得模型更容易學習,且預測更為穩定。

 

 

 

 

 

 

 

YOLO 一代包含有全連接層,從而能直接預測 Bounding Boxes 的坐標值。  Faster R-CNN 的方法只用卷積層與 Region Proposal Network 來預測 Anchor Box 偏移值與置信度,

而不是直接預測坐標值。作者發現通過預測偏移量而不是坐標值能夠簡化問題,讓神經網絡學習起來更容易

所以最終 YOLO 去掉了全連接層,使用 Anchor Boxes 來預測 Bounding Boxes。(后來又去掉了anchor box,因為使網絡不穩定)

 

分配上,在最小的13*13特征圖上(有最大的感受野)應用較大的先驗框(116x90),(156x198),(373x326),適合檢測較大的對象。中等的26*26特征圖上(中等感受野)應用中等的先驗框(30x61),(62x45),(59x119),適合檢測中等大小的對象。較大的52*52特征圖上(較小的感受野)應用較小的先驗框(10x13),(16x30),(33x23),適合檢測較小的對象。

 

網絡使用一個 Logistic Activation 來對於網絡預測結果進行限制,讓結果介於 0 到 1 之間,  因為使用了限制讓數值變得參數化,也讓網絡更容易學習、更穩定

似於 VGG。YOLO v2 使用 3*3 的 filter,每次池化之后都增加一倍 Channels 的數量

1×1 filters to compress the feature representation between 3×3 convolutions

 

 

聯合檢測集和分類集訓練網絡,

Using this joint training, YOLO9000 learns to find objects in images using the detection data in COCO and it learns to classify a wide variety of these objects using data from ImageNet. 

 

 

 

 YOLOV3

YOLO3主要的改進有:調整了網絡結構;利用多尺度特征進行對象檢測;對象分類用Logistic取代了softmax。

新的網絡結構Darknet -53

darknet-53借用了resnet的思想,在網絡中加入了殘差模塊,這樣有利於解決深層次網絡的梯度問題,每個殘差模塊由兩個卷積層和一個shortcut connections,

1,2,8,8,4代表有幾個重復的殘差模塊,整個v3結構里面,沒有池化層和全連接層,網絡的下采樣是通過設置卷積的stride為2來達到的,每當通過這個卷積層之后

圖像的尺寸就會減小到一半。而每個卷積層的實現又是包含     卷積+BN+Leaky relu  ,每個殘差模塊之后又要加上一個zero padding,具體實現可以參考下面的一張圖。

 

 

 具體的全部模型結構可以從這個網站的工具進行可視化分析:

https://lutzroeder.github.io/netron/

從Yolo的官網上下載yolov3的權重文件,然后通過官網上的指導轉化為H5文件,然后可以再這個瀏覽器工具里直接看yolov3的每一層是如何分布的;類似下邊截圖是一部分網絡(最后的拼接部分);

論文中所給的大致結果如下,由卷積結構和殘差模塊組成;

 

 

多尺度檢測:

對於多尺度檢測來說,采用多個尺度進行預測,具體形式是在網絡預測的最后某些層進行上采樣拼接的操作來達到;對於分辨率對預測的影響如下解釋:

分辨率信息直接反映的就是構成object的像素的數量。一個object,像素數量越多,它對object的細節表現就越豐富越具體,也就是說分辨率信息越豐富。這也就是為什么大尺度feature map提供的是分辨率信息了。語義信息在目標檢測中指的是讓object區分於背景的信息,即語義信息是讓你知道這個是object,其余是背景。在不同類別中語義信息並不需要很多細節信息,分辨率信息大,反而會降低語義信息,因此小尺度feature map在提供必要的分辨率信息下語義信息會提供的更好。(而對於小目標,小尺度feature map無法提供必要的分辨率信息,所以還需結合大尺度的feature map)

 

YOLO3更進一步采用了3個不同尺度的特征圖來進行對象檢測。能夠檢測的到更加細粒度的特征。

網絡的最終輸出有3個尺度分別為1/32,1/16,1/8;

在第79層之后經過幾個卷積操作得到的是1/32 (13*13) 的預測結果,下采樣倍數高,這里特征圖的感受野比較大,因此適合檢測圖像中尺寸比較大的對象

然后這個結果通過上采樣與第61層的結果進行concat,再經過幾個卷積操作得到1/16的預測結果;它具有中等尺度的感受野,適合檢測中等尺度的對象。

91層的結果經過上采樣之后在於第36層的結果進行concat,經過幾個卷積操作之后得到的是1/8的結果,它的感受野最小,適合檢測小尺寸的對象。

concat:張量拼接。將darknet中間層和后面的某一層的上采樣進行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。

 

使用Kmeans聚類的方法來決定anchors的尺寸大小:

 

YOLO2已經開始采用K-means聚類得到先驗框的尺寸,YOLO3延續了這種方法,為每種下采樣尺度設定3種先驗框,總共聚類出9種尺寸的先驗框。
在COCO數據集這9個先驗框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
分配上,在最小的13*13特征圖上(有最大的感受野)應用較大的先驗框(116x90),(156x198),(373x326),適合檢測較大的對象。中等的26*26
特征圖上(中等感受野)應用中等的先驗框(30x61),(62x45),(59x119),適合檢測中等大小的對象。較大的52*52特征圖上(較小的感受野)應用
較小的先驗框(10x13),(16x30),(33x23),適合檢測較小的對象。
 
yolo v3對bbox進行預測的時候,采用了logistic regression。yolo v3每次對b-box進行predict時,輸出和v2一樣都是(tx,ty,tw,th,to)​ , 然后通過公式1計算出絕對的(x, y, w, h, c)。

logistic回歸用於對anchor包圍的部分進行一個目標性評分(objectness score),(用於NMS),即這塊位置是目標的可能性有多大。

公式一:

 

yolo_v3只會對1個prior進行操作,也就是那個最佳prior。而logistic回歸就是用來從9個anchor priors中找到objectness score(目標存在可能性得分)最高的那一個。

 

對象分類softmax改成logistic

預測對象類別時不使用softmax,改成使用logistic的輸出進行預測。這樣能夠支持多標簽對象(比如一個人有Woman 和 Person兩個標簽)。

 

YOLO的LOSS函數:

 1         # K.binary_crossentropy is helpful to avoid exp overflow.
 2         xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[...,0:2], from_logits=True)
 3         wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh-raw_pred[...,2:4])
 4         confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True)+ \
 5             (1-object_mask) * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True) * ignore_mask
 6         class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[...,5:], from_logits=True)
 7 
 8         xy_loss = K.sum(xy_loss) / mf
 9         wh_loss = K.sum(wh_loss) / mf
10         confidence_loss = K.sum(confidence_loss) / mf
11         class_loss = K.sum(class_loss) / mf
12         loss += xy_loss + wh_loss + confidence_loss + class_loss
13         if print_loss:
14             loss = tf.Print(loss, [loss, xy_loss, wh_loss, confidence_loss, class_loss, K.sum(ignore_mask)], message='loss: ')
15     return loss

yolov3再keras中定義的Loss函數如上,基本可以看出,對於回歸預測的部分是采用多個mse均方差相加來進行的(類似於上邊所提到的v1中的Loss函數),對於分類部分和置信度是采用K.binary_crossentropy來進行的,最后把兩種Loss相加得出最終的loss

整體來看Yolov3的輸入與輸出形式如下:

輸入416*416*3的圖像,通過darknet網絡得到三種不同尺度的預測結果,每個尺度都對應N個通道,包含着預測的信息;

每個網格每個尺寸的anchors的預測結果。

 



 

 

 

 

 

 代碼解釋部分未完善;

return model, bottleneck_model, last_layer_model
249 3

Freeze the first 249 layers of total 252 layers.

 

 

 

對輸入圖片的要求,因為yolov3要把圖片下采樣到原圖的1/32,所以,圖片尺寸要是32的倍數,采用416*416

 

尺寸變換是通過改變卷積核的步長來實現的這里設置為stride = 2;

 

 

訓練過程先

Train with frozen layers first, to get a stable loss.
然后再訓練整個Model
Unfreeze and continue training, to fine-tune.






















參考博文:
https://www.jianshu.com/p/d13ae1055302
https://zhuanlan.zhihu.com/p/46691043
https://blog.csdn.net/leviopku/article/details/82660381
https://blog.csdn.net/chandanyan8568/article/details/81089083
https://zhuanlan.zhihu.com/p/47575929
源碼地址:
https://github.com/qqwweee/keras-yolo3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM