Yolov5有很多版本,但是 Yolov5s網絡最小,速度最少,AP精度也最低。但如果檢測的以大目标為主,追求速度,倒也是個不錯的選擇。其他的三種網絡,在此基礎上,不斷加深加寬網絡,AP精度也不斷提升,但速度的消耗也在不斷增加。目前使用下來,yolov5s的模型十幾M大小,速度很快,線上生産效果可觀,嵌入式裝置可以使用。
主要技術介紹:
Mosaic資料增強
Yolov5的輸入端采用了和Yolov4一樣的Mosaic資料增強的方式。
注: Mosaic資料增強: 主要思想是将四張圖檔進行随機裁剪,再拼接到一張圖上作為訓練資料。這樣做的好處是豐富了圖檔的背景,并且四張圖檔拼接在一起變相地提高了batch_size,在進行batch normalization的時候也會計算四張圖檔,是以對本身batch_size不是很依賴,增加了資料的多樣性。
随機縮放、随機裁剪、随機排布的方式進行拼接,對于小目标的檢測效果很不錯。
自适應錨框計算
在Yolo算法中,針對不同的資料集,都會有初始設定長寬的錨框。
在網絡訓練中,網絡在初始錨框的基礎上輸出預測框,進而和真實框ground truth進行比對,計算兩者差距,再反向更新,疊代網絡參數。
在YOLOv3、YOLOv4中,訓練不同的資料集時,計算初始錨框的值是通過單獨的程式運作的。但YOLOv5中将此功能嵌入到代碼中,每次訓練時,自适應的計算不同訓練集中最佳錨框找值。
anchor box既用于訓練階段,也用于預測階段。
訓練階段,訓練的時候其實已經打好了錨框,也就是說,在實際預測的時候會生成多個錨框,然後通過疊代使我們的損失函數最小,讓預測的框與之前輸入的錨框盡可能相一緻。
在預測階段,首先在圖像中生成多個anchor box,然後根據訓練好的模型參數去預測這些anchor box的類别和偏移量,進而得到預測的邊界框。由于門檻值和anchor box數量選擇的問題,同一個目标可能會輸出多個相似的預測邊界框,這樣不僅不簡潔,而且會增加計算量,為了解決這個問題,常用的措施是使用非極大值抑制(non-maximum suppression,NMS)。
自适應圖檔縮放
在常用的目标檢測算法中,不同的圖檔長寬都不相同,是以常用的方式是将原始圖檔統一縮放到一個标準尺寸,再送入檢測網絡中。
Yolov5中的letterbox自适應圖檔縮放技術
在目标檢測中,輸入的圖檔尺寸有大有小,根據前人的實驗結果,輸入網絡的尺寸統一縮放到同一個尺寸時,檢測效果會更好(train中放入的圖檔并不經過letterbox,而是檢測的時候使用letterbox)
但這時就有個問題,如果是簡單的使用resize,就會造成圖檔的失真,是以提出了letterbox自适應圖檔縮放技術。詳情參考博文連結
Focus結構
class Focus(nn.Module):
# Focus wh information into c-space
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups
super(Focus, self).__init__()
self.conv = Conv(c1 * 4, c2, k, s, p, g, act) # 這裡輸入通道變成了4倍
def forward(self, x): # x(b,c,w,h) -> y(b,4c,w/2,h/2)
return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
Focus子產品在v5中是圖檔進入backbone前,對圖檔進行切片操作,具體操作是在一張圖檔中每隔一個像素拿到一個值,類似于鄰近下采樣,這樣就拿到了四張圖檔,四張圖檔互補,長的差不多,但是沒有資訊丢失,這樣一來,将W、H資訊就集中到了通道空間,輸入通道擴充了4倍,即拼接起來的圖檔相對于原先的RGB三通道模式變成了12個通道,最後将得到的新圖檔再經過卷積操作,最終得到了沒有資訊丢失情況下的二倍下采樣特征圖。
以yolov5s為例,原始的640 × 640 × 3的圖像輸入Focus結構,采用切片操作,先變成320 × 320 × 12的特征圖,再經過一次卷積操作,最終變成320 × 320 × 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部分
Yolov4的Neck結構中,采用的都是普通的卷積操作。而Yolov5的Neck結構中,采用借鑒CSPnet設計的CSP2結構,加強網絡特征融合的能力。
output
Bounding box損失函數 Yolov5中采用其中的GIOU_Loss做Bounding box的損失函數。
nms非極大值抑制 在目标檢測的後處理過程中,針對很多目标框的篩選,通常需要nms操作。Yolov4在DIOU_Loss的基礎上采用DIOU_nms的方式,而Yolov5中仍然采用權重nms的方式。