前言 YOLOv5 是在 YOLOv4 出來之後沒多久就橫空出世了。今天筆者介紹一下 YOLOv5 的相關知識。目前 YOLOv5 釋出了新的版本,6.0版本。在這裡,YOLOv5 也在5.0基礎上整合了更多特性,同時也對模型做了微調,並且優化了模型大小,減少了模型的引數量。那麼這樣,就更加適合移動端了。
歡迎關注公眾號
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 是借鑑殘差結構的思想來構建網路的。
-
CBM 是殘差模組中的子模組。Conv + BN + Mish 啟用函式 。
-
CSP1_X 由 CSPNet 演變而來,該模組由 CBL 模組、Res unit、Conv、還有 Concate 組成,其中X代表有X個這個模組。
-
CSP2_X 也是由 CSPNet 網路組成,該模組由 Conv 和 X個 Res unit Concate 而成。
-
SPP 從 YOLOv3 起,就有使用 SPP 模組。SPP 是 通過採用 1 × 1、5 × 5、9 × 9 和 13 × 13 的最大池化方式,來進行多尺度特徵的融合。
-
新版的 YOLOv5 中使用的是升級版的 SPP結構,SPPF。它是將原本並行的 MaxPool 替換成了序列 MaxPool。其中序列兩個 5 x 5 大小的 MaxPool 和一個 9 x 9 大小的 MaxPool 是等價的,而序列三個 5 x 5 大小的 MaxPool 層和一個 13 x 13 大小的 MaxPool 是等價的。並行和序列的效果一樣,但序列的效率更高。
YOLOv5 知識點
總體來說,YOLOv5 和 YOLOv4 差不多,但還是做了一些調整、優化。
在 YOLOv5 中涉及到的知識:Mosaic資料增強、自適應錨框計算、自適應圖片縮放、Focus 結構、CSP 結構、FPN + PAN 結構、GIOU_Loss。
自適應錨框計算
像之前的 YOLOv3、YOLOv4,對於不同的資料集,都會計算先驗框 anchor。然後在網路訓練時,網路會在 anchor 的基礎上進行預測,然後輸出預測框,再和標籤框進行對比,最後就進行梯度地反向傳播。
在 YOLOv3、YOLOv4 中,訓練不同的資料集時,是使用單獨的指令碼進行初始錨框的計算,在 YOLOv5 中,則是將此功能嵌入到整個訓練程式碼裡中。所以在每次訓練開始之前,它都會根據不同的資料集來自適應計算 anchor。
如果你覺得計算的錨框效果並不好,那你也可以在程式碼中將此功能關閉。
自適應的計算具體過程:
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. 計算黑邊填充數值。
需要注意的是:
-
該操作僅在模型推理階段執行,模型訓練階段仍然和傳統的方法相同,將原始圖片裁剪到 416 x 416 大小;
-
YOLOv3 與 YOLOv4 中預設填充的數值是 (0,0,0),而 YOLOv5 中預設填充的數值是 (114,114,114);
-
該操作僅僅針對原始圖片的短邊而言,仍然將長邊裁剪到416。
Backbone
Focus結構
Focus 模組,輸入通道擴充了4倍,作用是可以使資訊不丟失的情況下提高計算力。Focus 是在 YOLOv5 中提出來的,它先將特徵圖進行分塊切片操作,然後再將結果 Concat 起來,再送入後面模組。
在新版中,YOLOv5 將Focus 模組替換成了一個 6 x 6 的卷積層。兩者的計算量是等價的,但是對於一些 GPU 裝置,使用 6 x 6 的卷積會更加高效。
在 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 非極大值抑制
NMS 的本質是搜尋區域性極大值,抑制非極大值元素。非極大值抑制,主要就是用來抑制檢測時冗餘的框。因為在目標檢測中,在同一目標的位置上會產生大量的候選框,這些候選框相互之間可能會有重疊,所以我們需要利用非極大值抑制找到最佳的目標邊界框,消除冗餘的邊界框。
大致演算法流程為:
1. 對所有預測框的置信度降序排序
2. 選出置信度最高的預測框,確認其為正確預測,並計算他與其他預測框的 IOU
3. 根據步驟2中計算的 IOU 去除重疊度高的,IOU > threshold 閾值就直接刪除
4. 剩下的預測框返回第1步,直到沒有剩下的為止
NMS 一次處理只會一個類別,所以如果有N個類別,那麼就需要執行N次。
SoftNMS
當兩個目標靠的非常近時,置信度低的會被置信度高的框所抑制,那麼當兩個目標靠的十分近的時候就只會識別出一個 bbox。為了解決這個問題,可以使用 softNMS。它的基本思想是用稍低一點的分數來代替原有的分數,而不是像 nms 一樣直接置零。
訓練策略
YOLOv5 也使用了許多訓練策略。
-
多尺度訓練。如果網路的輸入是416 x 416。那麼訓練的時候就會從 0.5 x 416 到 1.5 x 416 中任意取值,但所取的值都是32的整數倍。
-
訓練開始前會使用 warmup 進行訓練。在模型預訓練階段,先使用較小的學習率訓練一些epochs或者steps (如4個 epoch 或10000個 step),再修改為預先設定的學習率進行訓練。
-
使用了 cosine 學習率下降策略。
-
採用了 EMA 更新權重,相當於訓練時給引數賦予一個動量,這樣更新起來就會更加平滑。
-
使用了 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系列專欄文章:
歡迎關注公眾號
CV技術指南建立了一個免費的
歡迎可以寫以下內容的朋友聯絡我(微訊號:FewDesire,也可以關注公眾號獲取本人聯絡方式)。新增前請備註“內容投遞”
-
TVM入門到實踐的教程
-
TensorRT入門到實踐的教程
-
MNN入門到實踐的教程
-
數字影像處理與Opencv入門到實踐的教程
-
OpenVINO入門到實踐的教程
-
libtorch入門到實踐的教程
-
Oneflow入門到實踐的教程
-
Detectron入門到實踐的教程
-
CUDA入門到實踐的教程
-
caffe原始碼閱讀
-
pytorch原始碼閱讀
-
深度學習從入門到精通(從卷積神經網路開始講起)
-
最新頂會的解讀。例如最近的CVPR2022論文。
-
各個方向的系統性綜述、主要模型發展演變、各個模型的創新思路和優缺點、程式碼解析等。
-
若自己有想寫的且這上面沒提到的,可以跟我聯絡。
宣告:有一定報酬,具體請聯絡詳談。
其它文章