天天看點

Yolo發展史(v4/v5的創新點彙總!)

大家好,接上面一篇文章:網易面試原題|簡述Yolo系列網絡的發展史

原問題是

YoLo

系列網絡的發展。這篇文章,我們主要看下

YoLov4

YoLov5

的創新點。

看文章之前,别忘了關注我哈~ 向你

Salute

呀!

YOLOv4

YOLOv4的三大貢獻:

  1. 設計了強大而高效的檢測模型,任何人都可以用 1080Ti 和 2080Ti訓練這個超快而精準的模型。
  2. 驗證了很多近幾年 SOTA 的深度學習目标檢測訓練技巧。
  3. 修改了很多 SOTA 的方法, 讓它們對單GPU訓練更加高效,例如 CmBN,PAN,SAM等。

作者總結了近幾年的單階段和雙階段的目标檢測算法以及技巧,并用一個圖概括了單階段和雙階段目标檢測網絡的差别,two-stage的檢測網絡,相當于在one-stage的密集檢測上增加了一個稀疏的預測器

Yolo發展史(v4/v5的創新點彙總!)

作者也對多種方法進行實驗,做了詳盡的測試,作者将那些增加模型性能,隻在訓練階段耗時增多,但不影響推理耗時的技巧稱為 —— bag of freebies;而那些微微提高了推理耗時,卻顯著提升性能的,叫做 —— bag of specials。

bag of freebies

資料增強

  • 光度變換
    • 調整亮度,對比度,色相,飽和度和噪點
  • 幾何變換
    • 随機縮放,裁剪,翻轉和旋轉
  • 模拟目标遮擋
    • random erase
    • CutOut
    • Hide and Seek
    • grid Mask
  • 圖像融合
    • MixUp
    • CutMix
    • Mosaic

常見的正則化方法:

  • DropOut
  • DropConnect
  • DropBlock

處理資料不平衡

  • two-stage網絡使用的難例挖掘,但是這種方式不适合one-stage檢測
  • Focal Loss

标簽平滑(Label Smoothing)

邊界框回歸的損失函數

  • IOU Loss
  • GIOU Loss
  • DIOU Loss
  • CIOU Loss

Bag of specials

增強感受野

  • SPP
  • ASPP
  • RFB

注意力子產品

  • 通道注意力(channel-wise)
    • SE
  • 空間注意力(point-wise)
    • SAM

特征融合

  • 跳層連接配接
  • FPN
  • SFAM
  • ASFF
  • BiFPN(EfficientNet中提出)

激活函數

  • LReLU(解決當輸入小于0時ReLU梯度為0的情況)
  • PReLU(解決當輸入小于0時ReLU梯度為0的情況)
  • ReLU6(專門為量化網絡設計)
  • hard-swish(專門為量化網絡設計)
  • SELU(對神經網絡進行自歸一化)
  • Swish(連續可微激活函數)
  • Mish(連續可微激活函數)

後處理方式

  • NMS
  • soft NMS
  • DIOU NMS(在soft NMS的基礎上将重心距離的資訊添加到删選BBOx的過程中)

YOLOv4網絡結構

圖檔引自:江大白

Yolo發展史(v4/v5的創新點彙總!)

YOLOv4整個網絡架構組成

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

YOLOv4 各部分使用到的Bags:

Bag of Freebies (BoF) for backbone:

  • CutMix、Mosaic data augmentation
  • DropBlock regularization
  • Class label smoothing

Bag of Specials (BoS) for backbone:

  • Mish activation
  • Cross-stage partial connections (CSP)
  • Multiinput weighted residual connections (MiWRC)

Bag of Freebies (BoF) for detector:

  • CIoU-loss
  • CmBN
  • DropBlock regularization
  • Mosaic data augmentation
  • Self-Adversarial Training
  • Eliminate grid sensitivity
  • Using multiple anchors for a single ground truth
  • Cosine annealing scheduler
  • Optimal hyperparameters
  • Random training shapes

