YOLO系列梳理(三)YOLOv5

CV技術指南(公眾號)發表於2022-04-24

 前言 YOLOv5 是在 YOLOv4 出來之後沒多久就橫空出世了。今天筆者介紹一下 YOLOv5 的相關知識。目前 YOLOv5 釋出了新的版本,6.0版本。在這裡,YOLOv5 也在5.0基礎上整合了更多特性,同時也對模型做了微調,並且優化了模型大小,減少了模型的引數量。那麼這樣,就更加適合移動端了。

歡迎關注公眾號CV技術指南,專注於計算機視覺的技術總結、最新技術跟蹤、經典論文解讀、CV招聘資訊。

YOLO系列梳理(三)YOLOv5

 

YOLOv5 網路模型結構


與之前的 YOLOv3、YOLOv4 不同,v3、v4 除了有完整的大模型之外,只有一個輕量級的 tiny 模型,值得注意的是,在 tiny 中,只有兩個輸出層。而 YOLOv5 則具備四種網路模型:YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 四種模型。

它們是通過 depth_multiple 和 width_multiple 來控制網路的寬度和深度,這類似 EfficientNet 的思想。

其中,YOLOv5s 在該系列中是深度最小,並且特徵圖的寬度也最小的網路。其他的網路是在此基礎上進行不斷地加深、加寬。

 

YOLOv5 基礎元件


  • CBL 由 Conv + BN + Leaky_ReLU 組成。

  • Res unit 是借鑑殘差結構的思想來構建網路的。

YOLO系列梳理(三)YOLOv5
  • CBM 是殘差模組中的子模組。Conv + BN + Mish 啟用函式 。

  • CSP1_X 由 CSPNet 演變而來,該模組由 CBL 模組、Res unit、Conv、還有 Concate 組成,其中X代表有X個這個模組。

YOLO系列梳理(三)YOLOv5
  • CSP2_X 也是由 CSPNet 網路組成,該模組由 Conv 和 X個 Res unit Concate 而成。

YOLO系列梳理(三)YOLOv5
  • SPP 從 YOLOv3 起,就有使用 SPP 模組。SPP 是 通過採用 1 × 1、5 × 5、9 × 9 和 13 × 13 的最大池化方式,來進行多尺度特徵的融合。

YOLO系列梳理(三)YOLOv5
  • 新版的 YOLOv5 中使用的是升級版的 SPP結構,SPPF。它是將原本並行的 MaxPool 替換成了序列 MaxPool。其中序列兩個 5 x 5 大小的 MaxPool 和一個 9 x 9 大小的 MaxPool 是等價的,而序列三個 5 x 5 大小的 MaxPool 層和一個 13 x 13 大小的 MaxPool 是等價的。並行和序列的效果一樣,但序列的效率更高。

YOLO系列梳理(三)YOLOv5

 

 

 

YOLOv5 知識點


總體來說,YOLOv5 和 YOLOv4 差不多,但還是做了一些調整、優化。

在 YOLOv5 中涉及到的知識:Mosaic資料增強、自適應錨框計算、自適應圖片縮放、Focus 結構、CSP 結構、FPN + PAN 結構、GIOU_Loss

 

自適應錨框計算

像之前的 YOLOv3、YOLOv4,對於不同的資料集,都會計算先驗框 anchor。然後在網路訓練時,網路會在 anchor 的基礎上進行預測,然後輸出預測框,再和標籤框進行對比,最後就進行梯度地反向傳播。

在 YOLOv3、YOLOv4 中,訓練不同的資料集時,是使用單獨的指令碼進行初始錨框的計算,在 YOLOv5 中,則是將此功能嵌入到整個訓練程式碼裡中。所以在每次訓練開始之前,它都會根據不同的資料集來自適應計算 anchor。

YOLO系列梳理(三)YOLOv5

如果你覺得計算的錨框效果並不好,那你也可以在程式碼中將此功能關閉。

自適應的計算具體過程:

1. 獲取資料集中所有目標的寬和高。

2. 將每張圖片中按照等比例縮放的方式到 resize 指定大小,這裡保證寬高中的最大值符合指定大小。

3. 將 bboxes 從相對座標改成絕對座標,這裡乘以的是縮放後的寬高。

4. 篩選 bboxes,保留寬高都大於等於兩個畫素的 bboxes。

5. 使用 k-means 聚類三方得到n個 anchors,與v3、v4 操作一樣。

6. 使用遺傳演算法隨機對 anchors 的寬高進行變異。倘若變異後的效果好,就將變異後的結果賦值給 anchors;如果變異後效果變差就跳過,預設變異1000次。這裡是使用 anchor_fitness 方法計算得到的適應度 fitness,然後再進行評估。

 

