前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RT-DETR优化改进:轻量级Backbone改进 | 支持Paddle轻量级 rtdetr-r18、rtdetr-r34、rtdetr-r50、rtdet

RT-DETR优化改进:轻量级Backbone改进 | 支持Paddle轻量级 rtdetr-r18、rtdetr-r34、rtdetr-r50、rtdet

原创
作者头像
AI小怪兽
修改2023-11-17 14:19:30
1.9K0
修改2023-11-17 14:19:30
举报
文章被收录于专栏:YOLO大作战

本文独家改进: 支持百度飞浆resnet各个版本, rtdetr-r18、rtdetr-r34、rtdetr-r50、rtdetr-r101等

layers

parameters

gradients

GFLOPs

rtdetr-r18

421

20184464

20184464

58.6

rtdetr-r34

501

30292624

30292624

88.9

rtdetr-r50

629

42944620

42944620

134.8

rtdetr-r101

867

76661740

76661740

257.7

rtdetr-l

673

32970732

32970732

108.3

rtdetr-x

867

67468108

67468108

232.7

1.RT-DETR介绍

论文: https://arxiv.org/pdf/2304.08069.pdf

RT-DETR (Real-Time DEtection TRansformer) ,一种基于 DETR 架构的实时端到端检测器,其在速度和精度上取得了 SOTA 性能

为什么会出现:

YOLO 检测器有个较大的待改进点是需要 NMS 后处理,其通常难以优化且不够鲁棒,因此检测器的速度存在延迟。为避免该问题,我们将目光移向了不需要 NMS 后处理的 DETR,一种基于 Transformer 的端到端目标检测器。然而,相比于 YOLO 系列检测器,DETR 系列检测器的速度要慢的多,这使得"无需 NMS "并未在速度上体现出优势。上述问题促使我们针对实时的端到端检测器进行探索,旨在基于 DETR 的优秀架构设计一个全新的实时检测器,从根源上解决 NMS 对实时检测器带来的速度延迟问题。

RT-DETR是第一个实时端到端目标检测器。具体而言,我们设计了一个高效的混合编码器,通过解耦尺度内交互和跨尺度融合来高效处理多尺度特征,并提出了IoU感知的查询选择机制,以优化解码器查询的初始化。此外,RT-DETR支持通过使用不同的解码器层来灵活调整推理速度,而不需要重新训练,这有助于实时目标检测器的实际应用。RT-DETR-L在COCO val2017上实现了53.0%的AP,在T4 GPU上实现了114FPS,RT-DETR-X实现了54.8%的AP和74FPS,在速度和精度方面都优于相同规模的所有YOLO检测器。RT-DETR-R50实现了53.1%的AP和108FPS,RT-DETR-R101实现了54.3%的AP和74FPS,在精度上超过了全部使用相同骨干网络的DETR检测器。

RT-DETR作者团队认为只需将Encoder作用在S5 特征上,既可以大幅度地减小计算量、提高计算速度,又不会损伤到模型的性能。为了验证这一点,作者团队设计了若干对照组,如下图所示。

实验结果:

DETR类在COCO上常用的尺度都是800x1333,以往都是以Res50 backbone刷上45 mAP甚至50 mAP为目标,而RT-DETR在采用了YOLO风格的640x640尺度情况下,也不需要熬时长训几百个epoch 就能轻松突破50mAP,精度也远高于所有DETR类模型。

1.1 resnet各个版本介绍

YOLOv8版本目前只支持rtdetr-l、rtdetr-x两个版本

Paddle官方支持 rtdetr-r18、rtdetr-r34、rtdetr-r50、rtdetr-r101等版本

https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/rtdetr

2.Resnet各个版本引入到RT-DETR

2.1 新建ultralytics/nn/backbone/PaddleBackbone.py

核心代码:

代码语言:javascript
复制

class Resnet_Blocks(nn.Module):
    def __init__(self, ch_in, ch_out, block, count, stage_num, act='relu', variant='d'):
        super().__init__()

        self.blocks = nn.ModuleList()
        for i in range(count):
            self.blocks.append(
                block(
                    ch_in,
                    ch_out,
                    stride=2 if i == 0 and stage_num != 2 else 1,
                    shortcut=False if i == 0 else True,
                    variant=variant,
                    act=act)
            )
            if i == 0:
                ch_in = ch_out * block.expansion

    def forward(self, x):
        out = x
        for block in self.blocks:
            out = block(out)
        return out

​详见:

https://cv2023.blog.csdn.net/article/details/134407373

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.RT-DETR介绍
    • 1.1 resnet各个版本介绍
      • 2.Resnet各个版本引入到RT-DETR
        • 2.1 新建ultralytics/nn/backbone/PaddleBackbone.py
          • 核心代码:
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档