Yolov5优化: 多分支卷积模块RFB,扩大感受野提升小目标检测精度

news2024/11/25 6:46:40

目录

1.RFB-Net介绍

2. RFB引入到yolov5

2.1修改commmon.py

2.2 修改yolo.py

2.3 yolov5s_REF.yaml


1.RFB-Net介绍

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

 代码:https://github.com/ruinmessi/RFBNet

         受启发于人类视觉的Receptive Fields结构,本文提出RFB,将RFs的尺度、离心率纳入考虑范围,使用轻量级主干网也能提取到高判别性特征,使得检测器速度快、精度高;具体地,RFB基于RFs的不同尺度,使用不同的卷积核,设计了多分支的conv、pooling操作(makes use of multi-branch pooling with varying kernels),并通过空洞卷积(dilated conv)来控制感受野的离心率,最后一步reshape操作后,形成生成的特征

 RFs也已被深入研究,如Inception、ASPP、Deformable CNN:

RFB模块是一个多分支的卷积模块,它的内部结构被划分为两部分:

1.多分支卷积层根据RF的定义,使用多种尺寸的卷积核来实现比固定尺寸更好。具体设计:1.瓶颈结构,1x1-s2的卷积减少通道特征,然后加上一个nxn卷积。2.用5x5卷积替换为2个3x3的卷积去减少参数,这样可得到非线性结构更好的层。3.为了输出,卷积经常有stride=2或者是减少通道,所有直连层为了匹配维度用一个不带激活函数的1x1卷积层。
2.dilated 卷积层:在保持参数量可扩大感受野,用来获取更高分辨率的特征。下图展示了两种RFB结构:RFB和RFB-s。每个分支都是一个正常卷积后面加一个dilated卷积,主要尺寸和dilated因子不同。(a)RFB整体上借鉴了Inception的思想,主要不同点在于引入了3个dilated卷积层。(b)RFB-s和RFB相比主要有两个改进,一方面用3x3的卷积层代替5x5卷积层,另一方面用1x3和3x1的卷积来代替3x3卷积,主要目的是为了减少计算量,类似Inception后期版本对Inception结构的改进。

 实验结果

RFB模块:在table 2中,原始的SSD300实现了77.2%的mAP,通过简单的用RFB-max Pooling替代最后一个卷积层,我们将结果提升到了79.1%,获得了1.9%的提高,这表明了RFB模块的高效性。

2. RFB引入到yolov5

2.1修改common.py

