目标检测YOLO[03]:推理入门

1.理解训练和推理

学习AI 模型是需要理解"训练"和推理的,它们不仅是人工智能(尤其是机器学习和深度学习)中最基础、最核心的两个概念,更是贯穿整个AI系统生命周期的骨架性知识

1.1生活类比理解

你把AI想象成一个小孩子,你在教它识别水果:

  • 训练阶段:你拿出很多苹果和香蕉的照片,每张都告诉他:"这是苹果""这是香蕉"。孩子反复看、反复记,慢慢总结出规律------红红圆圆的是苹果,黄黄弯弯的是香蕉。
  • 推理阶段 :有一天你给他一张新照片(他从没见过),问他:"这是什么?"他根据之前学到的经验,自信地说:"是苹果!"------这就是他在"推理"。

核心区别

训练 = 学习知识 (需要老师、大量例子)
推理 = 运用知识(独立判断新问题)

1.2机器视角理解

AI 模型其实是一个数学函数,比如:

python 复制代码
output = f(input; θ)

其中 θ(theta)代表模型内部的参数(比如神经网络中的权重)。

  • 训练的目标 :找到一组最好的 θ,让这个函数在已知数据上预测得尽可能准。
    • 方法:不断试错 → 算误差 → 调整 θ → 再试......直到误差最小。
  • 推理的过程 :把训练好的 θ 固定下来,输入新数据,直接算出结果。
    • 不再调整 θ,只做一次计算。

1.3技术流程理解

  • 🔧 训练(Training)详细流程:
    • 准备数据:收集并标注大量样本(如 100 万张带标签的图片)
    • 定义模型结构:选择神经网络类型(CNN、Transformer 等)。
    • 前向传播:输入数据 → 模型计算 → 得到预测值。
    • 计算损失:用损失函数(如交叉熵)衡量预测与真实标签的差距。
    • 反向传播:利用链式法则计算每个参数对损失的"责任"(梯度)。
    • 参数更新:用优化器(如 Adam)按梯度方向微调参数 θ。
    • 重复迭代:遍历整个数据集多次(称为"epoch"),直到模型收敛。

💡 这个过程通常在 GPU 集群上跑几天甚至几周。

  • 🚀 推理(Inference)详细流程:
    • 加载训练好的模型:包含固定的参数 θ。
    • 输入新数据:比如用户上传的一张照片。
    • 前向计算:数据流经模型各层,输出预测结果(如"猫,置信度 92%")。

⏱️ 推理通常只需几十毫秒,可在手机、服务器甚至智能摄像头中实时运行。
一句话:训练是"创造智能"的过程,推理是"释放智能"的时刻。
没有高质量的训练,推理就是无源之水;没有高效的推理,训练成果就无法落地应用。二者相辅相成,共同构成 AI 系统的核心生命周期。

2.使用代码进行推理(或者预测)

这里使用VSCode IDE 工具,因为前面环境部署的时候,YOLOv8 的源码在 Ubuntu机器上。所以给VSCode 安装 Remote插件,使用插件打开 YOLOv8 源码代码项目:

在根目录下创建一个文件: mypredict.py

python 复制代码
from ultralytics import YOLO

model = YOLO('yolov8n.pt') # 我想用yolov8n.pt模型进行预测

model.predict(
    # 我要预测 ultralytics/assets 文件夹下所有的图片,就是你要预测的目标
    source="ultralytics/assets",
    # 下面两个参数是对预测提一些额外的要求
    save=True, # 保存预测结果
    show=True, # 是否立刻显示结果
)

项目根目录下并没有这个文件 yolov8n.pt , 脚本运行后会自动下载这个文件到根目录

打开终端,切换虚拟环境,然后执行这个脚本:

shell 复制代码
conda activate yolov8 # 这个环境上个章节已经建好了
cd ~/yolo/ultralytics-8.3.229

输出:

  • 因为本地没有模型文件,所以它到 geithub上去下载了
  • ultralytics/assets目录下有两个图片文件,就是我们要预测的文件

从运行的结果看,图1预测(或者叫识别,或者叫推理),图片大小事 648*480有4个人,1辆车,一个标有 stop 的标志,耗时 17.1 毫秒

图二:284*640,两个人,1个领带,耗时 17.4毫秒

可以尝试自己找一些图片或者视频或者摄像头进行预测。只需要将 source参数更改一下,可以是一个文件夹,可以是一个单个文件。

如果是摄像头,将值改为 0 即可。但是使用摄像头的话,不会释放内存,到了一个极限,程序会终止释放内存。最后我会用一个脚本来解决这个问题。

3.预测目标

官方文档中给出了所有可预测的目标:https://docs.ultralytics.com/modes/predict/#inference-sources

4.模型

上面代码中,使用的的是 yolov8n.pt这个模型,对模型的初步认识:

  1. 模型的任务类型。

yolo支持5中类型: 目标检测(yolo11n.pt),旋转目标检测(yolo11n.pt),姿态估计(yolo11n-pose.pt),实例分割(yolo11n-seg.pt),图像分类(yolo11n-cls.pt)

可以使用代码来检测你加载的模型的任务类型:

python 复制代码
from ultralytics import YOLO

model = YOLO('yolov8n.pt') 
print(model.task) # 输出 detect
  1. 模型可预测的类型: yolo11n模型可以预测80中类型的目标.

你可以打开摄像头,然后将物品放入摄像头实现内,它就会预测出来是啥。也可以使用代码来输出可以预测的类型

python 复制代码
from ultralytics import YOLO

