>>>深度学习Tricks,第一时间送达<<<

目录

RepVGG——极简架构,SOTA性能!!!

(一)前沿介绍

1.RepVGGBlock模块

2.相关实验结果

(二)YOLOv5/YOLOv7改进之结合​RepVGG

1.配置common.py文件

2.配置yolo.py文件

3.配置yolov5/yolov7_​​RepVGG.yaml文件


RepVGG——极简架构,SOTA性能!!!

(一)前沿介绍

论文题目:RepVGG: Making VGG-style ConvNets Great Again

论文地址:https://arxiv.org/abs/2101.03697

代码地址:https://github.com/DingXiaoH/RepVGG

作者提出了一个简单但功能强大的卷积神经网络架构,该架构推理时候具有类似于VGG的骨干结构,该主体仅由3 x 3卷积和ReLU堆叠组成,而训练时候模型采用多分支拓扑结构。 训练和推理架构的这种解耦是通过结构重参数化技术实现的,因此该模型称为RepVGG。 在ImageNet上,据我们所知,RepVGG的top-1准确性达到80%以上,这是老模型首次实现该精度。 在NVIDIA 1080Ti GPU上,RepVGG模型的运行速度比ResNet-50快83%,比ResNet-101快101%,并且具有更高的精度,与诸如EfficientNet和RegNet的最新模型相比,RepVGG显示出良好的精度-速度权衡。效果对比如下图所示。

该论文主要有以下三点贡献:

1.更快

除了Winograd conv带来的加速之外,FLOPs和速度之间的差异可以归因于两个重要因素,它们对速度有很大影响,但FLOPs并未考虑这些因素:内存访问成本(MAC)和并行度。 另一方面,在相同的FLOPs下,具有高并行度的模型可能比具有低并行度的模型快得多。因此简单的推理结构可以避免多分支的零碎计算。

2.更省内存

如图(A)所示的Residual模块,假设卷积层不改变channel的数量,那么在主分支和shortcut分支上都要保存各自的特征图或者称Activation,那么在add操作前占用的内存大概是输入Activation的两倍,而图(B)的Plain结构占用内存始终不变。

VGG是一个直筒性单路结构,由上述分析可知,单路结构会占有更少的内存,因为不需要保存其中间结果,同时,单路架构非常快,因为并行度高。同样的计算量,大而整的运算效率远超小而碎的运算。

3.更加灵活

作者在论文中提到了模型优化的剪枝问题,对于多分支的模型,结构限制较多剪枝很麻烦,而对于Plain结构的模型就相对灵活很多,剪枝也更加方便。

1.RepVGGBlock模块

2.相关实验结果

(二)YOLOv5/YOLOv7改进之结合​RepVGG

改进方法和其他模块一样,分三步走:

1.配置common.py文件

#RepVGGBlock
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 get_equivalent_kernel_bias(self):kernel3x3, bias3x3 = self._fuse_bn_tensor(self.rbr_dense)kernel1x1, bias1x1 = self._fuse_bn_tensor(self.rbr_1x1)kernelid, biasid = self._fuse_bn_tensor(self.rbr_identity)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 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))def fusevggforward(self, x):return self.nonlinearity(self.rbr_dense(x))

2.配置yolo.py文件

加入RepVGGBlock模块。

3.配置yolov5/yolov7_​​RepVGG.yaml文件

