YOLOv5、v7改进之三十八:引入RepVGG模型结构
创始人
2024-01-17 17:25:01
0

前 言:作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。由于出到YOLOv7,YOLOv5算法2020年至今已经涌现出大量改进论文,这个不论对于搞科研的同学或者已经工作的朋友来说,研究的价值和新颖度都不太够了,为与时俱进,以后改进算法以YOLOv7为基础,此前YOLOv5改进方法在YOLOv7同样适用,所以继续YOLOv5系列改进的序号。另外改进方法在YOLOv5等其他算法同样可以适用进行改进。希望能够对大家有帮助。

具体改进办法请关注后私信留言!关注即可免费领取深度学习算法资料!

解决问题:之前改进增加了很多注意力机制的方法,包括比较常规的SE、CBAM等,本文加入简单但功能强大的轻量级卷积神经网络结构,权衡网络精度和速度,实现双赢的检测效果。

基本原理:

提出了一种简单但功能强大的卷积神经网络结构,它具有一个类似VGG的推理时间体,由3×3卷积和ReLU组成,而训练时间模型具有多分支拓扑。这种训练时间和推理时间架构的解耦是通过结构重新参数化技术实现的,因此该模型被命名为RepVGG。在ImageNet上,据我们所知,RepVGG达到了80%以上的前1精度,这是普通模型的第一次。在NVIDIA 1080Ti GPU上,RepVGG型号的运行速度比ResNet-50快83%,比ResNet-101快101%,具有更高的精度,与EfficientNet和RegNet等最先进的型号相比,显示出令人满意的精度-速度权衡。

    与最先进的基线相比,考虑到其简单性,RepVGG也表现出良好的性能:RepVGG-A2比EfficientNet-B0好1.37%/59%,RepVVGG-B1比RegNetX-3.2GF好0.39%,运行速度稍快。值得注意的是,RepVGG模型在200个时代达到了80%以上的准确率(表5),据我们所知,这是普通模型第一次赶上最先进的水平。与RegNetX-12GF相比,RepVGG-B3的运行速度快31%,考虑到RepVGG不需要太多,这一点令人印象深刻。我们使用这样的批处理大小,因为它足够大,可以实现每个测试模型100%的GPU利用率,以模拟追求最大QPS(每秒查询数)的实际应用场景,而我们的GPU内存不足,无法满足批量大小为256的EfficientNet-B3。表:在ImageNet上训练的120个时期的简单数据增强结果。速度在1080Ti上进行测试,批量大小为128,全精度(fp32),以示例/秒为单位进行测量。我们计算第节中所述的理论FLOP和Wino MUL。

添加方法:

第一步:确定添加的位置,作为即插即用的注意力模块,可以添加到YOLOv7网络中的任何地方。

第二步:common.py构建模块。部分代码如下,关注文章末尾,私信后领取。