model = YOLO('yolov8n.pt') 
print(model.names) # 输出  {0: "person", 1:"bicycle", 2:"car" ...}
  1. 模型的大小

yolo11n.pt 中的n是 nano很小的意思

yolo11s.pt 中的n是 small

yolo11m.pt 中的n是 medium

yolo11l.pt 中的n是 large

yolo11x.pt 中的n是 extra-large 超大

到这里 https://github.com/ultralytics/assets/releases 可以下载各种尺寸的模型,这里是官方提供的模型仓库:

将他们下载到源码目录,加载后可以使用代码来输出它的参数:

python 复制代码
from ultralytics import YOLO

model = YOLO('yolov8n.pt') 
# 参数会很多
print(sum(p.numel() for p in model.parameters()))

参数越多,推理越准确,同时耗费的推理和训练的时间就越长。

下图中看到 v8 和 v11 支持所有5中类型

版本 Detect(目标检测) OBB(旋转目标检测) Segment(实例分割) Pose(姿态估计) Classify(图像分类)
YOLOv5 yolov5n.pt yolov5s.pt yolov5m.pt yolov5l.pt yolov5x.pt ❌ 不支持 ❌ 不支持 ❌ 不支持 ❌ 不支持
YOLOv8 yolov8n.pt yolov8s.pt yolov8m.pt yolov8l.pt yolov8x.pt yolov8n-obb.pt yolov8s-obb.pt yolov8m-obb.pt yolov8l-obb.pt yolov8x-obb.pt yolov8n-seg.pt yolov8s-seg.pt yolov8m-seg.pt yolov8l-seg.pt yolov8x-seg.pt yolov8n-pose.pt yolov8s-pose.pt yolov8m-pose.pt yolov8l-pose.pt yolov8x-pose.pt yolov8n-cls.pt yolov8s-cls.pt yolov8m-cls.pt yolov8l-cls.pt yolov8x-cls.pt
YOLOv9 yolov9t.pt yolov9s.pt yolov9m.pt yolov9c.pt yolov9e.pt ❌ 不支持(无公开 OBB 版本) yolov9c-seg.pt yolov9e-seg.pt ❌ 不支持 ❌ 不支持
YOLOv10 yolov10n.pt yolov10s.pt yolov10m.pt yolov10l.pt yolov10x.pt ❌ 不支持 y❌ 不支持 ❌ 不支持 ❌ 不支持
YOLOv11 yolov11n.pt yolov11s.pt yolov11m.pt yolov11l.pt yolov11x.pt yolov11n-obb.pt yolov11s-obb.pt yolov11m-obb.pt yolov11l-obb.pt yolov11x-obb.pt yolov11n-seg.pt yolov11s-seg.pt yolov11m-seg.pt yolov11l-seg.pt yolov11x-seg.pt yolov11n-pose.pt yolov11s-pose.pt yolov11m-pose.pt yolov11l-pose.pt yolov11x-pose.pt yolov11n-cls.pt yolov11s-cls.pt yolov11m-cls.pt yolov11l-cls.pt yolov11x-cls.pt
YOLOv12 yolov12n.pt yolov12s.pt yolov12m.pt yolov12l.pt yolov12x.pt ❌ 不支持 ❌ 不支持 ❌ 不支持 ❌ 不支持

5.预测选项

前面代码进行预测的时候:

python 复制代码
from ultralytics import YOLO

model = YOLO('yolov8n.pt') # 我想用yolov8n.pt模型进行预测

model.predict(
    # 我要预测 ultralytics/assets 文件夹下所有的图片,就是你要预测的目标
    source="ultralytics/assets",
    # 下面两个参数是对预测提一些额外的要求
    save=True, # 保存预测结果
    show=True, # 是否立刻显示结果
)

predict中还有很多选项,官方文档可以查阅:

https://docs.ultralytics.com/modes/predict/#inference-arguments

6.解决摄像头内存问题

python 复制代码
from ultralytics import YOLO

model = YOLO('yolov8n.pt') # 

model.predict(
    # 我要预测 ultralytics/assets 文件夹下所有的图片,就是你要预测的目标
    source=0,
    stream=True,
)
for result in results:
    plotted = result.plot()
    cv2.imshow('yolo inference', plotted)
    if cv2.waitKey(1) == ord('q'):
        break
相关推荐
让学习成为一种生活方式3 小时前
ANNEVO v2.1安装与使用--生信工具61
人工智能
_张一凡3 小时前
【AIGC面试面经第六期】AI视频-训练与微调技相关问答
人工智能·面试·aigc
智算菩萨4 小时前
《从弱人工智能到强人工智能:概念、边界与技术谱系全解析》
人工智能
极客BIM工作室4 小时前
多模态大模型Flamingo:视觉与文本交错输入?如何训练和推理?
人工智能·机器学习
热心网友俣先生4 小时前
2025年APMCM亚太数学建模C题AI+人工精翻版本+数据收集方式介绍+数据分享
c语言·人工智能·数学建模
轻微的风格艾丝凡4 小时前
光伏 MPPT 算法介绍
人工智能·算法·光伏
UMI赋能企业4 小时前
智能决策引擎助力科技企业转型升级
大数据·人工智能
腾讯云开发者4 小时前
当 AI 成为生产力底座,如何打通产业落地“最后一公里”?
人工智能
程序员与背包客_CoderZ4 小时前
C/C++版LLM推理框架Llama.cpp——入门与编码实战
c语言·开发语言·网络·c++·人工智能·语言模型·llama