加入極市專業CV交流群,與10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發者互動交流!同時提供每月大咖直播分享、真實專案需求對接、乾貨資訊彙總,行業技術交流。關注極市平臺公眾號,回覆加群,立刻申請入群~
來源|江大白@知乎,https://zhuanlan.zhihu.com/p/143747206。本文已獲作者授權,未經作者許可,不得二次轉載。
因為工作原因,專案中經常遇到目標檢測的任務,因此對目標檢測演算法會經常使用和關注,比如Yolov3、Yolov4演算法。
當然,實際專案中很多的第一步,也都是先進行目標檢測任務,比如人臉識別、多目標追蹤、REID、客流統計等專案。因此目標檢測是計算機視覺專案中非常重要的一部分。
從2018年Yolov3年提出的兩年後,在原作者聲名放棄更新Yolo演算法後,俄羅斯的Alexey大神扛起了Yolov4的大旗。
在此,大白將專案中,需要了解的Yolov3、Yolov4系列相關知識點以及相關程式碼進行完整的彙總,希望和大家共同學習探討。
文章目錄
1. 論文彙總
2. Yolov3核心基礎內容2.1 網路結構視覺化2.2 網路結構圖2.3 核心基礎內容3. Yolov3相關程式碼
3.1 python程式碼3.2 C++程式碼內容3.3 python版本的Tensorrt程式碼3.4 C++版本的Tensorrt程式碼4. Yolov4核心基礎內容
4.1 網路結構視覺化4.2 網路結構圖4.3 核心基礎內容4.3.1 輸入端創新4.3.2 Backbone創新4.3.3 Neck創新4.4.4 Prediction創新5. Yolov4相關程式碼
5.1 python程式碼5.2 C++程式碼5.3 python版本的Tensorrt程式碼5.4 C++版本的Tensorrt程式碼6. 相關資料集下載
7. 不斷更新ing
1.論文彙總
Yolov3論文名:《Yolov3: An Incremental Improvement》
Yolov3論文地址:https://arxiv.org/pdf/1804.02767.pdf
Yolov4論文名:《Yolov4: Optimal Speed and Accuracy of Object Detection》
Yolov4論文地址:https://arxiv.org/pdf/2004.10934.pdf
2.YoloV3核心基礎內容
2.1 網路結構視覺化
Yolov3是目標檢測Yolo系列非常非常經典的演算法,不過很多同學拿到Yolov3或者Yolov4的cfg檔案時,並不知道如何直觀的視覺化檢視網路結構。如果純粹看cfg裡面的內容,肯定會一臉懵逼。
其實可以很方便的用netron檢視Yolov3的網路結構圖,一目瞭然。
這裡不多說,如果需要安裝,可以移步大白的另一篇文章:《網路視覺化工具netron詳細安裝流程,https://blog.csdn.net/nan355655600/article/details/106245563》。
如果不想安裝,也可以直接點選此連結https://blog.csdn.net/nan355655600/article/details/106246355,檢視Yolov3視覺化流程圖。
2.2 網路結構圖