class RepVGGBlock(nn.Module):def __init__(self, in_channels, out_channels, kernel_size=3,stride=1, padding=1, dilation=1, groups=1, padding_mode='zeros', deploy=False, use_se=False):super(RepVGGBlock, self).__init__()self.deploy = deployself.groups = groupsself.in_channels = in_channelspadding_11 = padding - kernel_size // 2self.nonlinearity = nn.SiLU()# self.nonlinearity = nn.ReLU()if use_se:self.se = SEBlock(out_channels, internal_neurons=out_channels // 16)else:self.se = nn.Identity()if deploy:self.rbr_reparam = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size,stride=stride,padding=padding, dilation=dilation, groups=groups, bias=True,padding_mode=padding_mode)else:self.rbr_identity = nn.BatchNorm2d(num_features=in_channels) if out_channels == in_channels and stride == 1 else Noneself.rbr_dense = conv_bn(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size,stride=stride, padding=padding, groups=groups)self.rbr_1x1 = conv_bn(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=stride,padding=padding_11, groups=groups)# print('RepVGG Block, identity = ', self.rbr_identity)
def switch_to_deploy(self):if hasattr(self, 'rbr_1x1'):kernel, bias = self.get_equivalent_kernel_bias()self.rbr_reparam = nn.Conv2d(in_channels=self.rbr_dense.conv.in_channels, out_channels=self.rbr_dense.conv.out_channels,kernel_size=self.rbr_dense.conv.kernel_size, stride=self.rbr_dense.conv.stride,padding=self.rbr_dense.conv.padding, dilation=self.rbr_dense.conv.dilation, groups=self.rbr_dense.conv.groups, bias=True)self.rbr_reparam.weight.data = kernelself.rbr_reparam.bias.data = biasfor para in self.parameters():para.detach_()self.rbr_dense = self.rbr_reparam# self.__delattr__('rbr_dense')self.__delattr__('rbr_1x1')if hasattr(self, 'rbr_identity'):self.__delattr__('rbr_identity')if hasattr(self, 'id_tensor'):self.__delattr__('id_tensor')self.deploy = Truedef get_equivalent_kernel_bias(self):kernel3x3, bias3x3 = self._fuse_bn_tensor(self.rbr_dense)return kernel3x3 + self._pad_1x1_to_3x3_tensor(kernel1x1) + kernelid, bias3x3 + bias1x1 + biasiddef _pad_1x1_to_3x3_tensor(self, kernel1x1):if kernel1x1 is None:return 0else:return torch.nn.functional.pad(kernel1x1, [1, 1, 1, 1])def _fuse_bn_tensor(self, branch):if branch is None:return 0, 0if isinstance(branch, nn.Sequential):kernel = branch.conv.weightrunning_mean = branch.bn.running_meanrunning_var = branch.bn.running_vargamma = branch.bn.weightbeta = branch.bn.biaseps = branch.bn.epselse:assert isinstance(branch, nn.BatchNorm2d)if not hasattr(self, 'id_tensor'):input_dim = self.in_channels // self.groupskernel_value = np.zeros((self.in_channels, input_dim, 3, 3), dtype=np.float32)for i in range(self.in_channels):kernel_value[i, i % input_dim, 1, 1] = 1self.id_tensor = torch.from_numpy(kernel_value).to(branch.weight.device)kernel = self.id_tensorrunning_mean = branch.running_meanrunning_var = branch.running_vargamma = branch.weightbeta = branch.biaseps = branch.epsstd = (running_var + eps).sqrt()t = (gamma / std).reshape(-1, 1, 1, 1)return kernel * t, beta - running_mean * gamma / stddef forward(self, inputs):if self.deploy:return self.nonlinearity(self.rbr_dense(inputs))if hasattr(self, 'rbr_reparam'):return self.nonlinearity(self.se(self.rbr_reparam(inputs)))if self.rbr_identity is None:id_out = 0else:id_out = self.rbr_identity(inputs)return self.nonlinearity(self.se(self.rbr_dense(inputs) + self.rbr_1x1(inputs) + id_out))

第三步:yolo.py中注册RepVGGBlock模块

elif m is RepVGGBlock:c1, c2 = ch[f], args[0]if c2 != no:  # if not outputc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]
if type(m) is RepVGGBlock:m.switch_to_deploy()

第四步:修改yaml文件,本文以修改backbone为例,将原C3模块后加入该模块。

backbone:# [from, number, module, args][[-1, 1, Conv, [32, 3, 1]],  # 0[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2[-1, 1, Conv, [64, 3, 1]],[-1, 1, Conv, [128, 3, 2]],  # 3-P2/4 [-1, 1, RepVGGBlock, [128, 3, 2]], # 5-P4/16[-1, 1, Conv, [256, 3, 2]], [-1, 1, MP, []],[-1, 1, Conv, [128, 1, 1]],[-3, 1, Conv, [128, 1, 1]],[-1, 1, Conv, [128, 3, 2]],

第五步:将train.py中改为本文的yaml文件即可,开始训练。

结 果:本人在遥感数据集上进行实验,有涨点效果。需要请关注留言。