自適應圖片縮放

自適應圖片縮放-針對不同的目標檢測演算法而言,我們通常需要執行圖片縮放操作,即將原始的輸入圖片縮放到一個固定的尺寸,再將其送入檢測網路中。YOLO 系列演算法中常用的尺寸包括416 * 416,608 * 608 等尺寸。

原始的縮放方法存在著一些問題,因為在實際的使用中的很多圖片的長寬比不同,所以在進行縮放填充之後,兩端的黑邊大小都不相同,但是如果填充過多,則會存在大量的資訊冗餘,從而影響整體的推理速度。

為了進一步提升推理速度,YOLOv5 提出一種方法能夠自適應的新增最少的黑邊到縮放之後的圖片中。效果如下圖所示:

1. 根據原始圖片大小與輸入到網路圖片大小計算縮放比例。

2. 根據原始圖片大小與縮放比例計算縮放後的圖片大小。

3. 計算黑邊填充數值。

YOLO系列梳理(三)YOLOv5

需要注意的是:

  1. 該操作僅在模型推理階段執行,模型訓練階段仍然和傳統的方法相同,將原始圖片裁剪到 416 x 416 大小;

  2. YOLOv3 與 YOLOv4 中預設填充的數值是 (0,0,0),而 YOLOv5 中預設填充的數值是 (114,114,114);

  3. 該操作僅僅針對原始圖片的短邊而言,仍然將長邊裁剪到416。

 

Backbone


Focus結構

YOLO系列梳理(三)YOLOv5

Focus 模組,輸入通道擴充了4倍,作用是可以使資訊不丟失的情況下提高計算力。Focus 是在 YOLOv5 中提出來的,它先將特徵圖進行分塊切片操作,然後再將結果 Concat 起來,再送入後面模組。

在新版中,YOLOv5 將Focus 模組替換成了一個 6 x 6 的卷積層。兩者的計算量是等價的,但是對於一些 GPU 裝置,使用 6 x 6 的卷積會更加高效。

YOLO系列梳理(三)YOLOv5

在 YOLOv5s 中,608 x 608 x 3 的圖片經 Focus 處理,會變成 304 x 304 x 12 的特徵圖,這樣一定程度上提高了特徵圖的操作。然後會再經過一次32個卷積核變成 304 x 304 x 32 的特徵圖。在 YOLOv5s 中,Focus 最後使用了大小為32的卷積核,但是其他結構如 YOLO5m 是使用更大數目的卷積核。

 

CSP結構

YOLOv5 與 YOLOv4 的不同點在於,YOLOv4 只有主幹網路使用了 CSP結構, 而在 YOLOv5 中,設計了兩種 CSP 結構。其中,CSP1_X 應用於 Backbone,另一種 CSP2_X 則是應用於 Neck 中。

 

Neck

YOLOv5 對 FPN + PAN 的結構作了一些改動。在這裡使用了另外一種 CSP2_X 的結構,加強網路特徵融合的能力。

 

Head

在訓練階段,YOLOv5 與 YOLOv4 一樣,採用其中的了 CIOU_Loss。在推理階段,YOLOv4 在 DIOU_Loss 的基礎上採用了 DIOU_nms 的方式,而 YOLOv5 是採用加權 nms 的方式。

 

NMS 非極大值抑制

YOLO系列梳理(三)YOLOv5

NMS 的本質是搜尋區域性極大值,抑制非極大值元素。非極大值抑制,主要就是用來抑制檢測時冗餘的框。因為在目標檢測中,在同一目標的位置上會產生大量的候選框,這些候選框相互之間可能會有重疊,所以我們需要利用非極大值抑制找到最佳的目標邊界框,消除冗餘的邊界框。

 

大致演算法流程為:

1. 對所有預測框的置信度降序排序

2. 選出置信度最高的預測框,確認其為正確預測,並計算他與其他預測框的 IOU

3. 根據步驟2中計算的 IOU 去除重疊度高的,IOU > threshold 閾值就直接刪除

4. 剩下的預測框返回第1步,直到沒有剩下的為止

NMS 一次處理只會一個類別,所以如果有N個類別,那麼就需要執行N次。

 

SoftNMS

當兩個目標靠的非常近時,置信度低的會被置信度高的框所抑制,那麼當兩個目標靠的十分近的時候就只會識別出一個 bbox。為了解決這個問題,可以使用 softNMS。它的基本思想是用稍低一點的分數來代替原有的分數,而不是像 nms 一樣直接置零。

