# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P2-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024]
s: [0.33, 0.50, 1024]
m: [0.67, 0.75, 768]
l: [1.00, 1.00, 512]
x: [1.00, 1.25, 512]
# YOLOv8.0 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, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv8.0-p2 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, nn.Upsample, [ None, 2, "nearest" ] ]
- [ [ -1, 2 ], 1, Concat, [ 1 ] ] # cat backbone P2
- [ -1, 3, C2f, [ 128 ] ] # 18 (P2/4-xsmall)
- [ -1, 1, ADown, [ 128] ]
- [ [ -1, 15 ], 1, Concat, [ 1 ] ] # cat head P3
- [ -1, 3, C2f, [ 256 ] ] # 21 (P3/8-small)
- [ -1, 1, Conv, [ 256, 3, 2 ] ]
- [ [ -1, 12 ], 1, Concat, [ 1 ] ] # cat head P4
- [ -1, 3, C2f, [ 512 ] ] # 24 (P4/16-medium)
- [ -1, 1, Conv, [ 512, 3, 2 ] ]
- [ [ -1, 9 ], 1, Concat, [ 1 ] ] # cat head P5
- [ -1, 3, C2f, [ 1024 ] ] # 27 (P5/32-large)
- [ [ 18, 21, 24, 27 ], 1, Detect, [ nc ] ] # Detect(P2, P3, P4, P5)
在YOLOv8 p2的配置中,P2、P3、P4 和 P5 的特征图是在不同的层产生的。以下是各层产生这些特征图的具体位置:
Backbone 部分
1. P2 层:
定义在第2行:`[-1, 1, Conv, [128, 3, 2]]`。这表示从输入层开始,通过一个3×3的卷积核和步长为2的卷积操作得到P2层。P2层的通道数为128。
2. **P3 层**:
- 定义在第4行:`[-1, 1, ADown, [256]]`。这表示从P2层开始,通过一个名为`ADown`的模块得到P3层。P3层的通道数为256。
3. **P4 层**:
- 定义在第6行:`[-1, 1, Conv, [512, 3, 2]]`。这表示从P3层开始,通过一个3×3的卷积核和步长为2的卷积操作得到P4层。P4层的通道数为512。
4. **P5 层**:
- 定义在第8行:`[-1, 1, Conv, [1024, 3, 2]]`。这表示从P4层开始,通过一个3×3的卷积核和步长为2的卷积操作得到P5层。P5层的通道数为1024。
Head 部分
接下来,在Head部分,这些特征图被进一步处理,并且通过上采样和拼接操作与其他层的特征图融合,以产生最终的检测输出。
1. P2 层处理:
- 第6行:`[ -1, 1, nn.Upsample, [ None, 2, "nearest" ] ]`。这表示将P3层的特征图上采样到P2层的分辨率。
- 第7行:`[ [ -1, 2 ], 1, Concat, [ 1 ] ]`。这表示将上采样的P3层特征图与P2层特征图进行拼接。
- 第8行:`[ -1, 3, C2f, [ 128 ] ]`。这表示对拼接后的特征图进行进一步的处理,通道数为128。这是P2层的最终输出。
2. P3 层处理:
- 第2行:`[ -1, 1, nn.Upsample, [ None, 2, "nearest" ] ]`。这表示将P4层的特征图上采样到P3层的分辨率。
- 第3行:`[ [ -1, 4 ], 1, Concat, [ 1 ] ]`。这表示将上采样的P4层特征图与P3层特征图进行拼接。
- 第4行:`[ -1, 3, C2f, [ 256 ] ]`。这表示对拼接后的特征图进行进一步的处理,通道数为256。这是P3层的最终输出。
3. P4 层处理:
- 第7行:`[ -1, 1, ADown, [ 128] ]`。这表示将P2层的特征图进行下采样,以便与P3层的特征图融合。
- 第8行:`[ [ -1, 15 ], 1, Concat, [ 1 ] ]`。这表示将下采样的P2层特征图与P3层特征图进行拼接。
- 第9行:`[ -1, 3, C2f, [ 256 ] ]`。这表示对拼接后的特征图进行进一步的处理,通道数为256。这是P3层的最终输出。
- 第10行:`[ -1, 1, Conv, [ 256, 3, 2 ] ]`。这表示将处理过的P3层特征图进行下采样,以便与P4层特征图融合。
- 第11行:`[ [ -1, 12 ], 1, Concat, [ 1 ] ]`。这表示将下采样的特征图与P4层特征图进行拼接。
- 第12行:`[ -1, 3, C2f, [ 512 ] ]`。这表示对拼接后的特征图进行进一步的处理,通道数为512。这是P4层的最终输出。
4. P5 层处理:
- 第13行:`[ -1, 1, Conv, [ 512, 3, 2 ] ]`。这表示将处理过的P4层特征图进行下采样,以便与P5层特征图融合。
- 第14行:`[ [ -1, 9 ], 1, Concat, [ 1 ] ]`。这表示将下采样的特征图与P5层特征图进行拼接。
- 第15行:`[ -1, 3, C2f, [ 1024 ] ]`。这表示对拼接后的特征图进行进一步的处理,通道数为1024。这是P5层的最终输出。
综上所述,P2、P3、P4 和 P5 层的特征图最初分别由backbone部分的第2行、第4行、第6行和第8行定义,而这些特征图在head部分经过一系列处理后成为最终的检测输入。