YOLOV5:训练自己数据集
YOLOV5:Mosaic数据增强
YOLOV5 :网络结构 yaml 文件参数理解


前言

【个人学习笔记记录,如有错误,欢迎指正】

YOLO-V5 代码仓库地址:https://github.com/ultralytics/yolov5


一、Conv 模块

介绍各个模块前,需要介绍 YOLOV5 中的最基础 Conv 模块。

class Conv(nn.Module):def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):# ch_in, ch_out, kernel, stride, padding, groupssuper(Conv, self).__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = nn.Hardswish() if act else nn.Identity()def forward(self, x):return self.act(self.bn(self.conv(x)))def fuseforward(self, x):return self.act(self.conv(x))

这里的 Conv 模块就是 【卷积】+【BN】+【激活】的组合。激活函数使用 【Hardswish】,【nn.Identity】 简单理解为一个返回输入的占位符。

其中,【autopad(k,p)】就是一个 自动 padding 函数,

def autopad(k, p=None):  # kernel, padding# Pad to 'same'if p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-padreturn p

Conv 就是如下所示操作:

二、Focus 模块

class Focus(nn.Module):def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):super(Focus, self).__init__()# 通道数变为原来 4 倍self.conv = Conv(c1 * 4, c2, k, s, p, g, act)def forward(self, x):return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))

Focus 模块的操作如图

Focus 模块的操作是:将 RGB 三个通道上的像素每隔一个取出,如上图,这样每个通道就能生成四个通道,即高宽减半、通道变为4倍

三、Bottleneck 模块

定义的Bottleneck模块

class Bottleneck(nn.Module):def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansionsuper(Bottleneck, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c_, c2, 3, 1, g=g)self.add = shortcut and c1 == c2def forward(self, x):return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

Bottleneck 模块的流程图

当输入通道数【c1】和输出通道数【c2】相等时,就有 shortcut 连接。
第一个【Conv】:将输入通道数通过 1x1 的卷积核变为输出通道数的一半,
第二个【Conv】:正常的普通卷积(可通过更改超参数变为组卷积)。
注:这里的通道数减半是通过参数 【e】设定的,当 e == 1 时,通道数不变!

四.BottleneckCSP 模块

class BottleneckCSP(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):# ch_in, ch_out, number, shortcut, groups, expansionsuper(BottleneckCSP, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)self.cv4 = Conv(2 * c_, c2, 1, 1)self.bn = nn.BatchNorm2d(2 * c_)  # applied to cat(cv2, cv3)self.act = nn.LeakyReLU(0.1, inplace=True)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])def forward(self, x):y1 = self.cv3(self.m(self.cv1(x)))y2 = self.cv2(x)return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))

定义的 BottleneckCSP 模块流程图

输入的【x】经过两个不同的模块,然后进行【shortcut】连接,最后经过【BN】+【LeakyReLU】和 普通的【Conv】卷积。
模块一(左边):通过 1x1 的卷积进行通道数减半,然后经过一个【Bottleneck】模块,这里的参数 【e】控制 Bottleneck 模块内的 hidden 层的通道数。然后在经过一个 【Conv2d】模块(没有经过 BN 和 激活函数)。
模块二(右边):通过 1x1 的卷积进行通道数减半(也不经过 BN 和激活函数)。

五.SSP 模块

class SPP(nn.Module):# Spatial pyramid pooling layer used in YOLOv3-SPPdef __init__(self, c1, c2, k=(5, 9, 13)):super(SPP, self).__init__()c_ = c1 // 2  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c_ * (len(k) + 1), c2, 1, 1)self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])def forward(self, x):x = self.cv1(x)return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))

定义的 SPP 模块流程图

将输入的 【x】 通过一个 【Conv】模块将输入通道数减半,然后经过三个不同卷积核的最大值池化得到相同大小和通道数的输出,然后在维度一进行 concat 拼接,拼接之后经过 【Conv】将通道数缩放为 c2 的通道数。


不同卷积核的最大池化下采样:


经过三个不同卷积核的最大池化下采样之后,输出通道数是一样的,这样方便后续的拼接操作。

六.Detect 模块

这里没有给出整个类定义代码。

# 类初始化函数中
self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch)# forward 函数中
for i in range(self.nl):x[i] = self.m[i](x[i])  # convbs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()

定义的 Detect 模块流程图

输入【x】是在三个特征图上得到的结果,shape 如图所示,每个特征图经过不一样的卷积操作【nn.ModuleList】得到通道数一样,但是大小和原输入一样的特征图。然后将 shape Resize 为:
(batch_size, num_anchors,h, w, (类别个数+置信度+预测框的宽度、高度+中心点的横轴坐标))

总结

到这里,YOLOV5 中用到的模块就基本介绍完了。

