【前言】前幾天瘋狂刷屏的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)檢測新范式對原始DETR的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行了調(diào)整和優(yōu)化,以提高計(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à),這有助于提高模型的泛化能力和性能。
當(dāng)然,人們對RT-DETR之所以產(chǎn)生濃厚的興趣,我覺得大概率還是對YOLO系列審美疲勞了,就算是出到了YOLO10086,我還是只想用YOLOv5和YOLOv7的框架來魔改做業(yè)務(wù)。。
二、初識HGNet
看到RT-DETR的性能指標(biāo),發(fā)現(xiàn)指標(biāo)最好的兩個(gè)模型backbone都是用的HGNetv2,毫無疑問,和當(dāng)時(shí)的picodet一樣,骨干都是使用百度自家的網(wǎng)絡(luò)。初識HGNet的時(shí)候,當(dāng)時(shí)是參加了第四屆百度網(wǎng)盤圖像處理大賽,文檔圖像方向識別專題賽道,簡單來說,就是使用分類網(wǎng)絡(luò)對一些文檔截圖或者圖片進(jìn)行方向角度分類。
當(dāng)時(shí)的方案并沒有那么快定型,通常是打榜過程發(fā)現(xiàn)哪個(gè)網(wǎng)絡(luò)性能好就使用哪個(gè)網(wǎng)絡(luò)做魔改,而且木有顯卡,只能蹭Ai Studio的平臺,不過v100一天8小時(shí)的實(shí)驗(yàn)時(shí)間有點(diǎn)短,這也注定了大模型用不了。
流水的模型,鐵打的煉丹人,最后發(fā)現(xiàn)HGNet-tiny各方面指標(biāo)都很符合我們的預(yù)期,后面就一直圍繞它魔改。
當(dāng)然,比賽打榜是目的,學(xué)習(xí)才是享受過程,當(dāng)時(shí)看到效果還可以,便開始折騰起了HGNet的網(wǎng)絡(luò)架構(gòu),我們可以看到,PP-HGNet 針對 GPU 設(shè)備,對目前 GPU 友好的網(wǎng)絡(luò)做了分析和歸納,盡可能多的使用 3x3 標(biāo)準(zhǔn)卷積(計(jì)算密度最高),PP-HGNet是由多個(gè)HG-Block組成,細(xì)節(jié)如下:
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模型。
另外,我們可以看到:
- 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,并不會對GPU的利用率造成較大影響.
- PP-HGNet的激活函數(shù)為Relu,常數(shù)級操作可保證該模型在硬件上的推理速度。
三、再探HGNetv2
時(shí)隔半年,出世的RT-DETR又讓我關(guān)注起了這個(gè)網(wǎng)絡(luò),而此時(shí),HGNet已不叫HGNet,就像陳老師已經(jīng)不是當(dāng)年的陳老師,阿珍也不是當(dāng)初那片星空下的阿珍,現(xiàn)在升級換代變成了Pro版本。我們看看v2版本做了哪些變動?最基本的組成單元還是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
除此之外,相對于第一版,HGNetv2已摘除了ESE模塊,但提供了LightConvBNAct模塊,更加具體的內(nèi)容可參見:https://github.com/PaddlePaddle/PaddleDetection/blob/develop/ppdet/modeling/backbones/hgnet_v2.py
PP-HGNetv2的整體結(jié)構(gòu)詳見下圖:
【結(jié)尾】 總體而言,HGNet還是一個(gè)比較低調(diào)的網(wǎng)絡(luò),官方也沒有過多宣傳,但是好不好用,依舊還是使用者說了算,后續(xù)如果DETR變體可以在國內(nèi)常見的板端成熟落地,如瑞芯微,地平線,高通等芯片上適配,會給使用者帶來更多的選擇。
審核編輯 :李倩
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7570瀏覽量
88833 -
模型
+關(guān)注
關(guān)注
1文章
3248瀏覽量
48864 -
ChatGPT
+關(guān)注
關(guān)注
29文章
1562瀏覽量
7723
原文標(biāo)題:簡單聊聊目標(biāo)檢測新范式RT-DETR的骨干:HGNetv2
文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論