【前言】前幾天瘋狂刷屏的RT-DETR賺足了眼球,在精度和速度上體現(xiàn)的優(yōu)勢和性價(jià)比遠(yuǎn)遠(yuǎn)高于YOLO,而今年ChatGPT、Sam的出現(xiàn),也讓一些吃瓜群眾知乎CNN沒有未來了,今天的文章,我們簡單聊一聊RT-DETR的骨干網(wǎng)絡(luò),HGNetv2。
一、RT-DETR橫空出世
前幾天被百度的RT-DETR刷屏,該提出的目標(biāo)檢測新范式對(duì)原始DETR的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行了調(diào)整和優(yōu)化,以提高計(jì)算速度和減小模型大小。這包括使用更輕量級(jí)的基礎(chǔ)網(wǎng)絡(luò)和調(diào)整Transformer結(jié)構(gòu)。并且,摒棄了nms處理的detr結(jié)構(gòu)與傳統(tǒng)的物體檢測方法相比,不僅訓(xùn)練是端到端的,檢測也能端到端,這意味著整個(gè)網(wǎng)絡(luò)在訓(xùn)練過程中一起進(jìn)行優(yōu)化,推理過程不需要昂貴的后處理代價(jià),這有助于提高模型的泛化能力和性能。
![9288ca34-e494-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9A/0B/wKgZomTnlHiATzEhAAPoIRPfZWQ617.png)
當(dāng)然,人們對(duì)RT-DETR之所以產(chǎn)生濃厚的興趣,我覺得大概率還是對(duì)YOLO系列審美疲勞了,就算是出到了YOLO10086,我還是只想用YOLOv5和YOLOv7的框架來魔改做業(yè)務(wù)。。
二、初識(shí)HGNet
看到RT-DETR的性能指標(biāo),發(fā)現(xiàn)指標(biāo)最好的兩個(gè)模型backbone都是用的HGNetv2,毫無疑問,和當(dāng)時(shí)的picodet一樣,骨干都是使用百度自家的網(wǎng)絡(luò)。初識(shí)HGNet的時(shí)候,當(dāng)時(shí)是參加了第四屆百度網(wǎng)盤圖像處理大賽,文檔圖像方向識(shí)別專題賽道,簡單來說,就是使用分類網(wǎng)絡(luò)對(duì)一些文檔截圖或者圖片進(jìn)行方向角度分類。
![92c91e5e-e494-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9A/0B/wKgZomTnlHiAFg27AALRUS2HfHs389.png)
當(dāng)時(shí)的方案并沒有那么快定型,通常是打榜過程發(fā)現(xiàn)哪個(gè)網(wǎng)絡(luò)性能好就使用哪個(gè)網(wǎng)絡(luò)做魔改,而且木有顯卡,只能蹭Ai Studio的平臺(tái),不過v100一天8小時(shí)的實(shí)驗(yàn)時(shí)間有點(diǎn)短,這也注定了大模型用不了。
![92e9a584-e494-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9A/0B/wKgZomTnlHmAPBPqAAGR-uqmazw223.png)
流水的模型,鐵打的煉丹人,最后發(fā)現(xiàn)HGNet-tiny各方面指標(biāo)都很符合我們的預(yù)期,后面就一直圍繞它魔改。
當(dāng)然,比賽打榜是目的,學(xué)習(xí)才是享受過程,當(dāng)時(shí)看到效果還可以,便開始折騰起了HGNet的網(wǎng)絡(luò)架構(gòu),我們可以看到,PP-HGNet 針對(duì) GPU 設(shè)備,對(duì)目前 GPU 友好的網(wǎng)絡(luò)做了分析和歸納,盡可能多的使用 3x3 標(biāo)準(zhǔn)卷積(計(jì)算密度最高),PP-HGNet是由多個(gè)HG-Block組成,細(xì)節(jié)如下:
![93128274-e494-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9A/0B/wKgZomTnlHmAVGGzAAElNXXJCuE929.png)
ConvBNAct是啥?簡單聊一聊,就是Conv+BN+Act,CV Man應(yīng)該最熟悉不過了:
classConvBNAct(TheseusLayer):
def__init__(self,
in_channels,
out_channels,
kernel_size,
stride,
groups=1,
use_act=True):
super().__init__()
self.use_act=use_act
self.conv=Conv2D(
in_channels,
out_channels,
kernel_size,
stride,
padding=(kernel_size-1)//2,
groups=groups,
bias_attr=False)
self.bn=BatchNorm2D(
out_channels,
weight_attr=ParamAttr(regularizer=L2Decay(0.0)),
bias_attr=ParamAttr(regularizer=L2Decay(0.0)))
ifself.use_act:
self.act=ReLU()
defforward(self,x):
x=self.conv(x)
x=self.bn(x)
ifself.use_act:
x=self.act(x)
returnx
且標(biāo)準(zhǔn)卷積的數(shù)量隨層數(shù)深度增加而增多,從而得到一個(gè)有利于 GPU 推理的骨干網(wǎng)絡(luò),同樣速度下,精度也超越其他 CNN ,性價(jià)比也優(yōu)于ViT-base模型。
![93276482-e494-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9A/0B/wKgZomTnlHmAaxbWAAGFi8TPzgc271.png)
另外,我們可以看到:
- PP-HGNet 的第一層由channel為96的Stem模塊構(gòu)成,目的是為了減少參數(shù)量和計(jì)算量。PP-HGNet
- Tiny的整體結(jié)構(gòu)由四個(gè)HG Stage構(gòu)成,而每個(gè)HG Stage主要由包含大量標(biāo)準(zhǔn)卷積的HG Block構(gòu)成。
- PP-HGNet的第三到第五層使用了使用了可學(xué)習(xí)的下采樣層(LDS Layer),該層group為輸入通道數(shù),可達(dá)到降參降計(jì)算量的作用,且Tiny模型僅包含三個(gè)LDS Layer,并不會(huì)對(duì)GPU的利用率造成較大影響.
- PP-HGNet的激活函數(shù)為Relu,常數(shù)級(jí)操作可保證該模型在硬件上的推理速度。
三、再探HGNetv2
時(shí)隔半年,出世的RT-DETR又讓我關(guān)注起了這個(gè)網(wǎng)絡(luò),而此時(shí),HGNet已不叫HGNet,就像陳老師已經(jīng)不是當(dāng)年的陳老師,阿珍也不是當(dāng)初那片星空下的阿珍,現(xiàn)在升級(jí)換代變成了Pro版本。我們看看v2版本做了哪些變動(dòng)?最基本的組成單元還是ConvBNAct不變,但該結(jié)構(gòu)添加了use_lab結(jié)構(gòu),啥是use_lab結(jié)構(gòu),簡單來說就是類似于resnet的分支殘差,但是use_lab是使用在了純激活函數(shù)部分:
#refertohttps://github.com/PaddlePaddle/PaddleDetection/blob/develop/ppdet/modeling/backbones/hgnet_v2.py
classConvBNAct(nn.Layer):
def__init__(self,
in_channels,
out_channels,
kernel_size=3,
stride=1,
padding=1,
groups=1,
use_act=True,
use_lab=False,
lr_mult=1.0):
super().__init__()
self.use_act=use_act
self.use_lab=use_lab
self.conv=Conv2D(
in_channels,
out_channels,
kernel_size,
stride,
padding=padding
ifisinstance(padding,str)else(kernel_size-1)//2,
groups=groups,
bias_attr=False)
self.bn=BatchNorm2D(
out_channels,
weight_attr=ParamAttr(
regularizer=L2Decay(0.0),learning_rate=lr_mult),
bias_attr=ParamAttr(
regularizer=L2Decay(0.0),learning_rate=lr_mult))
ifself.use_act:
self.act=ReLU()
ifself.use_lab:
self.lab=LearnableAffineBlock(lr_mult=lr_mult)
#激活函數(shù)部分添加lab結(jié)構(gòu)
同時(shí),use_lab結(jié)構(gòu)可以通過scale控制分流大小:
#refertohttps://github.com/PaddlePaddle/PaddleDetection/blob/develop/ppdet/modeling/backbones/hgnet_v2.py
classLearnableAffineBlock(nn.Layer):
def__init__(self,
scale_value=1.0,
#scale設(shè)置分流占比
bias_value=0.0,
lr_mult=1.0,
lab_lr=0.01):
super().__init__()
self.scale=self.create_parameter(
shape=[1,],
default_initializer=Constant(value=scale_value),
attr=ParamAttr(learning_rate=lr_mult*lab_lr))
self.add_parameter("scale",self.scale)
self.bias=self.create_parameter(
shape=[1,],
default_initializer=Constant(value=bias_value),
attr=ParamAttr(learning_rate=lr_mult*lab_lr))
self.add_parameter("bias",self.bias)
defforward(self,x):
returnself.scale*x+self.bias
除此之外,相對(duì)于第一版,HGNetv2已摘除了ESE模塊,但提供了LightConvBNAct模塊,更加具體的內(nèi)容可參見:https://github.com/PaddlePaddle/PaddleDetection/blob/develop/ppdet/modeling/backbones/hgnet_v2.py
PP-HGNetv2的整體結(jié)構(gòu)詳見下圖:
![933aa286-e494-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9A/0B/wKgZomTnlHmAHQ1hAAFczvC4E7E503.png)
【結(jié)尾】 總體而言,HGNet還是一個(gè)比較低調(diào)的網(wǎng)絡(luò),官方也沒有過多宣傳,但是好不好用,依舊還是使用者說了算,后續(xù)如果DETR變體可以在國內(nèi)常見的板端成熟落地,如瑞芯微,地平線,高通等芯片上適配,會(huì)給使用者帶來更多的選擇。
審核編輯 :李倩
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7602瀏覽量
89336 -
模型
+關(guān)注
關(guān)注
1文章
3371瀏覽量
49288 -
ChatGPT
+關(guān)注
關(guān)注
29文章
1573瀏覽量
8128
原文標(biāo)題:簡單聊聊目標(biāo)檢測新范式RT-DETR的骨干:HGNetv2
文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
如何使用Transformer來做物體檢測?
![如何使用Transformer來做物體<b class='flag-5'>檢測</b>?](https://img-blog.csdnimg.cn/img_convert/de1e84951e16f003cad41eb9d065b884.png)
使用跨界模型Transformer來做物體檢測!
![使用跨界模型Transformer來做物體<b class='flag-5'>檢測</b>!](https://file.elecfans.com/web2/M00/01/31/pYYBAGDByM2Ad_oQAAAC0Rt0lf0988.png)
解讀目標(biāo)檢測中的框位置優(yōu)化
![解讀<b class='flag-5'>目標(biāo)</b><b class='flag-5'>檢測</b>中的框位置優(yōu)化](https://file.elecfans.com/web2/M00/02/7E/poYBAGDQX5aALjyCAAAk32rJRIQ894.png)
RT-DETR用114FPS實(shí)現(xiàn)54.8AP遠(yuǎn)超YOLOv8
Focus-DETR:30%Token就能實(shí)現(xiàn)SOTA性能,效率倍增
![Focus-<b class='flag-5'>DETR</b>:30%Token就能實(shí)現(xiàn)SOTA性能,效率倍增](https://file1.elecfans.com/web2/M00/8E/CB/wKgZomTKAseAZHSlAAAfe4X6QwA652.png)
華為諾亞提出全新目標(biāo)檢測器Focus-DETR
![華為諾亞提出全新<b class='flag-5'>目標(biāo)</b><b class='flag-5'>檢測</b>器Focus-<b class='flag-5'>DETR</b>](https://file1.elecfans.com/web2/M00/8E/CD/wKgZomTKCVaAKWZmAAATXJImA8w926.png)
DETR架構(gòu)的內(nèi)部工作方式分析
![<b class='flag-5'>DETR</b>架構(gòu)的內(nèi)部工作方式分析](https://file1.elecfans.com/web2/M00/A2/29/wKgaomTurxeAU7oaAAAKdvxjYf0297.png)
基于OpenVINO Python API部署RT-DETR模型
![基于OpenVINO Python API部署<b class='flag-5'>RT-DETR</b>模型](https://file1.elecfans.com/web2/M00/AB/3A/wKgZomUx8TOAWn0nAAAeLGnrxPA058.png)
第一個(gè)基于DETR的高質(zhì)量通用目標(biāo)檢測方法
![第一個(gè)基于<b class='flag-5'>DETR</b>的高質(zhì)量通用<b class='flag-5'>目標(biāo)</b><b class='flag-5'>檢測</b>方法](https://file1.elecfans.com/web2/M00/AD/A5/wKgZomVCCOeAMgMTAABia1xM-Ms658.png)
基于OpenVINO C++ API部署RT-DETR模型
![基于OpenVINO C++ API部署<b class='flag-5'>RT-DETR</b>模型](https://file1.elecfans.com/web2/M00/AE/1F/wKgZomVElD6AVanCAAAeLGnrxPA930.png)
基于OpenVINO C# API部署RT-DETR模型
![基于OpenVINO C# API部署<b class='flag-5'>RT-DETR</b>模型](https://file1.elecfans.com/web2/M00/AD/85/wKgaomVN8U6AJzs_AAAeLGnrxPA246.png)
百度開源DETRs在實(shí)時(shí)目標(biāo)檢測中勝過YOLOs
![百度開源DETRs在實(shí)時(shí)<b class='flag-5'>目標(biāo)</b><b class='flag-5'>檢測</b>中勝過YOLOs](https://file1.elecfans.com/web2/M00/C2/C7/wKgZomXnxliAGlTRAABbLk1Rero409.png)
OpenVINO? Java API應(yīng)用RT-DETR做目標(biāo)檢測器實(shí)戰(zhàn)
![OpenVINO? Java API應(yīng)用<b class='flag-5'>RT-DETR</b>做<b class='flag-5'>目標(biāo)</b><b class='flag-5'>檢測</b>器實(shí)戰(zhàn)](https://file1.elecfans.com/web2/M00/C4/CA/wKgZomX35-mAKonkAABDEyajpq8920.png)
手機(jī)識(shí)別模型案例
![手機(jī)識(shí)別模型案例](https://file1.elecfans.com/web2/M00/0C/B4/wKgaomc6r22Aa9SAAAAYvwyTWXw912.png)
評(píng)論