YOLOV5 网络模块解析相关推荐

  1. YOLOv5全面解析教程③:更快更好的边界框回归损失

    作者|Fengwen.BBuf 边界框回归是目标检测的关键步骤,在现有方法中,虽然被广泛用于边界框回归,但它不是针对评估指标量身定制的,即 Intersection over Union (IoU). ...

  2. YOLOv5全面解析教程⑥:模型训练流程详解

    作者 | Fengwen.BBuf 欢迎Star.试用One-YOLOv5: https://github.com/Oneflow-Inc/one-yolov5 1 结构项目预览 2 安装 git c ...

  3. YOLOV5代码解析(更新中)

    YOLOv5代码注释版更新啦,注释的是最近的2021.07.14的版本,注释更全哦 github: https://github.com/Laughing-q/yolov5_annotations 2 ...

  4. yolov5结果解析

    Confusion matrix 以这种形式给出矩阵的值 g t c l a s s 1 gt_{class1} gtclass1​ g t c l a s s 2 gt_{class2} gtcla ...

  5. Leon : YoloV5 结构原理全解析 思维导图版

    Leon : YoloV5 结构原理全解析 思维导图版 博客写到了 Head 部分 暂时断更 几天 --因为 互联网加的项目 快提交了 队员们 陆续 完成了 自己负责的策划书部分 得 开始 去修改策划 ...

  6. 使用YMIR生产基于yolov5的头盔检测模型

    使用YMIR生产基于yolov5的头盔检测模型 1.概述 2.YOLOV5结构解析 YOLOV5在coco数据集性能测试图 3.算法基本信息 动手实测 查看训练.测试数据集 模型训练启动页面 模型运行 ...

  7. OpenVINO2021.4+YOLOX目标检测模型部署测试

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 引言 本文基于YOLOX的ONNX模型分别测试了YOLOX-Small与YOLOX-Tiny版本的模型 ...

  8. SECOND点云检测代码详解

    1.前言 SECOND也是一片基于Voxel按anchor-based的点云检测方法,网络的整体结构和实现大部分与原先VoxelNet相近,同时在VoxelNet的基础上改进了中间层的3D卷积,采用稀 ...

  9. VoxelNet点云检测详解

    1.前言 精确的点云检测在很多三维场景的应用中都是十分重要的一环,比如家用机机器人.无人驾驶汽车等场景.然而高效且准确的点云检测在pointnet网络提出之前,一直没能取得很好的进展,因为传统的手工点 ...

  10. GPT-4问世;LLM训练指南;纯浏览器跑Stable Diffusion

    1.多模态GPT-4正式发布:支持图像和文本输入,效果超越ChatGPT OpenAI的里程碑之作GPT-4终于发布,这是一个多模态大模型(接受图像和文本输入,生成文本).主要能力有: GPT-4可以 ...

最新文章

  1. 信息大脑如何从物理大脑中涌现?
  2. 下载.Net 4源码
  3. 数据中心支持物联网的5种方式
  4. 菜鸟网络 | 寄件业务的产品逻辑
  5. react 子组件ref_React中Ref 的使用方法详解
  6. Linux下的字符处理命令之tr命令详解
  7. 第一百三十四期:MySQL分页查询方法及优化
  8. 3蛋白wb_老司机手把手教你选WB内参
  9. 获取日志的等级_进阶之路:Java 日志框架全画传(中)
  10. 解决 GDI 贴图的闪烁
  11. Struts2请求处理流程及源码分析
  12. 编写shell管理脚本(二)
  13. iPhone开发之修改UINavigation Bar背景图片
  14. staruml顺序图转通信图_ICAO航图详解——机场图
  15. vector2Drawable(批量将png图片转换成android使用的矢量图 )
  16. 怎样理解OOP?OOP又是什么?
  17. 算法图解之狄克斯特拉算法实现
  18. Linux中的ps命令详解
  19. 【MATLAB项目实战】基于RGB特征的火焰检测
  20. cpuz测试分数天梯图_处理器CPU性能天梯图表CinebenchR15Ranking2016

热门文章

  1. 影响下载速度的因素--总结
  2. 《涛声依旧》填词改编《测试依旧》
  3. latex 删除脚注的标号
  4. 请领导过目文件怎么说_职场话题:当领导说“你定吧”,你会怎么做?
  5. 公交线路查询接口使用说明
  6. 为什么社会上的Java程序员还没有饱和?
  7. JavaScript: Checkbox onChange event is differently processed by IE and FF
  8. 公开下载 |《2021技术人的百宝黑皮书》来了!
  9. python均线斜率_一根20日均线闯天下? ——量化回测“压箱底指标”
  10. 通达信自带指标 均线多头排列(DTPL)