0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一起來看看YOLOv8的結(jié)構(gòu)亮點(diǎn)

新機(jī)器視覺 ? 來源:集智書童 ? 2023-01-11 09:46 ? 次閱讀

導(dǎo)讀

出品YOLOv5的公司發(fā)布了最新的YOLOv8!一起來看看YOLOv8的結(jié)構(gòu)亮點(diǎn)。

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

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

Backbone:CSPDarkNet結(jié)構(gòu),主要結(jié)構(gòu)思想的體現(xiàn)在C3模塊,這里也是梯度分流的主要思想所在的地方;

PAN-FPN:雙流的FPN,必須香,也必須快,但是量化還是有些需要圖優(yōu)化才可以達(dá)到最優(yōu)的性能,比如cat前后的scale優(yōu)化等等,這里除了上采樣、CBS卷積模塊,最為主要的還有C3模塊(記住這個(gè)C3模塊哦);

Head:Coupled Head+Anchor-base,毫無疑問,YOLOv3、YOLOv4、YOLOv5、YOLOv7都是Anchor-Base的,后面會(huì)變嗎?

Loss:分類用BEC Loss,回歸用CIoU Loss。

e1581eac-911b-11ed-bfe3-dac502259ad0.png

話不多說,直接YOLOv8吧!

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

e16d5c72-911b-11ed-bfe3-dac502259ad0.png

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

Backbone:使用的依舊是CSP的思想,不過YOLOv5中的C3模塊被替換成了C2f模塊,實(shí)現(xiàn)了進(jìn)一步的輕量化,同時(shí)YOLOv8依舊使用了YOLOv5等架構(gòu)中使用的SPPF模塊;

PAN-FPN:毫無疑問YOLOv8依舊使用了PAN的思想,不過通過對(duì)比YOLOv5與YOLOv8的結(jié)構(gòu)圖可以看到,YOLOv8將YOLOv5中PAN-FPN上采樣階段中的卷積結(jié)構(gòu)刪除了,同時(shí)也將C3模塊替換為了C2f模塊;

Decoupled-Head:是不是嗅到了不一樣的味道?是的,YOLOv8走向了Decoupled-Head;

Anchor-Free:YOLOv8拋棄了以往的Anchor-Base,使用了Anchor-Free的思想;

損失函數(shù):YOLOv8使用VFL Loss作為分類損失,使用DFL Loss+CIOU Loss作為分類損失;

樣本匹配: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的值是有變化的。

e1778ac6-911b-11ed-bfe3-dac502259ad0.png

其實(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)如下:

classC3(nn.Module):
#CSPBottleneckwith3convolutions
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)#hiddenchannels
self.cv1=Conv(c1,c_,1,1)
self.cv2=Conv(c1,c_,1,1)
self.cv3=Conv(2*c_,c2,1)#optionalact=FReLU(c2)
self.m=nn.Sequential(*(Bottleneck(c_,c_,shortcut,g,e=1.0)for_inrange(n)))

defforward(self,x):
returnself.cv3(torch.cat((self.m(self.cv1(x)),self.cv2(x)),1))

下面就簡單說一下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中的模塊:

e1815cae-911b-11ed-bfe3-dac502259ad0.png

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

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

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

e18bd27e-911b-11ed-bfe3-dac502259ad0.png

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

classC2f(nn.Module):
#CSPBottleneckwith2convolutions
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)#hiddenchannels
self.cv1=Conv(c1,2*self.c,1,1)
self.cv2=Conv((2+n)*self.c,c2,1)#optionalact=FReLU(c2)
self.m=nn.ModuleList(Bottleneck(self.c,self.c,shortcut,g,k=((3,3),(3,3)),e=1.0)for_inrange(n))

defforward(self,x):
y=list(self.cv1(x).split((self.c,self.c),1))
y.extend(m(y[-1])forminself.m)
returnself.cv2(torch.cat(y,1))

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

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

e19220e8-911b-11ed-bfe3-dac502259ad0.png

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

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

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

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

e19e8de2-911b-11ed-bfe3-dac502259ad0.png

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

e1a74e64-911b-11ed-bfe3-dac502259ad0.png

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

e1ad9d1e-911b-11ed-bfe3-dac502259ad0.png

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

Head部分都變了什么呢?

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

e1b383f0-911b-11ed-bfe3-dac502259ad0.png

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

e1bc54d0-911b-11ed-bfe3-dac502259ad0.png

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

e1c12b72-911b-11ed-bfe3-dac502259ad0.png

損失函數(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ì)算是主正樣本。

e1ca272c-911b-11ed-bfe3-dac502259ad0.png

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更加簡單,主要特點(diǎn)是正負(fù)樣本非對(duì)稱加權(quán)、突出正樣本為主樣本。

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

