網絡結構
1.1 Backbone
YOLOv5-6.0版本的Backbone主要分為Conv模塊、CSPDarkNet53和SPPF模塊。
1.1.1 Conv模塊
YOLOv5在Conv模塊中封裝了三個功能:包括卷積(Conv2d)、Batch Normalization和激活函數,同時使用autopad(k, p)實現了padding的效果。其中YOLOv5-6.0版本使用Swish(或者叫SiLU)作為激活函數,代替了舊版本中的Leaky ReLU。
1.1.2 Focus模塊
Focus模塊是YOLOv5舊版本中的一個模塊,它的結構如下圖所示。
其中核心部分是對圖片進行切片(slice)操作,并且在通道維度上進行拼接。
如下圖所示,對于一張3通道的輸入圖片,分別在w ww和h hh兩個維度上,每隔一個像素取一個值,從而構建得到12張?zhí)卣鲌D。
這12張?zhí)卣鲌D在寬度和高度上變?yōu)樵瓉淼亩种?但是通道維度擴充了4倍。
同時,這12張?zhí)卣鲌D包含了輸入圖片的所有信息,因此Focus模塊不僅在減少信息丟失的情況下實現了2倍下采樣。
而且減少了參數量(params)和計算量(FLOPs),降低了CUDA顯存的消耗,從而提升了前向和后向傳遞的速度。
最后對拼接后的特征圖進行一次卷積操作,將通道數增加到64。
但是在YOLOv5-6.0版本中使用了尺寸大小為6 66×6 66,步長為2,padding為2的卷積核代替了Focus模塊,便于模型的導出,且效率更高。
1.1.3 CSPDarkNet53
1.1.3.1 CSPNet
CSPNet被提出的主要目的是為了保證在模型檢測和識別精度沒有下降的情況下,減少計算量,提高推理速度。
它的主要思想是通過分割梯度流,使梯度流通過不同的網絡路徑傳播。通過拼接和過渡等操作,從而實現更豐富的梯度組合信息。
Cross Stage Partial DenseNet
以DenseNet為例,在將特征圖輸入到Dense_Block之前,將特征圖從通道維度上分為兩個部分:
其中一部分進入Dense_Block中進行計算,另一部分則通過一個shortcut與Dense_Block的輸出特征圖進行拼接,最后將拼接后的特征圖輸入到Transition Layer進行卷積操作。
1.1.3.2 Bottleneck模塊
Bottleneck模塊借鑒了ResNet的殘差結構,其中一路先進行1 11×1 11卷積將特征圖的通道數減小一半。
從而減少計算量,再通過3 33×3 33卷積提取特征,并且將通道數加倍,其輸入與輸出的通道數是不發(fā)生改變的。
而另外一路通過shortcut進行殘差連接,與第一路的輸出特征圖相加,從而實現特征融合。
在YOLOv5的Backbone中的Bottleneck都默認使shortcut為True,而在Head中的Bottleneck都不使用shortcut。
1.1.3.3 C3模塊
YOLOv4和YOLOv5均借鑒了CSPNet的思想,將其運用于DarkNet53骨干網絡。YOLOv5-6.0版本中使用了C3模塊,替代了早期的BottleneckCSP模塊。
C3模塊
BottleneckCSP模塊
這兩者結構作用基本相同,均為CSP架構,只是在修正單元的選擇上有所不同,C3模塊包含了3個標準卷積層以及多個Bottleneck模塊。
C3模塊相對于BottleneckCSP模塊所不同的是,經過Bottleneck模塊輸出后的Conv模塊被去掉了。
但是YOLOv4和YOLOv5的Backbone雖然借鑒了CSPNet,但實際上并沒有按照CSPNet原論文中那樣將輸入的特征圖在通道維度上劃分成兩個部分。
而是直接用兩路的1 11×1 11卷積對輸入特征圖進行變換。
1.1.4 SPPF模塊
參考鏈接:
https://github.com/ultralytics/yolov5/pull/4420
YOLOv5-6.0版本使用了SPPF模塊來代替SPP模塊,其中SPP是Spatial Pyramid Pooling的簡稱,即空間金字塔池化,YOLOv5借鑒了SPPNet的思想。
SPPF模塊采用多個小尺寸池化核級聯(lián)代替SPP模塊中單個大尺寸池化核,從而在保留原有功能。
即融合不同感受野的特征圖,豐富特征圖的表達能力的情況下,進一步提高了運行速度。
SPPF模塊
SPP模塊
1.2 Neck
YOLOv5的Neck與YOLOV4相似,均借鑒了FPN和PANet的思想。
1.2.1 FPN
論文鏈接:https://arxiv.org/abs/1612.03144
FPN,即Feature Pyramid Network(特征金字塔)。
原來多數的目標檢測算法只是采用頂層特征做預測,但我們知道淺層的特征所攜帶的語義信息較少,而位置信息更強;
深層的特征所攜帶的語義信息較豐富,而位置信息更弱。FPN的思想就是把深層的語義信息傳遞到淺層,從而增強多個尺度上的語義表達。
FPN的大致結構如上圖所示,左邊是一個自底向上(Bottom-up)的傳播路徑,右邊是一個自頂向下(Top-down)的傳播路徑,中間是通過橫向連接(lateral connection)進行特征融合。
其中自底向上(Bottom-up)的過程就是網絡的前向傳播過程,對應前面的骨干網絡(Backbone)。
在前向過程中,feature map的大小在經過某些層后會改變,而在經過其他一些層的時候不會改變,作者將不改變feature map大小的層歸為一個stage。
因此每次抽取的特征都是每個stage的最后一層的輸出,這樣就能構成特征金字塔。
自頂向下(Top-down)的過程是從小尺寸的feature map開始逐個stage進行2倍上采樣。
而橫向連接則是先由自底向上(Bottom-up)過程中生成的相同大小的feature map經過1 11×1 11的卷積核來減少通道數(如下圖所示)。
然后與2倍上采樣得到的feature map進行相加融合(在YOLOv5中采用的是拼接融合)。
在融合之后還會對每個融合結果進行3 33×3 33卷積,目的是消除上采樣的混疊效應(aliasing effect)。
1.2.2 PANet
論文鏈接:https://arxiv.org/abs/1803.01534
FPN通過自頂向下(Top-down)的結構,將深層的語義信息傳遞到淺層,但是淺層的位置信息卻無法影響到深層特征。
同時,FPN中頂部信息流需要通過骨干網絡(Backbone)逐層地往下傳遞,由于層數相對較多,因此計算量比較大,而PANet有效地解決了上述這些問題。
如上圖(b)所示,PANet在FPN的基礎上又引入了一個自底向上(Bottom-up)的路徑。
經過自頂向下(Top-down)的特征融合后,再進行自底向上(Bottom-up)的特征融合,這樣底層的位置信息也能夠傳遞到深層,從而增強多個尺度上的定位能力。
同時,與FPN相比(如紅色線條所示),PANet中的底層特征傳遞所需要穿越的feature map數量大大減少(如綠色線條所示),使得底層的位置信息更容易傳遞到頂部。
其中自底向上(Bottom-up)的過程是沿著N 2 → N 3 → N 4 → N 5 的路徑,逐個stage通過3 33×3 33卷積進行2倍下采樣,然后與FPN中相應大小的feature map進行相加融合(在YOLOv5中采用的是拼接融合)。
1.3 Head
YOLOv5的Head對Neck中得到的不同尺度的特征圖分別通過1 11×1 11卷積將通道數擴展,擴展后的特征通道數為(類別數量+5)× ××每個檢測層上的anchor數量。
其中5 55分別對應的是預測框的中心點橫坐標、縱坐標、寬度、高度和置信度,這里的置信度表示預測框的可信度。
取值范圍為( 0 , 1 ) (0,1)(0,1),值越大說明該預測框中越有可能存在目標。
Head中包含3個檢測層,分別對應Neck中得到的3種不同尺寸的特征圖。
YOLOv5根據特征圖的尺寸在這3種特征圖上劃分網格,并且給每種特征圖上的每個網格都預設了3個不同寬高比的anchor,用來預測和回歸目標。
因此上述的通道維度可以理解為在特征圖的通道維度上保存了所有基于anchor先驗框的位置信息和分類信息,如下圖所示。
目標框回歸
YOLOv5的目標框回歸計算公式如下所示:
其中( b x , b y , b w , b h )表示預測框的中心點坐標、寬度和高度,( c x , c y )表示預測框中心點所在網格的左上角坐標,( t x , t y )
表示預測框的中心點相對于網格左上角坐標的偏移量,( t w , t h ) 表示預測框的寬高相對于anchor寬高的縮放比例,( p w , p h ) )表示先驗框anchor的寬高。
為了將預測框的中心點約束到當前網格中,使用Sigmoid函數處理偏移量,使預測的偏移值保持在( 0 , 1 ) (0,1)(0,1)范圍內。
這樣一來,根據目標框回歸計算公式,預測框中心點坐標的偏移量保持在( ? 0.5 , 1.5 ) (-0.5,1.5)(?0.5,1.5)范圍內。如上圖藍色區(qū)域所示。
正負樣本匹配
如上面所述,YOLOv5的每個檢測層上的每個網格都預設了多個anchor先驗框,但并不是每個網格中都存在目標,也并不是每個anchor都適合用來回歸當前目標。
因此需要對這些anchor先驗框進行篩選,將其劃分為正樣本和負樣本。本文的正負樣本指的是預測框而不是Ground Truth(人工標注的真實框)。
與YOLOv3/4不同的是,YOLOv5采用的是基于寬高比例的匹配策略,它的大致流程如下:
1.對于每一個Ground Truth(人工標注的真實框),分別計算它與9種不同anchor的寬與寬的比值(w1/w2, w2/w1)和高與高的比值(h1/h2, h2/h1)。
2.找到Ground Truth與anchor的寬比(w1/w2, w2/w1)和高比(h1/h2, h2/h1)中的最大值,作為該Ground Truth和anchor的比值。
3.若Ground Truth和anchor的比值小于設定的比值閾值(超參數中默認為anchor_t = 4.0)。
那么這個anchor就負責預測這個Ground Truth,即這個anchor所回歸得到的預測框就被稱為正樣本,剩余所有的預測框都是負樣本。
通過上述方法,YOLOv5不僅篩選了正負樣本,同時對于部分Ground Truth在單個尺度上匹配了多個anchor來進行預測,總體上增加了一定的正樣本數量。
除此以外,YOLOv5還通過以下幾種方法增加正樣本的個數,從而加快收斂速度。
1.跨網格擴充:假設某個Ground Truth的中心點落在某個檢測層上的某個網格中,除了中心點所在的網格之外,其左、上、右、下4個鄰域的網格中。
靠近Ground Truth中心點的兩個網格中的anchor也會參與預測和回歸,即一個目標會由3個網格的anchor進行預測,如下圖所示。
2.跨分支擴充:YOLOv5的檢測頭包含了3個不同尺度的檢測層,每個檢測層上預設了3種不同長寬比的anchor,假設一個Ground Truth可以和不同尺度的檢測層上的anchor匹配。
則這3個檢測層上所有符合條件的anchor都可以用來預測該Ground Truth,即一個目標可以由多個檢測層的多個anchor進行預測
損失計算
4.1 總損失
YOLOv5對特征圖上的每個網格進行預測,得到的預測信息與真實信息進行對比,從而指導模型下一步的收斂方向。
損失函數的作用就是衡量預測信息和真實信息之間的差距,若預測信息越接近真實信息,則損失函數值越小。YOLOv5的損失主要包含三個方面:
矩形框損失(bbox_loss)、分類損失(cls_loss)、置信度損失(obj_loss)。
總損失的表達式為:
Loss=box_gain×bbox_loss+cls_gain×cls_loss+obj_gain×obj_loss
其中b o x _ g a i n box\_gainbox_gain、c l s _ g a i n 分別對應不同的損失權重,默認值分別為0.05,0.5,1.0。
4.2 邊界框損失
文鏈接:https://arxiv.org/abs/1911.08287
IoU,即交并比,它的作用是衡量目標檢測中預測框與真實框的重疊程度。假設預測框為A,真實框為B,則IoU的表達式為:IoU= A?BA?B
但是當預測框與真實框沒有相交時,IoU不能反映兩者之間的距離,并且此時IoU損失為0,將會影響梯度回傳,從而導致無法訓練。
此外,IoU無法精確的反映預測框與真實框的重合度大小。因此為了改進IoU,又不斷提出了GIoU、DIoU和CIoU等一系列IoU的變種。
YOLOv5默認使用CIoU來計算邊界框損失。CIoU是在DIoU的基礎上,進一步考慮了Bounding Box的寬高比。
其中DIoU將預測框和真實框之間的距離,重疊率以及尺度等因素都考慮了進去,使得目標框回歸變得更加穩(wěn)定。它的損失計算公式為
其中b和b^{gt}分別表示預測框和真實框的中心點,ρ hoρ表示兩個中心點之間的歐式距離,c 表示預測框和真實框的最小閉包區(qū)域的對角線距離,如下圖所示
4.3 分類損失
4.4 置信度損失
每個預測框的置信度表示這個預測框的可靠程度,值越大表示該預測框越可靠,也表示越接近真實框。
如下圖所示,紅點A 、B 、C 、D 表示真實框的中心點,那么每個紅點所在網格對應的anchor所預測和回歸得到的預測框置信度應該比較大甚至接近1,而其它網格對應的預測框置信度則會比較小甚至接近0。
對于置信度標簽,YOLO之前的版本認為所有存在目標的網格(正樣本)對應的標簽值均為1,其余網格(負樣本)對應的標簽值為0。
但是這樣帶來的問題是有些預測框可能只是在目標的周圍,而并不能很好地框住目標。
因此YOLOv5的做法是,根據網格對應的預測框與真實框的CIoU作為該預測框的置信度標簽。它的代碼實現如下:
tobj[b, a, gj, gi] = (1.0 - self.gr) + self.gr * score_iou
其中self.gr為標簽平滑系數,當參數self.gr為1時,置信度標簽就等于CIoU。
與計算分類損失一樣,YOLOv5默認使用二元交叉熵函數來計算置信度損失。
除此以外,對于不同尺度的檢測層上得到的置信度損失,YOLOv5分配了不同的權重系數。
按照檢測層尺度從大到小的順序,對應的默認的權重系數分別為4.0、1.0、0.4,即用于檢測小目標的大尺度特征圖上的損失權重系數更大,從而使得網絡在訓練時更加側重于小目標。
數據增強
5.1 Mosaic
YOLOv5借鑒了YOLOv4中的Mosaic數據增強方法,它是CutMix數據增強方法的進化版。
主要思想是任意抽取四張圖片進行隨機裁剪,然后拼接到一張圖片上作為訓練數據,同時每張圖片上的標注框也會進行相應的裁剪。
這樣做的好處是變相增大了batch_size,豐富了圖像背景,同時通過對識別物體的裁剪,使模型根據局部特征識別物體,有助于被遮擋物體的檢測,從而提升了模型的檢測能力。Mosaic數據增強的操作過程如下:
1.假設抽取的每張圖片尺寸為( 640 , 640 ) ,重新拼接后的圖片尺寸為( 1280 , 1280 ) 。在下圖的灰色區(qū)域中隨機生成一個中心點( x c , y c ) ,從而將平面分割成四塊不同大小的區(qū)域。
labels4, segments4 = [], [] s = self.img_size yc, xc = (int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border)
2.在加載第一張圖片后,從數據集中再隨機抽取三張圖片,并打亂這四張圖片的順序。
indices = [index] + random.choices(self.indices, k=3) random.shuffle(indices)
3.將第一張圖像放置在左上角的區(qū)域,其右下角坐標與隨機生成的中心點對齊;
將第二張圖像放置在右上角的區(qū)域,其左下角坐標與隨機生成的中心點對齊;
將第三張圖像放置在左下角的區(qū)域,其右上角坐標與隨機生成的中心點對齊;
將第四張圖像放置在右下角的區(qū)域,其左上角坐標與隨機生成的中心點對齊。
if i == 0: # top left img4 = np.full((s * 2, s * 2, img.shape[2]), 114, dtype=np.uint8) x1a, y1a, x2a, y2a = max(xc - w, 0), max(yc - h, 0), xc, yc x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h elif i == 1: # top right x1a, y1a, x2a, y2a = xc, max(yc - h, 0), min(xc + w, s * 2), yc x1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), h elif i == 2: # bottom left x1a, y1a, x2a, y2a = max(xc - w, 0), yc, xc, min(s * 2, yc + h) x1b, y1b, x2b, y2b = w - (x2a - x1a), 0, w, min(y2a - y1a, h) elif i == 3: # bottom right x1a, y1a, x2a, y2a = xc, yc, min(xc + w, s * 2), min(s * 2, yc + h) x1b, y1b, x2b, y2b = 0, 0, min(w, x2a - x1a), min(y2a - y1a, h) img4[y1a:y2a, x1a:x2a] = img[y1b:y2b, x1b:x2b] # img4[ymin:ymax, xmin:xmax] padw = x1a - x1b padh = y1a - y1b
4.假設抽取的圖片尺寸超過了填充區(qū)域給定的大小,則需要對抽取的圖片中超過填充區(qū)域的部分進行裁剪,如下圖所示。
假設抽取的圖片尺寸小于填充區(qū)域給定的大小,則需要對缺少的區(qū)域進行填充,如下圖所示。
5.將歸一化后的標注框坐標還原到原圖尺寸,然后轉換到拼接后的坐標系中,得到新的標注框坐標。
labels, segments = self.labels[index].copy(), self.segments[index].copy() if labels.size: labels[:, 1:] = xywhn2xyxy(labels[:, 1:], w, h, padw, padh) segments = [xyn2xy(x, w, h, padw, padh) for x in segments] labels4.append(labels) segments4.extend(segments)
6.由于重新拼接后的圖片尺寸為( 1280 , 1280 ) ,因此還需要將其尺寸縮放到( 640 , 640 ) ,保證與用于訓練的輸入圖片尺寸一致。
5.2 MixUp
MixUp是一種簡單的數據增強方法,它的主要思想是將兩個隨機樣本的特征和標簽進行加權求和,從而得到一個新的訓練樣本。
公式如下:
其中x 1和x 2 表示兩個不同的輸入樣本,y 1 和y 2 表示兩個不同的輸入樣本對應的標簽,λ表示兩個樣本融合的比例系數,且滿足Beta分布。
但是在YOLOv5中只對圖像特征做了融合,而對標簽做了拼接,具體的代碼實現如下:
r = np.random.beta(32.0, 32.0) im = (im * r + im2 * (1 - r)).astype(np.uint8) labels = np.concatenate((labels, labels2), 0)
審核編輯:湯梓紅
-
模塊
+關注
關注
7文章
2706瀏覽量
47468 -
封裝
+關注
關注
126文章
7901瀏覽量
142951 -
網絡結構
+關注
關注
0文章
48瀏覽量
11086
原文標題:YOLOv5-v6.0學習筆記
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論