超越所有YOLO检测模型,mmdet开源当今最强最快目标检测模型!-冲顶技术团队
轻识Logo
人工智能与算法学习

共 14326字,需浏览 29分钟

 ·

2022-09-29 10:50

首先,这里先声明一下由于论文和代码没有一并放出,所以以下内容全是个人学习RTMDet代码的一个结果,整个过程时间也比较紧凑,难免会有所遗漏和错误,一切关于RTMDet的工作,最终以OpenMMLab官方论文为主,因为看到开源代码的速度表,小编很难不爱,小模型就可以把YOLO全系列按在地上摩擦,因此也就有了下面的故事。

0、直接上架构图吧!

看着上面的图,熟悉不?是不是满满的YOLO系列的味道?是的,看代码我猜应该是基于YOLO来进行的增量实验吧,也仅仅是猜啦,毕竟暗俺也没看到RTMDet的论文,俺也不是开发者!

1、改进点1 —— CSPNeXt

1.1 Backbone 部分

话不多说,直接上代码:

class CSPNeXtBlock(BaseModule):
    def __init__(self,
                 in_channels: int,
                 out_channels: int,
                 expansion: float = 0.5,
                 add_identity: bool = True,
                 use_depthwise: bool = False,
                 kernel_size: int = 5,
                 conv_cfg: OptConfigType = None,
                 norm_cfg: ConfigType = dict(
                     type='BN', momentum=0.03, eps=0.001)
,
                 act_cfg: ConfigType = dict(type='SiLU'),
                 init_cfg: OptMultiConfig = None)
 -> None:

        super().__init__(init_cfg=init_cfg)
        hidden_channels = int(out_channels * expansion)
        conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule
        self.conv1 = conv(
            in_channels,
            hidden_channels,
            3,
            stride=1,
            padding=1,
            norm_cfg=norm_cfg,
            act_cfg=act_cfg)
        self.conv2 = DepthwiseSeparableConvModule(
            hidden_channels,
            out_channels,
            kernel_size,
            stride=1,
            padding=kernel_size // 2,
            conv_cfg=conv_cfg,
            norm_cfg=norm_cfg,
            act_cfg=act_cfg)
        self.add_identity = add_identity and in_channels == out_channels

    def forward(self, x: Tensor) -> Tensor:
        identity = x
        out = self.conv1(x)
        out = self.conv2(out)

        if self.add_identity:
            return out + identity
        else:
            return out

其实通过代码我们可以很直观的看出模型的架构细节,这里小编也进行了简要的绘制,具体如下图:

这里提到的 Depthwise Separable Convolution 是 MobileNet 的基本单元,其实这种结构之前已经使用在 Inception 模型中。Depthwise Separable Convolution 其实是一种可分解卷积操作,其可以分解为2个更小的操作:Depthwise Convolution 和 Pointwise Convolution,如图所示。

Depthwise Convolution 和标准卷积不同,对于标准卷积,其卷积核是用在所有的输入通道上(input channels),而 Depthwise Convolution 针对每个输入通道采用不同的卷积核,就是说一个卷积核对应一个输入通道,所以说 Depthwise Convolution 是 Depth 级别的操作。

而 Pointwise Convolution 其实就是普通的 1×1 的卷积。对于 Depthwise Separable Convolution,首先是采用 Depthwise Convolution 对不同输入通道分别进行卷积,然后采用 Pointwise Convolution 将上面的输出再进行结合,这样整体效果和一个标准卷积是差不多的,但是会大大减少计算量和模型参数量。

熟悉DarkNet的朋友应该都知道,如果你不知道,小编这里也给出架构图:

然后依旧是直接上CSPLayer的代码:

class CSPLayer(BaseModule):
    def __init__(self,
                 in_channels: int,
                 out_channels: int,
                 expand_ratio: float = 0.5,
                 num_blocks: int = 1,
                 add_identity: bool = True,
                 use_depthwise: bool = False,
                 use_cspnext_block: bool = False,
                 channel_attention: bool = False,
                 conv_cfg: OptConfigType = None,
                 norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
                 act_cfg: ConfigType = dict(type='Swish'),
                 init_cfg: OptMultiConfig = None)
 -> None:

        super().__init__(init_cfg=init_cfg)
        block = CSPNeXtBlock if use_cspnext_block else DarknetBottleneck
        mid_channels = int(out_channels * expand_ratio)
        self.channel_attention = channel_attention
        self.main_conv = ConvModule(
            in_channels,
            mid_channels,
            1,
            conv_cfg=conv_cfg,
            norm_cfg=norm_cfg,
            act_cfg=act_cfg)
        self.short_conv = ConvModule(
            in_channels,
            mid_channels,
            1,
            conv_cfg=conv_cfg,
            norm_cfg=norm_cfg,
            act_cfg=act_cfg)
        self.final_conv = ConvModule(
            2 * mid_channels,
            out_channels,
            1,
            conv_cfg=conv_cfg,
            norm_cfg=norm_cfg,
            act_cfg=act_cfg)

        self.blocks = nn.Sequential(*[
            block(
                mid_channels,
                mid_channels,
                1.0,
                add_identity,
                use_depthwise,
                conv_cfg=conv_cfg,
                norm_cfg=norm_cfg,
                act_cfg=act_cfg) for _ in range(num_blocks)
        ])
        if channel_attention:
            self.attention = ChannelAttention(2 * mid_channels)

    def forward(self, x: Tensor) -> Tensor:
        x_short = self.short_conv(x)

        x_main = self.main_conv(x)
        x_main = self.blocks(x_main)

        x_final = torch.cat((x_main, x_short), dim=1)

        if self.channel_attention:
            x_final = self.attention(x_final)
        return self.final_conv(x_final)