Bag of Specials (BoS) for detector:

  • Mish activation
  • SPP-block
  • SAM-block
  • PAN path-aggregation block
  • DIoU-NMS

BackBone

CSPDarknet53是在Yolov3主幹網絡Darknet53的基礎上,借鑒2019年CSPNet的經驗,産生的Backbone結構,其中包含了5個CSP子產品。作者在實驗中得到結論,CSPResNeX50分類精度比CSPDarknet,但是檢測性能卻不如後者。

Yolo發展史(v4/v5的創新點彙總!)

每個CSP子產品第一個卷積核的大小都是

3 \times 3

,stride=2,是以可以起到下采樣的作用。因為Backbone有5個CSP子產品,輸入圖像是

608 \times 608

,是以特征圖變化的規律是:

608->304->152->76->38->19

YOLOv4 和 YOLOv5 都使用 CSPDarknet作為BackBone,從輸入圖像中提取豐富的特征資訊。CSPNet叫做Cross Stage Partial Network,跨階段局部網絡。其解決了其他大型卷積網絡結構中的重複梯度問題,減少模型參數和FLOPS。這對 YOLO 有重要的意義,即保證了推理速度和準确率,又減小了模型尺寸。

CSPNet的作者認為推理計算過高的問題是由于網絡優化中的梯度資訊重複導緻的。CSPNet基于Densnet的思想,複制基礎層的特征映射圖,通過dense block 傳遞到下一個階段進行合并,進而将基礎層的特征映射圖分離出來。這樣可以實作更豐富的梯度組合,同時減少計算量。

Yolo發展史(v4/v5的創新點彙總!)

Cross Stage Partial DenseNet

是以Yolov4在主幹網絡Backbone采用CSPDarknet53網絡結構,主要有三個方面的優點:

  • 優點一:增強CNN的學習能力,使得在輕量化的同時保持準确性。
  • 優點二:降低計算瓶頸
  • 優點三:降低記憶體成本

詳細了解CSPNet,https://zhuanlan.zhihu.com/p/124838243

而且作者隻在Backbone中采用了Mish激活函數,網絡後面仍然采用Leaky_relu激活函數。Yolov4作者實驗測試時,使用CSPDarknet53網絡在ImageNet資料集上做圖像分類任務,發現使用了Mish激活函數的TOP-1和TOP-5的精度比沒有使用時精度要高一些。是以在設計Yolov4目标檢測任務時,主幹網絡Backbone還是使用Mish激活函數。

Yolo發展史(v4/v5的創新點彙總!)

資料增強

Yolo發展史(v4/v5的創新點彙總!)

YOLOv4用到的資料增強方法

Mosaic是一種新的混合4幅訓練圖像的資料增強方法,使四個不同的上下文資訊被混合,豐富了圖像的上下文資訊,這使得網絡能夠檢測正常圖像之外的對象,增強模型的魯棒性。此外,批處理規範化BN層從每一層上的4個不同圖像計算激活統計資訊。這大大減少了對large mini-batch-size的需求。Mosaic,就是把四張圖檔拼接為一張圖檔,這等于變相的增大了一次訓練的圖檔數量,可以讓最小批數量進一步降低,讓在單GPU上訓練更為輕松。

Yolo發展史(v4/v5的創新點彙總!)

Mosaic資料增強

在YOLOv4中,通過引入CutMix和Mosaic資料增強、類标簽平滑和Mish激活等功能,分類精度得到了提高。是以,本文用于分類訓練的BoF骨幹(免費包)包括以下内容:CutMix和Mosaic資料增強和類标簽平滑。此外,本文使用Mish激活作為補充選項,

DropBlock

Yolov4中使用的Dropblock,其實和常見網絡中的Dropout功能類似,也是緩解過拟合的一種正則化方式。傳統的Dropout很簡單,一句話就可以說的清:随機删除減少神經元的數量,使網絡變得更簡單。

Yolo發展史(v4/v5的創新點彙總!)

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

Yolo發展史(v4/v5的創新點彙總!)

