YOLOv8

news/2025/2/14 5:09:41/

模型架构

代码

起初在看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"


http://www.ppmy.cn/news/1571884.html

相关文章

香橙派plus5换开机图标、用户名

1-换开机logo 首先是换开机logo,可以参考官方文档 开机 logo 图片在 linux 系统中的位置为 /usr/share/plymouth/themes/orangepi/watermark.png替换开机 logo 图片后需要运行下命令才能生效 sudo update-initramfs -u2-换用户名、主机名 不知道什么是ubuntu主机…

考研操作系统----操作系统的概念定义功能和目标(仅仅作为王道哔站课程讲义作用)

目录 操作系统的概念定义功能和目标 操作系统的四个特征 操作系统的分类 ​编辑 操作系统的运行机制 系统调用 操作系统体系结构 操作系统引导 虚拟机 操作系统的概念定义功能和目标 什么是操作系统: 操作系统是指控制和管理整个计算机系统的软硬件资源&…

树莓集团:从区域到全国,数字产业园服务如何有效赋能企业?

树莓集团从区域发展起步,逐步迈向全国,其数字产业园服务在赋能企业方面有着独特的路径。 在区域发展阶段,树莓集团深入了解当地企业的需求和特点,为企业量身定制服务方案。例如,针对当地传统制造业企业,提…

分布式 IO 模块:港口控制主柜的智能 “助手”

在繁忙的港口,每一个集装箱的装卸、每一艘货轮的停靠与离港,都离不开高效精准的控制系统。港口控制主柜作为整个港口作业的核心枢纽之一,其稳定运行至关重要。而明达技术自主研发推出的MR30分布式 IO 模块可作为从站,与 PLC&#…

若依 ruoyi-vue 隐藏字典样式

平时我们会使用若依字典样式&#xff0c;有时候需要隐藏。 <el-table-column label"统计指标" align"center" prop"type" width"200px"><template slot-scope"scope"><dict-tag :options"dict.type.sta…

k8s ingress-nginx-controller 0.46.0 升级到 1.6.4

官网文档提到&#xff0c;只需替换镜像版本即可升级 ingress-nginx-controller 官方文档升级 寻找对应的ingress-nginx-controller版本 因为是 k8s 版本升级到1.24后导致的不兼容&#xff0c;所以我们要找到对应的版本的ingress 寻找对应版本地址 我们找到了比较合适的1.6.4…

【设计模式】【行为型模式】策略模式(Strategy)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…

2025年3月一区SCI-真菌生长优化算法Fungal growth optimizer-附Matlab免费代码

引言 本期介绍了一种新的自然启发的元启发式算法-真菌生长优化算法Fungal growth optimizer&#xff0c;FGO&#xff0c;这是受到自然界真菌生长行为的启发。该算法于2025年3月最新发表在中科院1区SCI期刊 Computer Methods in Applied Mechanics and Engineering。 模拟了以菌…