繪製網路結構圖受到Yolov3另一位作者文章的啟發,包括下面Yolov4的結構圖,確實,從總體框架上先了解了Yolov3的流程,再針對去學習每一小塊的知識點,會事半功倍。
上圖三個藍色方框內表示Yolov3的三個基本元件:
-
CBL:Yolov3網路結構中的最小元件,由Conv+Bn+Leaky_relu啟用函式三者組成。 -
Res unit:借鑑Resnet網路中的殘差結構,讓網路可以構建的更深。 -
ResX:由一個CBL和X個殘差元件構成,是Yolov3中的大元件。每個Res模組前面的CBL都起到下采樣的作用,因此經過5次Res模組後,得到的特徵圖是608->304->152->76->38->19大小。
其他基礎操作:
-
Concat:張量拼接,會擴充兩個張量的維度,例如26*26*256和26*26*512兩個張量拼接,結果是26*26*768。Concat和cfg檔案中的route功能一樣。 -
add:張量相加,張量直接相加,不會擴充維度,例如104*104*128和104*104*128相加,結果還是104*104*128。add和cfg檔案中的shortcut功能一樣。
Backbone中卷積層的數量:
每個ResX中包含1+2*X個卷積層,因此整個主幹網路Backbone中一共包含1+(1+2*1)+(1+2*2)+(1+2*8)+(1+2*8)+(1+2*4)=52,再加上一個FC全連線層,即可以組成一個Darknet53分類網路。不過在目標檢測Yolov3中,去掉FC層,不過為了方便稱呼,仍然把Yolov3的主幹網路叫做Darknet53結構。
2.3 核心基礎內容
Yolov3是2018年發明提出的,這成為了目標檢測one-stage中非常經典的演算法,包含Darknet-53網路結構、anchor錨框、FPN等非常優秀的結構。
本文主要目的在於描述Yolov4和Yolov3演算法的不同及創新之處,對Yolov3的基礎不過多描述。
不過大白也正在準備Yolov3演算法非常淺顯易懂的基礎影片課程,讓小白也能簡單清楚的瞭解Yolov3的整個過程及各個演算法細節,製作好後會更新到此處,便於大家檢視。
在準備課程過程中,大白蒐集查看了網路上幾乎所有的Yolov3資料,在此整理幾個非常不錯的文章及影片,大家也可以點選檢視,學習相關知識。
(1)影片:吳恩達目標檢測Yolo入門講解
https://www.bilibili.com/video/BV1N4411J7Y6?from=search&seid=18074481568368507115
(2)文章:Yolo系列之Yolov3【深度解析】
https://blog.csdn.net/leviopku/article/details/82660381
(3)文章:一文看懂Yolov3
https://blog.csdn.net/litt1e/article/details/88907542
相信大家看完,對於Yolov3的基礎知識點會有一定的瞭解。
3.YoloV3相關程式碼
3.1 python程式碼
程式碼地址:https://github.com/ultralytics/Yolov3
3.2 C++程式碼
這裡推薦Yolov4作者的darknetAB程式碼,程式碼和原始作者程式碼相比,進行了很多的最佳化,如需要執行Yolov3網路,載入cfg時,使用Yolov3.cfg即可
程式碼地址:https://github.com/AlexeyAB/darknet
3.3 python版本的Tensorrt程式碼
除了演算法研究外,實際專案中還需要將演算法落地部署到工程上使用,比如GPU伺服器使用時還需要對模型進行tensorrt加速。
(1)Tensort中的加速案例
強烈推薦tensort軟體中,自帶的Yolov3加速案例,路徑位於tensorrt解壓資料夾的TensortX/samples/python/Yolov3_onnx中
針對案例中的程式碼,如果有不明白的,也可參照下方文章上的詳細說明:
程式碼地址:https://www.cnblogs.com/shouhuxianjian/p/10550262.html
(2)Github上的tensorrt加速
除了tensorrt軟體中的程式碼, github上也有其他作者的開原始碼
程式碼地址:https://github.com/lewes6369/TensorRT-Yolov3
3.4 C++版本的Tensorrt程式碼
專案的工程部署上,如果使用C++版本進行Tensorrt加速,一方面可以參照Alexey的github程式碼,另一方面也可以參照下面其他作者的開原始碼
程式碼地址:https://github.com/wang-xinyu/tensorrtx/tree/master/Yolov3
4.YoloV4核心基礎內容
4.1 網路結構視覺化
Yolov4的網路結構也可以使用netron工具檢視,大白也是對照其展示的視覺化流程圖繪製的下方網路結構圖。
netron視覺化顯示Yolov4網路結構可以參照大白的另一篇文章:《netron視覺化網路結構詳細安裝流程,https://blog.csdn.net/nan355655600/article/details/106245563》
如果不想安裝,也可以直接點選此連結https://blog.csdn.net/nan355655600/article/details/106246422,檢視Yolov4視覺化流程圖。
4.2 網路結構圖

