機器學習33:YoloV1/V2/V3學習筆記

機器學習33:YoloV1/V2/V3學習筆記

1.YoloV1簡介:

           1.1 YOLO的特點:

                速度快,可達到實時檢測的要求;

                使用全圖作爲背景信息,背景錯認爲物體的情況較少;

                泛化能力強。

           1.2 YOLO V1的實現方法:

                 1.2.1 YOLO V1的輸出信息:

                        將圖像劃分爲S*S個網格,如果某個物體目標的中心落在這個網格中,則這個網格負責這個物體目標。每個網格預測B個邊界框,每個邊界框包含的信息有:

                                 1)位置信息(x,y,w,h);

                                 2)置信度值:

                                       a.含有目標的置信度;

                                       b.預測的邊界框和實際groundtruth之間的IOU;

                        每個網格還需預測一個類別信息,記爲C類;因此輸出tensor的尺寸爲S*S*(5*B+C)。

                 1.2.2 YOLO V1的網絡結構:

                        YOLO V1的網絡結構借鑑了 GoogLeNet ,包括24個卷積層和2個全連接層,用1×1 reduction layers 緊跟 3×3卷積層取代Googlenet的inception模塊。

                        去掉候選區這個步驟以後,YOLO V1的結構非常簡單,單看網絡結構和普通的CNN對象分類網絡幾乎沒有本質的區別,最大的差異是最後輸出層用線性函數做激活函數,因爲需要預測邊界框的位置(數值型),而不僅僅是對象的概率。

                 1.2.3 YOLO V1的網絡訓練:

                         (1)網絡訓練過程:

                                   YOLO V1的預訓練在ImageNet上,分類模型採用前20個卷積層加一個平均池化層和全連接層,輸入尺寸爲224*224。

                                   訓練時在預訓練的20層卷積層上隨機初始化4個卷積層和2個全連接層,輸入尺寸改爲448*448。

                         (2)訓練損失函數: 

                                   1)損失函數的構成:

                                           1. 座標預測損失(coordinate loss)

                                                損失函數的第一部分是對預測bbox的座標損失,有兩個注意點:一是對寬高取平方根,抑制大物體的loss值,平衡小物體和大物體預測的loss差異;二是採用了權重係數5,因爲參與計算正樣本太少(如上面7*7掩膜中只有三個單元的座標參與計算),因此應該增加權重。

                                           2.置信度損失(Confidence loss)

                                                 損失函數的第二部分是正負樣本bbox的置信度損失,注意下ground truth的置信度: 對於正樣本其置信度爲預測框和ground truth之間的IOU*1, 對於負樣本,置信度爲IOU*0;另外由於負樣本多餘正樣本,取負樣本的權重係數爲0.5。

                                           3.分類損失(Classification Loss)

                                                損失函數的第三部分是預測所屬分類的損失,預測值爲網絡中softmax計算出,真實值爲標註類別的one-hot編碼(可以理解爲20分類任務,舉例若爲第五類則編碼爲00001000000000000000)。

                                   2)損失函數的平衡:

                                           損失函數的設計目標就是讓位置信息(x,y,w,h)/置信度/分類這個三個方面達到很好的平衡,簡單的全部採用sum-squared error loss來做這件事會有以下不足:

                                           a) 8維的定位誤差和20維的分類誤差同等重要顯然是不合理的;

                                           b) 如果一個網格中不包含目標(圖像中這種網格很多),那麼就會將這些網格中邊界框的置信度 push到0,相比於較少的有目標的網格,這種做法是不合理的,這會導致網絡不穩定甚至發散。

                                           這個問題的解決方案爲:

                                           a)更重視8維的座標預測,給這些損失前面賦予更大的損失權重(上圖藍色框);對不包含目標的邊界框的置信度損失,賦予小的損失權重(上圖橙色框);包含目標的邊界框的置信度損失(上圖紅色框) 和分類損失 (上圖紫色框)的損失權重正常取1。

                                           b)對不同大小的邊界框預測中,相比於大邊界框預測的偏移,小邊界框預測同樣的偏移對於預測結果的影響更大,而sum-square error loss中對同樣的偏移損失是一樣。 爲了緩和這個問題,作者用了一個比較取巧的辦法,就是將邊界框的width和height取平方根代替原本的width和height。

                 1.2.4 YOLO V1的網絡預測:

                         (1)其他目標檢測算法的預測過程:

                                   a.從檢測框中找出置信度最大的框;

                                   b.挨個計算其與剩下的框的IOU;

                                   c.如果其值大於設定的閾值,即重合過高,則剔除該框;

                                   d.重複上述過程,直至處理完所有的檢測框。

                         (2)YOLO V1的預測過程:

                                   a.設置一個Score的閾值,低於該閾值的候選對象排除掉(將該Score設爲0);
                                   b.遍歷每一個對象類別:
                                     1)遍歷該對象的所有得分;
                                  2)找到得分最大的對象及其邊界框,添加到輸出列表;
                                  3)對每個得分不爲0的候選對象,計算其與上面列表中輸出對象的邊界框的IOU;
                                  4)根據預先設置的IOU閾值,所有高於該閾值(重疊度較高)的候選對象排除掉(將Score設爲0);
                                  5)如果所有邊界框都在輸出列表中或Score=0,則該對象類別的非極大值抑制處理完成,繼續遍歷下一種對象。
                                   c.此時的輸出列表即爲預測的對象。


           1.3 YOLO V1的不足之處:

                 (1)由於輸出層爲全連接層,因此YOLO V1的輸入尺寸固定;

                 (2)對於佔比較小或相距很近的目標檢測效果不好,因爲每個網格只預測兩個框並且屬於同一個目標物體,當每個網格包含多個目標物體時只能檢測其中之一;

                 (3)測試圖像過程中,當同一類物體出現新的不常見的長寬比或其他情況時,泛化能力較差;

                 (4)由於損失函數的問題,定位誤差是影響檢測效果的主要原因,因此在大小目標物體的處理上有待加強。

 

