Bootstrap

RT-DETR融合[CVPR2020]EfficientDet中的BiFPN结构


RT-DETR使用教程: RT-DETR使用教程

RT-DETR改进汇总贴:RT-DETR更新汇总贴


《EfficientDet: Scalable and Efficient Object Detection》

一、 模块介绍

        论文链接:https://arxiv.org/abs/1911.09070

        代码链接:https://github.com/zylo117/Yet-Another-EfficientDet-Pytorch

论文速览:

        模型效率在计算机视觉中变得越来越重要。在本文中,我们系统地研究了对象检测的神经网络架构设计选择,并提出了几个关键优化以提高效率。首先,我们提出了一种加权双向特征金字塔网络 (BiFPN),它允许简单快速的多尺度特征融合;其次,我们提出了一种复合缩放方法,可以同时统一缩放所有主干、特征网络和盒/类预测网络的分辨率、深度和宽度。基于这些优化和更好的主干网络,我们开发了一个新的对象检测器系列,称为 EfficientDet,它在广泛的资源限制下始终实现比现有技术高得多的效率。特别是,在单模型和单尺度下,我们的 EfficientDet-D7 在 COCO 测试开发中实现了最先进的 55.1 AP,具有 77M 参数和 410B FLOPs1,与以前的探测器相比,体积缩小了 4 至 9 倍,使用的 FLOP 减少了 13 至 42 倍。

总结:文章提出一种BiFPN结构,可替代现有的PANet结构。


二、 加入到RT-DETR中

2.1 创建脚本文件

        首先在ultralytics->nn路径下创建blocks.py脚本,用于存放模块代码。

2.2 复制代码        

        复制代码粘到刚刚创建的blocks.py脚本中,如下图所示:

class BiFPN(nn.Module):
    def __init__(self, c1, c2):
        super(BiFPN, self).__init__()
        self.w = nn.Parameter(torch.ones(len(c1), dtype=torch.float32), requires_grad=True)
        self.conv = Conv(sum(c1), c2, k=1, s=1, p=0)
        self.epsilon = 0.0001

    def forward(self, x):
        w = self.w
        weight = w / (torch.sum(w, dim=0) + self.epsilon)
        return self.conv(torch.cat([weight[i] * x[i] for i in range(len(x))], dim=1))

2.3 更改task.py文件 

       打开ultralytics->nn->modules->task.py,在脚本空白处导入函数。

from ultralytics.nn.blocks import *

        之后找到模型解析函数parse_model(约在tasks.py脚本中940行左右位置,可能因代码版本不同变动),在该函数的最后一个else分支上面增加相关解析代码。

        elif m is BiFPN:
            c1 = [ch[i] for i in f]
            c2 = args[0]
            args = [c1, *args]

2.4 更改yaml文件 

yam文件解读:YOLO系列 “.yaml“文件解读_yolo yaml文件-CSDN博客

       打开更改ultralytics/cfg/models/rt-detr路径下的rtdetr-l.yaml文件,替换原有Concat模块,本文以自研DETR测试。


 2.5 修改train.py文件

       创建Train_RT脚本用于训练。

from ultralytics.models import RTDETR
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

if __name__ == '__main__':
    model = RTDETR(model='ultralytics/cfg/models/rt-detr/rtdetr-l.yaml')
    # model.load('yolov8n.pt')
    model.train(data='./data.yaml', epochs=2, batch=1, device='0', imgsz=640, workers=2, cache=False,
                amp=True, mosaic=False, project='runs/train', name='exp')

         在train.py脚本中填入修改好的yaml路径,运行即可训。

三、相关改进思路(2024/11/23日群文件)

        该模块可如图加入到HGBlock、RepNCSPELAN4、RepC3等模块中,代码见群文件,结构如图。自研模块与该模块融合代码及yaml文件见群文件。

 ⭐另外,融合上百种改进模块的YOLO项目仅119(含百种改进的v9),RTDETR119,含高性能自研模型,更易发论文,代码每周更新,欢迎点击下方小卡片加我了解。

⭐⭐平均每个文章对应4-6个二创及自研融合模块⭐⭐


;