Yolo發(fā)展史(v4/v5的創(chuàng)新點(diǎn)匯總!)
大家好,接上面一篇文章:網(wǎng)易面試原題|簡(jiǎn)述Yolo系列網(wǎng)絡(luò)的發(fā)展史
原問(wèn)題是系列網(wǎng)絡(luò)的發(fā)展。這篇文章,我們主要看下與的創(chuàng)新點(diǎn)。
看文章之前,別忘了關(guān)注我哈~ 向你呀!
YOLOv4
YOLOv4的三大貢獻(xiàn):
設(shè)計(jì)了強(qiáng)大而高效的檢測(cè)模型,任何人都可以用 1080Ti 和 2080Ti訓(xùn)練這個(gè)超快而精準(zhǔn)的模型。 驗(yàn)證了很多近幾年 SOTA 的深度學(xué)習(xí)目標(biāo)檢測(cè)訓(xùn)練技巧。 修改了很多 SOTA 的方法, 讓它們對(duì)單GPU訓(xùn)練更加高效,例如 CmBN,PAN,SAM等。
作者總結(jié)了近幾年的單階段和雙階段的目標(biāo)檢測(cè)算法以及技巧,并用一個(gè)圖概括了單階段和雙階段目標(biāo)檢測(cè)網(wǎng)絡(luò)的差別,two-stage的檢測(cè)網(wǎng)絡(luò),相當(dāng)于在one-stage的密集檢測(cè)上增加了一個(gè)稀疏的預(yù)測(cè)器
作者也對(duì)多種方法進(jìn)行實(shí)驗(yàn),做了詳盡的測(cè)試,作者將那些增加模型性能,只在訓(xùn)練階段耗時(shí)增多,但不影響推理耗時(shí)的技巧稱為 —— bag of freebies;而那些微微提高了推理耗時(shí),卻顯著提升性能的,叫做 —— bag of specials。
bag of freebies
數(shù)據(jù)增強(qiáng)
光度變換 調(diào)整亮度,對(duì)比度,色相,飽和度和噪點(diǎn) 幾何變換 隨機(jī)縮放,裁剪,翻轉(zhuǎn)和旋轉(zhuǎn) 模擬目標(biāo)遮擋 random erase CutOut Hide and Seek grid Mask 圖像融合 MixUp CutMix Mosaic
常見(jiàn)的正則化方法:
DropOut DropConnect DropBlock
處理數(shù)據(jù)不平衡
two-stage網(wǎng)絡(luò)使用的難例挖掘,但是這種方式不適合one-stage檢測(cè) Focal Loss
標(biāo)簽平滑(Label Smoothing)
邊界框回歸的損失函數(shù)
IOU Loss GIOU Loss DIOU Loss CIOU Loss
Bag of specials
增強(qiáng)感受野
SPP ASPP RFB
注意力模塊
通道注意力(channel-wise) SE 空間注意力(point-wise) SAM
特征融合
跳層連接 FPN SFAM ASFF BiFPN(EfficientNet中提出)
激活函數(shù)
LReLU(解決當(dāng)輸入小于0時(shí)ReLU梯度為0的情況) PReLU(解決當(dāng)輸入小于0時(shí)ReLU梯度為0的情況) ReLU6(專門為量化網(wǎng)絡(luò)設(shè)計(jì)) hard-swish(專門為量化網(wǎng)絡(luò)設(shè)計(jì)) SELU(對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行自歸一化) Swish(連續(xù)可微激活函數(shù)) Mish(連續(xù)可微激活函數(shù))
后處理方式
NMS soft NMS DIOU NMS(在soft NMS的基礎(chǔ)上將重心距離的信息添加到刪選BBOx的過(guò)程中)
YOLOv4網(wǎng)絡(luò)結(jié)構(gòu)
圖片引自:江大白
YOLOv4整個(gè)網(wǎng)絡(luò)架構(gòu)組成
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主干網(wǎng)絡(luò)Darknet53的基礎(chǔ)上,借鑒2019年CSPNet的經(jīng)驗(yàn),產(chǎn)生的Backbone結(jié)構(gòu),其中包含了5個(gè)CSP模塊。作者在實(shí)驗(yàn)中得到結(jié)論,CSPResNeX50分類精度比CSPDarknet,但是檢測(cè)性能卻不如后者。