Yolov4的結構圖和Yolov3相比,因為多了CSP結構,PAN結構,如果單純看視覺化流程圖,會覺得很繞,不過在繪製出上面的圖形後,會覺得豁然開朗,其實整體架構和Yolov3是相同的,不過使用各種新的演算法思想對各個子結構都進行了改進。
先整理下Yolov4的五個基本元件:
-
CBM:Yolov4網路結構中的最小元件,由Conv+Bn+Mish啟用函式三者組成。 -
CBL:由Conv+Bn+Leaky_relu啟用函式三者組成。 -
Res unit:借鑑Resnet網路中的殘差結構,讓網路可以構建的更深。 -
CSPX:借鑑CSPNet網路結構,由三個卷積層和X個Res unint模組Concate組成。 -
SPP:採用1×1,5×5,9×9,13×13的最大池化的方式,進行多尺度融合。
其他基礎操作:
-
Concat:張量拼接,維度會擴充,和Yolov3中的解釋一樣,對應於cfg檔案中的route操作。 -
add:張量相加,不會擴充維度,對應於cfg檔案中的shortcut操作。
Backbone中卷積層的數量:
和Yolov3一樣,再來數一下Backbone裡面的卷積層數量。
每個CSPX中包含3+2*X個卷積層,因此整個主幹網路Backbone中一共包含2+(3+2*1)+2+(3+2*2)+2+(3+2*8)+2+(3+2*8)+2+(3+2*4)+1=72。
這裡大白有些疑惑,按照Yolov3設計的傳統,這麼多卷積層,主幹網路不應該叫CSPDaeknet73嗎????
4.3 核心基礎內容
Yolov4本質上和Yolov3相差不大,可能有些人會覺得失望。
但我覺得演算法創新分為三種方式:
-
第一種:面目一新的創新,比如Yolov1、Faster-RCNN、Centernet等,開創出新的演算法領域,不過這種也是最難的 -
第二種:守正出奇的創新,比如將影象金字塔改進為特徵金字塔 -
第三種:各種先進演算法整合的創新,比如不同領域發表的最新論文的tricks,整合到自己的演算法中,卻發現有出乎意料的改進
Yolov4既有第二種也有第三種創新,組合嘗試了大量深度學習領域最新論文的20多項研究成果,而且不得不佩服的是作者Alexey在github程式碼庫維護的頻繁程度。
目前Yolov4程式碼的star數量已經1萬多,據我所瞭解,目前超過這個數量的,目標檢測領域只有Facebook的Detectron(v1-v2)、和Yolo(v1-v3)官方程式碼庫(已停止更新)。
所以Yolov4中的各種創新方式,大白覺得還是很值得仔細研究的。
為了便於分析,將Yolov4的整體結構拆分成四大板塊:

大白主要從以上4個部分對YoloV4的創新之處進行講解,讓大家一目瞭然。
-
輸入端:這裡指的創新主要是訓練時對輸入端的改進,主要包括Mosaic資料增強、cmBN、SAT自對抗訓練 -
BackBone主幹網路:將各種新的方式結合起來,包括:CSPDarknet53、Mish啟用函式、Dropblock -
Neck:目標檢測網路在BackBone和最後的輸出層之間往往會插入一些層,比如Yolov4中的SPP模組、FPN+PAN結構 -
Prediction:輸出層的錨框機制和Yolov3相同,主要改進的是訓練時的損失函式CIOU_Loss,以及預測框篩選的nms變為DIOU_nms
總體來說,Yolov4對Yolov3的各個部分都進行了改進最佳化,下面丟上作者的演算法對比圖。

僅對比Yolov3和Yolov4,在COCO資料集上,同樣的FPS等於83左右時,Yolov4的AP是43,而Yolov3是33,直接上漲了10個百分點。
不得不服,當然可能針對具體不同的資料集效果也不一樣,但總體來說,改進效果是很優秀的,下面大白對Yolov4的各個創新點繼續進行深挖。
4.3.1 輸入端創新
考慮到很多同學GPU顯示卡數量並不是很多,Yolov4對訓練時的輸入端進行改進,使得訓練在單張GPU上也能有不錯的成績。比如資料增強Mosaic、cmBN、SAT自對抗訓練。
但感覺cmBN和SAT影響並不是很大,所以這裡主要講解Mosaic資料增強。
(1)Mosaic資料增強
Yolov4中使用的Mosaic是參考2019年底提出的CutMix資料增強的方式,但CutMix只使用了兩張圖片進行拼接,而Mosaic資料增強則採用了4張圖片,隨機縮放、隨機裁剪、隨機排布的方式進行拼接。