预告一下:下一篇内容将继续分享深度学习算法相关改进方法。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦

PS:该方法不仅仅是适用改进YOLOv5,也可以改进其他的YOLO网络以及目标检测网络,比如YOLOv7、v6、v4、v3,Faster rcnn ,ssd等。

最后,有需要的请以关注文末私信我吧。关注即可免费领取深度学习算法学习资料!

相关内容

热门资讯

通讯稿 通讯稿(精选19篇)  在发展不断提速的社会中,我们需要用到通讯稿的情形越来越多,以下是小编为大家整...
语言欣赏《耳朵上的绿星》中班... 语言欣赏《耳朵上的绿星》中班说课材料  一、说教材。  (一)说设计意图:  《耳朵上的绿星》这一内...
感恩国旗下讲话稿 感恩国旗下讲话稿(通用5篇)  随着社会一步步向前发展,用到讲话稿的地方越来越多,讲话稿是讲话者为了...
中班数学活动《椭圆形》说课稿 中班数学活动《椭圆形》说课稿  一、背景  本次教研活动围绕中班"有趣的滚动"主题中的一节数学活动《...
运动员代表讲话稿 运动员代表讲话稿(通用23篇)  在日新月异的现代社会中,能够利用到讲话稿的场合越来越多,讲话稿是人...
说屏说课稿 说屏说课稿  在教学工作者实际的教学活动中,就有可能用到说课稿,说课稿有助于教学取得成功、提高教学质...
小学红领巾广播站广播稿 小学红领巾广播站广播稿(甲乙):敬爱的老师,亲爱的同学们,下午好!(甲):我是主持人——。(乙):我...
午夜情感电台广播稿 午夜情感电台广播稿  有在学校广播站锻炼的同学们,大家广播前一般都会预先做好广播稿,广播稿写得优秀才...
中学体育说课稿 中学体育说课稿  教师说课是教师招聘面试中的一个重要环节。下面是小编为你整理了“中学体育说课稿”,希...
获取网络信息的策略与技巧说课... 获取网络信息的策略与技巧说课稿  一、 教材分析和教学对象分析  “获取网络信息的策略与技巧”是普通...
初中同学聚会主持稿 初中同学聚会主持稿  在现在社会,用到主持稿的地方越来越多,主持稿起到承上启下的作用。相信很多朋友都...
职工代表发言稿 职工代表发言稿  演讲并不是你一个人在台上讲讲就好的事,演讲还需要你和听众进行交流,当然我说的是眼神...
《正方形与长方形的面积》说课... 《正方形与长方形的面积》说课稿范文  作为一名为他人授业解惑的教育工作者,时常会需要准备好说课稿,说...
《祖国,我爱你》诗歌朗诵稿 《祖国,我爱你》诗歌朗诵稿  热爱祖国,这是一种最纯洁、最敏锐、最高尚、最强烈、最温柔、最有情、最温...
运动会800加油稿八则   加油稿给别人一种鼓励或是动力的广播稿子。下面是小编为您带来的是运动会800加油稿八则相关内容,希...
幼儿园开学幼师代表发言稿 幼儿园开学幼师代表发言稿范文(精选3篇)  在社会发展不断提速的今天,发言稿的使用越来越广泛,通过对...
小学世界读书日国旗下讲话稿 小学世界读书日国旗下讲话稿(通用20篇)  在日常生活和工作中,我们都不可避免地要接触到讲话稿,绝大...
高中美术《美术作品的艺术语言... 高中美术《美术作品的艺术语言》说课稿模板  各位评委  我说课的内容是人美版高中课程标准实验教科书—...
校园运动会广播稿 校园运动会广播稿大全50字精选  篇1、致运动员  你是跑道上划过的流星,  燃烧自己,洒下光辉, ...
初中语文《望岳》优秀说课稿 初中语文《望岳》优秀说课稿  初中语文的教学开始增加难度,而教师们知道应该要怎么制定相关的说课稿吗?...