e1cf684a-911b-11ed-bfe3-dac502259ad0.png

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)直接使用邊長比也可以達(dá)到一阿姨你的效果。而YOLOv8則是拋棄了Anchor-Base方法使用Anchor-Free方法,找到了一個(gè)替代邊長比例的匹配方法,TaskAligned。

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

正常對(duì)齊的Anchor應(yīng)當(dāng)可以預(yù)測(cè)高分類得分,同時(shí)具有精確定位;

不對(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ì)齊程度:

e1d90c42-911b-11ed-bfe3-dac502259ad0.png

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,采用一種簡單的分配規(guī)則選擇訓(xùn)練樣本:對(duì)每個(gè)實(shí)例,選擇m個(gè)具有最大t值的Anchor作為正樣本,選擇其余的Anchor作為負(fù)樣本。然后,通過損失函數(shù)(針對(duì)分類與定位的對(duì)齊而設(shè)計(jì)的損失函數(shù))進(jìn)行訓(xùn)練。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PAN
    PAN
    +關(guān)注

    關(guān)注

    1

    文章

    19

    瀏覽量

    14320
  • ELAN
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    5148
  • BEC
    BEC
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    5367

原文標(biāo)題:YOLO系列又雙叒更新!詳細(xì)解讀YOLOv8的改進(jìn)模塊

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    中興V5手機(jī)配置如何?我們一起來看看吧!

    在3月18日的時(shí)候中興正式發(fā)布中興紅牛品牌,而這個(gè)品牌的首款智能手機(jī)產(chǎn)品中興紅牛V5將在今天(4月9日)下午正式發(fā)布,中興這次的新機(jī)推出速度著實(shí)迅速,那么配置怎么樣額?我們一起來看看吧!
    發(fā)表于 03-24 08:50 ?2527次閱讀

    使用YOLOv8做目標(biāo)檢測(cè)和實(shí)例分割的演示

    YOLOv8是來自Ultralytics的最新的基于YOLO的對(duì)象檢測(cè)模型系列,提供最先進(jìn)的性能。
    的頭像 發(fā)表于 02-06 10:11 ?7844次閱讀

    YOLOv8自定義數(shù)據(jù)集訓(xùn)練到模型部署推理簡析

    如果你只是想使用而不是開發(fā),強(qiáng)烈推薦通過pip安裝方式獲取YOLOv8包!YOLOv8安裝命令行
    的頭像 發(fā)表于 03-24 09:27 ?4821次閱讀

    在AI愛克斯開發(fā)板上用OpenVINO?加速YOLOv8目標(biāo)檢測(cè)模型

    《在 AI 愛克斯開發(fā)板上用 OpenVINO 加速 YOLOv8 分類模型》介紹了在 AI 愛克斯開發(fā)板上使用 OpenVINO 開發(fā)套件部署并測(cè)評(píng) YOLOv8 的分類模型,本文將介紹在 AI 愛克斯開發(fā)板上使用 OpenVINO 加速
    的頭像 發(fā)表于 05-12 09:08 ?1454次閱讀
    在AI愛克斯開發(fā)板上用OpenVINO?加速<b class='flag-5'>YOLOv8</b>目標(biāo)檢測(cè)模型

    YOLOv8版本升級(jí)支持小目標(biāo)檢測(cè)與高分辨率圖像輸入

    YOLOv8版本最近版本又更新了,除了支持姿態(tài)評(píng)估以外,通過模型結(jié)構(gòu)的修改還支持了小目標(biāo)檢測(cè)與高分辨率圖像檢測(cè)。原始的YOLOv8模型結(jié)構(gòu)如下。
    的頭像 發(fā)表于 05-16 11:14 ?1.3w次閱讀
    <b class='flag-5'>YOLOv8</b>版本升級(jí)支持小目標(biāo)檢測(cè)與高分辨率圖像輸入

    AI愛克斯開發(fā)板上使用OpenVINO加速YOLOv8目標(biāo)檢測(cè)模型

    《在AI愛克斯開發(fā)板上用OpenVINO加速YOLOv8分類模型》介紹了在AI愛克斯開發(fā)板上使用OpenVINO 開發(fā)套件部署并測(cè)評(píng)YOLOv8的分類模型,本文將介紹在AI愛克斯開發(fā)板上使用OpenVINO加速YOLOv8目標(biāo)檢
    的頭像 發(fā)表于 05-26 11:03 ?1434次閱讀
    AI愛克斯開發(fā)板上使用OpenVINO加速<b class='flag-5'>YOLOv8</b>目標(biāo)檢測(cè)模型

    文徹底搞懂YOLOv8【網(wǎng)絡(luò)結(jié)構(gòu)+代碼+實(shí)操】

    從上面可以看出,YOLOv8 主要參考了最近提出的諸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相關(guān)設(shè)計(jì),本身的創(chuàng)新點(diǎn)不多,偏向工程實(shí)踐,主推的還是 ultralytics 這個(gè)框架本身。
    的頭像 發(fā)表于 06-15 17:15 ?1.3w次閱讀
    <b class='flag-5'>一</b>文徹底搞懂<b class='flag-5'>YOLOv8</b>【網(wǎng)絡(luò)<b class='flag-5'>結(jié)構(gòu)</b>+代碼+實(shí)操】

    教你如何用兩行代碼搞定YOLOv8各種模型推理

    大家好,YOLOv8 框架本身提供的API函數(shù)是可以兩行代碼實(shí)現(xiàn) YOLOv8 模型推理,這次我把這段代碼封裝成了個(gè)類,只有40行代碼左右,可以同時(shí)支持YOLOv8對(duì)象檢測(cè)、實(shí)例分割
    的頭像 發(fā)表于 06-18 11:50 ?3314次閱讀
    教你如何用兩行代碼搞定<b class='flag-5'>YOLOv8</b>各種模型推理

    目標(biāo)檢測(cè)算法再升級(jí)!YOLOv8保姆級(jí)教程鍵體驗(yàn)

    YOLO作為種基于圖像全局信息進(jìn)行預(yù)測(cè)的目標(biāo)檢測(cè)系統(tǒng),始終保持著極高的迭代更新率,從YOLOv5到YOLOv8,本次升級(jí)主要包括結(jié)構(gòu)算法、命令行界面、PythonAPI等。具體到
    的頭像 發(fā)表于 02-28 11:16 ?2971次閱讀
    目標(biāo)檢測(cè)算法再升級(jí)!<b class='flag-5'>YOLOv8</b>保姆級(jí)教程<b class='flag-5'>一</b>鍵體驗(yàn)

    三種主流模型部署框架YOLOv8推理演示

    深度學(xué)習(xí)模型部署有OpenVINO、ONNXRUNTIME、TensorRT三個(gè)主流框架,均支持Python與C++的SDK使用。對(duì)YOLOv5~YOLOv8的系列模型,均可以通過C++推理實(shí)現(xiàn)模型
    的頭像 發(fā)表于 08-06 11:39 ?2880次閱讀

    解鎖YOLOv8修改+注意力模塊訓(xùn)練與部署流程

    很多人也想跟修改YOLOv5源碼樣的方式去修改YOLOv8的源碼,但是在github上面卻發(fā)現(xiàn)找到的YOLOv8項(xiàng)目下面TAG分支是空的
    的頭像 發(fā)表于 08-11 14:14 ?4747次閱讀
    解鎖<b class='flag-5'>YOLOv8</b>修改+注意力模塊訓(xùn)練與部署流程

    如何修改YOLOv8的源碼

    很多人也想跟修改YOLOv5源碼樣的方式去修改YOLOv8的源碼,但是在github上面卻發(fā)現(xiàn)找到的YOLOv8項(xiàng)目下面TAG分支是空的,然后就直接從master/main下面把源碼
    的頭像 發(fā)表于 09-04 10:02 ?2230次閱讀
    如何修改<b class='flag-5'>YOLOv8</b>的源碼

    YOLOv8實(shí)現(xiàn)任意目錄下命令行訓(xùn)練

    當(dāng)你使用YOLOv8命令行訓(xùn)練模型的時(shí)候,如果當(dāng)前執(zhí)行的目錄下沒有相關(guān)的預(yù)訓(xùn)練模型文件,YOLOv8就會(huì)自動(dòng)下載模型權(quán)重文件。這個(gè)是個(gè)正常操作,但是你還會(huì)發(fā)現(xiàn),當(dāng)你在參數(shù)model中指定已有
    的頭像 發(fā)表于 09-04 10:50 ?1258次閱讀
    <b class='flag-5'>YOLOv8</b>實(shí)現(xiàn)任意目錄下命令行訓(xùn)練

    基于YOLOv8的自定義醫(yī)學(xué)圖像分割

    YOLOv8種令人驚嘆的分割模型;它易于訓(xùn)練、測(cè)試和部署。在本教程中,我們將學(xué)習(xí)如何在自定義數(shù)據(jù)集上使用YOLOv8。但在此之前,我想告訴你為什么在存在其他優(yōu)秀的分割模型時(shí)應(yīng)該使用YOLO
    的頭像 發(fā)表于 12-20 10:51 ?936次閱讀
    基于<b class='flag-5'>YOLOv8</b>的自定義醫(yī)學(xué)圖像分割

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8的模型部署與推理演示

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8推理的好處就是套代碼就可以部署在Windows10系統(tǒng)、烏班圖系統(tǒng)、Jetson的Jetpack系統(tǒng)
    的頭像 發(fā)表于 03-01 15:52 ?2064次閱讀
    基于OpenCV DNN實(shí)現(xiàn)<b class='flag-5'>YOLOv8</b>的模型部署與推理演示