這裡首先要了解為什麼要進行Mosaic資料增強呢?
在平時專案訓練時,小目標的AP一般比中目標和大目標低很多。而Coco資料集中也包含大量的小目標,但比較麻煩的是小目標的分佈並不均勻。
首先看下小、中、大目標的定義:
2019年釋出的論文《Augmentation for small object detection》對此進行了區分:

可以看到小目標的定義是目標框的長寬0×0~32×32之間的物體。

但在整體的資料集中,小、中、大目標的佔比並不均衡。
如上表所示,Coco資料集中小目標占比達到
41.4%
,數量比中目標和大目標都要多。
但在所有的訓練集圖片中,只有52.3%的圖片有小目標,而中目標和大目標的分佈相對來說更加均勻一些。
針對這種狀況,Yolov4的作者採用了Mosaic資料增強的方式。
主要有幾個優點:
-
豐富資料集:隨機使用4張圖片,隨機縮放,再隨機分佈進行拼接,大大豐富了檢測資料集,特別是隨機縮放增加了很多小目標,讓網路的魯棒性更好。 -
減少GPU:可能會有人說,隨機縮放,普通的資料增強也可以做,但作者考慮到很多人可能只有一個GPU,因此Mosaic增強訓練時,可以直接計算4張圖片的資料,使得Mini-batch大小並不需要很大,一個GPU就可以達到比較好的效果。
此外,發現另一研究者的訓練方式也值得借鑑,採用的資料增強和Mosaic比較類似,也是使用4張圖片(不是隨機分佈),但訓練計算loss時,採用“缺啥補啥”的思路:
如果上一個iteration中,小物體產生的loss不足(比如小於某一個閾值),則下一個iteration就用拼接圖;否則就用正常圖片訓練,也很有意思。
參考連結:https://www.zhihu.com/question/390191723?rf=390194081
4.3.2 BackBone創新
(1)CSPDarknet53
CSPDarknet53是在Yolov3主幹網路Darknet53的基礎上,借鑑2019年CSPNet的經驗,產生的Backbone結構,其中包含了5個CSP模組。

這裡因為CSP模組比較長,不放到本處,大家也可以點選Yolov4的netron網路結構圖,對比檢視,一目瞭然。
每個CSP模組前面的卷積核的大小都是3*3,因此可以起到下采樣的作用。
因為Backbone有5個CSP模組,輸入影象是608*608,所以特徵圖變化的規律是:608->304->152->76->38->19
經過5次CSP模組後得到19*19大小的特徵圖。
而且作者只在Backbone中採用了Mish啟用函式,網路後面仍然採用Leaky_relu啟用函式。
我們再看看下作者為啥要參考2019年的CSPNet,採用CSP模組?
CSPNet論文地址:https://arxiv.org/pdf/1911.11929.pdf
CSPNet全稱是Cross Stage Paritial Network,主要從網路結構設計的角度解決推理中從計算量很大的問題。
CSPNet的作者認為推理計算過高的問題是由於網路最佳化中的梯度資訊重複導致的。
因此採用CSP模組先將基礎層的特徵對映劃分為兩部分,然後透過跨階段層次結構將它們合併,在減少了計算量的同時可以保證準確率。
因此Yolov4在主幹網路Backbone採用CSPDarknet53網路結構,主要有三個方面的優點:
優點一:增強CNN的學習能力,使得在輕量化的同時保持準確性。
優點二:降低計算瓶頸
優點三:降低記憶體成本
(2)Mish啟用函式
Mish啟用函式是2019年下半年提出的啟用函式
論文地址:https://arxiv.org/abs/1908.08681
和Leaky_relu啟用函式的圖形對比如下:

