【YOLOv8改进】 RFB (Receptive Field Block):多分支卷积块

介绍

image-20240604085730595

摘要

当前表现最好的目标检测器依赖于深度卷积神经网络(CNN)骨干,例如ResNet-101和Inception,得益于其强大的特征表示能力,但却面临高计算成本。相反,一些轻量级模型的检测器可以实现实时处理,但其准确性常常受到批评。本文中,我们探索了一种替代方法,通过使用手工设计的机制来增强轻量级特征,从而构建一个快速且准确的检测器。受人类视觉系统中感受野(RF)结构的启发,我们提出了一种新颖的感受野块(RFB)模块,该模块考虑了感受野的大小和偏心率之间的关系,以增强特征的可辨性和鲁棒性。我们进一步将RFB集成到SSD的顶部,构建了RFB Net检测器。为了评估其有效性,我们在两个主要基准上进行了实验,结果显示RFB Net能够在保持实时速度的同时达到先进的深度检测器的性能。代码可在https://github.com/ruinmessi/RFBNet获取。

YOLO目标检测创新改进与实战案例专栏

专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLO基础解析+创新改进+实战案例

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

Receptive Field Block(RFB)模块是一种多分支卷积块,旨在增强轻量级CNN模型学习到的深层特征,以提高目标检测的准确性和速度。

  1. 结构组成

    • RFB模块由两个主要组件组成:多分支卷积层和后续的扩张池化或卷积层。

    • 多分支卷积层采用不同的核大小,类似于Inception结构,用于模拟多尺度的感受野。

    • 扩张池化或卷积层用于控制感受野的偏心性,模拟人类视觉系统中感受野大小和偏心性之间的关系。

      image-20240604085948287

  2. 功能

    • RFB模块旨在提高特征的可区分性和鲁棒性,使得轻量级CNN模型也能够产生深层次的特征表示。
    • 通过多分支卷积和扩张操作,模拟人类视觉系统中感受野的特性,从而更好地捕获目标检测任务中的多尺度信息。
  3. 模块设计

    • RFB模块采用多个分支,每个分支包含不同的卷积核大小和扩张率,以模拟不同尺度的感受野。
    • 最终,所有分支的特征图被串联起来,形成一个空间池化或卷积数组,以生成最终的特征表示。
  4. 应用

    • RFB模块被嵌入到SSD等目标检测框架中,用于改善从轻量级骨干网络提取的特征,从而提高检测器的准确性和速度。
    • 通过引入RFB模块,研究人员实现了在保持实时性能的同时,达到了先进深度检测器的性能水平。

核心代码

 class BasicRFB(nn.Module):def __init__(self, in_planes, out_planes, stride=1, scale=0.1, visual=1):super(BasicRFB, self).__init__()self.scale = scaleself.out_channels = out_planesinter_planes = in_planes // 8# 定义分支0,包含两个卷积层,第一个卷积层的卷积核大小为1,第二个卷积层的卷积核大小为3,步长为1,膨胀系数为visualself.branch0 = nn.Sequential(BasicConv(in_planes, 2*inter_planes, kernel_size=1, stride=stride),BasicConv(2*inter_planes, 2*inter_planes, kernel_size=3, stride=1, padding=visual, dilation=visual, relu=False))# 定义分支1,包含三个卷积层,第一个卷积层的卷积核大小为1,第二个卷积层的卷积核大小为3,步长为stride,第三个卷积层的卷积核大小为3,膨胀系数为visual+1self.branch1 = nn.Sequential(BasicConv(in_planes, inter_planes, kernel_size=1, stride=1),BasicConv(inter_planes, 2*inter_planes, kernel_size=(3, 3), stride=stride, padding=(1, 1)),BasicConv(2*inter_planes, 2*inter_planes, kernel_size=3, stride=1, padding=visual+1, dilation=visual+1, relu=False))# 定义分支2,包含四个卷积层,第一个卷积层的卷积核大小为1,第二个卷积层的卷积核大小为3,步长为1,第三个卷积层的卷积核大小为3,步长为stride,第四个卷积层的卷积核大小为3,膨胀系数为2*visual+1self.branch2 = nn.Sequential(BasicConv(in_planes, inter_planes, kernel_size=1, stride=1),BasicConv(inter_planes, (inter_planes//2)*3, kernel_size=3, stride=1, padding=1),BasicConv((inter_planes//2)*3, 2*inter_planes, kernel_size=3, stride=stride, padding=1),BasicConv(2*inter_planes, 2*inter_planes, kernel_size=3, stride=1, padding=2*visual+1, dilation=2*visual+1, relu=False))# 定义一个线性卷积层self.ConvLinear = BasicConv(6*inter_planes, out_planes, kernel_size=1, stride=1, relu=False)# 定义一个shortcut路径的卷积层self.shortcut = BasicConv(in_planes, out_planes, kernel_size=1, stride=stride, relu=False)# 定义一个ReLU激活层self.relu = nn.ReLU(inplace=False)def forward(self, x):# 前向传播:分别通过三个分支x0 = self.branch0(x)x1 = self.branch1(x)x2 = self.branch2(x)# 将三个分支的输出沿通道维度拼接out = torch.cat((x0, x1, x2), 1)# 通过线性卷积层out = self.ConvLinear(out)# 通过shortcut路径的卷积层short = self.shortcut(x)# 进行加权求和out = out * self.scale + short# 通过ReLU激活层out = self.relu(out)return out

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/139431807

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/733462.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUUCTF---天干地址+甲子

