1. YOLOv5-v6.0學習筆記

        共 13837字,需瀏覽 28分鐘

         ·

        2023-11-07 12:38

        網(wǎng)絡(luò)結(jié)構(gòu)


        1.1 Backbone


        YOLOv5-6.0版本的Backbone主要分為Conv模塊、CSPDarkNet53和SPPF模塊。



        1.1.1 Conv模塊



        YOLOv5在Conv模塊中封裝了三個功能:包括卷積(Conv2d)、Batch Normalization激活函數(shù),同時使用autopad(k, p)實現(xiàn)了padding的效果。其中YOLOv5-6.0版本使用Swish(或者叫SiLU)作為激活函數(shù),代替了舊版本中的Leaky ReLU。


        1.1.2 Focus模塊


        Focus模塊是YOLOv5舊版本中的一個模塊,它的結(jié)構(gòu)如下圖所示。



        其中核心部分是對圖片進行切片(slice)操作,并且在通道維度上進行拼接。


        如下圖所示,對于一張3通道的輸入圖片,分別在w ww和h hh兩個維度上,每隔一個像素取一個值,從而構(gòu)建得到12張?zhí)卣鲌D。


        這12張?zhí)卣鲌D在寬度和高度上變?yōu)樵瓉淼亩种?但是通道維度擴充了4倍。


        同時,這12張?zhí)卣鲌D包含了輸入圖片的所有信息,因此Focus模塊不僅在減少信息丟失的情況下實現(xiàn)了2倍下采樣。


        而且減少了參數(shù)量(params)和計算量(FLOPs),降低了CUDA顯存的消耗,從而提升了前向和后向傳遞的速度。



        最后對拼接后的特征圖進行一次卷積操作,將通道數(shù)增加到64。


        但是在YOLOv5-6.0版本中使用了尺寸大小為6 66×6 66,步長為2,padding為2的卷積核代替了Focus模塊,便于模型的導出,且效率更高。


        1.1.3 CSPDarkNet53


        1.1.3.1 CSPNet


        論文鏈接:https://arxiv.org/abs/1911.11929


        CSPNet被提出的主要目的是為了保證在模型檢測和識別精度沒有下降的情況下,減少計算量,提高推理速度。


        它的主要思想是通過分割梯度流,使梯度流通過不同的網(wǎng)絡(luò)路徑傳播。通過拼接和過渡等操作,從而實現(xiàn)更豐富的梯度組合信息。


        Cross Stage Partial DenseNet


        以DenseNet為例,在將特征圖輸入到Dense_Block之前,將特征圖從通道維度上分為兩個部分:


        其中一部分進入Dense_Block中進行計算,另一部分則通過一個shortcut與Dense_Block的輸出特征圖進行拼接,最后將拼接后的特征圖輸入到Transition Layer進行卷積操作。


        1.1.3.2 Bottleneck模塊



        Bottleneck模塊借鑒了ResNet的殘差結(jié)構(gòu),其中一路先進行1 11×1 11卷積將特征圖的通道數(shù)減小一半。


        從而減少計算量,再通過3 33×3 33卷積提取特征,并且將通道數(shù)加倍,其輸入與輸出的通道數(shù)是不發(fā)生改變的。


        而另外一路通過shortcut進行殘差連接,與第一路的輸出特征圖相加,從而實現(xiàn)特征融合。


        在YOLOv5的Backbone中的Bottleneck都默認使shortcut為True,而在Head中的Bottleneck都不使用shortcut。


        1.1.3.3 C3模塊


        YOLOv4和YOLOv5均借鑒了CSPNet的思想,將其運用于DarkNet53骨干網(wǎng)絡(luò)。YOLOv5-6.0版本中使用了C3模塊,替代了早期的BottleneckCSP模塊


        C3模塊


        BottleneckCSP模塊


        這兩者結(jié)構(gòu)作用基本相同,均為CSP架構(gòu),只是在修正單元的選擇上有所不同,C3模塊包含了3個標準卷積層以及多個Bottleneck模塊


        C3模塊相對于BottleneckCSP模塊所不同的是,經(jīng)過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(特征金字塔)。


        原來多數(shù)的目標檢測算法只是采用頂層特征做預(yù)測,但我們知道淺層的特征所攜帶的語義信息較少,而位置信息更強;


        深層的特征所攜帶的語義信息較豐富,而位置信息更弱。FPN的思想就是把深層的語義信息傳遞到淺層,從而增強多個尺度上的語義表達。



        FPN的大致結(jié)構(gòu)如上圖所示,左邊是一個自底向上(Bottom-up)的傳播路徑,右邊是一個自頂向下(Top-down)的傳播路徑,中間是通過橫向連接(lateral connection)進行特征融合。


        其中自底向上(Bottom-up)的過程就是網(wǎng)絡(luò)的前向傳播過程,對應(yīng)前面的骨干網(wǎng)絡(luò)(Backbone)。


        在前向過程中,feature map的大小在經(jīng)過某些層后會改變,而在經(jīng)過其他一些層的時候不會改變,作者將不改變feature map大小的層歸為一個stage。


        因此每次抽取的特征都是每個stage的最后一層的輸出,這樣就能構(gòu)成特征金字塔。


        自頂向下(Top-down)的過程是從小尺寸的feature map開始逐個stage進行2倍上采樣。


        而橫向連接則是先由自底向上(Bottom-up)過程中生成的相同大小的feature map經(jīng)過1 11×1 11的卷積核來減少通道數(shù)(如下圖所示)。


        然后與2倍上采樣得到的feature map進行相加融合(在YOLOv5中采用的是拼接融合)。


        在融合之后還會對每個融合結(jié)果進行3 33×3 33卷積,目的是消除上采樣的混疊效應(yīng)(aliasing effect)。



        1.2.2 PANet


        論文鏈接:https://arxiv.org/abs/1803.01534


        FPN通過自頂向下(Top-down)的結(jié)構(gòu),將深層的語義信息傳遞到淺層,但是淺層的位置信息卻無法影響到深層特征。


        同時,F(xiàn)PN中頂部信息流需要通過骨干網(wǎng)絡(luò)(Backbone)逐層地往下傳遞,由于層數(shù)相對較多,因此計算量比較大,而PANet有效地解決了上述這些問題。



        如上圖(b)所示,PANet在FPN的基礎(chǔ)上又引入了一個自底向上(Bottom-up)的路徑。


        經(jīng)過自頂向下(Top-down)的特征融合后,再進行自底向上(Bottom-up)的特征融合,這樣底層的位置信息也能夠傳遞到深層,從而增強多個尺度上的定位能力。


        同時,與FPN相比(如紅色線條所示),PANet中的底層特征傳遞所需要穿越的feature map數(shù)量大大減少(如綠色線條所示),使得底層的位置信息更容易傳遞到頂部。


        其中自底向上(Bottom-up)的過程是沿著N 2 → N 3 → N 4 → N 5 的路徑,逐個stage通過3 33×3 33卷積進行2倍下采樣,然后與FPN中相應(yīng)大小的feature map進行相加融合(在YOLOv5中采用的是拼接融合)。


        1.3 Head



        YOLOv5的Head對Neck中得到的不同尺度的特征圖分別通過1 11×1 11卷積將通道數(shù)擴展,擴展后的特征通道數(shù)為(類別數(shù)量+5)× ××每個檢測層上的anchor數(shù)量。


        其中5 55分別對應(yīng)的是預(yù)測框的中心點橫坐標、縱坐標、寬度、高度和置信度,這里的置信度表示預(yù)測框的可信度。


        取值范圍為( 0 , 1 ) (0,1)(0,1),值越大說明該預(yù)測框中越有可能存在目標。


        Head中包含3個檢測層,分別對應(yīng)Neck中得到的3種不同尺寸的特征圖。


        YOLOv5根據(jù)特征圖的尺寸在這3種特征圖上劃分網(wǎng)格,并且給每種特征圖上的每個網(wǎng)格都預(yù)設(shè)了3個不同寬高比的anchor,用來預(yù)測和回歸目標。


        因此上述的通道維度可以理解為在特征圖的通道維度上保存了所有基于anchor先驗框的位置信息和分類信息,如下圖所示。



        目標框回歸



        YOLOv5的目標框回歸計算公式如下所示:


        其中( b x , b y , b w , b h )表示預(yù)測框的中心點坐標、寬度和高度,( c x , c y )表示預(yù)測框中心點所在網(wǎng)格的左上角坐標,( t x , t y ) 


        表示預(yù)測框的中心點相對于網(wǎng)格左上角坐標的偏移量,( t w , t h ) 表示預(yù)測框的寬高相對于anchor寬高的縮放比例,( p w , p h ) )表示先驗框anchor的寬高。


        為了將預(yù)測框的中心點約束到當前網(wǎng)格中,使用Sigmoid函數(shù)處理偏移量,使預(yù)測的偏移值保持在( 0 , 1 ) (0,1)(0,1)范圍內(nèi)。


        這樣一來,根據(jù)目標框回歸計算公式,預(yù)測框中心點坐標的偏移量保持在( ? 0.5 , 1.5 ) (-0.5,1.5)(?0.5,1.5)范圍內(nèi)。如上圖藍色區(qū)域所示。



        正負樣本匹配


        如上面所述,YOLOv5的每個檢測層上的每個網(wǎng)格都預(yù)設(shè)了多個anchor先驗框,但并不是每個網(wǎng)格中都存在目標,也并不是每個anchor都適合用來回歸當前目標。


        因此需要對這些anchor先驗框進行篩選,將其劃分為正樣本和負樣本。本文的正負樣本指的是預(yù)測框而不是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的比值小于設(shè)定的比值閾值(超參數(shù)中默認為anchor_t = 4.0)。


        那么這個anchor就負責預(yù)測這個Ground Truth,即這個anchor所回歸得到的預(yù)測框就被稱為正樣本,剩余所有的預(yù)測框都是負樣本。


        通過上述方法,YOLOv5不僅篩選了正負樣本,同時對于部分Ground Truth在單個尺度上匹配了多個anchor來進行預(yù)測,總體上增加了一定的正樣本數(shù)量。


        除此以外,YOLOv5還通過以下幾種方法增加正樣本的個數(shù),從而加快收斂速度。


        1.跨網(wǎng)格擴充:假設(shè)某個Ground Truth的中心點落在某個檢測層上的某個網(wǎng)格中,除了中心點所在的網(wǎng)格之外,其左、上、右、下4個鄰域的網(wǎng)格中。


        靠近Ground Truth中心點的兩個網(wǎng)格中的anchor也會參與預(yù)測和回歸,即一個目標會由3個網(wǎng)格的anchor進行預(yù)測,如下圖所示。



        2.跨分支擴充:YOLOv5的檢測頭包含了3個不同尺度的檢測層,每個檢測層上預(yù)設(shè)了3種不同長寬比的anchor,假設(shè)一個Ground Truth可以和不同尺度的檢測層上的anchor匹配。


        則這3個檢測層上所有符合條件的anchor都可以用來預(yù)測該Ground Truth,即一個目標可以由多個檢測層的多個anchor進行預(yù)測



        損失計算


        4.1 總損失


        YOLOv5對特征圖上的每個網(wǎng)格進行預(yù)測,得到的預(yù)測信息與真實信息進行對比,從而指導模型下一步的收斂方向。


        損失函數(shù)的作用就是衡量預(yù)測信息和真實信息之間的差距,若預(yù)測信息越接近真實信息,則損失函數(shù)值越小。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 分別對應(yīng)不同的損失權(quán)重,默認值分別為0.05,0.5,1.0。


        4.2 邊界框損失


        文鏈接:https://arxiv.org/abs/1911.08287


        IoU,即交并比,它的作用是衡量目標檢測中預(yù)測框與真實框的重疊程度。假設(shè)預(yù)測框為A,真實框為B,則IoU的表達式為:IoU= A?BA?B



        但是當預(yù)測框與真實框沒有相交時,IoU不能反映兩者之間的距離,并且此時IoU損失為0,將會影響梯度回傳,從而導致無法訓練。


        此外,IoU無法精確的反映預(yù)測框與真實框的重合度大小。因此為了改進IoU,又不斷提出了GIoU、DIoU和CIoU等一系列IoU的變種。


        YOLOv5默認使用CIoU來計算邊界框損失。CIoU是在DIoU的基礎(chǔ)上,進一步考慮了Bounding Box的寬高比。


        其中DIoU將預(yù)測框和真實框之間的距離,重疊率以及尺度等因素都考慮了進去,使得目標框回歸變得更加穩(wěn)定。它的損失計算公式為

        其中b和b^{gt}分別表示預(yù)測框和真實框的中心點,ρ \rhoρ表示兩個中心點之間的歐式距離,c 表示預(yù)測框和真實框的最小閉包區(qū)域的對角線距離,如下圖所示



        4.3 分類損失



        4.4 置信度損失


        每個預(yù)測框的置信度表示這個預(yù)測框的可靠程度,值越大表示該預(yù)測框越可靠,也表示越接近真實框。


        如下圖所示,紅點A 、B 、C 、D 表示真實框的中心點,那么每個紅點所在網(wǎng)格對應(yīng)的anchor所預(yù)測和回歸得到的預(yù)測框置信度應(yīng)該比較大甚至接近1,而其它網(wǎng)格對應(yīng)的預(yù)測框置信度則會比較小甚至接近0。



        對于置信度標簽,YOLO之前的版本認為所有存在目標的網(wǎng)格(正樣本)對應(yīng)的標簽值均為1,其余網(wǎng)格(負樣本)對應(yīng)的標簽值為0。


        但是這樣帶來的問題是有些預(yù)測框可能只是在目標的周圍,而并不能很好地框住目標。


        因此YOLOv5的做法是,根據(jù)網(wǎng)格對應(yīng)的預(yù)測框與真實框的CIoU作為該預(yù)測框的置信度標簽。它的代碼實現(xiàn)如下:


        tobj[b, a, gj, gi] = (1.0 - self.gr) + self.gr * score_iou


        其中self.gr為標簽平滑系數(shù),當參數(shù)self.gr為1時,置信度標簽就等于CIoU。


        與計算分類損失一樣,YOLOv5默認使用二元交叉熵函數(shù)來計算置信度損失。


        除此以外,對于不同尺度的檢測層上得到的置信度損失,YOLOv5分配了不同的權(quán)重系數(shù)。


        按照檢測層尺度從大到小的順序,對應(yīng)的默認的權(quán)重系數(shù)分別為4.0、1.0、0.4,即用于檢測小目標的大尺度特征圖上的損失權(quán)重系數(shù)更大,從而使得網(wǎng)絡(luò)在訓練時更加側(cè)重于小目標。



         數(shù)據(jù)增強


        5.1 Mosaic


        YOLOv5借鑒了YOLOv4中的Mosaic數(shù)據(jù)增強方法,它是CutMix數(shù)據(jù)增強方法的進化版。


        主要思想是任意抽取四張圖片進行隨機裁剪,然后拼接到一張圖片上作為訓練數(shù)據(jù),同時每張圖片上的標注框也會進行相應(yīng)的裁剪。



        這樣做的好處是變相增大了batch_size,豐富了圖像背景,同時通過對識別物體的裁剪,使模型根據(jù)局部特征識別物體,有助于被遮擋物體的檢測,從而提升了模型的檢測能力。Mosaic數(shù)據(jù)增強的操作過程如下:


        1.假設(shè)抽取的每張圖片尺寸為( 640 , 640 ) ,重新拼接后的圖片尺寸為( 1280 , 1280 ) 。在下圖的灰色區(qū)域中隨機生成一個中心點( x c , y c ) ,從而將平面分割成四塊不同大小的區(qū)域。


        labels4, segments4 = [], []s = self.img_sizeyc, xc = (int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border)



        2.在加載第一張圖片后,從數(shù)據(jù)集中再隨機抽取三張圖片,并打亂這四張圖片的順序。


        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, helif 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), helif 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 - x1bpadh = y1a - y1b


        4.假設(shè)抽取的圖片尺寸超過了填充區(qū)域給定的大小,則需要對抽取的圖片中超過填充區(qū)域的部分進行裁剪,如下圖所示。



        假設(shè)抽取的圖片尺寸小于填充區(qū)域給定的大小,則需要對缺少的區(qū)域進行填充,如下圖所示。



        5.將歸一化后的標注框坐標還原到原圖尺寸,然后轉(zhuǎn)換到拼接后的坐標系中,得到新的標注框坐標。


        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是一種簡單的數(shù)據(jù)增強方法,它的主要思想是將兩個隨機樣本的特征和標簽進行加權(quán)求和,從而得到一個新的訓練樣本。


        公式如下:


        其中x 1和x 2 表示兩個不同的輸入樣本,y 1 和y 2 表示兩個不同的輸入樣本對應(yīng)的標簽,λ表示兩個樣本融合的比例系數(shù),且滿足Beta分布。



        但是在YOLOv5中只對圖像特征做了融合,而對標簽做了拼接,具體的代碼實現(xiàn)如下:


        r = np.random.beta(32.0, 32.0)im = (im * r + im2 * (1 - r)).astype(np.uint8)labels = np.concatenate((labels, labels2), 0)


        編輯:古月居


        本文僅做學術(shù)分享,如有侵權(quán),請聯(lián)系刪文。

               
               

        —THE END—

        瀏覽 451
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 曰韩成人无码一区二区三区四区 | 日本sm羞辱/捆绑/调教/束缚 | 农村乱子伦毛片国产乱 | 亚洲国产精品色婷婷久久 | 张津瑜国产在线观看 |