上圖中,中間Dropout的方式會随機的删減丢棄一些資訊,但Dropblock的研究者認為,卷積層對于這種随機丢棄并不敏感,因為卷積層通常是三層連用:卷積+激活+池化層,池化層本身就是對相鄰單元起作用。而且即使随機丢棄,卷積層仍然可以從相鄰的激活單元學習到相同的資訊。是以,在全連接配接層上效果很好的Dropout在卷積層上效果并不好。是以右圖Dropblock的研究者則幹脆整個局部區域進行删減丢棄。

這種方式其實是借鑒2017年的cutout資料增強的方式,cutout是将輸入圖像的部分區域清零,而Dropblock則是将Cutout應用到每一個特征圖。而且并不是用固定的歸零比率,而是在訓練時以一個小的比率開始,随着訓練過程線性的增加這個比率。

Dropblock的研究者與Cutout進行對比驗證時,發現有幾個特點:

  • Dropblock的效果優于Cutout
  • Cutout隻能作用于輸入層,而Dropblock則是将Cutout應用到網絡中的每一個特征圖上
  • Dropblock可以定制各種組合,在訓練的不同階段可以修改删減的機率,從空間層面和時間層面,和Cutout相比都有更精細的改進。

Yolov4中直接采用了更優的Dropblock,對網絡進行正則化。

Neck創新

Yolov4的Neck結構主要采用了SPP子產品、FPN+PAN的方式。

SPP

Yolo發展史(v4/v5的創新點彙總!)

作者在SPP子產品中,使用

k={1 \times 1,5 \times 5,9 \times 9,13 \times 13}

的最大池化的方式,再将不同尺度的特征圖進行Concat操作。最大池化采用padding操作,移動的步長為1,比如

13×13

的輸入特征圖,使用

5×5

大小的池化核池化,

padding=2

,是以池化後的特征圖仍然是

13×13

大小。

Yolo發展史(v4/v5的創新點彙總!)

和Yolov4作者的研究相同,采用SPP子產品的方式,比單純的使用

k \times k

最大池化的方式,更有效的增加BackBone感受野。Yolov4的作者在使用

608 \times 608

大小的圖像進行測試時發現,在COCO目标檢測任務中,以0.5%的額外計算代價将AP50增加了2.7%,是以Yolov4中也采用了SPP子產品。

FPN+PAN

Yolo發展史(v4/v5的創新點彙總!)

Yolov4在FPN層的後面還添加了一個自底向上的特征金字塔。這樣結合操作,FPN層自頂向下傳達強語義特征,而特征金字塔則自底向上傳達強定位特征,兩兩聯手,從不同的主幹層對不同的檢測層進行參數聚合。

FPN+PAN借鑒的是18年CVPR的PANet,當時主要應用于圖像分割領域,但Alexey将其拆分應用到Yolov4中,進一步提高特征提取的能力。

原本的PANet網絡的PAN結構中,兩個特征圖結合是采用shortcut操作,而Yolov4中則采用concat(route)操作,特征圖融合後的尺寸發生了變化。

Yolo發展史(v4/v5的創新點彙總!)

Head頭

CmBN

CmBN 為 CBN 的改進版本,定義為交叉小批量歸一化 (CmBN)。這僅在單個批次内的小批次之間收集統計資訊(收集一個batch内多個mini-batch内的統計資料)。

Yolo發展史(v4/v5的創新點彙總!)

Bounding Box Regeression 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。

IOU LOSS

IOU Loss主要考慮檢測框和目标框的重疊面積,公式如下:

IOU Loss = 1 - IOU = 1 - \frac{A \cap B}{A \cup B}

IOU Loss存在兩個問題:

  • 問題一:當預測框和目标框不相交時,也就是當IOU=0時,無法反映兩個框距離的遠近,此時損失函數不可導。是以IOU Loss無法優化兩個框不相交的情況
  • 問題二:當兩個預測框和同一個目标框相重疊,且兩者IOU相同,這時IOU Loss對兩個預測框的懲罰相同,無法區分兩個預測框與GT目标框的相交情況

