前言

在使用 YOLO 模型做目标检测的时候,调整推理参数算是一个核心技巧了。这就像是给模型做“微调”,让它能更好地适应各种不同的任务需求,比如是在服务器上跑还是在乎实时速度。

这些参数提供了很大的灵活性,让使用者能够对检测过程的各个环节进行精细控制。无论是想追求更快的速度、更高的准确度,还是想节省计算资源,都能通过调整这些参数来找到一个合适的平衡点。说白了,熟悉这些参数是把 YOLO 从“能用”变成“好用”的关键一步。

常见的推理参数

为了让大家能快速上手,下面这个表格整理了一些最常用、也最实用的推理参数。当然,如果想要查看最完整、最官方的参数列表,随时可以去查阅官方文档,那里有最全面的介绍。

参数 类型 默认值 描述
source str 'ultralytics/assets' 指定推理的数据源。可以是图像路径、视频文件、目录、URL 或实时馈送的设备 ID。 支持多种格式和来源,从而可以在不同类型的输入上灵活应用。
conf float 0.25 设置检测的最小置信度阈值。 将忽略置信度低于此阈值的检测到的对象。 调整此值有助于减少误报。
iou float 0.7 用于非极大值抑制 (NMS) 的 Intersection Over Union (IoU) 阈值。较低的值会通过消除重叠的框来减少检测结果,这对于减少重复项很有用。
imgsz inttuple 640 定义推理的图像大小。可以是一个整数 640 表示正方形调整大小,也可以是 (height, width) 元组。适当的大小调整可以提高检测 准确性 和处理速度。
rect bool True 如果启用,则对图像较短的一边进行最小填充,直到可以被步长整除,以提高推理速度。如果禁用,则在推理期间将图像填充为正方形。
half bool False 启用半精度 (FP16) 推理,这可以加快在支持的 GPU 上的模型推理速度,同时对准确性的影响极小。
device str None 指定用于推理的设备(例如, cpu, cuda:00)。允许用户在 CPU、特定 GPU 或其他计算设备之间进行选择,以执行模型。
batch int 1 指定推理的批处理大小(仅在源为以下情况时有效: 目录、视频文件或 .txt 文件)。更大的批处理大小可以提供更高的吞吐量,从而缩短推理所需的总时间。
max_det int 300 每张图像允许的最大检测数量。限制模型在单次推理中可以检测到的对象总数,防止在密集场景中产生过多的输出。
vid_stride int 1 视频输入的帧步长。允许跳过视频中的帧,以加快处理速度,但会降低时间分辨率。值为 1 时处理每一帧,值越高跳过的帧越多。
stream_buffer bool False 确定是否为视频流排队传入帧。如果 False,旧帧会被丢弃以适应新帧(针对实时应用进行了优化)。如果 True,在缓冲区中对新帧进行排队,确保不跳过任何帧,但如果推理 FPS 低于流 FPS,则会导致延迟。
visualize bool False 激活推理期间模型特征的可视化,从而深入了解模型正在“看到”的内容。这对于调试和模型解释非常有用。
augment bool False 启用测试时增强 (TTA) 进行预测,可能会提高检测的鲁棒性,但会降低推理速度。
agnostic_nms bool False 启用与类别无关的非极大值抑制 (NMS),它会合并不同类别的重叠框。在类别重叠很常见的多类别检测场景中非常有用。
classes list[int] None 将预测结果筛选到一组类别 ID。只会返回属于指定类别的检测结果。这对于专注于多类别检测任务中的相关对象非常有用。
retina_masks bool False 返回高分辨率分割掩码。返回的掩码(masks.data)如果启用,将与原始图像大小匹配。如果禁用,它们将具有推理期间使用的图像大小。
embed list[int] None 指定从中提取特征向量或 embeddings 的层。对于诸如聚类或相似性搜索之类的下游任务非常有用。
project str None 如果 save 已启用,则为保存预测输出的项目目录的名称。
name str None 预测运行的名称。用于在项目文件夹中创建一个子目录,如果 save 已启用,则为保存预测输出的项目目录的名称。
stream bool False 通过返回 Results 对象的生成器而不是一次将所有帧加载到内存中,从而为长视频或大量图像启用内存高效处理。
verbose bool True 控制是否在终端中显示详细的推理日志,从而提供有关预测过程的实时反馈。
compile boolstr False 启用 PyTorch 2.x torch.compile 使用以下方式进行图形编译 backend='inductor'。接受 True"default", False → 禁用,或字符串模式,例如 "default", "reduce-overhead", "max-autotune-no-cudagraphs"。如果不支持,则会发出警告并回退到 Eager 模式。

