YOLOV8预测参数详解

YOLOV8预测参数详解

慕落 181 2024-01-17

image-20240117140252248

示例代码

Ultralytics YOLO 模型在进行推理时返回一个 Python Results 对象列表,或者当传入 stream=True 时,返回一个内存高效的 Python Results 对象生成器:

from ultralytics import YOLO
​
# 加载模型
model = YOLO('yolov8n.pt')  # 预训练的 YOLOv8n 模型
​
# 在图片列表上运行批量推理
results = model(['im1.jpg', 'im2.jpg'])  # 返回 Results 对象列表
​
# 处理结果列表
for result in results:
    boxes = result.boxes  # 边界框输出的 Boxes 对象
    masks = result.masks  # 分割掩码输出的 Masks 对象
    keypoints = result.keypoints  # 姿态输出的 Keypoints 对象
    probs = result.probs  # 分类输出的 Probs 对象

推理来源

YOLOv8 可以处理推理输入的不同类型,如下表所示。来源包括静态图像、视频流和各种数据格式。表格还表示了每种来源是否可以在流式模式下使用,使用参数 stream=True ✅。流式模式对于处理视频或实时流非常有利,因为它创建了结果的生成器,而不是将所有帧加载到内存。

使用 stream=True 处理长视频或大型数据集来高效地管理内存。当 stream=False 时,所有帧或数据点的结果都将存储在内存中,这可能很快导致内存不足错误。相对地,stream=True 使用生成器,只保留当前帧或数据点的结果在内存中,显著减少了内存消耗,防止内存不足问题。

来源

参数

类型

备注

图像

'image.jpg'

strPath

单个图像文件。

URL

'https://ultralytics.com/images/bus.jpg'

str

图像的 URL 地址。

截屏

'screen'

str

截取屏幕图像。

PIL

Image.open('im.jpg')

PIL.Image

RGB 通道的 HWC 格式图像。

OpenCV

cv2.imread('im.jpg')

np.ndarray

BGR 通道的 HWC 格式图像 uint8 (0-255)

numpy

np.zeros((640,1280,3))

np.ndarray

BGR 通道的 HWC 格式图像 uint8 (0-255)

torch

torch.zeros(16,3,320,640)

torch.Tensor

RGB 通道的 BCHW 格式图像 float32 (0.0-1.0)

CSV

'sources.csv'

strPath

包含图像、视频或目录路径的 CSV 文件。

视频 ✅

'video.mp4'

strPath

如 MP4, AVI 等格式的视频文件。

目录 ✅

'path/'

strPath

包含图像或视频文件的目录路径。

通配符 ✅

'path/*.jpg'

str

匹配多个文件的通配符模式。使用 * 字符作为通配符。

YouTube ✅

'https://youtu.be/LNwODJXcvt4'

str

YouTube 视频的 URL 地址。

流媒体 ✅

'rtsp://example.com/media.mp4'

str

RTSP, RTMP, TCP 或 IP 地址等流协议的 URL 地址。

多流媒体 ✅

'list.streams'

strPath

一个流 URL 每行的 *.streams 文本文件,例如 8 个流将以 8 的批处理大小运行。

推理参数

名称

类型

默认值

描述

source

str

'ultralytics/assets'

图像或视频的源目录

conf

float

0.25

检测对象的置信度阈值

iou

float

0.7

用于NMS的交并比(IoU)阈值

imgsz

int or tuple

640

图像大小,可以是标量或(h, w)列表,例如(640, 480)

half

bool

False

使用半精度(FP16)

device

None or str

None

运行设备,例如 cuda device=0/1/2/3 或 device=cpu

show

bool

False

如果可能,显示结果

save

bool

False

保存带有结果的图像

save_txt

bool

False

将结果保存为.txt文件

save_conf

bool

False

保存带有置信度分数的结果

save_crop

bool

False

保存带有结果的裁剪图像

show_labels

bool

True

隐藏标签

show_conf

bool

True

隐藏置信度分数

max_det

int

300

每张图像的最大检测数量

vid_stride

bool

False

视频帧速率跳跃

stream_buffer

bool

False

缓冲所有流媒体帧(True)或返回最新帧(False)

line_width

None or int

None