Yolov4的Backbone中都使用了Mish啟用函式,而後面的網路則還是使用leaky_relu函式。

Yolov4作者實驗測試時,使用CSPDarknet53網路在ImageNet資料集上做影象分類任務,發現使用了Mish啟用函式的TOP-1和TOP-5的精度比沒有使用時都略高一些。
因此在設計Yolov4目標檢測任務時,主幹網路Backbone還是使用Mish啟用函式。
(3)Dropblock
Yolov4中使用的Dropblock,其實和常見網路中的Dropout功能類似,也是緩解過擬合的一種正則化方式。
Dropblock在2018年提出,論文地址:https://arxiv.org/pdf/1810.12890.pdf
傳統的Dropout很簡單,一句話就可以說的清:隨機刪除減少神經元的數量,使網路變得更簡單。

而Dropblock和Dropout相似,比如下圖:

中間Dropout的方式會隨機的刪減丟棄一些資訊,但Dropblock的研究者認為,卷積層對於這種隨機丟棄並不敏感,因為卷積層通常是三層連用:卷積+啟用+池化層,池化層本身就是對相鄰單元起作用。而且即使隨機丟棄,卷積層仍然可以從相鄰的啟用單元學習到相同的資訊。
因此,在全連線層上效果很好的Dropout在卷積層上效果並不好。
所以右圖Dropblock的研究者則乾脆整個區域性區域進行刪減丟棄。
這種方式其實是借鑑2017年的cutout資料增強的方式,cutout是將輸入影象的部分割槽域清零,而Dropblock則是將Cutout應用到每一個特徵圖。而且並不是用固定的歸零比率,而是在訓練時以一個小的比率開始,隨著訓練過程線性的增加這個比率。

Dropblock的研究者與Cutout進行對比驗證時,發現有幾個特點:
優點一:Dropblock的效果優於Cutout
優點二:Cutout只能作用於輸入層,而Dropblock則是將Cutout應用到網路中的每一個特徵圖上
優點三:Dropblock可以定製各種組合,在訓練的不同階段可以修改刪減的機率,從空間層面和時間層面,和Cutout相比都有更精細的改進。
Yolov4中直接採用了更優的Dropblock,對網路的正則化過程進行了全面的升級改進。
4.3.3 Neck創新
在目標檢測領域,為了更好的提取融合特徵,通常在Backbone和輸出層,會插入一些層,這個部分稱為Neck。相當於目標檢測網路的頸部,也是非常關鍵的。
Yolov4的Neck結構主要採用了SPP模組、FPN+PAN的方式。
(1)SPP模組
SPP模組,其實在Yolov3中已經存在了,在Yolov4的C++程式碼資料夾中有一個Yolov3_spp版本,但有的同學估計從來沒有使用過,在Yolov4中,SPP模組仍然是在Backbone主幹網路之後:

作者在SPP模組中,使用k={1*1,5*5,9*9,13*13}的最大池化的方式,再將不同尺度的特徵圖進行Concat操作。

在2019提出的《DC-SPP-Yolo》文章:https://arxiv.org/ftp/arxiv/papers/1903/1903.08589.pdf
也對Yolo目標檢測的SPP模組進行了對比測試。
和Yolov4作者的研究相同,採用SPP模組的方式,比單純的使用k*k最大池化的方式,更有效的增加主幹特徵的接收範圍,顯著的分離了最重要的上下文特徵。
Yolov4的作者在使用608*608大小的影象進行測試時發現,在COCO目標檢測任務中,以0.5%的額外計算代價將AP50增加了2.7%,因此Yolov4中也採用了SPP模組。
(2)FPN+PAN
PAN結構比較有意思,看了網上Yolov4關於這個部分的講解,大多都是講的比較籠統的,而PAN是借鑑影象分割領域PANet的創新點,有些同學可能不是很清楚。
下面大白將這個部分拆解開來,看下Yolov4中是如何設計的。
Yolov3結構:
我們先來看下Yolov3中Neck的FPN接面構

