道路車流監測(2):目标檢測模型解釋
- 前言
- 一、模型選擇
- 二、yolov5s
-
- 模型概覽
- 輸入端========================================
- Mosaic資料增強
- 自适應錨框計算
- 自适應圖檔縮放
- 基準網絡============================================
- Focus結構
- CSP結構
- Neck網絡============================================
- SPP
- FPN+PAN
- 輸出端============================
- 損失函數
-
- IoU Loss
- GIoU Loss
- DIoU Loss
- DIoU Loss
- nms非極大值抑制
- 三、總結與分析
- 四、參考
前言
啊啊啊,最近實習真的太累(lan)了,拖了好久才出第二章,leader一直鞭策(pua),但是mentor對我很好,是以還想再繼續學下去,畢竟我也很難保證秋招能找到更好的公司,祈福.jpg。
一、模型選擇
首先,明确自己要解決的問題,具體分析業務場景。從業務的角度出發選擇适合的模型。畢竟沒有最好的模型,隻有最合适的模型。
解決的問題:檢測道路中的車輛模型。需要目标檢測模型來檢測視訊中的車輛。
業務場景分析:
1)檢測目标:視訊中的車輛目标屬于中目标或者大目标檢測,并且該類目标樣本之間變化不大,不存在細粒度問題,并且我們的目标隻需要檢測車輛,對模型的分類能力要求不高,一般的目标檢測模型都能夠起到一個較好的檢測結果
2)檢測背景:檢測目标背景簡單, 一般的視訊資料都是通過道路上的攝像頭采集的,單一攝像頭的場景不會有變動,同時攝像頭捕獲的也是道路資料,多個攝像頭捕獲的視訊資料的場景變動也不大。是以也降低了車輛檢測的難度。并且項目做的是車流檢測,要的是統計車流資料,假設一個鐘頭内少檢測了一輛車,導緻計數的時候有所缺失,目前想來是可以接受的。
3)檢測速度:由于應用場景是針對道路中攝像頭中實時捕獲的資料進行處理,是以對模型的速度,實時性要求比較高,并且最好能夠做到分布式實時處理視訊,在終端隻傳回處理後的結果給伺服器,是以模型的大小也是考慮的一個方面。
總結:綜上所述,在模型選擇的時候重點關注模型的處理速度,大小,并且保證檢測正确率不要太低即可。是以選用單階段模型來保證處理速度較為合适。而在衆多單階段模型中yolo系列非常出名,我也有yolov3的基礎,是以本次模型選擇新一代yolov5作為目标檢測模型,在yolov5系列中選用體量最小的yolov5s作為最終模型。各個模型之間比較結果如下。

