面试问题总结——关于YOLO系列(三)
- 接著上篇的的YOLO系列面試問題總結,加油,沖!
三.YOLOv3
1.YOLOv3主干網絡BackBone——Darknet-53網絡結構(因為有53個卷積層)
(原論文中Darknet53的尺寸是在圖片分類訓練集上訓練的,所以輸入的圖像尺寸是256x256,而在YOLOv3中輸入尺寸是416×416)
??①上圖中,Top-1 Accuracy和Top-5 Accuracy是指什么呢?區別在哪呢?
??我們知道ImageNet有大概1000個分類,而模型預測某張圖片時,會給出1000個按概率從高到低的類別排名,所謂的Top-1 Accuracy是指排名第一的類別與實際結果相符的準確率,而Top-5 Accuracy是指排名前五的類別包含實際結果的準確率。
??②為什么Darknet-53相比于同時期更深層的網絡ResNet-101、ResNet-152效果更好些呢?
??在兩個模型的主干網絡中,我發現基本都是通過一系列的殘差結構堆疊來實現的主干網絡,唯一不同的是Darknet-53網絡中沒有最大池化層即Maxpooling層,而Darknet-53中所有的下采樣基本都是通過卷積層來實現的,我猜想是這個原因。
??③為什么Darknet-53運行速度快呢?
??因為它的卷積核個數相比之下更少一些,所以參數也就更少了,運算量也就小。
??④關于殘差網絡
??殘差網絡的提出是為了解決深層網絡出現的退化問題,我們知道神經網絡的每一層對應提取到不同層次的特征信息,網絡越深的時候,提取到的信息也越豐富。而深度增加之后,會產生梯度消失或者梯度爆炸的問題,傳統的解決辦法是數據初始化和BN層,雖然解決了梯度消失和爆炸的問題,但也產生了別的問題,即網絡的性能退化了,雖然深度增加但錯誤率卻上升了。而殘差網絡,可有效解決此問題,同時也解決了梯度的問題。
2.YOLOv3網絡模型
??下面是以YOLOv3 416模型進行繪制的,所以輸入的尺寸是416x416,預測的三個特征層大小分別是52,26,13。
??殘差結構就是將主分支上1×1卷積層和3×3卷積層之后的輸出和捷徑分支上的輸出進行相加,所以上圖中的每個矩形框,并不是在兩個卷積層之后又接了一個殘差結構,而是這整個矩形框就是一個殘差結構。
(上圖要是背不下來,也可以直接畫下面這個模型圖,面試的時候直接就說輸出了三個尺寸的特征層52×52、26×26、13×13。作者在三個特征層上分別用了3個預設邊界框的尺寸,一共是9個anchor boxes,都是根據COCO數據集聚類得到的。)
3.關于YOLOv3網絡的訓練細節:正負樣本的匹配
??在原論文中,針對每一個ground truth(簡稱GT,真值,就是你打標簽時標注的目標矩形框),都會分配一個bounding box,表示針對每一個GT,都會分配一個正樣本,則一張圖片有幾個GT,就會有幾個正樣本。
??YOLOv3中正負樣本的定義:YOLOv3中就不再看中心點落在哪個grid cell(網格)里面就由哪個grid cell預測了,而是看誰的anchor與待檢測目標的grouth truth的iou值最大,才由那個anchor去預測,也就是在YOLOv3里面正樣本是指與grouth truth的iou值最大的預測框或anchor,對于和grouth truth有iou值且大于設定iou閾值(原論文中設為0.5)但不是最大值的預測框或anchor,就忽略它們;對于小于設定iou閾值的預測框或anchor而言就是負樣本。
??此外,在原論文中也提到,對于當前的bounding box,若其不是正樣本的話,則它既沒有定位損失,也沒有類別損失,僅僅只有置信度損失(confidence loss)。
4.YOLOv3損失函數
??YOLOv3的損失函數主要分為三個部分:目標定位偏移量損失,目標置信度損失以及目標分類損失,其中λ1、λ2、λ3是平衡系數。
原論文中損失函數寫的很粗略,比如坐標損失采用的是誤差的平方和,類別損失采用的是二值交叉熵,在github上也找了很多YOLO v3的公開代碼,有的采用的是YOLOv1或者YOLOv2的損失函數。
(二值交叉熵):y為樣本的期望輸出,y^為樣本的實際輸出
5.YOLOv3
Backbone(骨干網絡):用于提取特征
Neck(頸部網絡):用于匯總、融合不同尺度的特征,類似于FPN(特征金字塔)
Head(輸出頭):獲得各個尺度目標檢測的預測結果
(因為Backbone骨干網絡是全卷積網絡,可以兼顧任意尺度的輸入,則可以輸入32倍的任意尺度圖像。所以對于YOLOv3來說,輸入的圖像越大,則單張輸出的特征數也越多。)
為什么YOLOv3對小目標的檢測會比YOLOv1好很多?
YOLOv3更進一步的擴充了預測框的數量(52×52+26×26+13×13)×3=10647,所以檢測效果更好。
YOLOv1/v2中使用IoU作為置信度標簽有何不好?
??①很多預測框與ground truth的IoU最高只有0.7。
??②COCO中的小目標IoU對像素偏移很敏感無法有效學習。
而在YOLOv3中正樣本的標簽都用1表示,負樣本用0表示。
只有正樣本對分類和定位學習產生貢獻(與YOLOv1和YOLOv2思想一致),負樣本只對置信度學習產生貢獻。
YOLOv3對于小目標/密集目標的改進
1.grid cell個數增加(兼容任意圖片大小輸入)
2.Anchor
3.多尺度預測(FPN)
4.損失函數懲罰小框項
5.網絡結構(骨干網絡 跨層連接)
四.YOLOv4
YOLOv4主要做的改進方法分為兩類:Bag of freebies(BoF)和Bag of specials(BoS)。
BoF方法只改變訓練策略或者只增加訓練的成本與時間,但不會影響測試階段的性能;BoS方法只會增加少量的推理成本但卻能顯著提高對象檢測精度的插入組件和后處理方法。
(論文中提到的BoF和BoS方法并不是YOLOv4全部采用的,只是用了其中的一些tricks)
1.Bag of freebies(BOF)
①提出對數據的預處理(pixel-wise調整):數據擴充
a.光度畸變:調整圖像的亮度、對比度、色調、飽和度和噪聲。
b.幾何畸變:加入隨機縮放、剪切、翻轉和反旋。
Mosaic data augmentation(馬賽克數據增強)
??Mosaic方法基于Sangdoo Yun等人于2019年提出的CutMix數據增強方法,CutMix方法只處理合并兩張圖片,而Mosaic方法讀取四張圖片,然后分別進行翻轉、縮放等操作,接著拼成一張圖片。這種方法可以豐富圖片背景,大大擴充訓練數據集。而且隨機縮放操作增加了很多小目標,使得訓練出的模型更加魯棒。使用Mosaic方法在訓練時,可一次直接輸入4張圖片,使得訓練時的Mini-batch可以設置得很小,單個GPU就可以進行訓練。
②模擬對象遮擋
a. random erase,CutOut:可以隨機選擇圖像中的矩形區域,并填充一 個隨機的或互補的零值。
b. hide-and-seek、grid mask:隨機或均勻地選擇圖像中的多個矩形區 域,并將其全部替換為0。
③特征矩陣采用DropBlock regularization()
??在上圖中,×格子表示網絡層是學習不到的,但可以通過×格子周圍的信息來進行學習從而和檢測目標關聯。
(理解:網絡會從dropout掉的激活單元附近學習到同樣的信息,通過dropout掉一部分相鄰的整片區域(比如眼睛和鼻子),網絡就會去注重學習人的別的部位的特征來實現正確分類,從而表現出更好的泛化能力。)
④解決類別不平衡
??解決數據分布不平衡:在實際的訓練過程中,正負樣本總是相差懸殊的,通過設置損失函數前面的權重來解決。
⑤Label smoothing(標簽平滑處理)
??用于解決one-hot類別之間沒有關聯。
比如對于一個標簽矩陣 [0,0,1] 轉化為-> [0.01,0.01,0.98],分類標簽的平滑,將0,0,1轉變成0.01,0.01,0.98,這樣會提高識別精度。
⑥Bounding box回歸
YOLOv4采用的是CIoU_loss。
⑦ Self-Adversarial Training(自對抗訓練)
??對抗樣本的定義:以圖像樣本為例,在原樣本上加入一些輕微的擾動,使得在人眼分辨不出差別的情況下,誘導模型進行錯誤分類。
??作用:使得訓練出的模型更加魯棒。
2.Bag of specials(BOS)
①采用DIoU-NMS
(式中,M:表示置信度最高的框的四個參數(長、寬、中心點坐標);
Bi:表示其他的框,需要從置信度最高的框開始遍歷;ε:設定的閾值)
在原始的NMS中,IoU度量被用來抑制冗余檢測盒,其中重疊區域是唯一的因素,在有遮擋的情況下常常產生錯誤的抑制。
??DIoU-NMS不僅考慮了檢測區域的重疊,而且還考慮了檢測區域間的中心點距離。
②激活函數 Mish activation
??理論上對負值的輕微允許更好的梯度流,而不是像ReLU中那樣的硬零邊界。
??平滑的激活函數允許更好的信息深入神經網絡,從而得到更好的準確性和泛化。
③ enhance receptive field(提升模型感受野)
YOLOv4中采用SPP(結構見下圖,就是一堆池化的組合)作用:加速模型對核心特征的提取,提升模型的感受野。
感受野(Receptive Field),指的是神經網絡中神經元“看到的”輸入區域,在卷積神經網絡中,feature map上某個元素的計算受輸入圖像上某個區域的影響,這個區域即該元素的感受野。
??卷積神經網絡中,越深層的神經元看到的輸入區域越大,即越深層的神經元的感受野越大。
??所以,感受野是個相對概念,某層feature map上的元素看到前面不同層上的區域范圍是不同的,通常在不特殊指定的情況下,感受野指的是看到輸入圖像上的區域。
?所以,在YOLOv4中,對主干網絡CSPDarknet53后的特征采用SPP層的方式,能更有效的增加主干網絡的感受野,顯著的分離最重要的上下文特征。
④ CSPDarknet53
??CSPNet (Cross Stage Paritial Network) 主要從網絡結構設計的角度解決推理中計算量大的問題。CSPNet 的作者認為推理計算過高的問題是由于網絡優化中的梯度信息重復導致的。 因此采用先將基礎層的特征映射劃分為兩部分,然后通過跨階段層次結構將它們合并,在減少了計算量的同時可以保證準確率。
??CSPDarknet53 模型在目標檢測方面具有更高的檢測精度,同時,可以使用 Mish 和其他技術來提高 CSPDarknet53 的分類準確性。
⑤PAN
??PANet改進了主干網絡結構,加強了特征金字塔的結構,縮短了高低層特征融合的路徑。
??Neck頸部網絡中:使用了FPN和PAN,它把不同尺度的特征進行匯總整合,增強了模型對不同大小、不同尺度目標的識別能力。
??FPN特征金字塔通過融合高底層特征,提升了不同尺度特別是小尺度的目標檢測效果,而PAN在FPN特征金字塔的基礎上,進一步增強了自底向上的特征增強。(原因:因為底層神經網絡主要提取邊緣、輪廓、顏色等底層視覺特征,而這些特征往往與目標的邊緣和輪廓等密切相關,因此PAN-Net自底向上的特征增強,可以讓頂層特征圖充分共享到網絡底層提取到的底層視覺特征,提升大目標的檢測效果。)
3.YOLOv4采用的模型結構
backbone:CSP+Darknet53
additional module:SPP
neck:PANet
head:YOLOv3 (anchor based)
4. YOLOv4相比于YOLOv3作了哪些改進
??①在主干網絡CSPDarknet53中將CBL替換成了CBM,即卷積中的激活函數做了替換,改成了Mish激活函數,在主干網絡后面的網絡中沒有作替換,依然用的是LeakyReLU;(個人猜測,后面用LeakyReLU可能是為了計算速度更快)
(CBM=卷積層+BN層+Mish,CBL=卷積層+BN層+LeakyReLU)
??②對主干網絡CSPDarknet53后的特征采用SPP層的方式,能更有效的增加主干網絡的感受野,SPP的結構是三層最大池化,這里說一下感受野的定義;同時,我個人還覺得,通過SPP還可以有效減少特征提取的參數量,因為SPP是在主干網絡之后,主干網絡用來提取特征信息,對于提取到的信息肯定會有很多冗余,采用SPP即最大池化可以減少冗余,這是我個人觀點;
??③YOLOv3中的網絡輸出是從大目標到小目標,YOLOv4中的網絡輸出是從小目標到大目標,目的是增加了特征的融合程度,融合的比YOLOv3更深,這點看它們的網絡結構圖就清楚了。
5.YOLOv4損失函數采用了CIoU-loss,在此基礎上,介紹下IOU、GIOU、DIOU
??CIOU解決了一般IOU無法直接優化兩個框沒有重疊的部分的問題,并且綜合考慮了邊界框的重疊面積、中心點距離,長寬比等因素,使得預測框回歸的速度和精度更高。YOLOv4的損失函數可以由回歸框預測誤差 Lloc、置信度誤差Lconf 、分類誤差Lcls三部分相加而成:
①IOU
??IoU 通過計算預測的邊框和真實的邊框之間的Intersection Area I(相交的面積) 和 Union Area U(總的面積) 的比值來獲得,公式如下:
IoU的優點:
??a.IoU可以作為距離表示,即IoUloss=1-IoU,但是當兩個邊框不相交時無法回傳梯度;
??b.IoU對尺度變化具有不變性的特點,即不受兩個物體尺度大小的影響。
IoU的缺點:
??a.無法衡量兩個框是相鄰還是甚遠,如下圖,兩種情況下IoU值均為0,可以清楚地發現,圖(a)中兩框距離較近,圖(b)中兩框距離明顯要遠,但是僅從IoU數值上無法判斷兩者距離較近還是較遠(兩個物體不相交時無法回傳梯度);
??b.IoU不能反映兩個物體如何重疊(相交方式),如下圖,兩種情況下的IoU均為0.143,圖(a)中兩框要比圖(b)中的相交更整齊一些,但是IoU并沒有反映出這個特點。
②GIOU
?GIoU作為IoU的升級版,是為了克服IoU存在的缺點同時充分利用優點而提出的。具體的計算方式是在IoU計算的基礎上尋找一個最小外接凸閉合框C,公式如下:
式中,A為預測框,B為真實框,不管A與B是否相交,C是包含A與B的最小框(包含A與B的最小凸閉合框),首先計算IoU,A與B的交并比,再計算C框中沒有A與B的面積,比上C框面積,IoU減去前面算出的比值;得到GIoU。(注:本文提出的例子中A、B均是矩形框,但是也可以為其他形狀,比如A、B為橢圓形,那么此時C將是包含A、B的最小橢圓形,或者A、B均是3D box等等)
GIoU的優點:
??a.對尺度的不變性,GIoU可以衡量兩個框是相鄰還是甚遠,GIoU可認為是IoU的下界,小于等于IoU,即-1≤GIoU≤1,當A和B完全重合時,GIoU=IoU=1,當A與B不相交而且離得很遠時,GIoU(A,B)趨向于-1。
??b.GIoU能夠更好地反應相交情況。
GIoU的缺點:
??當目標框完全包裹預測框的時候,IoU和GIoU的值都一樣,此時GIoU退化為IoU,無法區分其相對位置關系。
③DIOU
??DIoU loss是在IoU loss基礎上引入一個懲罰項,公式如下:
式中,b,bgt分別代表了預測框和目標框的中心點,且ρ代表的是計算兩個中心點間的歐式距離。c代表的是能夠同時覆蓋預測框和目標框的最小矩形的對角線距離。因此DIoU中對預測框和目標框之間的歸一化距離進行了建模,直觀的展示如下圖所示,
DIoU的優點:
??①與GIoUloss類似,DIoUloss在與目標框不重疊時,仍然可以為邊界框提供移動方向;
??②DIoUloss可以直接最小化兩個目標框的距離,而GIOUloss優化的是兩個目標框之間的面積,因此比GIoUloss收斂快得多;
??③對于包含兩個框在水平方向和垂直方向上這種情況,DIoU損失可以使回歸非常快,而GIoU損失幾乎退化為IoU損失。
??④DIoU還可以替換普通的IoU評價策略,應用于NMS中,使得NMS得到的結果更加合理和有效。
④CIOU
(式中,Wgt和hgt表示標簽框的長寬,自己想一下tanα = w/h,就這樣把bbox和gt的長寬考慮到)
為什么CIOU這么優秀,卻只在損失函數中使用CIoU-loss,而在NMS中使用的卻是DIoU-NMS?
??答:因為CIOU需要真實框和預測框,在損失函數即訓練階段,是有標簽的真實框的,而在NMS即測試推理階段,是沒有標簽真實框的。
YOLOv3和YOLOv4的網絡模型圖:https://blog.csdn.net/abc13526222160/article/details/107035765/
五.YOLOv5
??YOLOv5和v4的網絡很相似,基本沒有什么太大的改變,唯一比較新的就是提出了Focus模塊,但我個人覺得Focus就是YOLOv2中的Passthrough layer。(但YOLOv5s確實很優秀,只有7.9M,速度快,可以用于嵌入式等設備)
1.Focus結構
Focus結構:把長度和寬度方向的空間維度信息切片并堆疊至通道維度,長和寬縮小為原來的一半,通道數變成原來的4倍,節省計算量。
??Focus結構,在Yolov3&Yolov4中并沒有這個結構,其中比較關鍵是切片操作。
??以Yolov5s的結構為例,原始608×608×3的圖像輸入Focus結構,采用切片操作,先變成304×304×12的特征圖,再經過一次32個卷積核的卷積操作,最終變成304×304×32的特征圖。
??Focus結構的目的是讓網絡提取到多種尺度的核心特征。(多尺度特征提取)
??具體實現過程:用切片的操作將圖像4×4×3切成2×2×12的特征圖,然后再用卷積去卷這個特征圖,來達到多尺度特征融合,增大感受野的效果。(我個人感覺就和YOLOv2中的Passthrough layer一模一樣)
??Focus和SPP都是為了增大感受野的操作,不過Focus是通過切片來做完整的特征提取,而SPP是通過最大池化來提取核心特征。
2.自適應錨框計算
??在YOLO算法中,針對不同的數據集,都會有初始設定長寬的錨框,且不會改變了,YOLOv2有5個,YOLOv3和YOLOv4是9個。
??但在YOLOv5中網絡訓練中,網絡在初始錨框的基礎上輸出預測框,進而和真實框groundtruth進行比對,計算兩者差距,再反向更新,迭代網絡參數。
??所以YOLOv5在訓練的過程中,每次訓練時都會自適應的計算不同訓練集的最佳錨框值,當然,這個功能也是可以在代碼中將自動計算錨框功能關閉。
3.YOLOv5網絡模型
輸入端:Mosaic數據增強、自適應錨框計算、自適應圖片縮放
Backbone:Focus結構,CSP結構
Neck:FPN+PAN結構
Prediction:GIOU_Loss
總結
以上是生活随笔為你收集整理的面试问题总结——关于YOLO系列(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 压力测试、负载测试、渗透测试、容量测试、
- 下一篇: Bios设置引起linux卡界面,根据显