class BasicRFB(nn.Module):

    def __init__(self, in_planes, out_planes, stride=1, scale=0.1, map_reduce=8, vision=1, groups=1):
        super(BasicRFB, self).__init__()
        self.scale = scale
        self.out_channels = out_planes
        inter_planes = in_planes // map_reduce

        self.branch0 = nn.Sequential(
            BasicConv(in_planes, inter_planes, kernel_size=1, stride=1, groups=groups, relu=False),
            BasicConv(inter_planes, 2 * inter_planes, kernel_size=(3, 3), stride=stride, padding=(1, 1), groups=groups),
            BasicConv(2 * inter_planes, 2 * inter_planes, kernel_size=3, stride=1, padding=vision + 1,
                      dilation=vision + 1, relu=False, groups=groups)
        )
        self.branch1 = nn.Sequential(
            BasicConv(in_planes, inter_planes, kernel_size=1, stride=1, groups=groups, relu=False),
            BasicConv(inter_planes, 2 * inter_planes, kernel_size=(3, 3), stride=stride, padding=(1, 1), groups=groups),
            BasicConv(2 * inter_planes, 2 * inter_planes, kernel_size=3, stride=1, padding=vision + 2,
                      dilation=vision + 2, relu=False, groups=groups)
        )
        self.branch2 = nn.Sequential(
            BasicConv(in_planes, inter_planes, kernel_size=1, stride=1, groups=groups, relu=False),
            BasicConv(inter_planes, (inter_planes // 2) * 3, kernel_size=3, stride=1, padding=1, groups=groups),
            BasicConv((inter_planes // 2) * 3, 2 * inter_planes, kernel_size=3, stride=stride, padding=1,
                      groups=groups),
            BasicConv(2 * inter_planes, 2 * inter_planes, kernel_size=3, stride=1, padding=vision + 4,
                      dilation=vision + 4, relu=False, groups=groups)
        )

        self.ConvLinear = BasicConv(6 * inter_planes, out_planes, kernel_size=1, stride=1, relu=False)
        self.shortcut = BasicConv(in_planes, out_planes, kernel_size=1, stride=stride, relu=False)
        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)
        short = self.shortcut(x)
        out = out * self.scale + short
        out = self.relu(out)

        return out

2.2 修改yolo.py

if m in {
                Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF,DWConv, MixConv2d, Focus, CrossConv,
                BottleneckCSP, C3, C3TR, C3SPP, C3Ghost, CNeB, nn.ConvTranspose2d, DWConvTranspose2d, C3x, C2f,BasicRFB}

2.3 yolov5s_REF.yaml3.

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 1  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32
# CSPNet-v5
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)
   [-1, 1, BasicRFB, [256]],  # 18

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 21 (P4/16-medium)
   [-1, 1, BasicRFB, [512]], # 22

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 25 (P5/32-large)
   [-1, 1, BasicRFB, [1024]], # 26

   [[18, 22, 26], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

String、StringBuffer和StringBuilder的区别(面试题)

目录 一、介绍String、StringBuffer和StringBuilder三大类 1.String类 2.StringBuffer类 3.StringBuilder类 4.什么是字符串常量池 4.StringBuilder类为什么不需要同步进行同步操作 二、关于String、StringBuffer和StringBuilder常见的面试题 1.为什么String是不可变的…

Flink入门学习(一)

Flink 1. 概述 分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架,用于对无界和有界数据流进行有状态计算。Flink 被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。 有界流:有定义流的开始&am…

Vue实例挂载的过程

一、思考与分析 我们都听过知其然知其所以然这句话 那么不知道是否思考过new Vue()这个过程中究竟做了些什么? 过程中是如何完成数据的绑定,又是如何将数据渲染到视图的等等 首先找到vue的构造函数 源码位置:src\core\instance\index.js…

高性能计算详细的自学方法及路线,强烈建议收藏!

一. 本文纲要 细想一下,其实无论是要自学高性能计算,还是要自学开车,无论我们要自学什么,都要弄明白以下几个问题:我们适不适合自学,怎么自学,从哪开始自学,自学到什么程度&#xff…

如何使用二维码实现业务流程闭环管理?

在日常工作中有许多业务流程需要进行跟踪记录,以确保掌握当前进度,譬如隐患上报整改、业务申请办理进度等,这时就可以应用二维码来实现业务流程的闭环管理。 通过草料二维码平台提供的表单功能,可以扫码提交表单记录,…

java之路 —— Shiro与Springboot整合开发

文章目录 前言一、基本开发步骤二、Springboot整合开发三、Shiro的集成四、测试 前言 在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。 在 Spring…

MyBatisPlus基础功能使用

文章目录 MyBatisPlus基础功能CRUDBaseMapperServiceImpl 条件构造器注解一对多、多对一映射 MyBatisPlus基础功能 CRUD BaseMapper BaseMapper 接口是 MyBatis-Plus 提供的一个基础 Mapper 接口,它定义了一系列的通用数据库操作方法,包括插入、更新、…

项目——学生信息管理系统7

目录 学生选课功能的介绍 把 课程的数据库表创建出来 创建实体类 创建添加课程页面 AddCourseFrm,注意创建成JInternalFrame类型 页面制作,具体参照之前的 回到 MainFrm 添加课程管理菜单项 给添加课程按钮绑定事件 回到AddCourseFrm 页面 1. 把…

JSON百科全书:学习JSON看这一篇就够了

目录 1.1 JSON 简介 1.1.1 什么是 JSON 1.1.2 JSON 的特点 1.2 JSON 语法 1.2.1 JSON 键/值对 1.2.2 JSON 字符串 1.2.3 JSON 数值 1.2.4 JSON 对象 1.2.5 JSON 数组 1.2.6 JSON 布尔值 1.2.7 JSON null 1.2.8 JSON 文件 1.3 JSON 对象 1.3.1 访问对象的值 1.3…

7DGroup性能实施项目日记7

九月廿五 壬寅年 虎 庚戌月 丙午日 从昨天的场景执行和结果分析来看,效果有一些。今天我们又换了一个接口,看看有什么新问题。 从我的 RESAR 性能工程的逻辑上来看,现在是在基准场景执行的阶段。在这个阶段就是要把每个接口都单独压到最大tp…

大数据开发之Hive案例篇14:某个节点HDFS块比较多

文章目录 一. 问题描述二. 解决方案2.1 查看节点安装的组件2.2 排查HDFS配置2.3 排查Yarn配置2.3.1 首先查看下nodemanager的日志2.3.2 查看container分配情况2.3.3 查看调度机制2.3.4 查看集群任务情况2.3.5 集群负载情况2.3.6 resourcemanager与nodemanager是否可以混合部署 …

基于Springboot的在线竞拍系统(拍卖系统)

今天给大家带来了一个在线竞拍(拍卖)系统(带设计报告),项目功能完善。 用户功能 包括沙箱支付宝支付,在线竞拍,收藏管理,个人资料管理,竞拍管理等等。 机构功能 包括,上传竞拍项目…

springboot球赛管理小程序

球赛管理系统 springboot球赛管理系统小程序 java球赛管理小程序 技术: 基于springbootvue小程序球赛管理系统的设计与实现 运行环境: JAVA版本:JDK1.8 IDE类型:IDEA、Eclipse都可运行 数据库类型:MySql(…

优盘无法识别?恢复U盘数据就这样做!

到底是怎么回事呢?我的优盘用得好好的,突然就无法识别了。优盘里有对我很重要的数据,这些数据还能找回来吗?希望大家帮帮我! 优盘作为常用的便携式存储设备。为我们随时随地保存数据提供了很大的便利。我们可以利用u盘…

C++并发编程之玩转condition_variable

C并发编程之玩转condition_variable 0.导语 最近在看并发编程相关的代码,自己顺手从0开始写了个小项目玩转并发场景下的生产消费者模型,如果你想提高多线程编程方面的能力,想熟练掌握condition_variable的使用,甚至想在面试当中凸…

Go 语言精进之路——Go 中常见并发模式总结

文章目录 前言创建模式退出模式分离模式join 模式notify-and-wait模式退出模式的应用 管道模式扇出与扇入模式 超时与取消模式 前言 在语言层面,Go针对CSP模型提供了三种并发原语。 goroutine:对应CSP模型中的P,封装了数据的处理逻辑&#x…

数字化赋能大健康实体行业迈入发展新阶段,大健康招商加盟系统优势有哪些?

数字经济的发展,正推动大健康实体行业迈入高质量发展新阶段。大健康实体行业应如何在数字化浪潮中抢占先机?大健康实体行业招商加盟平台应如何开发设计,才能帮助大健康企业主取得营收突破? 围绕蚓链大健康招商加盟系统&#xff0c…

ppt制作相关内容小结

ppt制作是天大的事!是讲清一件事,表达自己的最好方式 1.删除ppt中的所有备注信息2.ppt制作中的快捷键3.精美的ppt收集 这里还是要提醒自己一下,做好ppt是外在的事情,把道理吃透才是根本! 但是ppt外在也是表达的一种方式…

闭包实现函数柯里化,js实现

闭包实现函数柯里化,js实现 函数柯里化定义代码实现 函数柯里化定义 柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术 即函数可以接…

.NET 8 Preview 4 中的 ASP.NET Core 更新

作者:Daniel Roth - Principal Program Manager, ASP.NET 翻译:Alan Wang 排版:Alan Wang .NET 8 Preview 4 现已可用,并包括了许多对 ASP.NET Core 的新改进。 以下是本预览版本中的新内容摘要: Blazor 使用 Blazor …