2.YOLO V2簡介:

           2.1 YOLO V2網絡結構:

 

                           

           2.2 YOLO V2對YOLO V1進行的改進:

      (1) 加入BN批量標準化層, 去掉dropout:

                             神經網絡在訓練過程中網絡每層輸入的分佈一直在改變, 會使訓練過程難度加大,但可以通過標準化每層的輸入解決這個問題,YOLO V2網絡在每一個卷積層後添加批量標準化並處理通過這一方法獲得了2%的提升。

                             BN層也有助於規範化模型,可以在捨棄dropout優化後依然不會過擬合。

      (2) 高分辨率圖片分類器(High resolution classifier ):

                                YOLO V1中分類器在ImageNet數據集(224*224)上預訓練,而檢測時圖片的大小爲448*448,網絡需要適應新的尺寸,因此yolo V2中又加入了一步finetune,步驟如下:

                   a.在ImageNet上預訓練分類器(224*224),大概160個epoch;

                   b.將ImageNet的圖片resize到448*448,再finetune 10個epoch, 讓模型適應大圖片;

                   c.採用上述預訓練的權重,在實際數據集上finetune(416*416),最終輸出爲13*13.

      (3) 引入 Anchors:

                               借鑑Faster RCNN中Anchors的思想,通過kmeans方法在VOC數據集(COCO數據集)上對檢測物體的寬高進行了聚類分析,得出了5個聚類中心,因此選取5個anchor的寬高: (聚類時衡量指標distance = 1-IOU(bbox, cluster))

                                COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
                                VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

                         這樣每個網格單元將對應5個不同寬高的anchor, 上面給出的寬高是相對於網格單元,對應的實際寬高還需要乘以32,如下圖所示:

                         關於預測的邊界框的計算:(416*416-------13*13 爲例)

                   1) 輸入圖片尺寸爲416*416, 最後輸出結果爲13*13*125,這裏的125指5*(5 + 20),5表示5個anchor,25表示[x, y, w, h, confidence ] + 20 class ),即每一個anchor預測一組值;

                   2) 對於每一anchor預測的25個值, x, y是相對於該grid cell左上角的偏移值,需要通過sigmoid函數將其處理到0-1之間。如13*13大小的grid,對於index爲(6, 6)的cell,預測的x, y通過sigmoid計算爲xoffset, yoffset,   則對應的實際x = 6 + xoffset,   y = 6+yoffset, 由於0<xoffset<1, 0<yoffset<1, 預測的實際x, y總是在(6,6)的cell內。對於預測的w, h是相對於anchor的寬高,還需乘以anchor的(w, h), 就得到相應的寬高;

                   3) 由於上述尺度是在13*13下的,需要還原爲實際的圖片對應大小,還需乘以縮放倍數32。

     (4) 低層和高層特徵融合(Fine-grained Features ):

                               由上面網絡架構中可以看到一條短路連接,將低層的特徵圖(26*26*512)和最後輸出的特徵圖(13*13*1024)進行concat,從而將低層的位置信息特徵和高層的語義特徵進行融合。另外由於26*26尺度較大,網絡採用Reorg層對其進行了尺寸轉換,使其轉變爲13*13,如下圖所示:

 

     (5)不同尺度圖片的訓練 (Multi-scale Training ):

                 上述網絡架構中,最後一層的(Conv22)爲1*1*125的卷積層代替全連接函數,可以處理任何大小的圖片輸入,因此在訓練時,每10個epoch,作者從[320×320, 352×352, … 608×608](都是32的倍數,最後輸出都降採樣32倍)選一個尺度作爲輸入圖片的尺寸進行訓練,增加模型的魯棒性,當尺度爲416*416時,輸出爲13*13*125;輸入爲320*320,則輸出爲10*10*125。

           2.3 YOLO V2的特點:

    (1)採用Darknet19網絡結構,層數比Yolo V1更少,且沒有全連接層,計算量更少,模型運行更快;

       (2)使用卷積代替全連接,解除了輸入尺寸的限制,多尺度的訓練使得模型對不同尺度的圖片的檢測更加具有魯棒性;

    (3) 每個單元採用5個anchor box進行預測,對擁擠和小物體檢測更有效。

 