示例:调整标注线条宽度

在目标检测任务中,YOLO模型会在输出图像上绘制边界框来标示检测到的物体。这些边界框的线条宽度其实是可以根据实际需求进行调整的。默认的线条宽度通常为1像素,但在某些情况下,比如需要在演示或报告中更清晰地展示检测结果时,可能需要更粗的线条来增强视觉效果。

通过设置line_width参数,开发者可以轻松控制边界框的线条粗细。这个参数接受一个整数值,单位为像素。数值越大,线条就越粗;数值越小,线条就越细。值得注意的是,在不同的应用场景下,合适的线条宽度可能会有所不同。例如,在处理高分辨率图像时,可能需要较粗的线条才能让边界框清晰可见;而在处理密集的小目标时,过粗的线条反而可能会遮挡重要细节。

下面是一个具体的代码示例,展示了如何将边界框线条宽度设置为8像素:

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

在这个示例中,我们将line_width参数设置为8,这会使输出的边界框线条明显加粗。运行这段代码后,可以看到保存的推理结果图像中的边界框线条比默认情况下要粗很多,如下图所示。这种调整对于制作演示材料或者在复杂背景中突出显示检测目标特别有用。

输入图片说明

实际应用中,建议根据输出图像的分辨率和具体使用场景来选择合适的线条宽度。对于大多数情况,3-5像素的线条宽度就能提供良好的可见性,同时又不会过于突兀。如果是在嵌入式设备或者移动端部署,考虑到计算资源和显示效果,可能需要使用较细的线条宽度来保持清晰的视觉效果。

示例:筛选特定类别

在实际的目标检测应用场景中,我们往往只需要关注某些特定类别的物体,而不希望被其他不相关的检测结果干扰。这时候,YOLO提供的classes参数就发挥了重要作用。这个参数就像一个智能过滤器,让开发者能够精确控制模型只输出感兴趣的物体类别。

以常见的应用场景为例:

  • 在安防监控中,可能只需要检测"人"这一类别
  • 在交通管理中,可能只关心"车辆"、“行人"和"交通标志”
  • 在工业质检中,可能只需要检测特定的缺陷类型

使用classes参数前,需要了解数据集中各个类别的ID编号。以常用的COCO数据集为例:

  • 0: person(人)
  • 1: bicycle(自行车)
  • 2: car(汽车)
  • …(其他类别以此类推)

下面是具体的代码实现,展示如何通过设置classes参数来筛选检测结果:

from ultralytics import YOLO
model = YOLO("yolo11n.pt") 
model.predict(
    source=r"ultralytics/assets/bus.jpg", 
    save=True,  
    show=False, 
    classes=[0],  # 只检测类别 ID 为 0 的物体
)

在这个示例中,通过将classes参数设置为[0],我们告诉模型只保留类别ID为0(即"人")的检测结果。运行代码后,可以观察到模型确实只标注出了图像中的人物,而忽略了公交车、交通标志等其他物体。

输入图片说明

这种类别筛选的功能带来了几个显著优势:

  1. 提升处理效率:减少不必要的检测计算,加快推理速度
  2. 简化结果分析:输出结果更加清晰聚焦,便于后续处理
  3. 降低误检干扰:避免其他类别误检对结果的影响
  4. 适应专业场景:针对特定应用需求定制检测范围

实际应用中,classes参数支持同时指定多个类别。比如在行人交通分析中,可以设置classes=[0, 1, 2]来同时检测人、自行车和汽车。这种灵活性使得YOLO模型能够更好地适应各种专业场景的特定需求。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