本文参考:Yolov 8源码超详细逐行解读+ 网络结构细讲(自我用的小白笔记)_yolov8源码-CSDN博客
YOLOv8源码地址: https://gitcode.com/gh_mirrors/ul/ultralytics?utm_source=csdn_github_accelerator&isLogin=1
笔者采用YOLOv8训练自定义数据集:基于SeaShips数据集的yolov8训练教程_yolov8训练seaships数据集-CSDN博客
一、网络结构
首先我们来看YOLOv8的整体网络结构:
接下来我们将分为backbone和Head两部分进行介绍:
二、backbone骨干网络
backbone文件保存在yolov8-main/ultralytics/models/v8/yolov8l.yaml
这里的yolov8l.yaml的l代表large,同理还有s(small)、m(medium)x(extra large)以及n(nano),n是代表模型尺寸小、计算量最少的版本。这里介绍以l为例。yaml文件如下所示:
# Ultralytics YOLO 🚀, GPL-3.0 license
# Parameters
nc: 6 # number of classes
depth_multiple: 1.00 # scales module repeats
width_multiple: 1.00 # scales convolution channels
# YOLOv8.0l backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [512, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [512, True]]
- [-1, 1, SPPF, [512, 5]] # 9
# YOLOv8.0l head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 12
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 15 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 18 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [512]] # 21 (P5/32-large)
- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
可以看到其中包含了backbone和head两个块的代码,这里先介绍backbone部分:
# YOLOv8.0l backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [512, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [512, True]]
- [-1, 1, SPPF, [512, 5]] # 9
backbone下第一行注释的四个参数分别表示:
- from:输入,-1表示上层的输出作为本层的输入
- repeats:模块的重复次数
- module:使用的模块
- args:模块传入的参数
另外计算尺寸的公式:
这里我们可以看到backbone部分一共有10层(0层~9层),一共采用三种模块:Conv、C2f和SPPF。
2.1 标准卷积模块Conv
代码文件存放在yolov8-main/ultralytics/nn/modules.py/Class Conv
def autopad(k, p=None, d=1): # kernel, padding, dilation
# Pad to 'same' shape outputs
if d > 1:
k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-size
if p is None:
p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad
return p
# 标准卷积
class Conv(nn.Module):
# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)
default_act = nn.SiLU() # default activation
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
super().__init__()
self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)
self.bn = nn.BatchNorm2d(c2)
self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()
def forward(self, x):
return self.act(self.bn(self.conv(x)))
def forward_fuse(self, x