3.YOLO V3簡介:

          3.1 YOLO V3的架構概覽:


              上面的結構圖中,有三個基本的組件:
              (1)Darknetconv2D_BN_Leaky:

                      如圖左下角所示,Darknetconv2d_BN_Leaky是YOLO v3的基本組件,也就是卷積+BN+Leaky relu,對於YOLO V3來說,BN和leaky relu已經是和卷積層不可分離的部分了(最後一層卷積除外)。

              (2)Res_n:

                        n代表數字,表示這個Res_block裏含有多少個Res_unit,有Res1,Res2, … ,Res8等等。Res_block是YOLO V3的重要組件,YOLO V3借鑑了ResNet的殘差結構,使用這種結構可以讓網絡結構更深(從YOLO V2的darknet-19上升到YOLO V3的darknet-53,前者沒有殘差結構)。對於Res_block的解釋,其基本組件也是Darknetconv2D_BN_Leaky。
              (3)concat:

                        張量拼接即爲將darknet中間層和後面的某一層經過上採樣之後進行拼接,拼接的操作和殘差層add的操作是不一樣的,拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。

                        拼接是爲了對不同尺寸的目標進行特徵提取,從而增大對小目標的識別能力,這也是YOLO V3相較於YOLO V2版本的一大改進。

          3.2 YOLO V3對YOLO V2的改進:

                3.2.1 類別預測方面主要是將原來的單標籤分類改進爲多標籤分類(softmax->logistic):

                         網絡結構上將原來用於單標籤多分類的Softmax層換成用於多標籤多分類的邏輯迴歸層。

                         做這樣的修改的原因是網絡中的Softmax層都是假設一張圖像或一個object只屬於一個類別,但是在一些複雜場景下,一個object可能屬於多個類,比如你的類別中有woman和person這兩個類,那麼如果一張圖像中有一個woman,那麼你檢測的結果中類別標籤就要同時有woman和person兩個類,這就是多標籤分類,需要用邏輯迴歸層來對每個類別做二分類。

                         邏輯迴歸層主要用到的是sigmoid函數,sigmoid函數可以將輸入約束在0到1的範圍內,因此當一張圖像經過特徵提取後的某一類輸出經過sigmoid函數約束後如果大於0.5,就表示屬於該類。

                         YOLO V3不使用Softmax對每個框進行分類,主要考慮因素有兩個:

                         1)Softmax使得每個框分配一個類別(score最大的一個),而對於Open Images這種數據集,目標可能有重疊的類別標籤,因此Softmax不適用於多標籤分類;
                         2)Softmax可被獨立的多個邏輯分類器替代,且準確率不會下降。
                         分類損失採用二元交叉熵損失(binary cross-entropy loss)。
                3.2.2 YOLO V3採用多個scale融合的方式做預測(predictions across scales):

                         YOLO V2有一個層叫:passthrough layer,假設最後提取的特徵圖的尺寸是13*13,那麼這個層的作用就是將前面一層的26*26的特徵圖和本層的13*13的特徵圖進行連接,有點像ResNet。當時這麼操作也是爲了加強YOLO算法對小目標檢測的精確度。

                         有一個概念叫做:bounding box prior,其實就是實現聚類得到的幾個檢測邊框,YOLO V2和YOLO V3均採用了這種方式,但是又有所不同。

                         關於邊界框的初始尺寸還是採用YOLO V2中的k-means聚類的方式來做,這種先驗知識對於邊界框的初始化幫助還是很大的,畢竟過多的bounding box雖然對於效果來說有保障,但是對於算法速度影響還是比較大的。作者在COCO數據集上得到的9種聚類結果:(10*13); (16*30); (33*23); (30*61); (62*45); (59*119); (116*90); (156*198); (373*326),這應該是按照輸入圖像的尺寸是416*416計算得到的。

                         YOLO V2一共有13*13個單元,每一個單元預測5個候選框,故而總的候選框數目爲:13*13*5,但是由於YOLO V3採用了多個不同的尺度的特徵圖,每一張特徵圖上均採用3個候選框:

                          1)對於13*13的特徵圖,有13*13*3;

                          2)對於26*26的特徵圖,有26*26*3;

                          3)對於52*52的特徵圖,有52*52*3;

                         YOLO V3的候選框單從數量上來說就已經比YOLO V2版本多了很多,不僅如此,由於V3版本特徵圖的尺度是不一樣的,而且應用在每一個特徵圖上的候選框的大小也是不一樣的,這樣對於不同尺寸的目標的適應能力自然更強了。

                3.2.3 基本特徵提取器網絡架構完全不一樣(darknet-19->darknet-53):

                        YOLO V2採用的是darknet-19,而YOLO V3採用的是darknet-53,二者的設計也有很多不一樣的點,主要特現在以下幾個方面:

                        (1)darknet-53中無池化層,全連接層/特徵圖的縮小是通過增加捲積核的步長實現的(YOLO V2中採用池化層做特徵圖的採樣,這裏換成卷積層來做);

                        (2)darknet-53中卷積層+BN層+LeakyRelu激活函數成爲了標準組件;

                        (3)darknet-53採用了殘差的設計思想。
          3.3 YOLO V3和YOLO V2的基本特徵提取器:
                整個YOLO V3結構裏面是沒有池化層和全連接層的,前向傳播過程中,張量的尺寸變換是通過改變卷積核的步長來實現的,比如stride=(2, 2)就相當於將圖像邊長縮小了一半(即面積縮小到原來的1/4)。

                在YOLO V2中,要經歷5次縮小,會將特徵圖縮小到原輸入尺寸的2的5次方分之一,即1/32,若輸入爲416x416,則輸出爲13x13(416/32=13)。YOLO V3也和YOLO V2一樣,基本特徵提取器都會將輸出特徵圖縮小到輸入的1/32,所以,通常都要求輸入圖片是32的倍數,可以對比YOLO V2和YOLO V3的基本特徵提取器DarkNet-19 與 DarkNet-53:


                從上圖發現,YOLO V2中對於前向過程中張量尺寸變換,都是通過最大池化來進行,一共有5次,而YOLO V3是通過卷積核增大步長來進行,也是5次。(darknet-53最後面有一個全局平均池化,在yolo-v3裏面沒有這一層,所以張量維度變化只考慮前面那5次),這也是416x416輸入得到13x13輸出的原因。

               從上圖可以看出,darknet-19是不存在殘差結構的,和VGG是同類型的基本特徵提取器(屬於上一代CNN結構),而darknet-53是借鑑了resnet-152的基本特徵提取器。

                補充:YOLO V3的結構稍微顯得複雜,除此之外還有一個更加輕量化的版本tiny-darknet作爲基本特徵提取器可以替代darknet-53,在官方代碼裏用一行代碼就可以實現切換backbone。搭用tiny-darknet的YOLO,也就是tiny-YOLO在輕量和高速兩個特點上,tiny-YOLO模型非常小,大約只有4M左右,基本上和SqueezeNet不分上下。

          3.4  YOLO V3的輸出——predictions across scales(即多尺度預測):
                上面的結構圖中所顯示出來的YOLO V3的輸出爲:

                從上面YOLO V3輸出了3個不同尺度的特徵圖,如上圖所示的y1, y2, y3。這也是YOLO V3版本中相較於YOLO V2版本最大的一個改進點之一,也正是這個改進點,使得YOLO V3在小目標的檢測中有了更好的進展。

                什麼是predictions across scales(多尺度預測)?多尺度預測借鑑了FPN(feature pyramid networks),採用多尺度來對不同尺寸的目標進行檢測,越精細的網格單元就可以檢測出越精細的物體。
                y1,y2和y3的深度都是255,邊長的規律是13:26:52。對於COCO類別而言,有80個種類,所以每個box應該對每個種類都輸出一個概率;YOLO V3設定的是每個網格單元預測3個box,所以每個box需要有(x, y, w, h, confidence)五個基本參數,然後還要有80個類別的概率。所以3*(5 + 80) = 255。這個255就是這麼來的。(還記得yolo v1的輸出張量嗎? 7x7x30,只能識別20類物體,而且每個cell只能預測2個box)
                 YOLO V3用上採樣的方法來實現這種多尺度的特徵圖,可以結合上面的結構圖來看,圖中concat連接的兩個張量是具有一樣尺度的(兩處拼接分別是26x26尺度拼接和52x52尺度拼接,通過(2, 2)上採樣來保證concat拼接的張量尺度相同)。作者並沒有像SSD那樣直接採用基本特徵提取器中間層的處理結果作爲特徵圖的輸出,而是和後面網絡層的上採樣結果進行一個拼接之後的處理結果作爲特徵圖,這樣做檢測效果有所提高。

          3.5 爲什麼要用邏輯迴歸——爲了找尋目標得分最大的Box:

                 每個anchor prior(名字叫anchor prior,但並不是用anchor機制)就是兩個數字組成的,一個代表高度另一個代表寬度。YOLO V3對邊界框進行預測的時候,採用了邏輯迴歸,YOLO V3每次對邊界框進行預測時,輸出和YOLO V2一樣都是(tx,ty,tw,th,to ),然後通過公式1計算出絕對的(x, y, w, h, c)。
                邏輯迴歸用於對anchor包圍的部分進行一個目標評分,即這塊位置是目標的可能性有多大,這一步是在預測之前進行的,可以去掉不必要anchor從而減少計算量。

                如果模板框不是最佳的即使它超過我們設定的閾值,我們還是不會對它進行預測。不同於faster R-CNN的是,YOLO V3只會對1個prior進行操作,也就是那個最佳prior。而邏輯迴歸就是用來從9個anchor priors中找到目標得分最高的那一個。邏輯迴歸就是用曲線對prior相對於目標得分映射關係的線性建模。

 

4.YOLO系列和RCNN系列的簡單對比:

          (1)統一網絡:
                    YOLO沒有顯式求取候選區域的過程;Faster R-CNN中儘管RPN與Fast RCNN共享卷積層,但是在模型訓練過程中,需要反覆訓練RPN網絡和Fast RCNN網絡,相對於R-CNN系列的"看兩眼"(候選框提取與分類),YOLO只需要Look Once。

          (2)YOLO統一爲一個迴歸問題:
                    R-CNN將檢測結果分爲兩部分求解:物體類別(分類問題),物體位置即bounding box(迴歸問題)。

 

5.參考資料:

          (1)【深度學習YOLO V1】深刻解讀YOLO V1

          (2)yolov1, yolo v2 和yolo v3系列

          (3)https://blog.csdn.net/qq_27825451/article/details/88971395

          (4)https://blog.csdn.net/leviopku/article/details/82660381

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章