模型架构
代码
起初在看yolov8的官方代码时我一头雾水,后来出于想要修改yolov8模型的目的,来摸索yolov8模型架构定义过程。
模型构成
结合框架图可以看到,yolov8的模型由Backbone,Head组成,也有文章将Head除Detect的部分视为Neck。按照目标检测模型的逻辑,Backbone负责从图像中提取特征,Neck负责多尺度融合,提供跨尺度信息,Head负责最终的检测,预测类别、框和置信度(判断框内是否有物体)。
模型架构可以结合代码(yolov8\ultralytics\models\v8\yolov8n.yaml)参考:
[from, repeats, module, args]:f是指输入数据来源索引,r是指block重复次数,module是模块名,args是所需参数,例如[512, 3, 2],True则指是否残差连接等。
P:不同尺度的特征图,P1是第一次下采样(卷积)后的的特征图,其分辨率为输入图像的1/2,P1这些都是在backbone中提取的特征图,是捕捉的不同大小的目标。
# Ultralytics YOLO 🚀, GPL-3.0 license# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # scales module repeats
width_multiple: 0.25 # scales convolution channels# YOLOv8.0n 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.0n 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, [1024]] # 21 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
修改架构
(1)搭建模块
yolov8在yolov8\ultralytics\nn\modules.py中定义很多组件,如Conv,C2f,ChannelAttention等。
(2)添加模块
上一步提到,YOLOv8的模型架构在配置文件yaml中定义过,所以现在要在yaml文件中修改架构;然后在Model中解析配置文件,yolov8\ultralytics\nn\tasks.py的DetectionModel通过调用parse_model方法解析,我们要在这里进行修改:
elif m is nn.BatchNorm2d:args = [ch[f]]elif m is Concat:c2 = sum(ch[x] for x in f)elif m in (Detect, Segment):args.append([ch[x] for x in f])if m is Segment:args[2] = make_divisible(args[2] * gw, 8)else:c2 = ch[f]
(3)运行代码
在项目文件夹中进入cmd(记得新建虚拟环境yolov8_env)
下载安装包:
pip install ultralytics
pip install -r requirements
运行测试:
yolo predict model=yolov8n.pt source="https://ultralytics.com/images/bus.jpg"