题目直接参考天干地支表作结,转ASCII flag{Goodjob}

BUUCTF---古典密码知多少

题目知识 一共给出四种古典密码,分别是:猪圈密码、圣堂武士密码、标准银河字母、栅栏密码 猪圈之前有介绍 圣:标准银河字母更多加密方式 解题 对照解密 FGCPFLIRTUASYON 再使用栅栏 FLAGISCRYPTOFUN flag{CRYPTOFUN}

mysql 查询,字符串带着空格也能匹配上

1.说明有空格,这些数据其实是不规范的数据,但是仍然能查询出来2.注意id是一样的,但是查询出来的数据自动trim了。3.甚至输入数字也能查出来,之前知道可以自动转型,但是没想到可以自动转型+trim 4.带着前导0的整型 也能匹配上5.带着前导0的字符肯定匹配不上6.空格在前面也…

个人网站接入Google Ads的一点心得

前言 前段时间花了一些精力尝试和摸索主题接入 Google Ads 的问题,算是阶段性成功了吧,这次简单分享一下,如果有缘看到这篇文章,应该会有些启发。 1. 展示效果 上篇文章说到,前两天我在我的两款主题中内置了 Google Ads 广告位,并且我自己的网站也启用了,下图是这两天的…

你要的AI Agent工具都在这里

只有让LLM(大模型)学会使用工具,才能做出一系列实用的AI Agent,才能发挥出LLM真正的实力。本篇,我们让AI Agent使用更多的工具,比如:外部搜索、分析CSV、文生图、执行代码等。只有让LLM(大模型)学会使用工具,才能做出一系列实用的AI Agent,才能发挥出LLM真正的实力。…

C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏

前言 今天大姚给大家分享一款由C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏:SeeSharpSnake。 项目特点 该仓库中的项目文件和脚本可以用多种不同的配置构建相同的游戏,每个配置生成的输出大小也不同。 项目源码运行F5 运行 SeeSharpSnake项目,查看优秀效果: 构建不同大小…

dotnet X11 调用 XRootWindow 是否耗时

本文将通过阅读 lib x11 代码告诉大家,调用 XRootWindow 函数是不耗时的,没有成本的在我阅读 Avalonia 和 CPF 和 UNO 框架的代码的时候,我发现了很多时候都是在需要用到 RootWindow 时,调用 XRootWindow 或 XDefaultRootWindow 获取 RootWindow 的值。此时我想着是否将 Ro…

C++

C++中的isalnum可以判断一个字符是否为字母或者十进制数; 需包含头文件cctype 函数原型:int isalnum(int_C); 通过实验可知,int_C可以为字符、数字; 并且返回值为int类型,判断为true则返回1,判断为false则返回0; 接下来介绍sizeof(string) string s; sizeof(s) …

记vscode无法启动解决办法

背景之前都好好的,突然就不行了,点击快捷方式或直接程序右击管理员运行均没有任何反应。处理方式(确认使用此解决办法可以看下方红字部分,是否也有类似提示):创建null服务。(启发站点:shellvon的回复):https://github.com/microsoft/vscode/issues/185298 步骤 1、要…

OOP第7-8次作业总结

前言: 时光飞快, 转眼就到了学期末尾。从第七次作业开始,作业便开始加难度了。第七次作业加了互斥开关和窗帘,但是这次的电子元件不能像之前简单的写如同写商品类这样简单的写出,需要思考如何设计这个电器类。并且,在加上上面两个类的基础上,电路开放了串联电路中有串联…

[C++ Primer] 泛型算法

记录了C++标准库提供的泛型算法相关重难点。泛型算法 初识泛型大多数算法定义在头文件algorithm中。标准库还在头文件numeric中定义了一组数值范型算法。那些只接受一个单一迭代器来表示第二个序列的算法,都假定第二个序列至少与第一个序列一样长。 // v2中的元素数目应该至少…

prometheus指标终端绘图工具

最近搞了一个prometheus 指标终端展示工具,有兴趣的可以试试:本文来自博客园,作者:charlieroro,转载请注明原文链接:https://www.cnblogs.com/charlieroro/p/18274557