边框线宽度。如果为None,则按图像大小缩放。

visualize

bool

False

可视化模型特征

augment

bool

False

应用图像增强到预测源

agnostic_nms

bool

False

类别不敏感的NMS

retina_masks

bool

False

使用高分辨率分割掩码

classes

None or list

None

按类别过滤结果,例如 classes=0,或 classes=[0,2,3]

boxes

bool

True

在分割预测中显示框

下面是每个参数的解释:

  • source:输入源的目录,可以是图像或视频文件。

  • conf:目标检测的对象置信度阈值。只有置信度高于此阈值的对象才会被检测出来。默认值为0.25

  • iou:非极大值抑制(NMS)的交并比(IoU)阈值。用于在重叠较大的候选框中选择最佳的检测结果。默认值为0.7

  • half:是否使用半精度(FP16)进行推理。半精度可以减少计算量,但可能会牺牲一些精度。默认值为False

  • device:模型运行的设备,可以是cuda设备(cuda device=0/1/2/3)或CPU(device=cpu)。

  • show:是否显示检测结果。如果设置为True,则会在屏幕上显示检测到的对象。默认值为False

  • save:是否保存带有检测结果的图像。如果设置为True,则会将检测结果保存为图像文件。默认值为False

  • save_txt:是否将检测结果保存为文本文件(.txt)。默认值为False

  • save_conf:是否将检测结果与置信度分数一起保存。默认值为False

  • save_crop:是否保存裁剪后的带有检测结果的图像。默认值为False

  • hide_labels:是否隐藏标签。如果设置为True,则在显示检测结果时不显示对象标签。默认值为False

  • hide_conf:是否隐藏置信度分数。如果设置为True,则在显示检测结果时不显示置信度分数。默认值为False

  • max_det:每张图像的最大检测数。如果检测到的对象数超过此值,将保留置信度高低来保留。默认值为300

  • vid_stride:视频帧率步长。默认值为False,表示使用默认的帧率。

  • line_width:边界框的线宽。如果设置为None,则根据图像大小进行自动缩放。默认值为None

  • visualize:是否可视化模型特征。默认值为False

  • augment:是否对预测源应用图像增强。默认值为False

  • agnostic_nms:是否使用类别无关的NMS。默认值为False

  • retina_masks:是否使用高分辨率的分割掩膜。默认值为False

  • classes:按类别过滤结果。可以指定单个类别(例如class=0)或多个类别(例如class=[0,2,3])。默认值为None,表示不进行类别过滤。

  • boxes:在分割预测中显示边界框。默认值为True

使用Results对象

Results对象包含以下组件:

Results.boxes:用于操作边界框的属性和方法的对象

Results.masks:用于索引掩膜或获取分段坐标的对象

Results.probs:包含类别概率或逻辑值的张量(tensor)

Results.orig_img:加载在内存中的原始图像

Results.path:包含输入图像的路径

result对象默认是torch.Tensor对象,也可以转为其他对象

results = results.cuda()
results = results.cpu()
results = results.to('cpu')
results = results.numpy()
Boxes

Boxes对象可用于索引、操作边界框,并将其转换为不同的格式。Box格式转换结果是缓存的,这意味着每个对象只计算一次,并且这些值将在将来的调用中重复使用。

results = model(img)
boxes = results[0].boxes
box = boxes[0]  # returns one box
box.xyxy

Boxes 的属性有

boxes.xyxy  #  xyxy 形式的目标框, (N, 4)
boxes.xywh  # xywh 形式的目标框, (N, 4)
boxes.xyxyn  # xyxy 形式的目标框且归一化, (N, 4)
boxes.xywhn  #  xywh 形式的目标框且归一化, (N, 4)
boxes.conf  # 置信度的分数, (N, 1)
boxes.cls  # 类别, (N, 1)
boxes.data  # 原始目标框参数坐标 (x, y, w, h)、置信度以及类别, (N, 6) or boxes.boxes
Masks

Masks可以被索引、操作修改、将Masks转换为分割结果。也可以缓存段转换操作。

results = model(inputs)
masks = results[0].masks  # Masks object
masks.xy  # x, y segments (pixels), List[segment] * N
masks.xyn  # x, y segments (normalized), List[segment] * N
masks.data  # raw masks tensor, (N, H, W) or masks.masks 
Probs 置信度

