赞
踩
本文提出RFB,将RFs的尺度、离心率纳入考虑范围,使用轻量级主干网也能提取到高判别性特征,使得检测器速度快、精度高;具体地,RFB基于RFs的不同尺度,使用不同的卷积核,设计了多分支的conv、pooling操作(makes use of multi-branch pooling with varying kernels),并通过虫洞卷积(dilated conv)来控制感受野的离心率,最后一步reshape操作后,形成生成的特征。
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结构的改进。
在ultralytics/nn/modules路径下增加一个BasicRFB.py,将以下代码复制
- import torch
- import torch.nn as nn
-
- class BasicConv(nn.Module):
- def __init__(self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1, relu=True):
- super(BasicConv, self).__init__()
- self.conv = nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride,
- padding=padding, dilation=dilation, groups=groups, bias=False)
- self.bn = nn.BatchNorm2d(out_planes, eps=1e-5, momentum=0.01, affine=True)
- self.relu = nn.ReLU(inplace=True) if relu else nn.Identity()
-
- def forward(self, x):
- x = self.conv(x)
- x = self.bn(x)
- x = self.relu(x)
- return x
-
- 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

在ultralytics/nn/tasks.py中,保证能够导入类,在最后面加入class 的BasicRFB名称,
- from ultralytics.nn.modules import (AIFI, C1, C2, C3, C3TR, SPP, SPPF, Bottleneck, BottleneckCSP, C2f, C3Ghost, C3x,
- Classify, Concat, Conv, ConvTranspose, Detect, DWConv, DWConvTranspose2d, Focus,
- GhostBottleneck, GhostConv, HGBlock, HGStem, Pose, RepC3, RepConv, RTDETRDecoder,
- Segment,CBAM,BasicRFB)
还是在ultralytics/nn/tasks.py中,在最后面加入BasicRFB,保证能读入名称
- if m in (Classify, Conv, ConvTranspose, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, Focus,
- BottleneckCSP, C1, C2, C2f, C3, C3TR, C3Ghost, nn.ConvTranspose2d, DWConvTranspose2d, C3x,BasicRFB)
在ultralytics/models/v8/.yaml文件中,复制增加一个名称yolov8_BasicRFB.yaml文件,
把以下复制在其中。
- # Ultralytics YOLO 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42180推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。