yolov5于2020年由glenn-jocher首次提出,直至今日yolov5仍然在不斷進行升級迭代。
Yolov5有YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四個版本。文件中,這幾個模型的結構基本一樣,不同的是depth_multiple模型深度和width_multiple模型寬度這兩個參數。
yolov5主要分為輸入端,backbone,Neck,和head(prediction)。backbone是New CSP-Darknet53。Neck層為SPFF和New CSP-PAN。Head層為Yolov3 head。 yolov5 6.0版本的主要架構如下圖所示:
從整體結構圖中,我們可以看到Backbone,neck和head由不同的blocks構成,下面是對于這三個部分,逐一介紹各個blocks。
1. 輸入端:
YOLOv5在輸入端采用了Mosaic數據增強,參考了CutMix數據增強的方法,Mosaic數據增強由原來的兩張圖像提高到四張圖像進行拼接,并對圖像進行隨機縮放,隨機裁剪和隨機排列。使用數據增強可以改善數據集中,小、中、大目標數據不均衡的問題。
Mosaic數據增強的主要步驟為:1. Mosaic 2.Copy paste 3.Random affine(Scale, Translation and Shear) 4.Mixup 5.Albumentations 6. Augment HSV(Hue, Saturation, Value) 7. Random horizontal flip.
采用Mosaic數據增強的方式有幾個優點:1.豐富數據集:隨機使用4張圖像,隨機縮放后隨機拼接,增加很多小目標,大大豐富了數據集,提高了網絡的魯棒性。2.減少GPU占用:隨機拼接的方式讓一張圖像可以計算四張圖像的數據,減少每個batch的數量,即使只有一個GPU,也能得到較好的結果。3.同時通過對識別物體的裁剪,使模型根據局部特征識別物體,有助于被遮擋物體的檢測,從而提升了模型的檢測能力。
2.backbone
在Backbone中,有conv,C3,SPFF是我們需要闡明的。
2.1.Conv模塊
Conv卷積層由卷積,batch normalization和SiLu激活層組成。batch normalization具有防止過擬合,加速收斂的作用。SiLu激活函數是Sigmoid 加權線性組合,SiLU 函數也稱為 swish 函數。
公式:silu(x)=x?σ(x),where σ(x) is the logistic sigmoid. Silu函數處處可導,且連續光滑。Silu并非一個單調的函數,最大的缺點是計算量大。
2.2 C3模塊
C3其結構作用基本相同均為CSP架構,只是在修正單元的選擇上有所不同,其包含了3個標準卷積層,數量由配置文件yaml的n和depth_multiple參數乘積決定。該模塊是對殘差特征進行學習的主要模塊,其結構分為兩支,一支使用了上述指定多個Bottleneck堆疊,另一支僅經過一個基本卷積模塊,最后將兩支進行concat操作。
這個模塊相對于之前版本BottleneckCSP模塊不同的是,經歷過殘差輸出后的卷積模塊被去掉了,concat后的標準卷積模塊中的激活函數也為SiLU。
Bottleneck模塊借鑒了ResNet的殘差結構,其中一路先進行1 ×1卷積將特征圖的通道數減小一半,從而減少計算量,再通過3 ×3卷積提取特征,并且將通道數加倍,其輸入與輸出的通道數是不發生改變的。而另外一路通過shortcut進行殘差連接,與第一路的輸出特征圖相加,從而實現特征融合。
在YOLOv5的Backbone中的Bottleneck都默認使shortcut為True,而在Head中的Bottleneck都不使用shortcut。
2.3. SPPF模塊
SPPF由SPP改進而來,SPP先通過一個標準卷積模塊將輸入通道減半,然后分別做kernel-size為5,9,13的max pooling(對于不同的核大小,padding是自適應的)。對三次最大池化的結果與未進行池化操作的數據進行concat,最終合并后channel數是原來的2倍。
yolo的SPP借鑒了空間金字塔的思想,通過SPP模塊實現了局部特征和全部特征。經過局部特征與全矩特征相融合后,豐富了特征圖的表達能力,有利于待檢測圖像中目標大小差異較大的情況,對yolo這種復雜的多目標檢測的精度有很大的提升。
SPPF(Spatial Pyramid Pooling - Fast )使用3個5×5的最大池化,代替原來的5×5、9×9、13×13最大池化,多個小尺寸池化核級聯代替SPP模塊中單個大尺寸池化核,從而在保留原有功能,即融合不同感受野的特征圖,豐富特征圖的表達能力的情況下,進一步提高了運行速度。
3. Neck
在Neck部分,yolov5主要采用了PANet結構。
PANet在FPN(feature pyramid network)上提取網絡內特征層次結構,FPN中頂部信息流需要通過骨干網絡(Backbone)逐層地往下傳遞,由于層數相對較多,因此計算量比較大(a)。
PANet在FPN的基礎上又引入了一個自底向上(Bottom-up)的路徑。經過自頂向下(Top-down)的特征融合后,再進行自底向上(Bottom-up)的特征融合,這樣底層的位置信息也能夠傳遞到深層,從而增強多個尺度上的定位能力。
(a) FPN backbone. (b) Bottom-up path augmentation. (c) Adaptive feature pooling. (d) Box branch. (e) Fully-connected fusion.
4.Head
4.1 head
Head部分主要用于檢測目標,分別輸出20*20,40*40和80*80的特征圖大小,對應的是32*32,16*16和8*8像素的目標。
YOLOv5的Head對Neck中得到的不同尺度的特征圖分別通過1×1卷積將通道數擴展,擴展后的特征通道數為(類別數量+5)×每個檢測層上的anchor數量。其中5分別對應的是預測框的中心點橫坐標、縱坐標、寬度、高度和置信度,這里的置信度表示預測框的可信度,取值范圍為( 0 , 1 ) ,值越大說明該預測框中越有可能存在目標。
Head中的3個檢測層分別對應Neck中得到的3種不同尺寸的特征圖。特征圖上的每個網格都預設了3個不同寬高比的anchor,可以在特征圖的通道維度上保存所有基于anchor先驗框的位置信息和分類信息,用來預測和回歸目標。
4.2 目標框回歸
YOLOv5的目標框回歸計算公式如下所示:
其中(bx,by,bw,bh)表示預測框的中心點坐標、寬度和高度,(Cx, Cy)表示預測框中心點所在網格的左上角坐標,(tx,ty)表示預測框的中心點相對于網格左上角坐標的偏移量,(tw,th)表示預測框的寬高相對于anchor寬高的縮放比例,表示(pw,ph)先驗框anchor的寬高。
為了將預測框的中心點約束到當前網格中,使用Sigmoid函數處理偏移量,使預測的偏移值保持在(0,1)范圍內。這樣一來,根據目標框回歸計算公式,預測框中心點坐標的偏移量保持在(?0.5,1.5)范圍內,如上圖藍色區域所示。預測框的寬度和高度對于anchor的放縮范圍為(0,4)。
4.3 目標的建立
如上面所述,YOLOv5的每個檢測層上的每個網格都預設了多個anchor先驗框,但并不是每個網格中都存在目標,也并不是每個anchor都適合用來回歸當前目標,因此需要對這些anchor先驗框進行篩選,將其劃分為正樣本和負樣本。本文的正負樣本指的是預測框而不是Ground Truth(人工標注的真實框)。
與YOLOv3/4不同的是,YOLOv5采用的是基于寬高比例的匹配策略,它的大致流程如下:
1. 對于每一個Ground Truth(人工標注的真實框),分別計算它與9種不同anchor的寬與寬的比值(w1/w2, w2/w1)和高與高的比值(h1/h2, h2/h1)。
2. 找到Ground Truth與anchor的寬比(w1/w2, w2/w1)和高比(h1/h2, h2/h1)中的最大值,作為該Ground Truth和anchor的比值。
3. 若Ground Truth和anchor的比值r^max小于設定的比值閾值(超參數中默認為anchor_t = 4.0),那么這個anchor就負責預測這個Ground Truth,這個anchor所回歸得到的預測框就被稱為正樣本,剩余所有的預測框都是負樣本。
通過上述方法,YOLOv5不僅篩選了正負樣本,同時對于部分Ground Truth在單個尺度上匹配了多個anchor來進行預測,總體上增加了一定的正樣本數量。除此以外,YOLOv5還通過以下幾種方法增加正樣本的個數,從而加快收斂速度。
跨網格擴充: 如果某個Ground Truth的中心點落在某個檢測層上的某個網格中,除了中心點所在的網格之外,其左、上、右、下4個鄰域的網格中,靠近Ground Truth中心點的兩個網格中的anchor也會參與預測和回歸,即一個目標會由3個網格的anchor進行預測,如下圖所示。
跨分支擴充:YOLOv5的檢測頭包含了3個不同尺度的檢測層,每個檢測層上預設了3種不同長寬比的anchor,假設一個Ground Truth可以和不同尺度的檢測層上的anchor匹配,則這3個檢測層上所有符合條件的anchor都可以用來預測該Ground Truth,即一個目標可以由多個檢測層的多個anchor進行預測。
NMS non-maximum suppression
當我們得到對目標的預測后,一個目標通常會產生很多冗余的預測框。Non-maximum suppression(NMS)其核心思想在于抑制非極大值的目標,去除冗余,從而搜索出局部極大值的目標,找到最優值。
在我們對目標產生預測框后,往往會產生大量冗余的邊界框,因此我們需要去除位置準確率低的邊界框,保留位置準確率高的邊界框。NMS的主要步驟為:
1.對于每個種類的置信度按照從大到小的順序排序,選出置信度最高的邊框。
2.遍歷其余所有剩下的邊界框,計算這些邊界框與置信度最高的邊框的IOU值。如果某一邊界框和置信度最高的邊框IOU閾值大于我們所設定的IOU閾值,這意味著同一個物體被兩個重復的邊界框所預測,則去掉這這個邊框。
3.從未處理的邊框中再選擇一個置信度最高的值,重復第二步的過程,直到選出的邊框不再有與它超過IOU閾值的邊框。
5.損失函數
5.1 總損失
YOLOv5的損失主要由三個部分組成。分類損失,目標損失和定位損失。
Classes loss,分類損失,采用的是BCE loss,只計算正樣本的分類損失。
Objectness loss,置信度損失,采用的依然是BCE loss,指的是網絡預測的目標邊界框與GT Box的CIoU。這里計算的是所有樣本的損失。
Location loss,定位損失,采用的是CIoU loss,只計算正樣本的定位損失。
其中,lambda為平衡系數,分別為0.5,1和0.05。
5.2 定位損失 Location loss
IOU, intersection of Union交并比,它的作用是衡量目標檢測中預測框與真實框的重疊程度。假設預測框為A,真實框為B,則IoU的表達式為
但是當預測框與真實框沒有相交時,IoU不能反映兩者之間的距離,并且此時IoU損失為0,將會影響梯度回傳,從而導致無法訓練。此外,IoU無法精確的反映預測框與真實框的重合度大小。YOLOv5默認使用CIoU來計算邊界框損失。其中DIoU將預測框和真實框之間的距離,重疊率以及尺度等因素都考慮了進去,使得目標框回歸變得更加穩定。CIoU是在DIoU的基礎上,遵循與IoU相同的定義,進一步考慮了Bounding Box的寬和高的比。即將比較對象的形狀屬性編碼為區域(region)屬性;b)維持IoU的尺寸不變性;c) 在重疊對象的情況下確保與IoU的強相關性。
DIoU的損失函數為
其中b和b^gt 分別表示預測框和真實框的中心點,ρ表示兩個中心點之間的歐式距離,c表示預測框和真實框的最小閉包區域的對角線距離,gt是ground truth縮寫
如下圖所示:
CIoU是在DIoU的懲罰項基礎上添加了一個影響因子αv,這個因子將預測框的寬高比和真實框的寬高比考慮進去,即CIoU的損失計算公式為
其中α是權重參數,它的表達式為
v是用來衡量寬高比的一致性,它的表達式為
5.3 分類損失
YOLOv5默認使用二元交叉熵函數來計算分類損失。二元交叉熵函數的定義為
其中y為輸入樣本對應的標簽(正樣本為1,負樣本為0),p為模型預測該輸入樣本為正樣本的概率。假設,交叉熵函數的定義可簡化為
YOLOv5使用二元交叉熵損失函數計算類別概率和目標置信度得分的損失,各個標簽不是互斥的。YOLOv5使用多個獨立的邏輯(logistic)分類器替換softmax函數,以計算輸入屬于特定標簽的可能性。在計算分類損失進行訓練時,對每個標簽使用二元交叉熵損失。這也避免使用softmax函數而降低了計算復雜度。
5.4 置信度損失
每個預測框的置信度表示這個預測框的可靠程度,值越大表示該預測框越可靠,也表示越接近真實框。對于置信度標簽,YOLO之前的版本認為所有存在目標的網格(正樣本)對應的標簽值均為1,其余網格(負樣本)對應的標簽值為0。但是這樣帶來的問題是有些預測框可能只是在目標的周圍,而并不能精準預測框的位置。因此YOLOv5的做法是,根據網格對應的預測框與真實框的CIoU作為該預測框的置信度標簽。與計算分類損失一樣,YOLOv5默認使用二元交叉熵函數來計算置信度損失。
同時,對于目標損失,在不同的預測特征層也給予了不同權重。這些
在源碼中,針對預測小目標的預測特征層采用的權重是4.0,針對預測中等目標的預測特征層采用的權重是1.0,針對預測大目標的預測特征層采用的權重是0.4,作者說這是針對COCO數據集設置的超參數。
【以上信息由艾博檢測整理發布,如有出入請及時指正,如有引用請注明出處,歡迎一起討論,我們一直在關注其發展!專注:CCC/SRRC/CTA/運營商入庫】
審核編輯黃宇
-
數據
+關注
關注
8文章
7139瀏覽量
89579 -
算法
+關注
關注
23文章
4630瀏覽量
93356 -
預測
+關注
關注
0文章
38瀏覽量
12386
發布評論請先 登錄
相關推薦
【YOLOv5】LabVIEW+YOLOv5快速實現實時物體識別(Object Detection)含源碼
在RK3568教學實驗箱上實現基于YOLOV5的算法物體識別案例詳解
龍哥手把手教你學視覺-深度學習YOLOV5篇
怎樣使用PyTorch Hub去加載YOLOv5模型
如何YOLOv5測試代碼?
yolov5模型onnx轉bmodel無法識別出結果如何解決?
基于YOLOv5的目標檢測文檔進行的時候出錯如何解決?
在C++中使用OpenVINO工具包部署YOLOv5模型
【教程】yolov5訓練部署全鏈路教程
![【教程】<b class='flag-5'>yolov5</b>訓練部署全鏈路教程](https://file.elecfans.com/web2/M00/89/A7/pYYBAGO30yuAWGRaAAEMf3_1fvc505.png)
yolov5和YOLOX正負樣本分配策略
![<b class='flag-5'>yolov5</b>和YOLOX正負樣本分配策略](https://file1.elecfans.com/web2/M00/90/65/wKgZomTZpAGAL2OrAAALvAFuRhg212.jpg)
評論