可以看到經過幾次下采樣,三個紫色箭頭指向的地方,輸出分別是76*76、38*38、19*19。
以及最後的Prediction中用於預測的三個特徵圖①19*19*255、②38*38*255、③76*76*255。[注:255表示80類別(1+4+80)×3=255]
我們將Neck部分用立體圖畫出來,更直觀的看下兩部分之間是如何透過FPN接面構融合的。

如圖所示,FPN是自頂向下的,將高層的特徵資訊透過上取樣的方式進行傳遞融合,得到進行預測的特徵圖。
Yolov4結構:
而Yolov4中Neck這部分除了使用FPN外,還在此基礎上使用了PAN結構:

前面CSPDarknet53中講到,每個CSP模組前面的卷積核都是3*3大小,相當於下采樣操作。
因此可以看到三個紫色箭頭處的特徵圖是76*76、38*38、19*19。
以及最後Prediction中用於預測的三個特徵圖:①76*76*255,②38*38*255,③19*19*255。
我們也看下Neck部分的立體影象,看下兩部分是如何透過FPN+PAN結構進行融合的。

和Yolov3的FPN層不同,Yolov4在FPN層的後面還添加了一個自底向上的特徵金字塔。
其中包含兩個PAN結構。
這樣結合操作,FPN層自頂向下傳達強語義特徵,而特徵金字塔則自底向上傳達強定位特徵,兩兩聯手,從不同的主幹層對不同的檢測層進行引數聚合,這樣的操作確實很皮。
FPN+PAN借鑑的是18年CVPR的PANet,當時主要應用於影象分割領域,但Alexey將其拆分應用到Yolov4中,進一步提高特徵提取的能力。
不過這裡需要注意幾點:
注意一:
Yolov3的FPN層輸出的三個大小不一的特徵圖①②③直接進行預測
但Yolov4的FPN層,只使用最後的一個76*76特徵圖①,而經過兩次PAN結構,輸出預測的特徵圖②和③。
這裡的不同也體現在cfg檔案中,這一點有很多同學之前不太明白,
比如Yolov3.cfg最後的三個Yolo層,
第一個Yolo層是最小的特徵圖19*19,mask=6,7,8,對應最大的anchor box。
第二個Yolo層是中等的特徵圖38*38,mask=3,4,5,對應中等的anchor box。
第三個Yolo層是最大的特徵圖76*76,mask=0,1,2,對應最小的anchor box。
而Yolov4.cfg則恰恰相反
第一個Yolo層是最大的特徵圖76*76,mask=0,1,2,對應最小的anchor box。
第二個Yolo層是中等的特徵圖38*38,mask=3,4,5,對應中等的anchor box。
第三個Yolo層是最小的特徵圖19*19,mask=6,7,8,對應最大的anchor box。
注意點二:
原本的PANet網路的PAN結構中,兩個特徵圖結合是採用shortcut操作,而Yolov4中則採用**concat(route)**操作,特徵圖融合後的尺寸發生了變化。

這裡也可以對應Yolov4的netron網路圖檢視,很有意思。
4.3.4 Prediction創新
(1)CIOU_loss
目標檢測任務的損失函式一般由**Classificition Loss(分類損失函式)和Bounding Box Regeression Loss(迴歸損失函式)**兩部分構成。
Bounding Box Regeression的Loss近些年的發展過程是:Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)
我們從最常用的IOU_Loss開始,進行對比拆解分析,看下Yolov4為啥要選擇CIOU_Loss。
a.IOU_Loss

可以看到IOU的loss其實很簡單,主要是交集/並集,但其實也存在兩個問題。

問題1:即狀態1的情況,當預測框和目標框不相交時,IOU=0,無法反應兩個框距離的遠近,此時損失函式不可導,IOU_Loss無法最佳化兩個框不相交的情況。
問題2:即狀態2和狀態3的情況,當兩個預測框大小相同,兩個IOU也相同,IOU_Loss無法區分兩者相交情況的不同。
因此2019年出現了GIOU_Loss來進行改進。
b.GIOU_Loss