GIOU Loss

由于IOU Loss的不足,2019年提出了GIOU Loss,我們先定義一下符号:

Yolo發展史(v4/v5的創新點彙總!)

定義

A

為預測框,

B

為目标框,

C

為目标框和預測框的最小外接矩形,公式如下:

差集 = C - A \cup B

GIOU Loss = 1-GIOU = 1-(IOU - \frac{|差集|}{|C|})

可以看到,相比于IOU Loss,GIOU Loss衡量了目标框和預測框的相交程度,緩解了IOU Loss的問題。

但是當預測框在目标框内部,且預測框大小一緻時,這時候預測框和目标框的差集相等,這是GIOU Loss會退化成IOU Loss,無法區分各個預測框的位置關系。

Yolo發展史(v4/v5的創新點彙總!)

DIOU Loss 和 CIOU Loss

好的目标框回歸函數應該考慮三個重要幾何因素:重疊面積、中心點距離,長寬比。

針對IOU Loss和GIOU Loss存在的問題,DIOU Loss考慮重疊面積、中心點距離,公式如下:

設:

C

為預測框和目标框的最小外接矩形,

Distance \_ C

表示最小外接矩形的對角線距離,

Distance \_ 2

表示預測框的中心點到目标框中心點的歐式距離

DIOU \ Loss = 1 - DIOU = 1-(IOU - \frac{Distance \_ 2}{Distance \_ C})

由上述公式可以看出,當遇到GIOU Loss 無法解決的問題時,DIOU即考慮了重疊面積,也考慮了目标框和預測框的中心點的距離,就可以衡量兩者之間的位置關系。是以當目标框包裹預測框的時候,DIOU可以衡量兩者之間的距離。

Yolo發展史(v4/v5的創新點彙總!)

但是DIOU Loss沒有考慮長寬比,當預測框在目标框内部時,且多個預測框的中心點的位置都一樣時,這時候DIOU Loss無法區分這幾個預測框的位置。

Yolo發展史(v4/v5的創新點彙總!)

是以提出了CIOU Loss,其在DIOU Loss的基礎上增加了一個影響因子,将預測框和目标框的長寬比都考慮進去,公式如下:

CIOU \ Loss = 1 - CIOU = 1 - (IOU - \frac{Distance \_ 2^2}{Distance \_C ^2} - \frac{v^2}{(1-IOU)+v})

其中,

v

是一個衡量長寬比一緻性的參數,我們可以定義為:

v = \frac{4}{Π^2}(arctan \frac{w^{gt}}{h^{gt}} - arctan \frac{w^p}{h^p})^2

gt

代表目标框,

p

代表預測框。

至此,CIOU Loss包含了一個好的預測框回歸函數的三個重要的幾何因素:重疊面積、中心點距離、長寬比。

NMS

NMS主要用于預選框的篩選,常用于目标檢測算法中,一般采用普通的nms的方式,Yolov4則借鑒上面D/CIOU loss的論文:https://arxiv.org/pdf/1911.08287.pdf

Yolo發展史(v4/v5的創新點彙總!)

因為DIOU在計算loss的時候,需要考慮邊界框中心點的位置資訊,是以一些重疊物體也可以回歸出來。是以在重疊目标的檢測中,DIOU_nms的效果優于傳統的nms。

CIOU Loss的性能要比DIOU Loss好,那為什麼不用CIOU_nms,而用DIOU_nms?

因為CIOU_loss,是在DIOU_loss的基礎上,添加了一個的影響因子,包含groundtruth标注框的資訊,在訓練時用于回歸。但是NMS在推理過程中,并不需要groundtruth的資訊,是以CIOU NMS不可使用。

CIOU Loss 代碼