其结构如下所示,毫无疑问依旧是香香的CSP思想,但是这里的结构使用了5×5的DW卷积,实现了更少的参数量的情况下,带来更大的感受野。

同时这里RTMDet的Backbone中还考虑了通道注意力的问题,其代码如下:

class ChannelAttention(BaseModule):
    def __init__(self, channels: int, init_cfg: OptMultiConfig = None) -> None:
        super().__init__(init_cfg)
        self.global_avgpool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Conv2d(channels, channels, 110, bias=True)
        self.act = nn.Hardsigmoid(inplace=True)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        out = self.global_avgpool(x)
        out = self.fc(out)
        out = self.act(out)
        return x * out

小编依旧给小伙伴们画了示意图:

其实还有一个细节,这里我想的也不是很明白,如果熟悉ResNet构建的小伙伴应该知道,凯明大神在构建ResNet50是使用的残差Block的数量配比就是[3,6,6,3],

这里RTMDet使用的配比也是:

但是小编在白嫖 TRT-ViT、NeXtViT、SWin以及ConvNeXt的时候都在或有或无地说逐层增加配比会带来更好的结果,这里不知道为什么RTMDet选择以前的数据,期待论文中的描述和解释!

1.2 Neck部分

其实也是毫不意外的PAFPN的架构,只不过这里作者选择把YOLO系列中的CSPBlock替换为了本方法中的CSPNeXt Block,具体架构图如下所示:

1.3 Head部分

这部分也是相对比较常规的设计,对于PAFPN结构输出的特征,先使用由堆叠的卷积所组成的分类分支以及回归分支提取对应的分类特征和回归特征,然后分别送到对应的RTM分类分支和回归分支,得到我们最终随需要的东西,这里有一个小小的细节,便是堆叠的卷积在不同level的中是共享权重的,具体可以参见代码,这里也不进行过多的猜测,最终还是以论文为主。

2、匹配策略

直接上配置参数,熟悉Nanodet的小伙伴你是不是又知道了!嗯,是的是熟悉的味道,就是NanoDet-Plus的哪个策略,依旧很香,依旧很好用!!!

当年的Nanodet-Plus是这样的:

这里所谓动态匹配,简单来说就是直接使用模型检测头的输出,与所有Ground Truth计算一个匹配得分,这个得分由分类损失和回归损失相加得到。特征图上N个点的预测值,与M个Ground Truth计算得到一个N×M的矩阵,称为Cost Matrix,基于这个矩阵可以让当前预测结果动态地寻找最优标签,匹配的策略有二分图匹配、传输优化、Top-K等,在NanoDet中直接采取了Top-K的策略来匹配。

这种策略的一个问题在于,在网络训练的初期,预测结果是很差的,可能根本预测不出结果。所以在动态匹配时还会加上一些位置约束,比如使用一个 5×5 的中心区域去限制匹配的自由程度,然后再依赖神经网络天生的抗噪声能力,只需要在Ground Truth框内随机分配一些点,网络就能学到一些基础的特征。

3、损失函数

这部分主要是是用来QFL和GIOU Loss,这里不进行过多描述,以后尽可能补上吧,今天太累了,已经太晚了。。。。

4、输入端部分

阶段一

作者在训练的第一阶段,主要是使用了CacheMosaic数据增强,RandomResize,RandomCrop,RandomCrop,CacheMixup以及YOLOX关于HSV的一些增强手段,这里的CacheMosaic以及CacheMixup是mmdet中全新提出的新Trcik炼丹术;

阶段2

作者在训练阶段2提出了前面提出的新技术,CacheMosaic以及CacheMixup,看样子这里应该是学习YOLOX的训练技术:

4.1、CacheMosaic

1、Mosaic流程:

  1. 选择Mosaic中心作为4幅图像的交点。
  2. 根据索引获取左上图,从自定义数据集中随机抽取另外3张图片。
  3. 如果图像大于Mosaic Patch,子图像将被裁剪。