每個(gè)CSP模塊第一個(gè)卷積核的大小都是 ,stride=2,因此可以起到下采樣的作用。因?yàn)锽ackbone有5個(gè)CSP模塊,輸入圖像是,所以特征圖變化的規(guī)律是:。
YOLOv4 和 YOLOv5 都使用 CSPDarknet作為BackBone,從輸入圖像中提取豐富的特征信息。CSPNet叫做Cross Stage Partial Network,跨階段局部網(wǎng)絡(luò)。其解決了其他大型卷積網(wǎng)絡(luò)結(jié)構(gòu)中的重復(fù)梯度問(wèn)題,減少模型參數(shù)和FLOPS。這對(duì) YOLO 有重要的意義,即保證了推理速度和準(zhǔn)確率,又減小了模型尺寸。
CSPNet的作者認(rèn)為推理計(jì)算過(guò)高的問(wèn)題是由于網(wǎng)絡(luò)優(yōu)化中的梯度信息重復(fù)導(dǎo)致的。CSPNet基于Densnet的思想,復(fù)制基礎(chǔ)層的特征映射圖,通過(guò)dense block 傳遞到下一個(gè)階段進(jìn)行合并,從而將基礎(chǔ)層的特征映射圖分離出來(lái)。這樣可以實(shí)現(xiàn)更豐富的梯度組合,同時(shí)減少計(jì)算量。

因此Yolov4在主干網(wǎng)絡(luò)Backbone采用CSPDarknet53網(wǎng)絡(luò)結(jié)構(gòu),主要有三個(gè)方面的優(yōu)點(diǎn):
優(yōu)點(diǎn)一:增強(qiáng)CNN的學(xué)習(xí)能力,使得在輕量化的同時(shí)保持準(zhǔn)確性。 優(yōu)點(diǎn)二:降低計(jì)算瓶頸 優(yōu)點(diǎn)三:降低內(nèi)存成本
詳細(xì)了解CSPNet,https://zhuanlan.zhihu.com/p/124838243
而且作者只在Backbone中采用了Mish激活函數(shù),網(wǎng)絡(luò)后面仍然采用Leaky_relu激活函數(shù)。Yolov4作者實(shí)驗(yàn)測(cè)試時(shí),使用CSPDarknet53網(wǎng)絡(luò)在ImageNet數(shù)據(jù)集上做圖像分類任務(wù),發(fā)現(xiàn)使用了Mish激活函數(shù)的TOP-1和TOP-5的精度比沒(méi)有使用時(shí)精度要高一些。因此在設(shè)計(jì)Yolov4目標(biāo)檢測(cè)任務(wù)時(shí),主干網(wǎng)絡(luò)Backbone還是使用Mish激活函數(shù)。

數(shù)據(jù)增強(qiáng)

Mosaic是一種新的混合4幅訓(xùn)練圖像的數(shù)據(jù)增強(qiáng)方法,使四個(gè)不同的上下文信息被混合,豐富了圖像的上下文信息,這使得網(wǎng)絡(luò)能夠檢測(cè)正常圖像之外的對(duì)象,增強(qiáng)模型的魯棒性。此外,批處理規(guī)范化BN層從每一層上的4個(gè)不同圖像計(jì)算激活統(tǒng)計(jì)信息。這大大減少了對(duì)large mini-batch-size的需求。Mosaic,就是把四張圖片拼接為一張圖片,這等于變相的增大了一次訓(xùn)練的圖片數(shù)量,可以讓最小批數(shù)量進(jìn)一步降低,讓在單GPU上訓(xùn)練更為輕松。