def box_ciou(b1, b2):
    """
    輸入為:
    ----------
    b1: tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh
    b2: tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh

    傳回為:
    -------
    ciou: tensor, shape=(batch, feat_w, feat_h, anchor_num, 1)
    """
    # 求出預測框左上角右下角
    b1_xy = b1[..., :2]
    b1_wh = b1[..., 2:4]
    b1_wh_half = b1_wh/2.
    b1_mins = b1_xy - b1_wh_half
    b1_maxes = b1_xy + b1_wh_half
    # 求出真實框左上角右下角
    b2_xy = b2[..., :2]
    b2_wh = b2[..., 2:4]
    b2_wh_half = b2_wh/2.
    b2_mins = b2_xy - b2_wh_half
    b2_maxes = b2_xy + b2_wh_half

    # 求真實框和預測框所有的iou
    intersect_mins = torch.max(b1_mins, b2_mins)
    intersect_maxes = torch.min(b1_maxes, b2_maxes)
    intersect_wh = torch.max(intersect_maxes - intersect_mins, torch.zeros_like(intersect_maxes))
    intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1]
    b1_area = b1_wh[..., 0] * b1_wh[..., 1]
    b2_area = b2_wh[..., 0] * b2_wh[..., 1]
    union_area = b1_area + b2_area - intersect_area
    iou = intersect_area / torch.clamp(union_area,min = 1e-6)

    # 計算中心的差距
    center_distance = torch.sum(torch.pow((b1_xy - b2_xy), 2), axis=-1)
    
    # 找到包裹兩個框的最小框的左上角和右下角
    enclose_mins = torch.min(b1_mins, b2_mins)
    enclose_maxes = torch.max(b1_maxes, b2_maxes)
    enclose_wh = torch.max(enclose_maxes - enclose_mins, torch.zeros_like(intersect_maxes))
    # 計算對角線距離
    enclose_diagonal = torch.sum(torch.pow(enclose_wh,2), axis=-1)
    ciou = iou - 1.0 * (center_distance) / torch.clamp(enclose_diagonal,min = 1e-6)
    
    v = (4 / (math.pi ** 2)) * torch.pow((torch.atan(b1_wh[..., 0]/torch.clamp(b1_wh[..., 1],min = 1e-6)) - torch.atan(b2_wh[..., 0]/torch.clamp(b2_wh[..., 1],min = 1e-6))), 2)
    alpha = v / torch.clamp((1.0 - iou + v),min=1e-6)
    ciou = ciou - alpha * v
    return ciou
  
def clip_by_tensor(t,t_min,t_max):
    t=t.float()
    result = (t >= t_min).float() * t + (t < t_min).float() * t_min
    result = (result <= t_max).float() * result + (result > t_max).float() * t_max
    return result
           

複制

YOLOv5

yolov5沒有釋出論文,是以更加精細的内容,隻能研究其代碼,該代碼倉庫仍然保持高頻率更新:https://github.com/ultralytics/yolov5

YOLOv5 ? 是一系列在 COCO 資料集上預訓練的對象檢測架構和模型,代表 Ultralytics 對未來視覺 AI 方法的開源研究,結合了在數千小時的研究和開發中獲得的經驗教訓和最佳實踐。

網絡模型結構

YOLOv5給出了四種版本的目标檢測網絡,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四個模型。YOLOv5s是深度最淺,特征圖的寬度最窄的網絡,後面三種在此基礎上不斷加深,加寬。YOLOv5s的網絡結構圖如下所示:

Yolo發展史(v4/v5的創新點彙總!)

YOLOv5s網絡架構圖

YOLOv5各部分改進

  • 輸入端:Mosaic資料增強、自适應錨框計算
  • Backbone:Focus結構,CSP結構
  • Neck:FPN+PAN結構
  • Prediction:GIOU_Loss

Mosaic資料增強

YOLOV5會進行三種資料增強:縮放,色彩空間調整和馬賽克增強。其中馬賽克增強是通過将四張圖像進行随機縮放、随機裁剪、随機分布方式進行拼接,小目标的檢測效果得到提升。

Yolo發展史(v4/v5的創新點彙總!)

自适應錨框計算

