Yolov5 已经更新到v6.1版本了,与之前的版本有了不少区别,网络结构有了进一步优化。来整理一下。
本文主要参考 https://blog.csdn.net/qq_37541097/article/details/123594351,大佬真了不起。
借用大佬的模型图
文章图片
删除Focus层 之前看的资料,网络的第一层都是Focus层,v6.0之后换成了一个kernel=6,stride=2,padding=2
大小的卷积层,有人认为两者在理论上是等价的,可能是觉得两者的输出大小相同。
文章图片
但是我个人认为从细节的角度Focus确实比卷积或者池化要精致一些,可以减少下采样带来的信息损失。作者改回使用卷积可能是出于工程上的考量,牺牲一点点精度带来速度上的提升,毕竟大多数芯片厂商不一定提供Focus层的优化或者自定义接口。
激活函数改用SiLU 几乎所有的激活函数都使用了SiLU,等同于Swish激活函数( β = 1 \beta=1 β=1),具有无上界有下界、平滑、非单调的特性。可以看做是介于线性函数与ReLU函数之间的平滑函数。
文章图片
文章图片
SPPF yolov5之前的版本的Neck结构采用了SPP模块。
在SPP模块中,使用 k = 1 ? 1 , 5 ? 5 , 9 ? 9 , 13 ? 13 k={1*1, 5*5, 9*9, 13*13} k=1?1,5?5,9?9,13?13的最大池化的方式,再将不同尺度的特征图进行Concat操作
文章图片
文章图片
而SPPF结构是将输入串行通过多个5x5大小的MaxPool层,简单的说,就是用2个5*5
的卷积操作代替一个9*9
的卷积操作,3个5*5
的卷积操作代替一个13*13
的卷积操作。感受野是一样的,但是计算时间快了很多。也是常规操作了。
class SPP(nn.Module):
# Spatial Pyramid Pooling (SPP) layer https://arxiv.org/abs/1406.4729
def __init__(self, c1, c2, k=(5, 9, 13)):
super().__init__()
c_ = c1 // 2# hidden channels
self.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)
with warnings.catch_warnings():
warnings.simplefilter('ignore')# suppress torch 1.9.0 max_pool2d() warning
return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))class SPPF(nn.Module):
# Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
def __init__(self, c1, c2, k=5):# equivalent to SPP(k=(5, 9, 13))
super().__init__()
c_ = c1 // 2# hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c_ * 4, c2, 1, 1)
self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)def forward(self, x):
x = self.cv1(x)
with warnings.catch_warnings():
warnings.simplefilter('ignore')# suppress torch 1.9.0 max_pool2d() warning
y1 = self.m(x)
y2 = self.m(y1)
return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1))
网络输出 【目标检测|Yolov5 v6.1网络结构】yolov5 经过5次下采样,最大会放缩32倍,原图的长宽都要求是32的倍数。v6.0版本将图片的输入默认改为640,也就是说输出的结果是
20*20*(5+n)
、40*40*(5+n)
、80*80*(5+n)
。n为分类的总数。参考
- https://blog.csdn.net/qq_37541097/article/details/123594351
推荐阅读
- 深度学习|未穿戴安全帽反光衣的人脸识别
- 目标检测|YOLOV4 -- SE注意力机制
- 深度学习|YOLOv5-Lite(更轻更快易于部署的YOLOv5)
- Yolo|在yolov5的网络结构中添加注意力机制模块
- 深度学习|yolov5-6.0/6.1加入SE、CBAM、CA注意力机制(理论及代码)
- 研发管理|学习笔记(5):第三章(YOLO系列目标检测-模型优化模块解析及功能介绍-04)
- 深度学习|深度学习综述(译)
- #|归一化(Layer Normalization、Batch Normalization)
- 计算机视觉|OpenAI新研究(扩散模型在图像合成质量上击败BigGAN,多样性还更佳)