【前言】前幾天瘋狂刷屏的RT-DETR賺足了眼球,在精度和速度上體現的優勢和性價比遠遠高于YOLO,而今年ChatGPT、Sam的出現,也讓一些吃瓜群眾知乎CNN沒有未來了,今天的文章,我們簡單聊一聊RT-DETR的骨干網絡,HGNetv2。
一、RT-DETR橫空出世
前幾天被百度的RT-DETR刷屏,該提出的目標檢測新范式對原始DETR的網絡結構進行了調整和優化,以提高計算速度和減小模型大小。這包括使用更輕量級的基礎網絡和調整Transformer結構。并且,摒棄了nms處理的detr結構與傳統的物體檢測方法相比,不僅訓練是端到端的,檢測也能端到端,這意味著整個網絡在訓練過程中一起進行優化,推理過程不需要昂貴的后處理代價,這有助于提高模型的泛化能力和性能。
當然,人們對RT-DETR之所以產生濃厚的興趣,我覺得大概率還是對YOLO系列審美疲勞了,就算是出到了YOLO10086,我還是只想用YOLOv5和YOLOv7的框架來魔改做業務。。
二、初識HGNet
看到RT-DETR的性能指標,發現指標最好的兩個模型backbone都是用的HGNetv2,毫無疑問,和當時的picodet一樣,骨干都是使用百度自家的網絡。初識HGNet的時候,當時是參加了第四屆百度網盤圖像處理大賽,文檔圖像方向識別專題賽道,簡單來說,就是使用分類網絡對一些文檔截圖或者圖片進行方向角度分類。
當時的方案并沒有那么快定型,通常是打榜過程發現哪個網絡性能好就使用哪個網絡做魔改,而且木有顯卡,只能蹭Ai Studio的平臺,不過v100一天8小時的實驗時間有點短,這也注定了大模型用不了。
流水的模型,鐵打的煉丹人,最后發現HGNet-tiny各方面指標都很符合我們的預期,后面就一直圍繞它魔改。
當然,比賽打榜是目的,學習才是享受過程,當時看到效果還可以,便開始折騰起了HGNet的網絡架構,我們可以看到,PP-HGNet 針對 GPU 設備,對目前 GPU 友好的網絡做了分析和歸納,盡可能多的使用 3x3 標準卷積(計算密度最高),PP-HGNet是由多個HG-Block組成,細節如下:
ConvBNAct是啥?簡單聊一聊,就是Conv+BN+Act,CV Man應該最熟悉不過了:
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
且標準卷積的數量隨層數深度增加而增多,從而得到一個有利于 GPU 推理的骨干網絡,同樣速度下,精度也超越其他 CNN ,性價比也優于ViT-base模型。
另外,我們可以看到:
- PP-HGNet 的第一層由channel為96的Stem模塊構成,目的是為了減少參數量和計算量。PP-HGNet
- Tiny的整體結構由四個HG Stage構成,而每個HG Stage主要由包含大量標準卷積的HG Block構成。
- PP-HGNet的第三到第五層使用了使用了可學習的下采樣層(LDS Layer),該層group為輸入通道數,可達到降參降計算量的作用,且Tiny模型僅包含三個LDS Layer,并不會對GPU的利用率造成較大影響.
- PP-HGNet的激活函數為Relu,常數級操作可保證該模型在硬件上的推理速度。
三、再探HGNetv2
時隔半年,出世的RT-DETR又讓我關注起了這個網絡,而此時,HGNet已不叫HGNet,就像陳老師已經不是當年的陳老師,阿珍也不是當初那片星空下的阿珍,現在升級換代變成了Pro版本。我們看看v2版本做了哪些變動?最基本的組成單元還是ConvBNAct不變,但該結構添加了use_lab結構,啥是use_lab結構,簡單來說就是類似于resnet的分支殘差,但是use_lab是使用在了純激活函數部分:
#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)
#激活函數部分添加lab結構
同時,use_lab結構可以通過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設置分流占比
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模塊,更加具體的內容可參見:https://github.com/PaddlePaddle/PaddleDetection/blob/develop/ppdet/modeling/backbones/hgnet_v2.py
PP-HGNetv2的整體結構詳見下圖:
【結尾】 總體而言,HGNet還是一個比較低調的網絡,官方也沒有過多宣傳,但是好不好用,依舊還是使用者說了算,后續如果DETR變體可以在國內常見的板端成熟落地,如瑞芯微,地平線,高通等芯片上適配,會給使用者帶來更多的選擇。
審核編輯 :李倩
-
網絡
+關注
關注
14文章
7570瀏覽量
88819 -
模型
+關注
關注
1文章
3248瀏覽量
48860 -
ChatGPT
+關注
關注
29文章
1562瀏覽量
7700
原文標題:簡單聊聊目標檢測新范式RT-DETR的骨干:HGNetv2
文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論