什么是推理

在计算机科学和人工智能领域,推理(Inference) 是一个核心概念,简单来说,它就是利用已有的数据或训练好的模型,来生成新信息或得出结论的过程。无论是简单的分类任务,还是复杂的决策系统,推理都是让机器学习和深度学习模型真正“发挥作用”的关键环节。

理解推理的过程

具体来说,推理就是当我们有了新的输入数据时,调用已经训练好的模型来给出预测结果的过程。在深度学习里,这个过程也常被称为前向传播(Forward Pass)——数据从模型的输入层开始,依次穿过中间的隐藏层,最后到达输出层,并得到最终的预测。

一个典型的推理流程通常包含下面几个步骤:

  1. 数据预处理
    首先,我们需要把原始输入数据(比如一张图片、一段语音)转换成模型能理解的格式。例如,对图像进行尺寸调整、归一化像素值等操作,确保输入和模型训练时的数据格式一致。

  2. 加载模型
    接下来,我们把预训练好的模型文件(包括它的结构和学到的权重参数)加载到内存中。这个模型已经在大规模数据上学到了识别特征和规律的“能力”。

  3. 执行前向传播
    这是推理的核心环节。我们把预处理好的数据送入模型,让它逐层计算,最终输出预测结果。比如,模型可能会告诉我们图片里有什么物体,或者一段语音对应的文字是什么。

  4. 对结果进行后处理
    模型直接输出的结果可能并不直观,我们还需要做一些处理,让它变得更容易理解和使用。例如在目标检测中,常用“非极大值抑制(NMS)”来去掉重复的检测框。

  5. 输出或保存结果
    最后,我们可以把最终结果展示给用户(比如在屏幕上显示),或者保存到文件里供后续使用。

举个简单的例子:假设你有一张图片,想知道里面有什么东西。你把它交给一个训练好的模型,模型经过一番计算后告诉你:“图里有一辆公交车和四个人。”——这个过程,就是一次完整的推理。

所以概括来说,推理就是使用训练好的模型进行预测。下面我们就通过一个实际的例子,来看看怎么用代码完成一次推理。

简单的推理脚本

下面让我们通过一个完整的示例,深入了解如何编写一个实用的推理脚本。这个脚本虽然代码量不多,但包含了推理流程的所有关键环节。

完整的推理脚本

from ultralytics import YOLO
model = YOLO("yolo11n.pt") 
model.predict(
    source=r"ultralytics/assets/bus.jpg", 
    save=True,  
    show=False, 
)

代码逐行解析

虽然这段代码很简洁,但每一行都承担着重要的功能:

第1行:导入库

from ultralytics import YOLO

这行代码导入了Ultralytics提供的YOLO类,这是我们进行目标检测的基础。YOLO(You Only Look Once)是目前最流行的实时目标检测算法之一。

第2行:加载模型

model = YOLO("yolo11n.pt")

这里创建了一个YOLO模型实例并加载了预训练的权重文件:

  • "yolo11n.pt" 指定了要使用的模型文件
  • 如果是第一次运行,程序会自动下载这个预训练模型
  • 模型文件中包含了网络结构和在大量数据上学到的参数

第4-8行:执行预测

model.predict(
    source=r"ultralytics/assets/bus.jpg", 
    save=True,  
    show=False, 
)

这是推理的核心部分,各参数的作用如下:

  • source:指定输入数据的来源,这里是一个图片文件路径
  • save=True:告诉程序将检测结果保存为新的图片文件
  • show=False:不在屏幕上实时显示检测结果,适合在服务器环境中使用

运行这个脚本

将上面这段代码保存为 01_easy_predict.py,然后在终端中运行:

python 01_easy_predict.py

理解输出结果

运行成功后,你会看到类似下面这样的输出信息:

image 1/1 /media/becase/common/yolo/Learning/01_predict/ultralytics/assets/bus.jpg: 640x480 4 persons, 1 bus, 70.6ms
Speed: 2.3ms preprocess, 70.6ms inference, 1.7ms postprocess per image at shape (1, 3, 640, 480)
Results saved to /media/becase/common/yolo/Learning/01_predict/runs/detect/predict

这些输出信息告诉我们:

  1. 检测结果:在bus.jpg中识别出了4个人和1辆公交车
  2. 性能分析
    • 预处理:2.3ms(调整图片尺寸、归一化等)
    • 推理:70.6ms(模型实际计算时间)
    • 后处理:1.7ms(处理输出结果、绘制边界框等)
  3. 结果位置:所有输出文件保存在指定的文件夹中

查看可视化结果

打开输出目录,你会看到类似这样的检测结果:

输入图片说明

在结果图片中,你可以看到:

  • 每个检测到的物体都用边界框标出
  • 框上方显示了物体类别和置信度
  • 不同类别的物体使用不同颜色的边界框

对了,这张公交车图片是不是很眼熟?它其实就是你在第一小节中运行 yolo detect predict 命令时,YOLO 默认用来测试的那张示例图片。

yolo detect predict

更多推荐