2、CacheMosaic流程:

  1. 将上次Transform的结果加到Cache中。
  2. 选择Mosaic中心作为4幅图像的交点。
  3. 根据索引获取左上图,从结果缓存中随机抽取另外3张图片。
  4. 如果图像大于Mosaic Patch,子图像将被裁剪。

优点我猜就是训练快!!!

4.2、CacheMixup

1、Mixup

  1. 另一个随机图像被数据集挑选并嵌入到左上角的Patch中(在填充和调整大小之后)
  2. mixup变换的目标是mixup image和origin image的加权平均。

2、CacheMixup

  1. 将上次Transform的结果加到Cache中。
  2. 从Cache中挑选另一个随机图像并嵌入到左上角的Patch中(在填充和调整大小之后)
  3. mixup变换的目标是mixup image和origin image的加权平均。

参考

[1].https://github.com/RangiLyu/mmdetection/tree/rtmdet_config/configs/rtmdet.

分享

收藏

点赞

在看

浏览 101
点赞
评论
收藏
分享

手机扫一扫分享

图片
表情
点赞
评论
收藏
分享

手机扫一扫分享

相关内容推荐

免费社交软件打造世界手机版无限之角色扮演商标免费设计烧绳子动漫日下载波克城市河南农信官网点易呼死gymnast破解版安吉拉自动浏览器时代周刊中文网克隆手机钓鱼星球繁体字转换工具在线模拟器moble车连星幻境网盾斗罗大陆大乱斗改cad快看图斗牛下载养成类单机手游乐聊战神4下载三国志英杰传下载小天才微聊赏金猫三国志英杰传下载最后一卷胶片天天看高清电影鲲鹏快付月亮巴免费的语音包软件幻想全明星有宝最后的生存者湖南联通恐怖乐园猎鹰行动数据宝官网指南针手机版下载执剑江湖春秋旅游官方网虫虫助手官方庇护所游戏男人帮app下载应用商城bh365强力v1极略三国官网我的世界模组盒子刀塔西游p图免费软件迅雷离线下载体验客服在线小米云同步霸王卧龙传图途帕拉狗骑士中文版随机密码破解软件十三英硕鼠下载器阳光厨房公路游戏迷你世界网页版typora下载话费棋牌奥奇h5智能工具箱汉化版下载商店应用谷歌地图怎么下载鱼丸游戏下载淘金小助手下载moldiv拳皇中文版三国英雄手游青岛银行官网语音打字老爹汉堡店无敌版樱花物语欧陆战争6下载口袋妖怪xy突袭游戏江湖美人apk下载安装百里守约自瞄挂星际矿工前锋突袭ro游戏陕煤运销集团时尚洋品店物语手游决战艾泽拉斯土耳其方块美食模拟器甜一必应浏览器福利游戏字体推荐qmc解码什么值得买网站山歌伴奏软件下载办公软件免费下载机型伪装app我在大清玩暖暖魔法门之英雄交锋易迅网商城炸弹小子za解压仙女游戏9聊口袋妖怪白2下载星星密码秘密游戏之了课堂hry切切乐免费照片恢复大师雁北堂女社长漫画屋下载超人安装雨讯资源网视频分割软件车载音乐播放器免耽小说蜂窝加速器3d立体迷宫鲁班安装rose软件婴语翻译机征服私服发布网陕西省社保缴费锦江酒店app经典蜘蛛纸牌电击使模拟地铁破解版塞班游戏下载窝窝团购网手机版四川省人力爱学习学生端网易吃鸡游戏ewwbox网盘迈卡盾末世危城昆明教育电视台赣林通热点排行榜贵州茅台防伪溯源ro游戏糖果屋附近公交车无敌流浪汉3真人在线千梨互动秀米app好游戏下载趣阁网易账户中心百度版海岛奇兵正当防卫3jj比赛大厅暗黑风暴模拟位置信息应用给力的拼音vip影视解析传奇手游变态版本最美情侣僵尸派对笔趣阁免费版据意查句买单侠app下载ps2机战z广发证券下载LONEWOLF华为市场三国游戏单机版大主宰下载三国志7下载布丁动画官网梦幻西游单机版5音乐播放器推荐做图片tap是什么软件足球软件可能的英语单词黄色影视软件手机大师解压软件rar装扮少女破解版精斗云云会计扎职下载宠物连连消作业帮网页版仙境传说私服迅游加速器多少钱

合作伙伴

冲顶技术团队

www.28j.com.cn
www.china185.com
www.xm5656.cn
www.imcrd.com
baidu.07yue.com
www.akz.net.cn
www.chaoshanxing.com
www.3phw.com
www.bbswimming.cn
www.07yue.com
www.28j.com.cn
www.haowangjiao.cc
seo.jsfengchao.com
www.bjdongwei.cn
www.tjwyj.com
www.andmedia.cn
www.07yue.com
www.3phw.com
dh.jsfengchao.com
www.maijichuang.cn