可以看到右圖GIOU_Loss中,增加了相交尺度的衡量方式,緩解了單純IOU_Loss時的尷尬。
但為什麼僅僅說緩解呢?
因為還存在一種不足:

問題
:狀態1、2、3都是預測框在目標框內部且預測框大小一致的情況,這時預測框和目標框的差集都是相同的,因此這三種狀態的
GIOU值
也都是相同的,這時GIOU退化成了IOU,無法區分相對位置關係。
基於這個問題,
2020年
的AAAI又提出了
DIOU_Loss
。
c.DIOU_Loss
好的目標框迴歸函式應該考慮三個重要幾何因素:重疊面積、中心點距離,長寬比。
針對IOU和GIOU存在的問題,作者從兩個方面進行考慮
一:如何最小化預測框和目標框之間的歸一化距離?
二:如何在預測框和目標框重疊時,迴歸的更準確?
針對第一個問題,提出了DIOU_Loss(Distance_IOU_Loss)

DIOU_Loss考慮了重疊面積和中心點距離,當目標框包裹預測框的時候,直接度量2個框的距離,因此DIOU_Loss收斂的更快。
但就像前面好的目標框迴歸函式所說的,沒有考慮到長寬比。

比如上面三種情況,目標框包裹預測框,本來DIOU_Loss可以起作用。
但預測框的中心點的位置都是一樣的,因此按照DIOU_Loss的計算公式,三者的值都是相同的。
針對這個問題,又提出了CIOU_Loss,不對不說,科學總是在解決問題中,不斷進步!!
d.CIOU_Loss
CIOU_Loss和DIOU_Loss前面的公式都是一樣的,不過在此基礎上還增加了一個影響因子,將預測框和目標框的長寬比都考慮了進去。

其中v是衡量長寬比一致性的引數,我們也可以定義為:

這樣CIOU_Loss就將目標框迴歸函式應該考慮三個重要幾何因素:重疊面積、中心點距離,長寬比全都考慮進去了。
再來綜合的看下各個Loss函式的不同點:
IOU_Loss:主要考慮檢測框和目標框重疊面積。
GIOU_Loss:在IOU的基礎上,解決邊界框不重合時的問題。
DIOU_Loss:在IOU和GIOU的基礎上,考慮邊界框中心點距離的資訊。
CIOU_Loss:在DIOU的基礎上,考慮邊界框寬高比的尺度資訊。
Yolov4中採用了CIOU_Loss的迴歸方式,使得預測框迴歸的速度和精度更高一些。
(2)DIOU_nms
Nms主要用於預測框的篩選,常用的目標檢測演算法中,一般採用普通的nms的方式,Yolov4則借鑑上面D/CIOU loss的論文:https://arxiv.org/pdf/1911.08287.pdf
將其中計算IOU的部分替換成DIOU的方式:
再來看下實際的案例