YOLO系列梳理(三)YOLOv5

 

訓練策略


YOLOv5 也使用了許多訓練策略。

  1. 多尺度訓練。如果網路的輸入是416 x 416。那麼訓練的時候就會從 0.5 x 416 到 1.5 x 416 中任意取值,但所取的值都是32的整數倍。

  2. 訓練開始前會使用 warmup 進行訓練。在模型預訓練階段,先使用較小的學習率訓練一些epochs或者steps (如4個 epoch 或10000個 step),再修改為預先設定的學習率進行訓練。

  3. 使用了 cosine 學習率下降策略。

  4. 採用了 EMA 更新權重,相當於訓練時給引數賦予一個動量,這樣更新起來就會更加平滑。

  5. 使用了 amp 進行混合精度訓練。能夠減少視訊記憶體的佔用並且加快訓練速度,但是需要 GPU 支援。

     

損失函式


YOLOv5 的損失依舊是由 Classes loss、Objectness loss、Location loss組成:

Location loss 採用的是 CIOU loss,這裡只會計算正樣本的定位損失。

Classes loss 和 Objectness loss 採用的是 BCE loss。其中 Classes loss 也只會計算正樣本的分類損失。

Objectness loss 是使用所有樣本進行反向傳播的計算,並且這裡用的是網路預測的目標邊界框與 GT Box 的CIOU。

 

程式碼


YOLOv5 的作者並沒有發表論文,因此只能從程式碼角度進行分析。YOLOv5 程式碼:https://github.com/ultralytics/yolov5

參考連結

https://zhuanlan.zhihu.com/p/172121380

https://blog.csdn.net/qq_37541097/article/details/123594351

https://zhuanlan.zhihu.com/p/186014243

 

總結與分析


YOLOv5 是 one stage 的目標檢測演算法,該演算法在 YOLOv4 的基礎上新增了一些新的改進思路,使得其速度與精度都得到了極大的效能提升,具體包括:輸入端的 Mosaic 資料增強、自適應錨框計算、自適應圖片縮放操作、Focus 結構、CSP 結構、SPP 結構、FPN + PAN 結構、CIOU_Loss 等等。除此之外,YOLOv5 中的各種改進思路也可以使用到其它的目標檢測演算法中。

YOLO系列下一篇將介紹YOLO部署的內容。

YOLO系列專欄文章:

YOLO系列梳理(一)YOLOv1-YOLOv3

YOLO系列梳理(二)YOLOv4

YOLO系列梳理(三)YOLOv5

歡迎關注公眾號CV技術指南,專注於計算機視覺的技術總結、最新技術跟蹤、經典論文解讀、CV招聘資訊。

CV技術指南建立了一個免費的知識星球。關注公眾號新增編輯的微訊號可邀請加入。

歡迎可以寫以下內容的朋友聯絡我(微訊號:FewDesire,也可以關注公眾號獲取本人聯絡方式)。新增前請備註“內容投遞”

  1. TVM入門到實踐的教程

  2. TensorRT入門到實踐的教程

  3. MNN入門到實踐的教程

  4. 數字影像處理與Opencv入門到實踐的教程

  5. OpenVINO入門到實踐的教程

  6. libtorch入門到實踐的教程

  7. Oneflow入門到實踐的教程

  8. Detectron入門到實踐的教程

  9. CUDA入門到實踐的教程

  10. caffe原始碼閱讀

  11. pytorch原始碼閱讀

  12. 深度學習從入門到精通(從卷積神經網路開始講起)

  13. 最新頂會的解讀。例如最近的CVPR2022論文。

  14. 各個方向的系統性綜述、主要模型發展演變、各個模型的創新思路和優缺點、程式碼解析等。

  15. 若自己有想寫的且這上面沒提到的,可以跟我聯絡。

    宣告:有一定報酬,具體請聯絡詳談。

其它文章

YOLO系列梳理(一)YOLOv1-YOLOv3

YOLO系列梳理(二)YOLOv4

Attention Mechanism in Computer Vision

從零搭建Pytorch模型教程(三)搭建Transformer網路

從零搭建Pytorch模型教程(二)搭建網路

從零搭建Pytorch模型教程(一)資料讀取

YOLO系列梳理與複習(二)YOLOv4

YOLO系列梳理(一)YOLOv1-YOLOv3

StyleGAN大彙總 | 全面瞭解SOTA方法、架構新進展

一份熱力圖視覺化程式碼使用教程

一份視覺化特徵圖的程式碼

工業影像異常檢測研究總結(2019-2020)

關於快速學習一項新技術或新領域的一些個人思維習慣與思想總結

相關文章