YOLO系列:V1,V2,V3,V4簡介

 2020-04-27 16:00:12.0

YOLO系列是基於深度學習的迴歸方法。
RCNN, Fast-RCNN,Faster-RCNN是基於深度學習的分類方法。

YOLO官網:github.com/pjreddie/dar

YOLOV1

論文下載:arxiv.org/abs/1506.0264

代碼下載:github.com/pjreddie/dar

核心思想:將整張圖片作爲網絡的輸入(類似於Faster-RCNN),直接在輸出層對BBox的位置和類別進行迴歸。

實現方法

  • 將一幅圖像分成SxS個網格(grid cell),如果某個object的中心 落在這個網格中,則這個網格就負責預測這個object。
  • 每個網絡需要預測B個BBox的位置信息和confidence(置信度)信息,一個BBox對應着四個位置信息和一個confidence信息。confidence代表了所預測的box中含有object的置信度和這個box預測的有多準兩重信息:
其中如果有object落在一個grid cell裏,第一項取1,否則取0。 第二項是預測的bounding box和實際的groundtruth之間的IoU值。
  • 每個bounding box要預測(x, y, w, h)和confidence共5個值,每個網格還要預測一個類別信息,記爲C類。則SxS個網格,每個網格要預測B個bounding box還要預測C個categories。輸出就是S x S x (5*B+C)的一個tensor。(注意:class信息是針對每個網格的,confidence信息是針對每個bounding box的。
  • 舉例說明: 在PASCAL VOC中,圖像輸入爲448x448,取S=7,B=2,一共有20個類別(C=20)。則輸出就是7x7x30的一個tensor。整個網絡結構如下圖所示:
  • 在test的時候,每個網格預測的class信息和bounding box預測的confidence信息相乘,就得到每個bounding box的class-specific confidence score:
等式左邊第一項就是每個網格預測的類別信息,第二三項就是每個bounding box預測的confidence。這個乘積即encode了預測的box屬於某一類的概率,也有該box準確度的信息。
  • 得到每個box的class-specific confidence score以後,設置閾值,濾掉得分低的boxes,對保留的boxes進行NMS處理,就得到最終的檢測結果。

損失函數

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

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

  • 第一,8維的localization error和20維的classification error同等重要顯然是不合理的;
  • 第二,如果一個網格中沒有object(一幅圖中這種網格很多),那麼就會將這些網格中的box的confidence push到0,相比於較少的有object的網格,這種做法是overpowering的,這會導致網絡不穩定甚至發散。

解決辦法:

  • 更重視8維的座標預測,給這些損失前面賦予更大的loss weight。
  • 對沒有object的box的confidence loss,賦予小的loss weight。
  • 有object的box的confidence loss和類別的loss的loss weight正常取1。

對不同大小的box預測中,相比於大box預測偏一點,小box預測偏一點肯定更不能被忍受的。而sum-square error loss中對同樣的偏移loss是一樣。

爲了緩和這個問題,作者用了一個比較取巧的辦法,就是將box的width和height取平方根代替原本的height和width。這個參考下面的圖很容易理解,小box的橫軸值較小,發生偏移時,反應到y軸上相比大box要大。(也是個近似逼近方式)

一個網格預測多個box,希望的是每個box predictor專門負責預測某個object。具體做法就是看當前預測的box與ground truth box中哪個IoU大,就負責哪個。這種做法稱作box predictor的specialization。

最後整個的損失函數如下所示:

這個損失函數中:

  • 只有當某個網格中有object的時候纔對classification error進行懲罰。
  • 只有當某個box predictor對某個ground truth box負責的時候,纔會對box的coordinate error進行懲罰,而對哪個ground truth box負責就看其預測值和ground truth box的IoU是不是在那個cell的所有box中最大。

其他細節,例如使用激活函數使用leak RELU,模型用ImageNet預訓練等等

缺點

  • 由於輸出層爲全連接層,因此在檢測時,YOLO訓練模型只支持與訓練圖像相同的輸入分辨率。
  • 雖然每個格子可以預測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作爲物體檢測輸出,即每個格子最多隻預測出一個物體。當物體佔畫面比例較小,如圖像中包含畜羣或鳥羣時,每個格子包含多個物體,但卻只能檢測出其中一個。這是YOLO方法的一個缺陷。
  • YOLO loss函數中,大物體IOU誤差和小物體IOU誤差對網絡訓練中loss貢獻值接近(雖然採用求平方根方式,但沒有根本解決問題)。因此,對於小物體,小的IOU誤差也會對網絡優化過程造成很大的影響,從而降低了物體檢測的定位準確性。

YOLOv2(YOLO9000)

文章提出了一種新的訓練方法–聯合訓練算法,這種算法可以把這兩種的數據集混合到一起。使用一種分層的觀點對物體進行分類,用巨量的分類數據集數據來擴充檢測數據集,從而把兩種不同的數據集混合起來。

聯合訓練算法的基本思路就是:同時在檢測數據集和分類數據集上訓練物體檢測器(Object Detectors ),用檢測數據集的數據學習物體的準確位置,用分類數據集的數據來增加分類的類別量、提升健壯性。

YOLO9000就是使用聯合訓練算法訓練出來的,他擁有9000類的分類信息,這些分類信息學習自ImageNet分類數據集,而物體位置檢測則學習自COCO檢測數據集。

改進

Batch Normalization

使用Batch Normalization對網絡進行優化,讓網絡提高了收斂性,同時還消除了對其他形式的正則化(regularization)的依賴。通過對YOLO的每一個卷積層增加Batch Normalization,最終使得mAP提高了2%,同時還使model正則化。使用Batch Normalization可以從model中去掉Dropout,而不會產生過擬合。

High resolution classifier

目前業界標準的檢測方法,都要先把分類器(classifier)放在ImageNet上進行預訓練。從Alexnet開始,大多數的分類器都運行在小於256*256的圖片上。而現在YOLO從224*224增加到了448*448,這就意味着網絡需要適應新的輸入分辨率。

爲了適應新的分辨率,YOLO v2的分類網絡以448*448的分辨率先在ImageNet上進行Fine Tune,Fine Tune10個epochs,讓網絡有時間調整他的濾波器(filters),好讓其能更好的運行在新分辨率上,還需要調優用於檢測的Resulting Network。最終通過使用高分辨率,mAP提升了4%。

Convolution with anchor boxes

YOLOV1包含有全連接層,從而能直接預測Bounding Boxes的座標值。 Faster R-CNN的方法只用卷積層與Region Proposal Network來預測Anchor Box的偏移值與置信度,而不是直接預測座標值。作者發現通過預測偏移量而不是座標值能夠簡化問題,讓神經網絡學習起來更容易。

所以最終YOLO去掉了全連接層,使用Anchor Boxes來預測 Bounding Boxes。作者去掉了網絡中一個Pooling層,這讓卷積層的輸出能有更高的分辨率。收縮網絡讓其運行在416*416而不是448*448。由於圖片中的物體都傾向於出現在圖片的中心位置,特別是那種比較大的物體,所以有一個單獨位於物體中心的位置用於預測這些物體。YOLO的卷積層採用32這個值來下采樣圖片,所以通過選擇416*416用作輸入尺寸最終能輸出一個13*13的Feature Map。 使用Anchor Box會讓精確度稍微下降,但用了它能讓YOLO能預測出大於一千個框,同時recall達到88%,mAP達到69.2%。

Dimension clusters

之前Anchor Box的尺寸是手動選擇的,所以尺寸還有優化的餘地。 爲了優化,在訓練集(training set)Bounding Boxes上跑了一下k-means聚類,來找到一個比較好的值。

如果我們用標準的歐式距離的k-means,尺寸大的框比小框產生更多的錯誤。因爲我們的目的是提高IOU分數,這依賴於Box的大小,所以距離度量的使用:

通過分析實驗結果(Figure 2),左圖:在model複雜性與high recall之間權衡之後,選擇聚類分類數K=5。右圖:是聚類的中心,大多數是高瘦的Box。

Table1是說明用K-means選擇Anchor Boxes時,當Cluster IOU選擇值爲5時,AVG IOU的值是61,這個值要比不用聚類的方法的60.9要高。選擇值爲9的時候,AVG IOU更有顯著提高。總之就是說明用聚類的方法是有效果的。

Direct location prediction

用Anchor Box的方法,會讓model變得不穩定,尤其是在最開始的幾次迭代的時候。大多數不穩定因素產生自預測Box的(x,y)位置的時候。按照之前YOLO的方法,網絡不會預測偏移量,而是根據YOLO中的網格單元的位置來預測座標,這就讓Ground Truth的值介於0到1之間。而爲了讓網絡的結果能落在這一範圍內,網絡使用一個 Logistic Activation來對於網絡預測結果進行限制,讓結果介於0到1之間。 網絡在每一個網格單元中預測出5個Bounding Boxes,每個Bounding Boxes有五個座標值tx,ty,tw,th,t0,他們的關係見下圖(Figure3)。假設一個網格單元對於圖片左上角的偏移量是cx,cy,Bounding Boxes Prior的寬度和高度是pw,ph,那麼預測的結果見下圖右面的公式:

因爲使用了限制讓數值變得參數化,也讓網絡更容易學習、更穩定。

Fine-Grained Features

YOLO修改後的Feature Map大小爲13*13,這個尺寸對檢測圖片中尺寸大物體來說足夠了,同時使用這種細粒度的特徵對定位小物體的位置可能也有好處。Faster R-CNN、SSD都使用不同尺寸的Feature Map來取得不同範圍的分辨率,而YOLO採取了不同的方法,YOLO加上了一個Passthrough Layer來取得之前的某個26*26分辨率的層的特徵。這個Passthrough layer能夠把高分辨率特徵與低分辨率特徵聯繫在一起,聯繫起來的方法是把相鄰的特徵堆積在不同的Channel之中,這一方法類似與Resnet的Identity Mapping,從而把26*26*512變成13*13*2048。YOLO中的檢測器位於擴展後(expanded )的Feature Map的上方,所以他能取得細粒度的特徵信息,這提升了YOLO 1%的性能。

Multi-ScaleTraining

作者希望YOLO v2能健壯的運行於不同尺寸的圖片之上,所以把這一想法用於訓練model中。

區別於之前的補全圖片的尺寸的方法,YOLO v2每迭代幾次都會改變網絡參數。每10個Batch,網絡會隨機地選擇一個新的圖片尺寸,由於使用了下采樣參數是32,所以不同的尺寸大小也選擇爲32的倍數{320,352…..608},最小320*320,最大608*608,網絡會自動改變尺寸,並繼續訓練的過程。

這一政策讓網絡在不同的輸入尺寸上都能達到一個很好的預測效果,同一網絡能在不同分辨率上進行檢測。當輸入圖片尺寸比較小的時候跑的比較快,輸入圖片尺寸比較大的時候精度高,所以你可以在YOLO v2的速度和精度上進行權衡。

Figure4,Table 3:在voc2007上的速度與精度

YOLOV3

YOLO v3的模型比之前的模型複雜了不少,可以通過改變模型結構的大小來權衡速度與精度。

速度對比如下:

簡而言之,YOLOv3 的先驗檢測(Prior detection)系統將分類器或定位器重新用於執行檢測任務。他們將模型應用於圖像的多個位置和尺度。而那些評分較高的區域就可以視爲檢測結果。此外,相對於其它目標檢測方法,我們使用了完全不同的方法。我們將一個單神經網絡應用於整張圖像,該網絡將圖像劃分爲不同的區域,因而預測每一塊區域的邊界框和概率,這些邊界框會通過預測的概率加權。我們的模型相比於基於分類器的系統有一些優勢。它在測試時會查看整個圖像,所以它的預測利用了圖像中的全局信息。與需要數千張單一目標圖像的 R-CNN 不同,它通過單一網絡評估進行預測。這令 YOLOv3 非常快,一般它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。

改進之處

  • 多尺度預測 (類FPN)
  • 更好的基礎分類網絡(類ResNet)和分類器 darknet-53,見下圖。
  • 分類器-類別預測。

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

  1. Softmax使得每個框分配一個類別(score最大的一個),而對於Open Images這種數據集,目標可能有重疊的類別標籤,因此Softmax不適用於多標籤分類。
  2. Softmax可被獨立的多個logistic分類器替代,且準確率不會下降。

分類損失採用binary cross-entropy loss。

多尺度預測

每種尺度預測3個box, anchor的設計方式仍然使用聚類,得到9個聚類中心,將其按照大小均分給3個尺度.

  • 尺度1: 在基礎網絡之後添加一些卷積層再輸出box信息.
  • 尺度2: 從尺度1中的倒數第二層的卷積層上採樣(x2)再與最後一個16x16大小的特徵圖相加,再次通過多個卷積後輸出box信息.相比尺度1變大兩倍.
  • 尺度3: 與尺度2類似,使用了32x32大小的特徵圖.

參見網絡結構定義文件yolov3.cfg

基礎網絡 Darknet-53

darknet-53

仿ResNet, 與ResNet-101或ResNet-152準確率接近,但速度更快.對比如下:

主幹架構的性能對比

檢測結構如下:

YOLOv3在mAP@0.5及小目標APs上具有不錯的結果,但隨着IOU的增大,性能下降,說明YOLOv3不能很好地與ground truth切合.

邊框預測

圖 2:帶有維度先驗和定位預測的邊界框。我們邊界框的寬和高以作爲離聚類中心的位移,並使用 Sigmoid 函數預測邊界框相對於濾波器應用位置的中心座標。

仍採用之前的logis,其中cx,cy是網格的座標偏移量,pw,ph是預設的anchor box的邊長.最終得到的邊框座標值是b*,而網絡學習目標是t*,用sigmod函數、指數轉換。

優點

  • 快速,pipline簡單.
  • 背景誤檢率低。
  • 通用性強。YOLO對於藝術類作品中的物體檢測同樣適用。它對非自然圖像物體的檢測率遠遠高於DPM和RCNN系列檢測方法。

但相比RCNN系列物體檢測方法,YOLO具有以下缺點:

  • 識別物體位置精準性差。
  • 召回率低。在每個網格中預測兩個box這種約束方式減少了對同一目標的多次檢測(R-CNN使用的region proposal方式重疊較多),相比R-CNN使用Selective Search產生2000個proposal(RCNN測試時每張超過40秒),yolo僅使用7x7x2個.

YOLOV4

YOLOv4: Optimal Speed and Accuracy of Object Detection

論文:arxiv.org/abs/2004.1093

代碼:github.com/AlexeyAB/dar

YOLOv4!

YOLOv4 在COCO上,可達43.5% AP,速度高達 65 FPS!

YOLOv4的特點是集大成者,俗稱堆料。但最終達到這麼高的性能,一定是不斷嘗試、不斷堆料、不斷調參的結果,給作者點贊。下面看看堆了哪些料:

  • Weighted-Residual-Connections (WRC)
  • Cross-Stage-Partial-connections (CSP)
  • Cross mini-Batch Normalization (CmBN)
  • Self-adversarial-training (SAT)
  • Mish-activation
  • Mosaic data augmentation
  • CmBN
  • DropBlock regularization
  • CIoU loss

本文的主要貢獻如下:

1. 提出了一種高效而強大的目標檢測模型。它使每個人都可以使用1080 Ti或2080 Ti GPU 訓練超快速和準確的目標檢測器(牛逼!)。

2. 在檢測器訓練期間,驗證了SOTA的Bag-of Freebies 和Bag-of-Specials方法的影響。

3. 改進了SOTA的方法,使它們更有效,更適合單GPU訓練,包括CBN [89],PAN [49],SAM [85]等。文章將目前主流的目標檢測器框架進行拆分:input、backbone、neck 和 head.

具體如下圖所示:

  • 對於GPU,作者在卷積層中使用:CSPResNeXt50 / CSPDarknet53
  • 對於VPU,作者使用分組卷積,但避免使用(SE)塊-具體來說,它包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3

作者的目標是在輸入網絡分辨率,卷積層數,參數數量和層輸出(filters)的數量之間找到最佳平衡。

總結一下YOLOv4框架:

  • Backbone:CSPDarknet53
  • Neck:SPP,PAN
  • Head:YOLOv3

YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3

其中YOLOv4用到相當多的技巧:

  • 用於backbone的BoF:CutMix和Mosaic數據增強,DropBlock正則化,Class label smoothing
  • 用於backbone的BoS:Mish激活函數,CSP,MiWRC
  • 用於檢測器的BoF:CIoU-loss,CmBN,DropBlock正則化,Mosaic數據增強,Self-Adversarial 訓練,消除網格敏感性,對單個ground-truth使用多個anchor,Cosine annealing scheduler,最佳超參數,Random training shapes
  • 用於檢測器的Bos:Mish激活函數,SPP,SAM,PAN,DIoU-NMS

看看YOLOv4部分組件:

感受一下YOLOv4實驗的充分性(調參的藝術):

感受一下性能炸裂的YOLOv4實驗結果:


YOLO v.s Faster R-CNN

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

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

[1][2]

參考

  1. ^V1,V2,V3轉載地址: https://blog.csdn.net/App_12062011/article/details/77554288
  2. ^V4轉載地址 https://mp.weixin.qq.com/s/Ua3T-DOuzmLWuXfohEiVFw

文章來源:知乎