在上圖重疊的摩托車檢測中,中間的摩托車因為考慮邊界框中心點的位置資訊,也可以迴歸出來。
因此在重疊目標的檢測中,DIOU_nms的效果優於傳統的nms。
注意:有讀者會有疑問,這裡為什麼不用CIOU_nms,而用DIOU_nms?
答:因為前面講到的CIOU_loss,是在DIOU_loss的基礎上,新增的影響因子,包含groundtruth標註框的資訊,在訓練時用於迴歸。
但在測試過程中,並沒有groundtruth的資訊,不用考慮影響因子,因此直接用DIOU_nms即可。
總體來說,YOLOv4的論文稱的上良心之作,將近幾年關於深度學習領域最新研究的tricks移植到Yolov4中做驗證測試,將Yolov3的精度提高了不少。
雖然沒有全新的創新,但很多改進之處都值得借鑑,借用Yolov4作者的總結。
Yolov4 主要帶來了 3 點新貢獻:
(1)提出了一種高效而強大的目標檢測模型,使用 1080Ti 或 2080Ti 就能訓練出超快、準確的目標檢測器。
(2)在檢測器訓練過程中,驗證了最先進的一些研究成果對目標檢測器的影響。
(3)改進了 SOTA 方法,使其更有效、更適合單 GPU 訓練。
5.YoloV4相關程式碼
5.1 python程式碼
程式碼地址:https://github.com/Tianxiaomo/pytorch-Yolov4
作者的訓練和測試推理程式碼都已經完成
5.2 C++程式碼
Yolov4作者Alexey的程式碼,俄羅斯的大神,應該是個獨立研究員,更新演算法的頻繁程度令人佩服。
在Yolov3作者Joseph Redmon宣佈停止更新Yolo演算法之後,Alexey憑藉對於Yolov3演算法的不斷探索研究,贏得了Yolov3作者的認可,釋出了Yolov4。
程式碼地址:https://github.com/AlexeyAB/darknet
5.3 python版本的Tensorrt程式碼
目前測試有效的有tensorflow版本:weights->pb->trt
程式碼地址:https://github.com/hunglc007/tensorflow-Yolov4-tflite
5.4 C++版本的Tensorrtrt程式碼
程式碼地址:https://github.com/wang-xinyu/tensorrtx/tree/master/Yolov4
作者自定義了mish啟用函式的plugin層,Tensorrt加速後速度還是挺快的。
6.相關資料集下載
專案中,目標檢測演算法應該的非常多非常多,比如人臉識別,比如疫情期間的口罩人臉識別,比如車流統計,人流統計等等。
因此大白也會將不錯的值得一試的目標檢測資料集彙總到此處,方便需要的同學進行下載。
6.1 口罩遮擋人臉資料集
資料集詳情:由武漢大學多媒體研究中心發起,目前是全球最大的口罩遮擋人臉資料集。
分為真實口罩人臉和模擬口罩人臉兩部分,真實口罩人臉包含525人的5000張口罩人臉和9萬張正常人臉。模擬口罩人臉包含1萬個人共50萬張模擬人臉資料集。
應用專案:人臉檢測、人臉識別
資料集地址:https://github.com/X-zhangyang/Real-World-Masked-Face-Dataset
6.2 Wider Face人臉資料集
資料集詳情:香港中文大學發起的,包含3萬張圖片共40萬張人臉。
應用專案:人臉檢測
資料集地址:http://shuoyang1213.me/WIDERFACE/WiderFace_Results.html
6.3 Wider Person擁擠場景行人資料集
資料集詳情:多種場景比較擁擠場景的行人檢測資料集,包含13382張圖片,共計40萬個不同遮擋程度的人體。
應用專案:人體檢測
資料集地址:http://www.cbsr.ia.ac.cn/users/sfzhang/WiderPerson/
因為工作原因,會蒐集大量的各類公開應用場景資料集,如果有同學需要其他場景或者其他專案的,也可以留言,或者傳送郵件到[email protected],也會將對應的資料集更新到此處。
7.不斷更新ing
在深度學習的影象領域,肯定會涉及目標檢測,而在目標檢測中,Yolov3是非常經典,必須要學習的演算法,有些同學,特別新接觸的同學,剛學習時會覺得yolo演算法很繁瑣。
但我發現,網上很多的教程其實講的還是比較籠統,並不適合小白學習。
所以大白也在耗盡洪荒之力,在準備Yolov3和Yolov4及相關的基礎入門影片,讓大家看完就能明白整體的流程和各種演算法細節,大家可以先收藏,後期製作好後會更新到此處。
希望和大家一起努力,在人工智慧深度學習領域一起進步,一起提升,一起變強!
推薦閱讀:

新增極市小助手微信(ID : cv-mart),備註:研究方向-姓名-學校/公司-城市(如:AI移動應用-小極-北大-深圳),即可申請加入AI移動應用極市技術交流群,更有每月大咖直播分享、真實專案需求對接、求職內推、演算法競賽、乾貨資訊彙總、行業技術交流,一起來讓思想之光照的更遠吧~

△長按新增極市小助手

△長按關注極市平臺,獲取最新CV乾貨
覺得有用麻煩給個在看啦~