在YOLOv4中,通過(guò)引入CutMix和Mosaic數(shù)據(jù)增強(qiáng)、類標(biāo)簽平滑和Mish激活等功能,分類精度得到了提高。因此,本文用于分類訓(xùn)練的BoF骨干(免費(fèi)包)包括以下內(nèi)容:CutMix和Mosaic數(shù)據(jù)增強(qiáng)和類標(biāo)簽平滑。此外,本文使用Mish激活作為補(bǔ)充選項(xiàng),
DropBlock
Yolov4中使用的Dropblock,其實(shí)和常見(jiàn)網(wǎng)絡(luò)中的Dropout功能類似,也是緩解過(guò)擬合的一種正則化方式。傳統(tǒng)的Dropout很簡(jiǎn)單,一句話就可以說(shuō)的清:隨機(jī)刪除減少神經(jīng)元的數(shù)量,使網(wǎng)絡(luò)變得更簡(jiǎn)單。
而Dropblock和Dropout相似,比如下圖:
上圖中,中間Dropout的方式會(huì)隨機(jī)的刪減丟棄一些信息,但Dropblock的研究者認(rèn)為,卷積層對(duì)于這種隨機(jī)丟棄并不敏感,因?yàn)榫矸e層通常是三層連用:卷積+激活+池化層,池化層本身就是對(duì)相鄰單元起作用。而且即使隨機(jī)丟棄,卷積層仍然可以從相鄰的激活單元學(xué)習(xí)到相同的信息。因此,在全連接層上效果很好的Dropout在卷積層上效果并不好。所以右圖Dropblock的研究者則干脆整個(gè)局部區(qū)域進(jìn)行刪減丟棄。
這種方式其實(shí)是借鑒2017年的cutout數(shù)據(jù)增強(qiáng)的方式,cutout是將輸入圖像的部分區(qū)域清零,而Dropblock則是將Cutout應(yīng)用到每一個(gè)特征圖。而且并不是用固定的歸零比率,而是在訓(xùn)練時(shí)以一個(gè)小的比率開(kāi)始,隨著訓(xùn)練過(guò)程線性的增加這個(gè)比率。
Dropblock的研究者與Cutout進(jìn)行對(duì)比驗(yàn)證時(shí),發(fā)現(xiàn)有幾個(gè)特點(diǎn):
Dropblock的效果優(yōu)于Cutout Cutout只能作用于輸入層,而Dropblock則是將Cutout應(yīng)用到網(wǎng)絡(luò)中的每一個(gè)特征圖上 Dropblock可以定制各種組合,在訓(xùn)練的不同階段可以修改刪減的概率,從空間層面和時(shí)間層面,和Cutout相比都有更精細(xì)的改進(jìn)。
Yolov4中直接采用了更優(yōu)的Dropblock,對(duì)網(wǎng)絡(luò)進(jìn)行正則化。
Neck創(chuàng)新
Yolov4的Neck結(jié)構(gòu)主要采用了SPP模塊、FPN+PAN的方式。
SPP

作者在SPP模塊中,使用的最大池化的方式,再將不同尺度的特征圖進(jìn)行Concat操作。最大池化采用padding操作,移動(dòng)的步長(zhǎng)為1,比如的輸入特征圖,使用大小的池化核池化,,因此池化后的特征圖仍然是大小。

和Yolov4作者的研究相同,采用SPP模塊的方式,比單純的使用最大池化的方式,更有效的增加BackBone感受野。Yolov4的作者在使用大小的圖像進(jìn)行測(cè)試時(shí)發(fā)現(xiàn),在COCO目標(biāo)檢測(cè)任務(wù)中,以0.5%的額外計(jì)算代價(jià)將AP50增加了2.7%,因此Yolov4中也采用了SPP模塊。
FPN+PAN

Yolov4在FPN層的后面還添加了一個(gè)自底向上的特征金字塔。這樣結(jié)合操作,F(xiàn)PN層自頂向下傳達(dá)強(qiáng)語(yǔ)義特征,而特征金字塔則自底向上傳達(dá)強(qiáng)定位特征,兩兩聯(lián)手,從不同的主干層對(duì)不同的檢測(cè)層進(jìn)行參數(shù)聚合。
FPN+PAN借鑒的是18年CVPR的PANet,當(dāng)時(shí)主要應(yīng)用于圖像分割領(lǐng)域,但Alexey將其拆分應(yīng)用到Y(jié)olov4中,進(jìn)一步提高特征提取的能力。
原本的PANet網(wǎng)絡(luò)的PAN結(jié)構(gòu)中,兩個(gè)特征圖結(jié)合是采用shortcut操作,而Yolov4中則采用concat(route)操作,特征圖融合后的尺寸發(fā)生了變化。

Head頭
CmBN
CmBN 為 CBN 的改進(jìn)版本,定義為交叉小批量歸一化 (CmBN)。這僅在單個(gè)批次內(nèi)的小批次之間收集統(tǒng)計(jì)信息(收集一個(gè)batch內(nèi)多個(gè)mini-batch內(nèi)的統(tǒng)計(jì)數(shù)據(jù))。

