news 2026/5/1 16:28:45

人工智能|YOLOv8必须了解的知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
人工智能|YOLOv8必须了解的知识

🌞欢迎来到人工智能的世界
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

📆首发时间:🌹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×806400小目标检测框每个点感受野小,适合检测小目标。
40×401600中目标检测框感受野中等,适合检测中等大小目标。
20×20400大目标检测框每个点感受野大,适合检测大目标。

向量部分维度数量含义说明
坐标信息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 labels

import 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的抖音 - 抖音

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 16:22:04

Emu3.5多模态模型:视觉叙事与文本渲染技术解析

1. 项目概述:Emu3.5的多模态革命去年我在处理一个跨模态内容生成项目时,第一次接触到Emu系列模型。当时团队需要同时处理图像描述生成和图文匹配任务,传统单模态模型的表现总差强人意。直到测试了Emu3.5的早期版本,其视觉叙事能力…

作者头像 李华
网站建设 2026/5/1 16:19:55

别再搞混了!信号分析仪和矢量信号源的数据格式(中频 vs. IQ)实战避坑指南

信号分析仪与矢量信号源数据格式实战指南:中频与IQ的工程师避坑手册 在射频测试实验室里,最令人沮丧的莫过于花费数小时采集的宝贵信号数据,在矢量信号源上回放时却变成了一堆无法识别的频谱噪声。这种场景对于从事卫星通信系统调试的张工来说…

作者头像 李华
网站建设 2026/5/1 16:18:14

避坑指南:单片机串口收发中文乱码?用这份GB2312/UTF-8转换代码搞定

单片机串口通信中文乱码全解析:从编码原理到实战解决方案 调试物联网设备时,最让人抓狂的莫过于串口监视器里那一堆毫无意义的乱码字符。上周深夜,当我调试一个智能农业传感器节点时,明明发送的是"土壤湿度异常"&#x…

作者头像 李华
网站建设 2026/5/1 16:18:03

Android NDK Vulkan开发避坑指南:从环境配置到Shader编译的5个实战问题

Android NDK Vulkan开发实战:5个高频问题深度解析与解决方案 当你在Android NDK Vulkan开发中迈过入门阶段后,真正的挑战才刚刚开始。那些官方文档里轻描淡写的问题,往往在实际项目中成为拦路虎。本文将聚焦五个最具代表性的实战难题&#x…

作者头像 李华