YOLO系列-概述及YOLOv1

一、概述

目標檢測的目的是將圖片或者視頻中感興趣的目標提取出來。例如對於貓和狗的檢測,我們不僅要用算法判斷圖片中是不是有貓和狗, 還要在圖片中標記出它的位置, 用邊框或紅色方框把貓和狗圈起來。其中“定位”的意思是判斷貓和狗在圖片中的具體位置。

 

                                                                   圖1.目標檢測與其他計算機視覺任務示例

近幾年來,目標檢測算法取得了很大的突破。比較流行的算法可以分爲兩類,一類是基於Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它們是two-stage算法,需要先算法產生目標候選框,也就是目標位置,然後再對候選框做分類與迴歸。而另一類是YOLO,SSD這類one-stage算法,其僅僅使用一個卷積神經網絡CNN直接預測不同目標的類別與位置。第一類方法是準確度高一些,但是速度慢,但是第二類算法是速度快,但是準確性要低一些。如圖2所示。

 

                                                      圖2.幾種常見目標檢測算法速度與準確度比較(截止2016年)

 

 

二、YOLOv1

1.YOLO

YOLO:You Only Look Once,即你只需要看一次,就能夠檢測出目標。是目前最爲先進的目標檢測算法之一。

 

2.YOLOv1的核心思想

·YOLO 的核心思想就是利用整張圖作爲網絡的輸入,直接在輸出層迴歸 bounding box(邊界框)的位置及其所屬的類別。

·Faster-RCNN中也直接用整張圖作爲輸入,但是Faster-RCNN整體還是採用了RCNN 那種proposal+classifier的思想,也就是上面所說的two-stage。只不過提取proposal的步驟放在CNN中實現了,而YOLO則採用直接回歸的思路。

 

3.YOLOv1實現步驟

                                                                                 圖3.YOLOV1的實現步驟

 

(1)將圖像resize到448*448作爲神經網絡的輸入;

(2)運行神經網絡,得到bounding box座標、box中包含物體的置信度和class probabilities;

(3)進行非極大值抑制,得到最終結果。

 

4.YOLOv1具體流程

                                                                            圖4-1.YOLOV1具體流程概圖

                                                                            圖4-2.YOLOV1具體流程詳細圖

 

將一幅圖像分成 S*S 個網格(grid cell),如果某個 object 的中心落在這個網格中,則這個網格就負責預測這個 object。在論文當中將圖片分成7*7,共49個區域。

每個網格要預測B個bounding box,每個bounding box除了要回歸自身的位置之外,還要附帶預測一個confidence值。 
這個confidence代表了所預測的box中含有object的置信度和這個box預測的精準度兩重信息,其值是這樣計算的:

其中如果有object落在一個grid cell裏,第一項取1,否則取0。 第二項是預測的bounding box和實際的ground truth之間的IoU值。

同時每個bounding box要預測(x, y, w, h)和confidence共5個值,每個網格還要預測一個類別信息,記爲C類。則S*S個網格,每個網格要預測B個bounding box還要預測C個categories(類別)。輸出就是S *S * (5*B+C)的一個tensor。 

舉個例子在PASCAL VOC(訓練集)中,圖像輸入爲448*448,取S=7,B=2,一共有20個類別(C=20)。則輸出就是7*7*30的一個tensor。 

                                                                                          圖5.YOLOV1示例

5.YOLOv1網絡結構

YOLOv1的網絡結構借鑑了 GoogLeNet 。24個卷積層,2個全鏈接層。用1×1 reduction layers 緊跟 3×3 convolutional layers 取代Goolenet的 inception modules 。

但在這裏有一個小問題,就是在2015年的論文和2016年的論文中網絡結構和註釋有所不同,個人感覺2016年的標註在第一層網絡處有細微問題,如圖6-1和6-2所示。在本文中以2016年的論文爲準。

                                                                          圖6-1.YOLOV1網絡結構(2015)

 

                                                                          圖6-2.YOLOV1網絡結構(2016)

6.損失函數

在實現中,最主要的就是怎麼設計損失函數,讓這個三個方面得到很好的平衡。作者簡單粗暴的全部採用了sum-squared error loss來做這件事。 

這種做法存在以下幾個問題: 

第一,8維的localization error和20維的classification error同等重要顯然是不合理的; 

第二,如果一個網格中沒有object(一幅圖中這種網格很多),那麼就會將這些網格中的box的confidence push到0,相比於較少的有object的網格,這種做法是over powering的,這會導致網絡不穩定甚至發散。

針對上面的問題,作者提出瞭如下解決辦法:

第一,更重視8維的座標預測,給這些損失前面賦予更大的loss weight,記爲λcoord,在Pascal VOC訓練中取5; 

第二,對沒有object的box的confidence loss,賦予小的loss weight,記爲λnoobj,在Pascal VOC訓練中取0.5;

第三,有object的box的loss和類別的loss的loss weight正常取1。

最終作者設計的損失函數如下:

每個grid有30維,這30維中,8維是迴歸box的座標,2維是box的confidence,還有20維是類別。 其中座標的x, y用對應網格的offset歸一化到0-1之間,w, h用圖像的width和height歸一化到0-1之間。具體實例如圖7所示。

                                                                                圖7.YOLOV1損失函數分析

7.訓練

預訓練分類網絡:在ImageNet 1000-class competition dataset上預訓練一個分類網絡,這個網絡是YOLOv1的前20個卷積網絡+average-pooling layer+ fully connected layer (此時網絡輸入是224*224)。

                                                                                圖8.兩個bounding box示意

      每一個網格不僅僅要預測2個bounding box(如圖8所示)的座標(x, y ,w ,h)以及confidence(置信度)。還要預測類別信息,在論文中有20個categories,計算出20個類別的概率,概率最大的即爲對應的類別。

                                                                        圖9.YOLOV1訓練過程中20個分類示意

 

8.缺點

·YOLO對相互靠的很近的物體,還有很小的羣體 檢測效果不好,這是因爲一個網格中只預測了兩個框,並且只屬於一類。

·對測試圖像中,同一類物體出現的新的不常見的長寬比和其他情況是。泛化能力偏弱。

·由於損失函數的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。

 

因爲YOLO系列比較長,所以最後還是決定分成兩個部分寫,相關文獻資料和參考鏈接會在下一篇放出!如果有問題,歡迎大家指正!

YOLOv2及YOLOv3:https://blog.csdn.net/lipengfei0427/article/details/103726333

發佈了67 篇原創文章 · 獲贊 133 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章