# anchors
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# YOLOv5 backbone
backbone:# [from, number, module, args][[-1, 1, RepVGGBlock, [64, 3, 2]],  # 0-P1/2[-1, 1, RepVGGBlock, [64, 3, 2]], # 1-P2/4[-1, 1, RepVGGBlock, [64, 3, 1]], # 2-P2/4[-1, 1, RepVGGBlock, [128, 3, 2]], # 3-P3/8[-1, 3, RepVGGBlock, [128, 3, 1]],[-1, 1, RepVGGBlock, [256, 3, 2]], # 5-P4/16[-1, 13, RepVGGBlock, [256, 3, 1]],[-1, 1, RepVGGBlock, [512, 3, 2]], # 7-P4/16]
# YOLOv5 head
head:[[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 1, C3, [256, False]],  # 11[-1, 1, Conv, [128, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 1, C3, [128, False]],  # 15 (P3/8-small)[-1, 1, Conv, [128, 3, 2]],[[-1, 12], 1, Concat, [1]],  # cat head P4[-1, 1, C3, [256, False]],  # 18 (P4/16-medium)[-1, 1, Conv, [256, 3, 2]],[[-1, 8], 1, Concat, [1]],  # cat head P5[-1, 1, C3, [512, False]],  # 21 (P5/32-large)[[15, 18, 21], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

目标检测算法——YOLOv5/YOLOv7改进之结合​RepVGG(速度飙升)相关推荐

  1. 目标检测算法——YOLOv5/YOLOv7改进之结合GAMAttention

    >>>深度学习Tricks,第一时间送达<<< 目录 超越CBAM,全新注意力GAM:不计成本提高精度! (一)前沿介绍 1.GAM结构图 2.相关实验结果 (二) ...

  2. 目标检测算法——YOLOv5/YOLOv7改进之结合​PP-LCNet(轻量级CPU网络)

    >>>深度学习Tricks,第一时间送达<<< 目录 ​PP-LCNet--轻量级且超强悍的CPU级骨干网络!! (一)前沿介绍 1.PP-LCNet主要模块 2. ...

  3. ​目标检测算法——YOLOv5/YOLOv7改进之结合​SOCA(单幅图像超分辨率)

    >>>深度学习Tricks,第一时间送达<<< 目录 CVPR19 单幅图像超分辨率来了!!! (一)前沿介绍 论文题目:Second-order Attentio ...

  4. 目标检测算法——YOLOv5/YOLOv7改进之结合BiFPN

    >>>深度学习Tricks,第一时间送达<<< 论文题目:<EfficientDet: Scalable and Efficient Object Detec ...

  5. 目标检测算法——YOLOv5/YOLOv7改进|将IOU Loss替换为EIOU Loss

    >>>深度学习Tricks,第一时间送达<<< 论文题目:<Focal and Efficient IOU Loss for Accurate Boundin ...

  6. 目标检测算法——YOLOv5/YOLOv7改进结合轻量型Ghost模块

    >>>深度学习Tricks,第一时间送达<<< 论文题目:<GhostNet:More Features from Cheap Operations> ...

  7. 目标检测算法——YOLOv5/YOLOv7改进之结合无参注意力SimAM(涨点神器)

    >>>深度学习Tricks,第一时间送达<<< 目录 (一)前言介绍 1.摘要 2.不同注意力步骤比较 (二)相关实验 (三)YOLOv5结合无参注意力SimAM ...

  8. 目标检测算法——YOLOv5/YOLOv7改进之结合CBAM注意力机制

    深度学习Tricks,第一时间送达 论文题目:<CBAM: Convolutional Block Attention Module> 论文地址:  https://arxiv.org/p ...

  9. 目标检测算法——YOLOv5/YOLOv7改进之结合轻量化网络MobileNetV3(降参提速)

    >>>深度学习Tricks,第一时间送达<<< 论文题目:Searching for MobileNetV3 论文地址:https://arxiv.org/abs/ ...

最新文章

  1. 《Adobe Flash CS5中文版经典教程》——1.5 在“时间轴”中组织图层
  2. CentOS Linux搭建SVN服务器
  3. substring、substr以及slice、splice用法和区别
  4. 用Python爬取Bilibili上二次元妹子的视频
  5. 在Windows XP中对系统文件(页面文件和注册表)进行碎片整理
  6. Adbshell相关命令
  7. C语言小项目(画机器猫)
  8. 利用sql语句实现到datagridview显示的转换
  9. [转载]网页栅格系统研究(1):960的秘密
  10. 修改页面后获得flag_逆向基础题五:获取Flag
  11. 音阶频率对照表_音符频率对应表
  12. 【机器学习】分类决策树基本介绍+代码实现
  13. 如何在python导入包_python如何导入包
  14. 查看英伟达NVIDIA显卡型号
  15. 基因家族特征分析 - 染色体定位分析
  16. OpenCV+百度云人脸识别项目及源码
  17. 省市区镇(可以选四级)联动点击自动展开下一级
  18. 使用winrar压缩分卷(csdn上传大资源使用)
  19. Web前端,HTML表格相关标签和属性,在网页中表格结构的显示
  20. 阿里云国际站有什么优势吗?

热门文章

  1. Thinkpad R61 驱动下载及安装方法 for windows XP
  2. Python缺失值的处理
  3. selenium+opencv干掉滑动验证码
  4. 翻译 第10章 of IEEE Std 1666-2011 IEEE Standard for Standard SystemC Language Reference Manual
  5. mysql技能培训_MySQL学习(一)
  6. 计算机主机箱内件组装图解,如何自己动手解决组装电脑 组装电脑步骤介绍【详解】...
  7. Winsoft OBR库v2.2-10.3-SEO-狼术
  8. spring cloud 集成elasticsearch 实现分词查询和模糊查询
  9. 前端埋点数据收集及上报方案实战
  10. 电脑声道,Win7电脑5.1声道怎么调?Win7系统配置5.1声道的方法