Yolov5s網絡最小,速度最少,AP精度也最低。但如果檢測的以大目标為主,追求速度,倒也是個不錯的選擇。
其他的三種網絡,在此基礎上,不斷加深加寬網絡,AP精度也不斷提升,但速度的消耗也在不斷增加。
目前使用下來,yolov5s的模型十幾M大小,速度很快,線上生産效果可觀,嵌入式裝置可以使用。
(這一段如果寫論文的話可以擴充開,多選擇幾個不同的模型,單階段雙階段,都拿來測試和比較)
二、yolov5s
模型概覽
通過netron可以直覺檢視網絡結構,對網絡的架構會有更清晰的認識。
- 輸入端: 表示輸入的圖檔。該網絡的輸入圖像大小為608*608,該階段通常包含一個圖像預處理階段,即将輸入圖像縮放到網絡的輸入大小,并進行歸一化等操作。在網絡訓練階段,YOLOv5使用Mosaic資料增強操作提升模型的訓練速度和網絡的精度;并提出了一種自适應錨框計算與自适應圖檔縮放方法。
- 基準網絡: 通常是一些性能優異的分類器種的網絡,該子產品用來提取一些通用的特征表示。YOLOv5中不僅使用了CSPDarknet53結構,而且使用了Focus結構作為基準網絡。
- Neck網絡: 通常位于基準網絡和頭網絡的中間位置,利用它可以進一步提升特征的多樣性及魯棒性。雖然YOLOv5同樣用到了SPP、FPN和PAN子產品,但是實作的細節有些不同。
- Head輸出端: Head用來完成目标檢測結果的輸出。針對不同的檢測算法,輸出端的分支個數不盡相同,通常包含一個分類分支和一個回歸分支。YOLOv5利用GIOU_Loss來代替Smooth L1 Loss函數,以及預測框篩選的DIOU_nms,進而進一步提升算法的檢測精度。
輸入端========================================
Mosaic資料增強
YOLOv5中在訓練模型階段仍然使用了Mosaic資料增強方法,該算法是在CutMix資料增強方法的基礎上改進而來的。CutMix僅僅利用了兩張圖檔進行拼接,而Mosaic資料增強方法則采用了4張圖檔,并且按照随機縮放、随機裁剪和随機排布的方式進行拼接而成,具體的效果如下圖所示。這種增強方法可以将幾張圖檔組合成一張,這樣不僅可以豐富資料集的同時極大的提升網絡的訓練速度,而且可以降低模型的記憶體需求。
自适應錨框計算
yolo系列使用的anchors都是在配置檔案中預先定義的,原先都是通過手動另外再跑一個kmeans算法,計算出目前資料集的anchors,然後通過手動修改配置檔案的方法完成。現在yolov5将這兩個步驟完成了整合。
yolov5s初始設定的anchor
Yolov5中将此功能嵌入到代碼中,每次訓練時,自适應的計算不同訓練集中的最佳錨框值。
當然,如果覺得計算的錨框效果不是很好,也可以在代碼中将自動計算錨框功能關閉。
train.py中上面一行代碼,設定成False,每次訓練時,不會自動計算。
自适應圖檔縮放
針對不同的目标檢測算法而言,我們通常需要執行圖檔縮放操作,即将原始的輸入圖檔縮放到一個固定的尺寸,再将其送入檢測網絡中。YOLO系列算法中常用的尺寸包括416*416,608 *608等尺寸。原始的縮放方法存在着一些問題,由于在實際的使用中的很多圖檔的長寬比不同,是以縮放填充之後,兩端的黑邊大小都不相同,然而如果填充的過多,則會存在大量的資訊備援,進而影響整個算法的推理速度。為了進一步提升YOLOv5算法的推理速度,該算法提出一種方法能夠自适應的添加最少的黑邊到縮放之後的圖檔中。具體的實作步驟如下所述。
步驟1-根據原始圖檔大小與輸入到網絡圖檔大小計算縮放比例。
步驟2-根據原始圖檔大小與縮放比例計算縮放後的圖檔大小。
步驟3-計算黑邊填充數值。
如上圖所示,416表示YOLOv5網絡所要求的圖檔寬度,312表示縮放後圖檔的寬度。首先執行相減操作來獲得需要填充的黑邊長度104;然後對該數值執行取餘操作,即104%32=8,使用32是因為整個YOLOv5網絡執行了5次下采樣操作,即2^5=32;最後對該數值除以2,即将填充的區域分散到兩邊。這樣将416 * 416大小的圖檔縮小到416 * 320大小,通過這種簡單的改進,推理速度得到了37%的提升,可以說效果很明顯。
需要注意的是:
- 該操作僅在模型推理階段執行,模型訓練階段仍然和傳統的方法相同,将原始圖檔裁剪到416*416大小
- YOLOv3與YOLOv4中預設填充的數值是(0,0,0),而YOLOv5中預設填充的數值是(114,114,114)
- 該操作僅僅針對原始圖檔的短邊而言,仍然将長邊裁剪到416
基準網絡============================================
Focus結構
Focus是Yolov5新增的操作,該結構的主要思想是通過slice操作來對輸入圖檔進行裁剪。如下圖所示,原始輸入圖檔大小為608 * 608 * 3,采用切片操作,先變成304 * 304 * 12的特征圖,再經過一次32個卷積核的卷積操作,最終變成304 * 304 * 32的特征圖。
需要注意的是:Yolov5s的Focus結構最後使用了32個卷積核,而其他三種結構,使用的數量有所增加。
CSP結構
Yolov5中設計了兩種CSP結構,以Yolov5s網絡為例,CSP1_X結構應用于Backbone主幹網絡,另一種CSP2_X結構則應用于Neck中。
CSPNet(Cross Stage Partial Network):跨階段局部網絡,以緩解以前需要大量推理計算的問題。
- 增強了CNN的學習能力,能夠在輕量化的同時保持準确性
- 降低計算瓶頸
- 降低記憶體成本
CSPNet通過将梯度的變化從頭到尾地內建到特征圖中,在減少了計算量的同時可以保證準确率。
CSPNet和PRN都是一個思想,将feature map拆成兩個部分,一部分進行卷積操作,另一部分和上一部分卷積操作的結果進行concate。
Neck網絡============================================
SPP
SPP(Spatial Pyramid Pooling): 空間金字塔池化,由何凱明提出(大佬真的太強了,respect!),使用多個視窗(pooling window) 可以統一圖像不同尺寸(scale)作為輸入, 得到同樣長度的池化特征。
最初提出應用在雙階段檢測器中,最後的分類層是由全連接配接組成,這就導緻訓練時圖檔的輸入尺寸不能改變,推理時輸入尺寸要和訓練時一緻。圖檔的變形拉伸和裁剪會導緻圖檔失真和資訊丢失。是以在當時的環境下,凱明提出了SPP,主要解決兩個問題:
- 有效避免了對圖像區域剪裁、縮放操作導緻的圖像失真等問題
- 解決了卷積神經網絡對圖像重複特征提取的問題,大大提高了産生候選框的速度,且節省了計算成本
如圖所示,任何輸入尺寸的圖檔,都會得到16+4+1=21長度的輸出,channel數量仍為256不變
由論文《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》可知由于對輸入圖像的不同縱橫比和不同尺寸,SPP同樣可以處理,是以提高了圖像的尺度不變和降低了過拟合,且實驗表明訓練圖像尺寸的多樣性比單一尺寸的訓練圖像更容易使得網絡收斂,SPP 對于特定的CNN網絡設計和結構是獨立的。(也就是說,隻要把SPP放在最後一層卷積層後面,對網絡的結構是沒有影響的, 它隻是替換了原來的pooling層);而且其不僅可以用于圖像分類還可以用來目标檢測。
但是在YOLOV3~V5中,SPP作用不同于前。YOLO中的SPP module由四個并行的分支構成,分别是kernel size為 5×5, 9×9, 13×13的最大池化和一個跳躍連接配接。如下圖所示,以YOLOv3-SPP為例,作者檢測頭前面的第5和第6卷積層之間內建SPP子產品來獲得,而在随後的YOLOV4/V5中,SPP都被借鑒,用在最小的特征輸出層。在Feature Map經過SPP module池化後的特征圖重新cat起來傳到下一層偵測網絡中。此部分SPP最主要的作用就是融合了局部與全局特征。YOLOV3-SPP相比YOLOV3提升了好幾個點。
在yolov5中的位置
FPN+PAN
FPN(feature pyramid networks): 特征金字塔網絡,通過将主幹網絡的不同層的語義特征進行融合,提高各輸出層所包含的語義特征。
PAN(Path Aggregation Network): 路徑聚合網絡,通過自下而上的将各FPN得到的新的網絡分支進行特征融合,縮短了較低層和最頂層功能之間的資訊路徑。可以更加有效利用底層語義資訊的定位資訊便于精确分割(略微扯淡了,沒有FPN幫他先一步完成了網絡分支的建構,那PAN就啥也不是,竟然還反過來說FPN跨層太多,資訊流通慢,屬實過河拆橋了。個人認為可嘗試去掉PAN訓練一下網絡,在COCO2017下與原先的模型的檢測名額進行對比。當然作為2018年的CVPR肯定有獨到之處。)
高層語義資訊響應的是物體的整體資訊,語義特征豐富;底層資訊響應局部和問題資訊,語義特征較少。
Yolov5的Neck和Yolov4中一樣,都采用FPN+PAN的結構
Yolov4的Neck結構中,采用的都是普通的卷積操作。而Yolov5的Neck結構中,采用借鑒CSPnet設計的CSP2結構,加強網絡特征融合的能力。
輸出端============================
損失函數
Yolov5中采用其中的GIOU_Loss做Bounding box的損失函數。
但是這并不是一個好的選擇,是以本文從目标檢測的損失函數發展史回溯,詳細介紹各損失函數的優缺點。
目标檢測任務的損失函數一般由分類損失函數和回歸損失函數兩部分構成,回歸損失函數的發展過程主要包括:最原始的Smooth L1 Loss函數、2016年提出的IoU Loss、2019年提出的GIoU Loss、2020年提出的DIoU Loss和最新的CIoU Loss函數。
IoU Loss
所謂的IoU Loss,即預測框與GT框之間的交集/預測框與GT框之間的并集。
這種損失會存在一些問題,具體的問題如下圖所示.
-
如狀态1所示,當預測框和GT框不相交時,即IOU=0,此時無法反映兩個框之間的距離,此時該
損失函數不可導,即IOU_Loss無法優化兩個框不相交的情況
- 如狀态2與狀态3所示,當兩個預測框大小相同時,那麼這兩個IOU也相同,IOU_Loss無法區分兩者相交這種情況
道路車流監測(2):目标檢測模型解釋前言一、模型選擇二、yolov5s三、總結與分析四、參考
GIoU Loss
Yolov5中采用其中的GIOU_Loss做Bounding box的損失函數。GIOU_Loss 為了解決以上的問題,GIOU損失應運而生。GIOU_Loss中增加了相交尺度的衡量方式,緩解了單純IOU_Loss時存在的一些問題。
但是這種方法并不能完全解決這種問題,仍然存在着其它的問題。具體的問題如下所示,狀态1、2、3都是預測框在GT框内部且預測框大小一緻的情況,這時預測框和GT框的差集都是相同的,是以這三種狀态的GIOU值也都是相同的,這時GIOU退化成了IOU,無法區分相對位置關系。
DIoU Loss
DIoU要比GIou更加符合目标框回歸的機制,将目标與anchor之間的距離,重疊率以及尺度都考慮進去,使得目标框回歸變得更加穩定,不會像IoU和GIoU一樣出現訓練過程中發散等問題。
如下圖所示,當GT框包裹預測框時,此時預測框的中心點的位置都是一樣的,是以按照DIOU_Loss的計算公式,三者的值都是相同的。為了解決這個問題,CIOU_Loss應運而生。
優點:
- 與GIoU loss類似,DIoU loss在與目标框不重疊時,仍然可以為邊界框提供移動方向。
- DIoU loss可以直接最小化兩個目标框的距離,是以比GIoU loss收斂快得多。
- 對于包含兩個框在水準方向和垂直方向上這種情況,DIoU損失可以使回歸非常快,而GIoU損失幾乎退化為IoU損失。
- DIoU還可以替換普通的IoU評價政策,應用于NMS中,使得NMS得到的結果更加合理和有效
DIoU Loss
CIOU_Loss在DIOU_Loss的基礎上增加了一個影響因子,将預測框和GT框的長寬比也考慮了進來。具體的計算方法如下式所示,即CIOU_Loss将GT框的重疊面積、中心點距離和長寬比全都考慮進來了。
總而言之:
IOU_Loss主要考慮了檢測框和GT框之間的重疊面積;
GIOU_Loss在IOU的基礎上,解決邊界框不重合時出現的問題;
DIOU_Loss在IOU和GIOU的基礎上,同時考慮了邊界框中心點距離資訊;
CIOU_Loss在DIOU的基礎上,又考慮了邊界框寬高比的尺度資訊。
nms非極大值抑制
在目标檢測的後處理過程中,針對很多目标框的篩選,通常需要nms操作。
因為CIOU_Loss中包含影響因子v,涉及groudtruth的資訊,而測試推理時,是沒有groundtruth的。
是以Yolov4在DIOU_Loss的基礎上采用DIOU_nms的方式,而Yolov5中采用權重nms的方式。
不同的nms,會有不同的效果,采用了DIOU_nms的方式,在同樣的參數情況下,将nms中IOU修改成DIOU_nms。對于一些遮擋重疊的目标,确實會有一些改進。
比如下面黃色箭頭部分,原本兩個人重疊的部分,在參數和普通IOU_nms一緻的情況下,修改成DIOU_nms,可以将兩個目标檢出。雖然大多數狀态下效果差不多,但在不增加計算成本的情況下,有稍微的改進也是好的。
三、總結與分析
YOLOv5是一種單階段目标檢測算法,該算法在YOLOv4的基礎上添加了一些新的改進思路,使得其速度與精度都得到了極大的性能提升,具體包括:輸入端的Mosaic資料增強、自适應錨框計算、自适應圖檔縮放操作;基準端的Focus結構與CSP結構;Neck端的SPP與FPN+PAN結構;輸出端的損失函數GIOU_Loss以及預測框篩選的DIOU_nms。除此之外,YOLOv5中的各種改進思路仍然可以應用到其它的目标檢測算法中。
四、參考
【1】https://blog.csdn.net/weixin_38842821/article/details/108544609
【2】https://blog.csdn.net/WZZ18191171661/article/details/113765995
【3】https://blog.csdn.net/WZZ18191171661/article/details/113789486