天天看點

YOLOV5學習筆記

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的特征圖。切片操作如下:參考博文連結

YOLOV5學習筆記

注: 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部分

YOLOV5學習筆記

Yolov4的Neck結構中,采用的都是普通的卷積操作。而Yolov5的Neck結構中,采用借鑒CSPnet設計的CSP2結構,加強網絡特征融合的能力。

YOLOV5學習筆記

output

Bounding box損失函數 Yolov5中采用其中的GIOU_Loss做Bounding box的損失函數。

nms非極大值抑制 在目标檢測的後處理過程中,針對很多目标框的篩選,通常需要nms操作。Yolov4在DIOU_Loss的基礎上采用DIOU_nms的方式,而Yolov5中仍然采用權重nms的方式。

繼續閱讀