论文:https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1807.03247

一、背景
最近发现了一篇18年Uber美团发的一篇文章,针对卷积操作的改进。论文中提到,卷积网络在坐标变换上的缺陷限制了它的性能提升,即:它无法将空间表示转换为笛卡尔空间中的坐标和one-hot像素空间中的坐标。具体原因请参考论文,这部分没有研究,毕竟只是拿来用,且恰好有用而已。
二、针对此问题,论文中提出解决方法:
由于卷积是等变的,也就是说当每个过滤器应用到输入上时,它不知道每个过滤器在哪。我们可以帮助卷积,让它知道过滤器 的位置,这一过程需要在输入上添加两个通道实现:一个在i坐标,另一个在j坐标。如下为CoordConv卷积图:

论文认为,卷积获得成功的原因主要依靠三个元素:运用相对较少的学习参数、在GPU上计算速度很快、学习函数符合平移等变性。
CoordConv保留了前两种特点——较少的参数和高效的计算。如果坐标的权重变为零,CoordConv就和普通卷积没什么区别。另一方面,如果平移依赖对下游任务有用的话,它也同样可以学习。

由以上分析可知:CoordConv工作原理是通过使用额外的坐标通道,让卷积访问自己的输入坐标。CoordConv允许网络学习完全翻译不变性或不同程度的翻译依赖性。
它在输入特征图,添加了两个通道,一个表征i坐标,一个表征j坐标。这两个通道带有坐标信息,从而允许网络学习完全平移不变性和变化 平移相关度。
因此CoordConv卷积适合于改进目标检测网络,可以更好地学习目标的坐标信息,而对于分类和分割任务来说,则作用不大。
三、yolov5-6.1改进
3.1 前期准备
github下载yolov5-6.1,当然6.0也行,其他版本没有尝试,具体训练的配置,请自行查阅,此处只说明如何改进。
3.2 代码修改
1)models/common.py中添加如下代码:

class AddCoords(nn.Module):def __init__(self, with_r=False):super().__init__()self.with_r = with_rdef forward(self, input_tensor):"""Args:input_tensor: shape(batch, channel, x_dim, y_dim)"""batch_size, _, x_dim, y_dim = input_tensor.size()xx_channel = torch.arange(x_dim).repeat(1, y_dim, 1)yy_channel = torch.arange(y_dim).repeat(1, x_dim, 1).transpose(1, 2)xx_channel = xx_channel.float() / (x_dim - 1)yy_channel = yy_channel.float() / (y_dim - 1)xx_channel = xx_channel * 2 - 1yy_channel = yy_channel * 2 - 1xx_channel = xx_channel.repeat(batch_size, 1, 1, 1).transpose(2, 3)yy_channel = yy_channel.repeat(batch_size, 1, 1, 1).transpose(2, 3)ret = torch.cat([input_tensor,xx_channel.type_as(input_tensor),yy_channel.type_as(input_tensor)], dim=1)if self.with_r:rr = torch.sqrt(torch.pow(xx_channel.type_as(input_tensor) - 0.5, 2) + torch.pow(yy_channel.type_as(input_tensor) - 0.5, 2))ret = torch.cat([ret, rr], dim=1)return retclass CoordConv(nn.Module):def __init__(self, in_channels, out_channels, kernel_size=1, stride=1, with_r=False):super().__init__()self.addcoords = AddCoords(with_r=with_r)in_channels += 2if with_r:in_channels += 1self.conv = Conv(in_channels, out_channels, k=kernel_size, s=stride)def forward(self, x):x = self.addcoords(x)x = self.conv(x)return x

2)models/yolo.py中,在第260行左右,添加CoordConv模块说明:


