🌞欢迎来到人工智能的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
📆首发时间:🌹2026年5月1日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
YOLOv8必须了解的知识
非极大值抑制
模型架构
快速进行目标检测
参考内容
YOLOv8必须了解的知识
任何数字图像都可以等效看作一个平面像素直角坐标系,图像中的每一个像素点都唯一对应一组坐
标(x, y)。图像坐标系的原点位于图片左上角顶点;水平向右为X 轴正方向,对应图像的宽度方
向;竖直向下为Y 轴正方向,对应图像的高度方向。图像上任意像素的横坐标 x 代表该像素距离
左边界的水平像素个数,纵坐标 y 代表该像素距离上边界的竖直像素个数。
目标检测任务的核心,是设计并构建卷积神经网络模型:以整张图像作为网络输入,输出图像中所
有目标的位置信息与类别语义信息。一幅图像内可存在多个待检测目标;每个目标可用4 维位置信
息与2 维类别信息共同表征:位置信息为检测框左上角坐标与右下角坐标,类别信息为目标类别标
签及对应置信度。以上六项信息构成一组完整描述,形成检测六元组,图像中每一个检测目标,都
唯一对应一个这样的六元组。
YOLOv8 网络的输入为尺寸 (3*640*640)的 RGB 图像,经主干特征提取、多尺度特征融合与检测
头推理后,最终会输出三组不同分辨率的预测特征图。特征图尺度从小到大依次为 (80*80)、
(40*40)、(20*20),分别负责小、中、大尺度目标的检测任务。
特征图尺寸越小,其对应感受野范围越大,更适合预测画面中尺寸较大的目标;反之特征图尺寸越
大,感受野越小,擅长检测小尺度目标。特征图上的每一个网格单元,均对应一组目标检测预测结
果;YOLOv8 检测头为解耦头无锚框设计,每个网格单元包含 144 维 预测向量,该向量编码了目
标位置、尺寸回归、分类置信度等全部信息,后续通过解码与非极大值抑制,即可得到图像中所有
目标的最终检测框与类别结果。
| 特征图尺寸 | 数据点数量 | 感受野大小 | 对应检测框类型 | 说明 |
|---|---|---|---|---|
| 80×80 | 6400 | 小 | 小目标检测框 | 每个点感受野小,适合检测小目标。 |
| 40×40 | 1600 | 中 | 中目标检测框 | 感受野中等,适合检测中等大小目标。 |
| 20×20 | 400 | 大 | 大目标检测框 | 每个点感受野大,适合检测大目标。 |
| 向量部分 | 维度数量 | 含义 | 说明 |
|---|---|---|---|
| 坐标信息 | 64 维 | 表示检测框位置 | 每个坐标由 16 个数值表示(基于 DFL 分布焦点损失) |
| 类别信息 | 80 维 | 表示目标类别置信度 | 对应 80 种类别的置信度(以 COCO 数据集为例) |
| 合计 | 144 维 | 表示检测结果的预测向量 | 与 YOLO 模型的参数配置和特定目标检测问题相关(示例) |
非极大值抑制
YOLOv8 网络最终会输出一组共8400 个候选检测框(即 80×80 + 40×40 + 20×20 网格单元的预
测结果)。随后,这些原始预测结果会通过 YOLOv8 内置的解码算法,还原为包含目标位置与类
别信息的六元组检测结果(位置信息、类别标签与置信度)。
由于大部分候选框为冗余或无效预测,模型会通过非极大值抑制(NMS)算法进行后处理,筛选
出最可靠的目标框。该算法的核心逻辑是:通过计算两个检测框之间的 交并比(IOU)来衡
量重合程度,对高度重叠的冗余框进行抑制,最终保留置信度最高、定位最精准的检测结果。
NMS 的标准步骤:
按置信度对所有预测框从高到低排序;
取出置信度最高的框作为基准,与其余所有框计算 IOU;
若 IOU 超过设定阈值,则判定为重复框并剔除;
重复上述过程,直到所有目标框筛选完成。
模型架构
主干网络的核心功能是对输入图像进行多尺度特征提取与下采样,逐步生成不同空间分辨率的特征
图,最终输出 P3、P4、P5 三组关键特征图,用于后续 Neck 与 Head 模块的目标检测任务。
这三个特征图的命名 P3、P4、P5,其核心含义是以输入图像的下采样倍率为基准的特征层编号:
输入图像尺寸为 640×640,
P3:下采样倍率为 (2^3=8),特征图尺寸为 (80×80),负责小目标检测;
P4:下采样倍率为 (2^4=16),特征图尺寸为 (40×40),负责中目标检测;
P5:下采样倍率为 (2^5=32\),特征图尺寸为 (20×20),负责大目标检测。
其中,P 是 Pyramid(特征金字塔) 的缩写,数字 3/4/5 则代表相对于输入图像的下采样倍率的指
数((2^3/2^4/2^5)),因此 P3/P4/P5 也常被称为第 3/4/5 级特征金字塔层。
颈部网络:
颈部网络(Neck)的核心功能是对主干网络输出的多尺度特征图进行双向融合与增强,以实现高
层语义信息与底层空间细节的互补。
具体来说,它以主干网络输出的 P3、P4、P5 三级特征为输入,通过上采样(Upsample)、特征
拼接(Concat)与卷积精炼的组合,构建自上而下与自下而上的融合路径。最终,颈部网络会输
出三组与输入尺寸一致的融合特征图,分别对应小、中、大目标的检测任务,为后续检测头提供更
具鲁棒性的多尺度特征表征。
检测头:
YOLOv8 采用 解耦检测头(Decoupled Head) 设计,将目标检测的回归与分类任务分离为两个
独立的卷积分支:一个分支预测目标的位置与尺寸,另一个分支预测类别置信度。相比传统耦合
头,该结构优化了梯度流向,提升了检测精度与收敛速度。
检测头的输出经解码算法解析,可还原为目标坐标、宽高及类别置信度;训练阶段通过分布焦点损
失(DFL)、CIoU 损失与分类损失计算误差并更新网络参数;推理阶段则通过坐标解码映射回原
图,并配合非极大值抑制(NMS)筛选最终检测框。
快速进行目标检测
Ultralytics 是一家专注于计算机视觉与深度学习的公司,同时也是一个开源框架 / 库(通过 pip
install ultralytics 安装),核心产品是YOLO 系列模型(如 YOLOv5、YOLOv8、YOLO11 等),
主打高效、易用、多功能的计算机视觉解决方案。
安装 Ultralytics - Ultralytics YOLO 文档
安装
# Install or upgrade the ultralytics package from PyPI pip install -U ultralytics对于没有显示器的服务器环境(例如,云虚拟机、Docker 容器、CI/CD 流水线)
pip install ultralytics-opencv-headless调用模型进行检测
import cv2 from PIL import Image from ultralytics import YOLO model = YOLO("yolov8n.pt")#会下载到当前路径下 im1= cv2.imread("1.jpg") results = model.predict(source=im1, save=True, save_txt=True) # save predictions as labelsimport ultralytics from ultralytics import YOLO # 1. 打印 ultralytics 包的位置 print(ultralytics.__file__) # 例:/home/user/anaconda3/envs/yolo/lib/python3.10/site-packages/ultralytics/__init__.py # 2. 打印 yolov8n.yaml 的位置 import os yaml_path = os.path.join(os.path.dirname(ultralytics.__file__), 'cfg', 'models', 'v8', 'yolov8n.yaml') print(yaml_path) # 3. 更简单:直接用 pathlib(推荐) from pathlib import Path pkg_dir = Path(ultralytics.__file__).parent print(pkg_dir) # ultralytics 根目录 print(pkg_dir / 'cfg' / 'models' / 'v8' / 'yolov8n.yaml') # yaml 完整路径 # 4. 加载模型后直接查 yaml 路径 model = YOLO("yolov8n.yaml") print(model.cfg) # 直接输出 yaml 的完整绝对路径如果自定义模型
my_project/ ├── custom_modules/ │ ├── __init__.py │ ├── attention.py # 自定义注意力模块 │ └── conv.py # 自定义卷积模块 ├── models/ │ └── my_yolov8.yaml # 自定义模型配置 ├── register.py # 统一注册入口 └── train.py # 训练脚本定义自定义模块
# custom_modules/attention.py import torch import torch.nn as nn class ChannelAttention(nn.Module): """通道注意力模块 SE-Net""" def __init__(self, c1, ratio=16): super().__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc = nn.Sequential( nn.Linear(c1, c1 // ratio, bias=False), nn.ReLU(), nn.Linear(c1 // ratio, c1, bias=False), ) self.sigmoid = nn.Sigmoid() def forward(self, x): b, c, _, _ = x.shape avg = self.fc(self.avg_pool(x).view(b, c)) max_ = self.fc(self.max_pool(x).view(b, c)) weight = self.sigmoid(avg + max_).view(b, c, 1, 1) return x * weight class SpatialAttention(nn.Module): """空间注意力模块""" def __init__(self, kernel_size=7): super().__init__() self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size // 2, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg = torch.mean(x, dim=1, keepdim=True) max_, _ = torch.max(x, dim=1, keepdim=True) out = torch.cat([avg, max_], dim=1) return x * self.sigmoid(self.conv(out)) class CBAM(nn.Module): """CBAM = 通道注意力 + 空间注意力""" def __init__(self, c1, ratio=16, kernel_size=7): super().__init__() self.ca = ChannelAttention(c1, ratio) self.sa = SpatialAttention(kernel_size) def forward(self, x): return self.sa(self.ca(x))# custom_modules/conv.py import torch.nn as nn from ultralytics.nn.modules.conv import Conv # 继承官方 Conv,复用 BN+激活 class GhostConv(nn.Module): """Ghost 轻量卷积:用廉价操作生成更多特征图""" def __init__(self, c1, c2, k=1, s=1, g=1, act=True): super().__init__() c_ = c2 // 2 # 主卷积只做一半 self.cv1 = Conv(c1, c_, k, s, None, g, act=act) self.cv2 = Conv(c_, c_, 5, 1, None, c_, act=act) # DW卷积生成另一半 def forward(self, x): y = self.cv1(x) return torch.cat([y, self.cv2(y)], dim=1)统一注册入口
# register.py ← 训练前必须 import 这个文件 from ultralytics.nn import modules as nn_modules # 获取模块命名空间 # 导入你的自定义模块 from custom_modules.attention import CBAM, ChannelAttention, SpatialAttention from custom_modules.conv import GhostConv # ✅ 关键:注入到 ultralytics 的模块字典 # 方式一:直接赋值(最简单) nn_modules.CBAM = CBAM nn_modules.ChannelAttention = ChannelAttention nn_modules.SpatialAttention = SpatialAttention nn_modules.GhostConv = GhostConv # 方式二:批量注册(模块多时推荐) _CUSTOM_MODULES = { 'CBAM': CBAM, 'ChannelAttention': ChannelAttention, 'SpatialAttention': SpatialAttention, 'GhostConv': GhostConv, } for name, cls in _CUSTOM_MODULES.items(): setattr(nn_modules, name, cls) print(f"✅ 已注册自定义模块:{list(_CUSTOM_MODULES.keys())}")在 yaml 中使用自定义模块
# models/my_yolov8.yaml nc: 80 scales: n: [0.33, 0.25, 1024] 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]] # 2 - [-1, 1, Conv, [256, 3, 2]] # 3 - P3/8 - [-1, 6, C2f, [256, True]] # 4 - [-1, 1, CBAM, [256]] # 5 ← 插入 CBAM 注意力 - [-1, 1, Conv, [512, 3, 2]] # 6 - P4/16 - [-1, 6, C2f, [512, True]] # 7 - [-1, 1, CBAM, [512]] # 8 ← 再插一个 - [-1, 1, Conv, [1024, 3, 2]] # 9 - P5/32 - [-1, 3, C2f, [1024, True]] # 10 - [-1, 1, SPPF, [1024, 5]] # 11 head: - [-1, 1, nn.Upsample, [None, 2, 'nearest']] - [[-1, 8], 1, Concat, [1]] - [-1, 3, C2f, [512]] - [-1, 1, nn.Upsample, [None, 2, 'nearest']] - [[-1, 5], 1, Concat, [1]] - [-1, 3, C2f, [256]] - [[17, 20, 23], 1, Detect, [nc]]训练脚本
# train.py import register # ← 第一行必须先执行注册! from ultralytics import YOLO model = YOLO('models/my_yolov8.yaml') # 解析 yaml 时已能识别 CBAM model.train( data='data.yaml', epochs=100, imgsz=640, batch=16, device=0, )验证注册是否成功
import register from ultralytics.nn import modules as m from ultralytics import YOLO # 检查是否注册成功 print(hasattr(m, 'CBAM')) # True print(hasattr(m, 'GhostConv')) # True # 打印模型结构,确认 CBAM 出现在正确位置 model = YOLO('models/my_yolov8.yaml') print(model.model) # 统计参数量 from ultralytics.utils.torch_utils import model_info model_info(model.model, verbose=True)如果模块较多,可以封装一个注册装饰器,更工程化:
# register.py from ultralytics.nn import modules as nn_modules def register_module(name=None): """装饰器:自动将类注册到 Ultralytics 模块系统""" def decorator(cls): module_name = name or cls.__name__ setattr(nn_modules, module_name, cls) print(f"✅ 注册模块:{module_name}") return cls return decorator # ── 使用方式 ────────────────────────────────── # custom_modules/attention.py @register_module() # 使用类名 'CBAM' 注册 class CBAM(nn.Module): ... @register_module('MyCA') # 使用自定义名 'MyCA' 注册 class ChannelAttention(nn.Module): ...参考内容
【1】
小黑黑讲AI的抖音 - 抖音