YOLO系列梳理(一)YOLOv1-YOLOv3
前言 本文是YOLO系列專欄的第一篇,該專欄將會介紹YOLO系列文章的演算法原理、程式碼解析、模型部署等一系列內容。本文系公眾號讀者投稿,歡迎想寫任何系列文章的讀者給我們投稿,共同打造一個計算機視覺技術分享社群。
本文介紹了目標檢測中one stage的YOLO演算法,並介紹了從YOLOv1到YOLOv3的發展過程。
本文來自公眾號CV技術指南的
歡迎關注公眾號
YOLO的設計理論
YOLO 全稱叫 You Only Look Once。是目標檢測中 one stage 的典型之作。此外,目標檢測的流派還有 two-stage,如 RCNN 系列;以及anchor free,如cornnet、centernet。
其實 YOLO 就是通過一系列的卷積操作來實現端到端的目標檢測。YOLO 會將圖片劃分為 S x S 的網格(grid),每個網格負責檢測落入其中的目標,最後輸出所含目標的邊框(bounding box)、定位的位置資訊、以及所有類別的置信度。
基本流程如下:
1. 首先將輸入圖片 resize 到固定大小。
2. 輸入到網路中,最後得到預測結果檢測到的目標。
3. 使用非極大抑制演算法來過濾冗餘目標。
非極大值抑制演算法(nms)
不僅僅是YOLO才會使用到nms,其實在大多數目標檢測演算法都會使用nms。它主要是為了解決一個目標被重複檢測的現象。如下圖,我們可以看到人臉被重複檢測了。雖然每個框都檢測對了,但我們只需要得到一個框,即最好的那一個框。
那麼採用NMS就可以實現這樣的效果。首先從所有的檢測框中找到置信度最大的那個,然後遍歷剩餘的框,計算其與最大框之間的IOU。如果其值大於一定閾值,則表示重合度過高,那麼就將該框就會被剔除;然後對剩餘的檢測框重複上述過程,直到處理完所有的檢測框。
YOLOv1
其實 YOLOv1 和後續的 YOLO 演算法最大的不同是 YOLOv1 並沒有使用錨點框(anchor box),在 YOLOv1 中是沒有 anchor 這個概念的,嚴格上來說 YOLOv1 屬於 anchor free。
演算法思想
1. 將影象劃分為 S x S 的網格,論文中的設定是 7 x 7 的網格。如果某個物體的中心落在這個網格中,那麼這個網格就負責預測這個物體。
2. 然後每個網格預測 B 個邊框,論文中的設定是2個邊框,即預測出 7 x 7 x 2 個邊框,這個邊框負責預測物體的位置。
3. 每個邊框除了要預測物體的位置之外,還要附帶預測一個置信度。這裡的置信度指的是邊框的概率,無關目標屬於哪一個類別,表示的是邊框內是否有物體。
4. 每個網格還要預測C個類別的分數。比如說在 VOC 資料集上則會預測出20個類別。
5. 因此,對於 VOC 資料集來說,YOLOv1 的網路最後是輸出預測位置(xywh)+置信度以及類別分數,所以輸出為 7 x 7 x (5 + 5 + 20)。
6. 最後一層全連線層用線性啟用函式,其餘層採用 Leaky ReLU。
損失函式
可以看到損失函式有三個部分組成,分別是邊框損失,置信度損失,以及類別損失。並且三個損失函式都使用均方差損失函式(MSE)。
有趣的說法
有一個有趣的說法:YOLO將檢測問題當做迴歸任務來解決,而不是分類任務。大家可以想下是為什麼?
不足之處
1. 因為每個網格單元只預測兩個框,並且只有一個類別。即每個網格只會選擇出 IOU 最高的那個目標,所以如果每個網格包含多個物體,就只能檢測出其中一個,所以對於擁有群體小目標的圖片來說,比如鳥群,檢測效果會很差。也可能是因為這種方式導致減少了對同一目標的多次檢測,最終識別物體位置精準性差,召回率低。
2. 當出現新尺寸的目標時,效果也會變差,原因是 YOLOv1 使用簡單的特徵來預測邊界框,並沒有使用 anchor,導致定位的不準確。
3. 最後的輸出層為全連線層。因為全連線層輸出大小是固定的,所以導致影象的輸入大小也必須固定,這在一定程度上來說有侷限性。
4. MSE 在處理大邊框和小邊框時,賦予的權重是一樣的。假設同樣是預測與實際相差25個畫素點,但是對於大邊界框來說,小錯誤通常是無足輕重的,甚至可以忽略不計,但對於小邊界框來說,這個數值對於它的影響就很大了。
YOLOv2
YOLOv2 也叫 YOLO9000,因為使用了 COCO 資料集以及 Imagenet 資料集來聯合訓練,最終可以檢測9000個類別。
演算法思想
1. 使用 Darknet19 作為網路的主幹網路。Darknet19 有點類似 VGG,在 Darknet19 中,使用的是 3 x 3 大小的卷積核,並且在每次Pooling 之後都增加一倍通道數,以及將特徵圖的寬高縮減為原來的一半。網路中有19個卷積層,所以叫 Darknet19,以及有5個 Max Pooling 層,所以這裡進行了32倍的下采樣。
2. 採用了 Batch Normal 層來加速訓練時的收斂速度,並且使用了 Batch Normal 就可以從去掉 Dropout,而不會產生過擬合。在 Batch Normal 的論文中講道, Batch Normal 作用和 Dropout 的作用是類似的。
3. 使用了先驗框 anchor,基於 Kmeans 的聚類方法來根據資料集的標籤來自動提取先驗框的資訊,所以可根據不同的資料集設定 anchor 。當 Cluster IOU 選擇值為5時,Avg IOU比不用聚類的方法要高一些。選擇值為9的時候,Avg IOU有更加明顯地提升。
4. 使用了更高的解析度,訓練時從 224 x 224 提升到了 448 x 448。並且採用了隨機裁剪、旋轉、顏色變換、飽和度變換, 曝光度變換等資料增強的操作。
5. 可以進行多尺度訓練,每迭代10個 batch,隨機更換尺寸320、352...608,注意這裡都為32的倍數,因為在 Darknet19 中進行了32倍的下采樣操作。
6. 使用了 Pass through,類似 Pixel-shuffle,融合高層和低層的資訊,這樣可以保留一些細節資訊,這樣可以更好檢測小物體。具體來說,就是進行一拆四的操作,直接傳遞到池化後的特徵圖中,進行卷積後再疊加兩者,最後一起作為輸出特徵圖進行輸出。通過使用 Pass through 層來檢測細粒度特徵使 mAP 提升了1個點。
7. 網路去掉了最後一個卷積層,而加上了三個 3 x 3 卷積層,分別預測大尺度、中尺度、小尺度的物體。其中每個卷積層有1024個卷積核,並且每個卷積層緊接著一個 1 x 1 卷積層。每個 anchor 預測5個邊界框,所以對於 VOC 資料集來說,每個邊界框會輸出5個座標的相關資訊和20個類別的相關資訊。
位置的預測
在 YOLOv2 中的位置預測中,加入了 sigmoid 的約束是因為沒有約束的話,預測的邊界框容易向任何方向偏移任意大小,可能出現這個 anchor 的中心點落在了其他的 anchor 的區域上。這就導致每個位置預測的邊界框可以落在圖片的任意位置,容易導致模型訓練的不穩定性,在訓練的時候要花很長時間才可以得到正確的偏移。
在 YOLOv2 中,就是預測邊界框中心點是相對於對應網格的左上角位置進行相對偏移,為了將邊界框中心點約束在當前網格中,使用 sigmoid 函式處理偏移值,這樣預測的偏移值在(0,1)範圍內。這裡將每個網格的尺度看做是1的基本單位。
YOLOv3
啥也不多說,光看這張圖,就可以感受到 YOLOv3 的強大。彷彿在說:我不是針對誰,我是說,在座的各位都是xx~
YOLOv3 採用了作者自己設計的 Darknet-53 作為主幹網路,Darknet-53 借鑑了殘差網路的思想,與 Resnet101、Resnet152 相比,在精度上差不多的同時,有著更快的速度。
在下采樣操作中使用了步長為2的卷積來代替傳統的池化操作;在特徵融合方面,為了提高小目標的檢測效能,引入了類似 FPN 的多尺度特徵融合方法,特徵圖在經過上取樣後與前面層的輸出進行 concat 操作,這樣可以融合淺層特徵和深層特徵,使得 YOLOv3 在小目標的精度上有了很大的提升。並且使用邏輯迴歸替代 softmax 作為分類器,為的就是解決多標籤分類問題,比如一個物體既屬於A類,又屬於B類。
演算法思想
1. YOLOv3 的輸出依舊分為三個部分,首先是置信度、然後是座標資訊,最後是分類資訊。在推理的時候,特徵圖會等分成 S x S 的網格,通過設定置信度閾值對網格進行篩選,如果某個格子上存在目標,那麼這個格子就負責預測該物體的置信度、座標和類別資訊。
2. 使用了殘差模型的思想:Darknet-53。這個是類似 Resnet 的結構,不斷堆疊殘差結構,並且沒有最大池化層。既然沒有池化來進行下采樣,那麼下采樣的操作就通過兩個步長的卷積操作完成。所以整體來看,網路全部由卷積搭建而成,也就是全卷積網路。基本部件DBL:Conv + BN + Leaky ReLU、殘差結構 res_unit。
3. 多尺度預測,採用類似 FPN 融合的方式,在三個不同尺寸大小的特徵層上預測不同尺度資訊,每個特徵層三種尺度,所以最後為9個,從 YOLOv2 的5個變成9個。
4. 大目標輸出維度:13 x 13 x 255,其中255 = ( 80 + 5 ) × 3;中目標輸出維度:26 × 26 × 255;小目標輸出維度:52 × 52 × 255。這裡的80個類別是因為使用了COCO 資料集。
5. 採用了新的正負樣本匹配策略:如果重合度高但不是最高的,則依舊拋棄。只選取重合度最高的。
6. 分類器損失採用二分類交叉損失熵 binary cross-entropy loss(BCE),而不是使用 softmax,因為有的目標可能存在重疊的類別標籤,也就是多標籤分類。如 SUV 又是車又是 SUV,而 softmax 只會輸出最大的那一個類別。
損失函式
損失函式:置信度損失使用的是 BCE、類別損失也是使用 BCE、定位損失使用均方差損失函式(MSE)。只有正樣本才參與類別損失,定位損失還有置信度損失三者的計算,但是負樣本只參與置信度損失。
並且三個損失函式之間加入了平衡係數,來平衡損失。
YOLOv3 快的原因
YOLOv3 和 SSD 比網路更加深了,雖然 anchor 比 SSD 少了許多,但是加深的網路深度明顯會增加更多的計算量,那麼為什麼 YOLOv3會比 SSD 快3倍?因為 SSD 的 backbone 使用的是 VGG16,YOLOv3 用的其最新原創的 Darknet,Darknet-53 與 Resnet 的網路結構,Darknet-53 會先用 1 x 1 的卷積核對 feature 進行降維,隨後再使用 3 x 3 的卷積核升維。在這個過程中,這樣可以大大降低引數的計算量以及模型的大小,有點類似於低秩分解。究其原因還是做了很多優化,比如用卷積替代全連線,1 x 1 卷積減小計算量等。
論文連結
筆者以前都是在部落格、公眾號上看別人的論文講解,去消化別人咀嚼過的知識。但後來別人還是建議我多多去讀原論文,從最開始的地方去理解,這樣才會有自己的獨特見解,以及會理解得更加透徹。所以我還是會建議大家多去看看原論文,以下就是原論文的連結:
YOLOv1: https://arxiv.org/abs/1506.02640
YOLOv2: https://arxiv.org/abs/1612.08242
YOLOv3: https://arxiv.org/abs/1804.02767
希望大家看完本篇文章後,能對YOLO有個更深的理解。後續我會繼續更新YOLOv4的解析,大家敬請期待。
本文系公眾號讀者投稿,歡迎想寫任何系列文章的讀者給我們投稿,共同打造一個計算機視覺技術分享社群。
歡迎關注公眾號
CV技術指南建立了一個交流氛圍很不錯的群,除了太偏僻的問題,幾乎有問必答。關注公眾號新增編輯的微訊號可邀請加交流群。
在公眾號中回覆關鍵字 “入門指南“可獲取計算機視覺入門所有必備資料。
其它文章