YOLO系列中,可以針對資料集設定初始的Anchor。在網絡訓練中,網絡在Anchor的基礎上輸出預測框,進而和GT框進行比較,計算loss,在反向更新,疊代網絡參數。在YOLOv3、4版本中,設定初始Anchor的大小都是通過單獨的程式使用K-means算法得到,但是在YOLOv5中,将此功能嵌入到代碼中,每次訓練資料集之前,都會自動計算該資料集最合适的Anchor尺寸,該功能可以在代碼中設定超參數進行關閉。

Yolo發展史(v4/v5的創新點彙總!)

train.py中上面一行代碼,設定成False,每次訓練時,不會自動計算。

CSP BackBone-跨階段局部網絡

YOLOv4 和 YOLOv5 都使用 CSPDarknet作為BackBone,從輸入圖像中提取豐富的特征資訊。CSPNet叫做Cross Stage Partial Network,跨階段局部網絡。其解決了其他大型卷積網絡結構中的重複梯度問題,減少模型參數和FLOPS。這對 YOLO 有重要的意義,即保證了推理速度和準确率,又減小了模型尺寸。

YOLOv4隻有主幹網絡中使用了CSP結構,而YOLOv5中設計了兩種CSP結構,CSP1_X應用于BackBone主幹網絡,另一種CSP_2X結構則應用于Neck中。

Yolo發展史(v4/v5的創新點彙總!)

Focus結構

Focus結構,在Yolov3&Yolov4中并沒有這個結構,其中比較關鍵是切片操作。

Yolo發展史(v4/v5的創新點彙總!)

比如上圖的切片示意圖,

4 \times \times 4 \times 3

的圖像切片後變成

2 \times 2 \times 12

的特征圖。

Yolo發展史(v4/v5的創新點彙總!)

以Yolov5s的結構為例,原始

608 \times 608 \times 3

的圖像輸入Focus結構,采用切片操作,先變成

304 \times 304 \times 12

的特征圖,再經過一次32個卷積核的卷積操作,最終變成

304 \times 304 \times 32

的特征圖。

需要注意的是:Yolov5s的Focus結構最後使用了32個卷積核,而其他三種結構,使用的卷積核數量有所增加。

作者原話:Focus() module is designed for FLOPS reduction and speed increase, not mAP increase.

作用:減少FLOPs,提高速度,對于模型的精度mAP沒有提升。

Neck

Yolov5現在的Neck和Yolov4中一樣,都采用FPN+PAN的結構,但在Yolov5剛出來時,隻使用了FPN結構,後面才增加了PAN結構,此外網絡中其他部分也進行了調整。

Yolo發展史(v4/v5的創新點彙總!)

但如上面CSPNet結構中講到,Yolov5和Yolov4的不同點在于,

Yolov4的Neck結構中,采用的都是普通的卷積操作。而Yolov5的Neck結構中,采用借鑒CSPnet設計的CSP2_X結構,加強網絡特征融合的能力。

Yolo發展史(v4/v5的創新點彙總!)

Bounding Box的損失函數

Yolov5中采用其中的GIOU_Loss做Bounding box的損失函數。而Yolov4中采用CIOU_Loss作為目标Bounding box的損失。

nms非極大值抑制

在目标檢測的後處理過程中,針對很多目标框的篩選,通常需要nms操作。

因為CIOU_Loss中包含影響因子v,涉及groudtruth的資訊,而測試推理時,是沒有groundtruth的。

是以Yolov4在DIOU_Loss的基礎上采用DIOU_nms的方式,而Yolov5中采用權重nms的方式。

采用DIOU_nms,對于遮擋問題,檢出效果有所提升。

在回歸框的損失函數和使用NMS删除備援預選框上,YOLOv4使用的方法要比v5的方法更有優勢。

參考連結

  1. https://www.yuque.com/darrenzhang/cv/tg215h
  2. http://arxiv.org/abs/2004.10934
  3. https://blog.csdn.net/nan355655600/article/details/106246625
  4. https://zhuanlan.zhihu.com/p/172121380
  5. https://www.zhihu.com/question/399884529