<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          YOLOv8來啦 | 詳細(xì)解讀YOLOv8的改進(jìn)模塊!YOLOv5官方出品YOLOv8,必卷!

          共 6751字,需瀏覽 14分鐘

           ·

          2023-01-09 15:34

          點(diǎn)擊下方名片關(guān)注【集智書童】,后臺(tái)回復(fù)【YOLOv8】獲取YOLOv8源碼以及書童親自繪制的YOLOv8結(jié)構(gòu)圖原圖。

          回顧一下YOLOv5,不然沒機(jī)會(huì)了

          這里粗略回顧一下,這里直接提供YOLOv5的整理的結(jié)構(gòu)圖吧:

          1. Backbone:CSPDarkNet結(jié)構(gòu),主要結(jié)構(gòu)思想的體現(xiàn)在C3模塊,這里也是梯度分流的主要思想所在的地方;
          2. PAN-FPN:雙流的FPN,必須香,也必須快,但是量化還是有些需要圖優(yōu)化才可以達(dá)到最優(yōu)的性能,比如cat前后的scale優(yōu)化等等,這里除了上采樣、CBS卷積模塊,最為主要的還有C3模塊(記住這個(gè)C3模塊哦);
          3. Head:Coupled Head+Anchor-base,毫無疑問,YOLOv3、YOLOv4、YOLOv5、YOLOv7都是Anchor-Base的,后面會(huì)變嗎?
          4. Loss:分類用BEC Loss,回歸用CIoU Loss。

          話不多說,直接YOLOv8吧!

          直接上YOLOv8的結(jié)構(gòu)圖吧,小伙伴們可以直接和YOLOv5進(jìn)行對(duì)比,看看能找到或者猜到有什么不同的地方?

          下面就直接揭曉答案吧,具體改進(jìn)如下:

          1. Backbone:使用的依舊是CSP的思想,不過YOLOv5中的C3模塊被替換成了C2f模塊,實(shí)現(xiàn)了進(jìn)一步的輕量化,同時(shí)YOLOv8依舊使用了YOLOv5等架構(gòu)中使用的SPPF模塊;
          2. PAN-FPN:毫無疑問YOLOv8依舊使用了PAN的思想,不過通過對(duì)比YOLOv5與YOLOv8的結(jié)構(gòu)圖可以看到,YOLOv8將YOLOv5中PAN-FPN上采樣階段中的卷積結(jié)構(gòu)刪除了,同時(shí)也將C3模塊替換為了C2f模塊;
          3. Decoupled-Head:是不是嗅到了不一樣的味道?是的,YOLOv8走向了Decoupled-Head;
          4. Anchor-FreeYOLOv8拋棄了以往的Anchor-Base,使用了Anchor-Free的思想;
          5. 損失函數(shù):YOLOv8使用VFL Loss作為分類損失,使用DFL Loss+CIOU Loss作為分類損失;
          6. 樣本匹配:YOLOv8拋棄了以往的IOU匹配或者單邊比例的分配方式,而是使用了Task-Aligned Assigner匹配方式。

          1、C2f模塊是什么?與C3有什么區(qū)別?

          我們不著急,先看一下C3模塊的結(jié)構(gòu)圖,然后再對(duì)比與C2f的具體的區(qū)別。針對(duì)C3模塊,其主要是借助CSPNet提取分流的思想,同時(shí)結(jié)合殘差結(jié)構(gòu)的思想,設(shè)計(jì)了所謂的C3 Block,這里的CSP主分支梯度模塊為BottleNeck模塊,也就是所謂的殘差模塊。同時(shí)堆疊的個(gè)數(shù)由參數(shù)n來進(jìn)行控制,也就是說不同規(guī)模的模型,n的值是有變化的。

          其實(shí)這里的梯度流主分支,可以是任何之前你學(xué)習(xí)過的模塊,比如,美團(tuán)提出的YOLOv6中就是用來重參模塊RepVGGBlock來替換BottleNeck Block來作為主要的梯度流分支,而百度提出的PP-YOLOE則是使用了RepResNet-Block來替換BottleNeck Block來作為主要的梯度流分支。而YOLOv7則是使用了ELAN Block來替換BottleNeck Block來作為主要的梯度流分支。

          C3模塊的Pytorch的實(shí)現(xiàn)如下:

          class C3(nn.Module):
              # CSP Bottleneck with 3 convolutions
              def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
                  super().__init__()
                  c_ = int(c2 * e)  # hidden channels
                  self.cv1 = Conv(c1, c_, 11)
                  self.cv2 = Conv(c1, c_, 11)
                  self.cv3 = Conv(2 * c_, c2, 1)  # optional act=FReLU(c2)
                  self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0for _ in range(n)))

              def forward(self, x):
                  return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

          下面就簡(jiǎn)單說一下C2f模塊,通過C3模塊的代碼以及結(jié)構(gòu)圖可以看到,C3模塊和名字思路一致,在模塊中使用了3個(gè)卷積模塊(Conv+BN+SiLU),以及n個(gè)BottleNeck。

          通過C3代碼可以看出,對(duì)于cv1卷積和cv2卷積的通道數(shù)是一致的,而cv3的輸入通道數(shù)是前者的2倍,因?yàn)閏v3的輸入是由主梯度流分支(BottleNeck分支)依舊次梯度流分支(CBS,cv2分支)cat得到的,因此是2倍的通道數(shù),而輸出則是一樣的。

          不妨我們?cè)倏匆幌耏OLOv7中的模塊:

          YOLOv7通過并行更多的梯度流分支,放ELAN模塊可以獲得更豐富的梯度信息,進(jìn)而或者更高的精度和更合理的延遲。

          C2f模塊的結(jié)構(gòu)圖如下:

          我們可以很容易的看出,C2f模塊就是參考了C3模塊以及ELAN的思想進(jìn)行的設(shè)計(jì),讓YOLOv8可以在保證輕量化的同時(shí)獲得更加豐富的梯度流信息。

          C2f模塊對(duì)應(yīng)的Pytorch實(shí)現(xiàn)如下:

          class C2f(nn.Module):
              # CSP Bottleneck with 2 convolutions
              def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
                  super().__init__()
                  self.c = int(c2 * e)  # hidden channels
                  self.cv1 = Conv(c1, 2 * self.c, 11)
                  self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
                  self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((33), (33)), e=1.0for _ in range(n))

              def forward(self, x):
                  y = list(self.cv1(x).split((self.c, self.c), 1))
                  y.extend(m(y[-1]) for m in self.m)
                  return self.cv2(torch.cat(y, 1))

          SPPF改進(jìn)了什么?

          這里講解的文章就很多了,這里也就不具體描述了,直接給出對(duì)比圖了

          上圖中,左邊是SPP,右邊是SPPF。

          PAN-FPN改進(jìn)了什么?

          我們先看一下YOLOv5以及YOLOv6的PAN-FPN部分的結(jié)構(gòu)圖:

          YOLOv5的Neck部分的結(jié)構(gòu)圖如下:

          YOLOv6的Neck部分的結(jié)構(gòu)圖如下:

          我們?cè)倏碮OLOv8的結(jié)構(gòu)圖:

          可以看到,相對(duì)于YOLOv5或者YOLOv6,YOLOv8將C3模塊以及RepBlock替換為了C2f,同時(shí)細(xì)心可以發(fā)現(xiàn),相對(duì)于YOLOv5和YOLOv6,YOLOv8選擇將上采樣之前的1×1卷積去除了,將Backbone不同階段輸出的特征直接送入了上采樣操作。

          Head部分都變了什么呢?

          先看一下YOLOv5本身的Head(Coupled-Head):

          而YOLOv8則是使用了Decoupled-Head,同時(shí)由于使用了DFL 的思想,因此回歸頭的通道數(shù)也變成了4*reg_max的形式:

          對(duì)比一下YOLOv5與YOLOv8的YAML

          損失函數(shù)

          對(duì)于YOLOv8,其分類損失為VFL Loss,其回歸損失為CIOU Loss+DFL的形式,這里Reg_max默認(rèn)為16。

          VFL主要改進(jìn)是提出了非對(duì)稱的加權(quán)操作,F(xiàn)L和QFL都是對(duì)稱的。而非對(duì)稱加權(quán)的思想來源于論文PISA,該論文指出首先正負(fù)樣本有不平衡問題,即使在正樣本中也存在不等權(quán)問題,因?yàn)閙AP的計(jì)算是主正樣本。

          q是label,正樣本時(shí)候q為bbox和gt的IoU,負(fù)樣本時(shí)候q=0,當(dāng)為正樣本時(shí)候其實(shí)沒有采用FL,而是普通的BCE,只不過多了一個(gè)自適應(yīng)IoU加權(quán),用于突出主樣本。而為負(fù)樣本時(shí)候就是標(biāo)準(zhǔn)的FL了。可以明顯發(fā)現(xiàn)VFL比QFL更加簡(jiǎn)單,主要特點(diǎn)是正負(fù)樣本非對(duì)稱加權(quán)、突出正樣本為主樣本。

          針對(duì)這里的DFL(Distribution Focal Loss),其主要是將框的位置建模成一個(gè) general distribution,讓網(wǎng)絡(luò)快速的聚焦于和目標(biāo)位置距離近的位置的分布。

          DFL 能夠讓網(wǎng)絡(luò)更快地聚焦于目標(biāo) y 附近的值,增大它們的概率;

          DFL的含義是以交叉熵的形式去優(yōu)化與標(biāo)簽y最接近的一左一右2個(gè)位置的概率,從而讓網(wǎng)絡(luò)更快的聚焦到目標(biāo)位置的鄰近區(qū)域的分布;也就是說學(xué)出來的分布理論上是在真實(shí)浮點(diǎn)坐標(biāo)的附近,并且以線性插值的模式得到距離左右整數(shù)坐標(biāo)的權(quán)重。

          樣本的匹配

          標(biāo)簽分配是目標(biāo)檢測(cè)非常重要的一環(huán),在YOLOv5的早期版本中使用了MaxIOU作為標(biāo)簽分配方法。然而,在實(shí)踐中發(fā)現(xiàn)直接使用邊長(zhǎng)比也可以達(dá)到一阿姨你的效果。而YOLOv8則是拋棄了Anchor-Base方法使用Anchor-Free方法,找到了一個(gè)替代邊長(zhǎng)比例的匹配方法,TaskAligned。

          為與NMS搭配,訓(xùn)練樣例的Anchor分配需要滿足以下兩個(gè)規(guī)則:

          1. 正常對(duì)齊的Anchor應(yīng)當(dāng)可以預(yù)測(cè)高分類得分,同時(shí)具有精確定位;
          2. 不對(duì)齊的Anchor應(yīng)當(dāng)具有低分類得分,并在NMS階段被抑制?;谏鲜鰞蓚€(gè)目標(biāo),TaskAligned設(shè)計(jì)了一個(gè)新的Anchor alignment metric 來在Anchor level 衡量Task-Alignment的水平。并且,Alignment metric 被集成在了 sample 分配和 loss function里來動(dòng)態(tài)的優(yōu)化每個(gè) Anchor 的預(yù)測(cè)。

          Anchor alignment metric:

          分類得分和 IoU表示了這兩個(gè)任務(wù)的預(yù)測(cè)效果,所以,TaskAligned使用分類得分和IoU的高階組合來衡量Task-Alignment的程度。使用下列的方式來對(duì)每個(gè)實(shí)例計(jì)算Anchor-level 的對(duì)齊程度:

          s 和 u 分別為分類得分和 IoU 值,α 和 β 為權(quán)重超參。從上邊的公式可以看出來,t 可以同時(shí)控制分類得分和IoU 的優(yōu)化來實(shí)現(xiàn) Task-Alignment,可以引導(dǎo)網(wǎng)絡(luò)動(dòng)態(tài)的關(guān)注于高質(zhì)量的Anchor。

          Training sample Assignment:

          為提升兩個(gè)任務(wù)的對(duì)齊性,TOOD聚焦于Task-Alignment Anchor,采用一種簡(jiǎn)單的分配規(guī)則選擇訓(xùn)練樣本:對(duì)每個(gè)實(shí)例,選擇m個(gè)具有最大t值的Anchor作為正樣本,選擇其余的Anchor作為負(fù)樣本。然后,通過損失函數(shù)(針對(duì)分類與定位的對(duì)齊而設(shè)計(jì)的損失函數(shù))進(jìn)行訓(xùn)練。

          參考

          [1].https://github.com/uyolo1314/ultralytics.
          [2].https://github.com/meituan/YOLOv6.
          [3].https://arxiv.org/abs/2209.02976.
          [4].https://github.com/PaddlePaddle/PaddleDetection.
          [5].https://github.com/PaddlePaddle/PaddleYOLO.
          [6].https://github.com/open-mmlab/mmyolo.

          推薦閱讀

          書童改進(jìn) | YOLOv5之架構(gòu)改進(jìn)、樣本匹配升級(jí)、量化部署、剪枝、自蒸餾以及異構(gòu)蒸餾


          目標(biāo)檢測(cè)模型設(shè)計(jì)準(zhǔn)則 | YOLOv7參考的ELAN模型解讀,YOLO系列模型思想的設(shè)計(jì)源頭


          目標(biāo)檢測(cè)Trick | SEA方法輕松抹平One-Stage與Two-Stage目標(biāo)檢測(cè)之間的差距


          掃描上方二維碼可聯(lián)系小書童加入交流群~

          想要了解更多前沿AI視覺感知全棧知識(shí)【分類、檢測(cè)、分割關(guān)鍵點(diǎn)、車道線檢測(cè)、3D視覺(分割、檢測(cè))多模態(tài)、目標(biāo)跟蹤、NerF】、行業(yè)技術(shù)方案【AI安防、AI醫(yī)療AI自動(dòng)駕駛】、AI模型部署落地實(shí)戰(zhàn)【CUDA、TensorRT、NCNNOpenVINO、MNN、ONNXRuntime以及地平線框架等】,歡迎掃描下方二維碼,加入集智書童知識(shí)星球,日常分享論文、學(xué)習(xí)筆記、問題解決方案、部署方案以及全棧式答疑,期待交流!

          瀏覽 3765
          1點(diǎn)贊
          評(píng)論
          2收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          1點(diǎn)贊
          評(píng)論
          2收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久国产劲暴∨内射新川 | 国产操逼逼 | 99re在线视频播放 | 用力操我视频 | MFYD-013 肉食人妻女上司が部下を誘惑し |