Bounding Box Regeression Loss
目標(biāo)檢測(cè)任務(wù)的損失函數(shù)一般由Classificition Loss(分類損失函數(shù))和Bounding Box Regeression Loss(回歸損失函數(shù))兩部分構(gòu)成。
Bounding Box Regeression的Loss近些年的發(fā)展過(guò)程是:
Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)
我們從最常用的IOU_Loss開(kāi)始,進(jìn)行對(duì)比拆解分析,看下Yolov4為啥要選擇CIOU_Loss。
IOU LOSS
IOU Loss主要考慮檢測(cè)框和目標(biāo)框的重疊面積,公式如下:
IOU Loss存在兩個(gè)問(wèn)題:
問(wèn)題一:當(dāng)預(yù)測(cè)框和目標(biāo)框不相交時(shí),也就是當(dāng)IOU=0時(shí),無(wú)法反映兩個(gè)框距離的遠(yuǎn)近,此時(shí)損失函數(shù)不可導(dǎo)。所以IOU Loss無(wú)法優(yōu)化兩個(gè)框不相交的情況 問(wèn)題二:當(dāng)兩個(gè)預(yù)測(cè)框和同一個(gè)目標(biāo)框相重疊,且兩者IOU相同,這時(shí)IOU Loss對(duì)兩個(gè)預(yù)測(cè)框的懲罰相同,無(wú)法區(qū)分兩個(gè)預(yù)測(cè)框與GT目標(biāo)框的相交情況
GIOU Loss
由于IOU Loss的不足,2019年提出了GIOU Loss,我們先定義一下符號(hào):
定義為預(yù)測(cè)框,為目標(biāo)框,為目標(biāo)框和預(yù)測(cè)框的最小外接矩形,公式如下:
可以看到,相比于IOU Loss,GIOU Loss衡量了目標(biāo)框和預(yù)測(cè)框的相交程度,緩解了IOU Loss的問(wèn)題。
但是當(dāng)預(yù)測(cè)框在目標(biāo)框內(nèi)部,且預(yù)測(cè)框大小一致時(shí),這時(shí)候預(yù)測(cè)框和目標(biāo)框的差集相等,這是GIOU Loss會(huì)退化成IOU Loss,無(wú)法區(qū)分各個(gè)預(yù)測(cè)框的位置關(guān)系。
DIOU Loss 和 CIOU Loss
好的目標(biāo)框回歸函數(shù)應(yīng)該考慮三個(gè)重要幾何因素:重疊面積、中心點(diǎn)距離,長(zhǎng)寬比。
針對(duì)IOU Loss和GIOU Loss存在的問(wèn)題,DIOU Loss考慮重疊面積、中心點(diǎn)距離,公式如下:
設(shè):為預(yù)測(cè)框和目標(biāo)框的最小外接矩形,表示最小外接矩形的對(duì)角線距離,表示預(yù)測(cè)框的中心點(diǎn)到目標(biāo)框中心點(diǎn)的歐式距離
由上述公式可以看出,當(dāng)遇到GIOU Loss 無(wú)法解決的問(wèn)題時(shí),DIOU即考慮了重疊面積,也考慮了目標(biāo)框和預(yù)測(cè)框的中心點(diǎn)的距離,就可以衡量?jī)烧咧g的位置關(guān)系。所以當(dāng)目標(biāo)框包裹預(yù)測(cè)框的時(shí)候,DIOU可以衡量?jī)烧咧g的距離。
但是DIOU Loss沒(méi)有考慮長(zhǎng)寬比,當(dāng)預(yù)測(cè)框在目標(biāo)框內(nèi)部時(shí),且多個(gè)預(yù)測(cè)框的中心點(diǎn)的位置都一樣時(shí),這時(shí)候DIOU Loss無(wú)法區(qū)分這幾個(gè)預(yù)測(cè)框的位置。
所以提出了CIOU Loss,其在DIOU Loss的基礎(chǔ)上增加了一個(gè)影響因子,將預(yù)測(cè)框和目標(biāo)框的長(zhǎng)寬比都考慮進(jìn)去,公式如下:
其中,是一個(gè)衡量長(zhǎng)寬比一致性的參數(shù),我們可以定義為:
代表目標(biāo)框,代表預(yù)測(cè)框。
至此,CIOU Loss包含了一個(gè)好的預(yù)測(cè)框回歸函數(shù)的三個(gè)重要的幾何因素:重疊面積、中心點(diǎn)距離、長(zhǎng)寬比。
NMS
NMS主要用于預(yù)選框的篩選,常用于目標(biāo)檢測(cè)算法中,一般采用普通的nms的方式,Yolov4則借鑒上面D/CIOU loss的論文:https://arxiv.org/pdf/1911.08287.pdf

