2、YOLOv8基础认知:YOLOv8架构概览、模型家族(n/s/m/l/x)、预训练权重下载、使用官方模型进行图片与视频推理

好,咱们正式开始动手之前,得先把YOLOv8这个家伙摸透了。说实话,我见过不少同学上来就pip install,然后跑demo,结果换了自己的数据集就一脸懵。嗯,咱们不干那种事。先把地基打牢,后面你训练自己的模型时,心里才有底。

2.1 YOLOv8架构概览——它到底长什么样?

YOLOv8是Ultralytics公司在2023年初推出的目标检测框架。说白了,它就是一个“看一眼就能知道图片里有什么、在哪”的神经网络。我个人习惯把它的架构分成三块来看:

  • Backbone(骨干网络):负责提取图片特征。你可以把它想象成人的眼睛,先看轮廓,再看细节。YOLOv8用的是CSPDarknet结构,说白了就是一堆卷积层的堆叠,但做了很多优化,让计算更快。
  • Neck(颈部):负责融合不同尺度的特征。为什么要融合?因为大目标和小目标需要的特征不一样。YOLOv8用了FPN+PAN的结构,我刚开始看这个结构图时也觉得绕,但后来发现它其实就是“把不同层的特征图拼在一起用”。
  • Head(检测头):负责输出最终结果。YOLOv8最大的变化之一就是去掉了之前的Anchor-Based(锚框)机制,改成了Anchor-Free。什么意思?以前你得预设一堆框的大小,现在模型自己学会怎么框目标了。我在项目中遇到过,换了这个之后,小目标的召回率明显提升了。

核心变化:YOLOv8相比v5,最大的改动就是检测头从耦合变成了解耦,并且去掉了objectness分支。说白了,就是让分类和回归两个任务各干各的,互不干扰。效果嘛,我实测下来,mAP涨了大概2-3个点。

2.2 模型家族——n/s/m/l/x,我该选哪个?

YOLOv8提供了5个不同大小的版本,从轻到重分别是:nano、small、medium、large、xlarge。你想想看,这就像买车,有经济型的,也有豪华型的。关键看你兜里有多少“算力”。

模型版本 参数量 FLOPs(计算量) 速度(GPU) 适用场景
YOLOv8n 3.2M 8.7G 极快 移动端、嵌入式设备
YOLOv8s 11.2M 28.6G 边缘计算、实时检测
YOLOv8m 25.9M 78.9G 中等 服务器端、精度优先
YOLOv8l 43.7M 165.2G 较慢 高精度场景
YOLOv8x 68.2M 257.8G 极致精度、科研

我的建议:如果你刚开始做自定义数据集,先用YOLOv8s或YOLOv8m。为什么?nano虽然快,但精度有限,你调试时可能分不清是模型问题还是数据问题。x又太慢,迭代一次要等半天。我一般先用m跑通流程,最后再根据部署需求换版本。

2.3 预训练权重下载——别从零开始训练

这里有个非常重要的概念:迁移学习。说白了,就是别人已经在几百万张图片上训练好的模型,你拿来接着用。你想想看,如果让你从零开始学认猫和狗,你得看多少张图?但如果你已经会认各种物体了,再学猫和狗就快多了。

YOLOv8的预训练权重是在COCO数据集上训练的,包含了80个常见类别。下载方式很简单,就一行代码:

# 自动下载YOLOv8n的预训练权重
from ultralytics import YOLO
model = YOLO('yolov8n.pt')  # 如果本地没有,会自动下载

或者你也可以手动去GitHub的Release页面下载。我个人习惯用自动下载,省事。但要注意,网络不好的时候可能会卡住。我曾经在客户现场演示时,网络断了,权重下不下来,场面一度很尴尬。所以建议你提前下载好,存到项目目录里。

避坑指南:我曾经遇到过一个问题——下载的权重文件损坏了,但程序没报错,只是训练出来的模型效果奇差。后来我养成了习惯,下载后先校验一下文件大小。yolov8n.pt大概6.2MB,yolov8s.pt约22MB,如果差太多,重新下载。

2.4 使用官方模型进行图片与视频推理

好,现在咱们来点实际的。下载好权重后,怎么用?其实就三步:加载模型、传入数据、获取结果。

2.4.1 图片推理

先看代码,我直接给你一个完整的示例:

from ultralytics import YOLO

# 1. 加载模型
model = YOLO('yolov8n.pt')  # 你可以换成s/m/l/x

# 2. 对单张图片进行推理
results = model('bus.jpg')  # 传入图片路径

# 3. 查看结果
for result in results:
    boxes = result.boxes  # 检测框信息
    for box in boxes:
        print(f"类别: {result.names[int(box.cls)]}, 置信度: {box.conf:.2f}, 坐标: {box.xyxy}")
    
# 4. 保存结果图片
results[0].save('result.jpg')  # 会在原图上画框

嗯,这里要注意一点:results是一个列表,每个元素对应一张图片的结果。即使你只传了一张图,它也是列表形式。我第一次用的时候直接results.boxes,结果报错了,后来才发现要加索引。

2.4.2 视频推理

视频推理其实更简单,就是把视频流一帧一帧地传给模型。YOLOv8的API已经封装好了:

# 视频推理
results = model('traffic.mp4', stream=True)  # stream=True表示流式处理

# 逐帧处理
for result in results:
    # 每一帧的结果
    boxes = result.boxes
    # 你可以在这里做自定义处理,比如画框、统计数量等
    # 如果想实时显示,可以用OpenCV的imshow
    result.show()  # 显示当前帧

性能提示:视频推理时,一定要加上stream=True。如果不加,模型会等所有帧处理完才返回结果,视频一长内存就爆了。我刚开始没注意,处理一个10分钟的视频,直接内存溢出。加了stream之后,一帧一帧处理,稳得很。

2.4.3 调整推理参数

YOLOv8还提供了很多参数让你微调推理行为。我常用的几个:

  • conf=0.5:置信度阈值,低于这个值的检测结果会被过滤掉。默认0.25,我一般调到0.5,减少误检。
  • iou=0.5:NMS的IoU阈值,控制重叠框的保留。值越小,保留的框越少。
  • device='cuda':指定用GPU还是CPU。有GPU一定要用,速度差几十倍。
# 带参数的推理
results = model('bus.jpg', conf=0.5, iou=0.45, device='cuda')

你想想看,这些参数就像相机的光圈和快门,调好了才能拍出好照片。我一般会在验证集上先跑一遍,看看不同阈值下的效果,再确定最终参数。

小结

这一章咱们把YOLOv8的底子摸了一遍。从架构到模型选择,从下载权重到实际推理,每一步我都踩过坑,也把经验分享给你了。下一章,咱们就要开始准备自己的数据集了——这才是整个课程的重头戏。

记住一句话:模型是骨架,数据是血肉。没有好的数据,再牛的模型也白搭。