包含了所有类别的置信度

results = model(inputs)
results[0].probs  # cls prob, (num_class, )

更多文档可以参考 https://docs.ultralytics.com/reference/yolo/engine/results/

绘制结果

YOLOV8提供了plot函数绘制结果,可以绘制边框,分割结果,分类结果类别等等。不在需要像YOLOV5那样直接写后处理nms等,很方便。

from PIL import Image
from ultralytics import YOLO
​
# 加载预训练的YOLOv8n模型
model = YOLO('yolov8n.pt')
​
# 在'bus.jpg'上运行推理
results = model('bus.jpg')  # 结果列表
​
# 展示结果
for r in results:
    im_array = r.plot()  # 绘制包含预测结果的BGR numpy数组
    im = Image.fromarray(im_array[..., ::-1])  # RGB PIL图像
    im.show()  # 显示图像
    im.save('results.jpg')  # 保存图像

plot()方法支持以下参数:

参数

类型

描述

默认值

conf

bool

是否绘制检测置信度分数。

True

line_width

float

边框线宽度。如果为None,则按图像大小缩放。

None

font_size

float

文本字体大小。如果为None,则按图像大小缩放。

None

font

str

文本字体。

'Arial.ttf'

pil

bool

是否将图像返回为PIL图像。

False

img

numpy.ndarray

绘制到另一个图像上。如果没有,则绘制到原始图像上。

None

im_gpu

torch.Tensor

形状为(1, 3, 640, 640)的规范化GPU图像,用于更快地绘制掩码。

None

kpt_radius

int

绘制关键点的半径。默认为5。

5

kpt_line

bool

是否绘制连接关键点的线条。

True

labels

bool

是否绘制边框标签。

True

boxes

bool

是否绘制边框。

True

masks

bool

是否绘制掩码。

True

probs

bool

是否绘制分类概率

True

线程安全推理

在多线程中并行运行多个YOLO模型时,确保推理过程的线程安全性至关重要。线程安全的推理保证了每个线程的预测结果是隔离的,不会相互干扰,避免竞态条件,确保输出的一致性和可靠性。

在多线程应用中使用YOLO模型时,重要的是为每个线程实例化单独的模型对象,或使用线程本地存储来防止冲突:

!!! Example "线程安全推理"

#在每个线程内实例化单个模型以实现线程安全的推理:
from ultralytics import YOLO
from threading import Thread
​
def thread_safe_predict(image_path):
    # 在线程内实例化新模型
    local_model = YOLO("yolov8n.pt")
    results = local_model.predict(image_path)
    # 处理结果
​
# 启动拥有各自模型实例的线程
Thread(target=thread_safe_predict, args=("image1.jpg",)).start()
Thread(target=thread_safe_predict, args=("image2.jpg",)).start()

有关YOLO模型线程安全推理的深入讨论和逐步指导,请参阅我们的YOLO线程安全推理指南。该指南将为您提供避免常见陷阱并确保多线程推理顺利进行所需的所有必要信息。

流媒体源for循环

以下是使用OpenCV(cv2)和YOLOv8在视频帧上运行推理的Python脚本。此脚本假设您已经安装了必要的包(opencv-pythonultralytics)。

import cv2
from ultralytics import YOLO

# 加载YOLOv8模型
model = YOLO('yolov8n.pt')

# 打开视频文件
video_path = "path/to/your/video/file.mp4"
cap = cv2.VideoCapture(video_path)

# 遍历视频帧
while cap.isOpened():
    # 从视频中读取一帧
    success, frame = cap.read()

    if success:
        # 在该帧上运行YOLOv8推理
        results = model(frame)

        # 在帧上可视化结果
        annotated_frame = results[0].plot()

        # 显示带注释的帧
        cv2.imshow("YOLOv8推理", annotated_frame)

        # 如果按下'q'则中断循环
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # 如果视频结束则中断循环
        break

# 释放视频捕获对象并关闭显示窗口
cap.release()
cv2.destroyAllWindows()

此脚本将对视频的每一帧进行预测,可视化结果,并在窗口中显示。按下'q'键可以退出循环。