因?yàn)镈IOU在計(jì)算loss的時(shí)候,需要考慮邊界框中心點(diǎn)的位置信息,所以一些重疊物體也可以回歸出來(lái)。因此在重疊目標(biāo)的檢測(cè)中,DIOU_nms的效果優(yōu)于傳統(tǒng)的nms。
CIOU Loss的性能要比DIOU Loss好,那為什么不用CIOU_nms,而用DIOU_nms?
因?yàn)镃IOU_loss,是在DIOU_loss的基礎(chǔ)上,添加了一個(gè)的影響因子,包含groundtruth標(biāo)注框的信息,在訓(xùn)練時(shí)用于回歸。但是NMS在推理過(guò)程中,并不需要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)
"""
# 求出預(yù)測(cè)框左上角右下角
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
# 求出真實(shí)框左上角右下角
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
# 求真實(shí)框和預(yù)測(cè)框所有的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)
# 計(jì)算中心的差距
center_distance = torch.sum(torch.pow((b1_xy - b2_xy), 2), axis=-1)
# 找到包裹兩個(gè)框的最小框的左上角和右下角
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))
# 計(jì)算對(duì)角線距離
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沒(méi)有發(fā)布論文,所以更加精細(xì)的內(nèi)容,只能研究其代碼,該代碼倉(cāng)庫(kù)仍然保持高頻率更新:https://github.com/ultralytics/yolov5
YOLOv5 ?? 是一系列在 COCO 數(shù)據(jù)集上預(yù)訓(xùn)練的對(duì)象檢測(cè)架構(gòu)和模型,代表 Ultralytics 對(duì)未來(lái)視覺(jué) AI 方法的開(kāi)源研究,結(jié)合了在數(shù)千小時(shí)的研究和開(kāi)發(fā)中獲得的經(jīng)驗(yàn)教訓(xùn)和最佳實(shí)踐。
網(wǎng)絡(luò)模型結(jié)構(gòu)
YOLOv5給出了四種版本的目標(biāo)檢測(cè)網(wǎng)絡(luò),分別是Yolov5s、Yolov5m、Yolov5l、Yolov5x四個(gè)模型。YOLOv5s是深度最淺,特征圖的寬度最窄的網(wǎng)絡(luò),后面三種在此基礎(chǔ)上不斷加深,加寬。YOLOv5s的網(wǎng)絡(luò)結(jié)構(gòu)圖如下所示:

YOLOv5各部分改進(jìn)
輸入端:Mosaic數(shù)據(jù)增強(qiáng)、自適應(yīng)錨框計(jì)算 Backbone:Focus結(jié)構(gòu),CSP結(jié)構(gòu) Neck:FPN+PAN結(jié)構(gòu) Prediction:GIOU_Loss
Mosaic數(shù)據(jù)增強(qiáng)
YOLOV5會(huì)進(jìn)行三種數(shù)據(jù)增強(qiáng):縮放,色彩空間調(diào)整和馬賽克增強(qiáng)。其中馬賽克增強(qiáng)是通過(guò)將四張圖像進(jìn)行隨機(jī)縮放、隨機(jī)裁剪、隨機(jī)分布方式進(jìn)行拼接,小目標(biāo)的檢測(cè)效果得到提升。

自適應(yīng)錨框計(jì)算
YOLO系列中,可以針對(duì)數(shù)據(jù)集設(shè)置初始的Anchor。在網(wǎng)絡(luò)訓(xùn)練中,網(wǎng)絡(luò)在Anchor的基礎(chǔ)上輸出預(yù)測(cè)框,進(jìn)而和GT框進(jìn)行比較,計(jì)算loss,在反向更新,迭代網(wǎng)絡(luò)參數(shù)。在YOLOv3、4版本中,設(shè)置初始Anchor的大小都是通過(guò)單獨(dú)的程序使用K-means算法得到,但是在YOLOv5中,將此功能嵌入到代碼中,每次訓(xùn)練數(shù)據(jù)集之前,都會(huì)自動(dòng)計(jì)算該數(shù)據(jù)集最合適的Anchor尺寸,該功能可以在代碼中設(shè)置超參數(shù)進(jìn)行關(guān)閉。
train.py中上面一行代碼,設(shè)置成False,每次訓(xùn)練時(shí),不會(huì)自動(dòng)計(jì)算。
CSP BackBone-跨階段局部網(wǎng)絡(luò)
YOLOv4 和 YOLOv5 都使用 CSPDarknet作為BackBone,從輸入圖像中提取豐富的特征信息。CSPNet叫做Cross Stage Partial Network,跨階段局部網(wǎng)絡(luò)。其解決了其他大型卷積網(wǎng)絡(luò)結(jié)構(gòu)中的重復(fù)梯度問(wèn)題,減少模型參數(shù)和FLOPS。這對(duì) YOLO 有重要的意義,即保證了推理速度和準(zhǔn)確率,又減小了模型尺寸。
YOLOv4只有主干網(wǎng)絡(luò)中使用了CSP結(jié)構(gòu),而YOLOv5中設(shè)計(jì)了兩種CSP結(jié)構(gòu),CSP1_X應(yīng)用于BackBone主干網(wǎng)絡(luò),另一種CSP_2X結(jié)構(gòu)則應(yīng)用于Neck中。
Focus結(jié)構(gòu)
Focus結(jié)構(gòu),在Yolov3&Yolov4中并沒(méi)有這個(gè)結(jié)構(gòu),其中比較關(guān)鍵是切片操作。

比如上圖的切片示意圖,的圖像切片后變成的特征圖。

以Yolov5s的結(jié)構(gòu)為例,原始的圖像輸入Focus結(jié)構(gòu),采用切片操作,先變成的特征圖,再經(jīng)過(guò)一次32個(gè)卷積核的卷積操作,最終變成的特征圖。
需要注意的是:Yolov5s的Focus結(jié)構(gòu)最后使用了32個(gè)卷積核,而其他三種結(jié)構(gòu),使用的卷積核數(shù)量有所增加。
作者原話:Focus() module is designed for FLOPS reduction and speed increase, not mAP increase.
作用:減少FLOPs,提高速度,對(duì)于模型的精度mAP沒(méi)有提升。
Neck
Yolov5現(xiàn)在的Neck和Yolov4中一樣,都采用FPN+PAN的結(jié)構(gòu),但在Yolov5剛出來(lái)時(shí),只使用了FPN結(jié)構(gòu),后面才增加了PAN結(jié)構(gòu),此外網(wǎng)絡(luò)中其他部分也進(jìn)行了調(diào)整。

但如上面CSPNet結(jié)構(gòu)中講到,Yolov5和Yolov4的不同點(diǎn)在于,
Yolov4的Neck結(jié)構(gòu)中,采用的都是普通的卷積操作。而Yolov5的Neck結(jié)構(gòu)中,采用借鑒CSPnet設(shè)計(jì)的CSP2_X結(jié)構(gòu),加強(qiáng)網(wǎng)絡(luò)特征融合的能力。

Bounding Box的損失函數(shù)
Yolov5中采用其中的GIOU_Loss做Bounding box的損失函數(shù)。而Yolov4中采用CIOU_Loss作為目標(biāo)Bounding box的損失。
nms非極大值抑制
在目標(biāo)檢測(cè)的后處理過(guò)程中,針對(duì)很多目標(biāo)框的篩選,通常需要nms操作。
因?yàn)镃IOU_Loss中包含影響因子v,涉及groudtruth的信息,而測(cè)試推理時(shí),是沒(méi)有g(shù)roundtruth的。
所以Yolov4在DIOU_Loss的基礎(chǔ)上采用DIOU_nms的方式,而Yolov5中采用加權(quán)nms的方式。
采用DIOU_nms,對(duì)于遮擋問(wèn)題,檢出效果有所提升。
在回歸框的損失函數(shù)和使用NMS刪除冗余預(yù)選框上,YOLOv4使用的方法要比v5的方法更有優(yōu)勢(shì)。
參考鏈接
https://www.yuque.com/darrenzhang/cv/tg215h http://arxiv.org/abs/2004.10934 https://blog.csdn.net/nan355655600/article/details/106246625 https://zhuanlan.zhihu.com/p/172121380 https://www.zhihu.com/question/399884529
百面計(jì)算機(jī)視覺(jué)匯總
點(diǎn)擊文末閱讀原文,跳轉(zhuǎn)到《百面第三版》Github地址,歡迎STAR!
往期干貨文章

面試必問(wèn)!| 1. ResNet手推及其相關(guān)變形~

一文深入淺出cv中的Attention機(jī)制

沒(méi)文章,沒(méi)背景,想做CV?那就按這個(gè)干!

我丟!算法崗必問(wèn)!建議收藏!

面試真題:Backbone不變,顯存有限,如何增大訓(xùn)練時(shí)的batchsize?