3)models/yolov5s.yaml修改,只在FPN的两个小尺度输出上替换了CoordConv卷积,将原文件中的backbone和head注释,添加如下结构:

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, CoordConv, [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, CoordConv, [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, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[17, 1, Conv, [256, 3, 1]], # 24[20, 1, Conv, [512, 3, 1]], # 25[23, 1, Conv, [1024, 3, 1]], # 26[[24, 25, 26], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

然后训练即可:

最终在自己检测数据集上,涨点2.5个百分点,模型文件大小和参数量各增加了约1/5,还可以接受;
也可以在三个检测头的第一个卷积替换,但模型文件大小增加了2/5,参数量增加了1/3,而且涨点幅度反而下降了,涨了1.3个百分点,其他替换组合可以自行尝试(backbone中我没有替换)。
后续也会针对yolov5添加其他改进措施做对比。

CoordConv卷积改进yolov5-6.1相关推荐

  1. [智慧农业]Python基于改进YOLOv5的猕猴桃叶病害检测系统(完整源码&数据集&视频教程)

    1.背景 现如今由于农作物病虫害的多样性和复杂性,在特定的条件下其很容易在大范围内发生,导致农产品产量急剧下降.因此,预防和监测农作物病虫害已成为农业生产活动中的重要环节.当前,耕地面积逐渐减少,世界 ...

  2. 改进YOLOv5 | Stand-Alone Self-Attention | 针对视觉任务的独立自注意力层 | 搭建纯注意力FPN+PAN结构

    改进YOLOv5 | Stand-Alone Self-Attention | 搭建纯注意力Neck结构 论文地址:https://arxiv.org/abs/1906.05909 卷积是现代计算机视 ...

  3. 【目标检测论文解读复现NO.25】基于改进Yolov5的地铁隧道附属设施与衬砌表观病害检测方法

    前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,帮 ...

  4. 基于改进YOLOv5的猕猴桃叶病害检测系统(完整源码&数据集&视频教程)

    1.背景 现如今由于农作物病虫害的多样性和复杂性,在特定的条件下其很容易在大范围内发生,导致农产品产量急剧下降.因此,预防和监测农作物病虫害已成为农业生产活动中的重要环节.当前,耕地面积逐渐减少,世界 ...

  5. 基于改进YOLOv5的斑马线和汽车过线行为检测

    基于改进YOLOv5的斑马线检测和汽车过线行为检测 1 信息 2 摘要 3 贡献 4 数据集.源码.视频.全文链接 今天带来一个基于改进YOLOv5的斑马线和汽车过线行为检测算法:CDNet,文章提出 ...

  6. 目标检测论文解读复现之五:改进YOLOv5的SAR图像舰船目标检测

    目标检测论文解读复现 文章目录 目标检测论文解读复现 前言 一.摘要 二.网络模型及核心创新点 三.应用数据集 四.实验效果(部分展示) 五.实验结论 六.投稿期刊介绍 前言 此前出了目标改进算法专栏 ...

  7. 基于改进YOLOv5的挖机铲斗缺陷检测系统(源码&教程)

    1.研究背景 针对现有电铲斗齿检测方法存在实时性较差.误报率较高等问题,提出了一种基于机器视觉的电铲斗齿缺失检测方法.该方法利用红外热像仪采集铲斗图像,基于模板匹配原理对复杂背景下斗齿的目标区域进行准 ...

  8. 改进YOLOv5 | 头部解耦 | 将YOLOX解耦头添加到YOLOv5 | 涨点杀器

    改进YOLOv5 | 头部解耦 | 将YOLOX解耦头添加到YOLOv5 论文地址:https://arxiv.org/abs/2107.08430 文章目录 改进YOLOv5 | 头部解耦 | 将Y ...

  9. 基于融合SPD+BIFPN+CBAM改进YOLOv5的奶牛检测识别分析系统开发

    在我之前的几篇文章中分别应用了不同的tricks来改进yolov5模型如下: 加入针对小目标的SPD-Conv模块 <yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五 ...

最新文章

  1. 引入redis报错Bean method ‘redisConnectionFactory‘ not loaded because @ConditionalOnClass did not find
  2. Leetcode: LRU Cache
  3. 泛泰A860(高通公司8064 cpu 1080p) 拂4.4中国民营recovery TWRP2.7.1.2文本(通过刷第三版)...
  4. 用python计算准确率_Python 学习 scikit-learn 预测准确率计算
  5. 一个项目了解 SpringBoot 集成 MyBatis
  6. python 函数中参数的传递方式(三分钟读懂)
  7. 张量(tensor)
  8. oracle数据库的字符集更改
  9. 华为机试HJ12:字符串反转
  10. 50套简历模板.7z
  11. ThinkPHP 验证码错误
  12. Maven(六)Maven传递性和依赖性
  13. 八大地图API开发平台大比拼
  14. 关于人事档案都看看 给你们敲响警钟(
  15. 华硕fl5600l装固态并重装系统到固态
  16. 写一段潮汐调和分析的matlab代码
  17. unity 雷电游戏
  18. Linux课堂笔记--第九天
  19. 生产型WMS系统:库内管理功能设计
  20. jsp连接数据库实现注册登陆(超级详细)

热门文章

  1. git:pull --force 强制覆盖本地的分支
  2. 吉他新手防踩雷,告别吉他选择困难症!初学者吉他推荐!看这一篇就够了!
  3. windows编程之TextOut与DrawText
  4. 以通信方式共享内存,不要以共享内存方式通信(2)
  5. ARM嵌入式裸机程序学习(一)
  6. 【转载】面朝大海,春暖花开
  7. 第一学期考试 计算机科学导论,计算机科学导论试题-2013
  8. linux 测试程序性能,linux 压力测试性能IO MEM CPU
  9. Learning with Noisy Label
  10. ggplot2——坐标系篇