YOLO12 使用入门
- 1. 源码下载
- 2. 权重下载
- 3. 环境配置
- 4. 例程测试
- 4.1. 目标检测
- 4.1.1. 源文件 model
- 4.1.2. 结果Results
- 4.1.3. 边界框 Boxes
- 2.2. 图像分割
- 4.2.1. 推理 model.predict
- 4.2.2. 掩码 Masks
1. 源码下载
之前介绍了《目标检测 YOLOv5 使用入门》
现在是 2024.12.20 目前已经出到了 YOLO11,提升还是明显的
这里整理了含例程的仓库(基于 ultralytics-v8.3.51
)
git clone https://gitee.com/JoveH-H/ultralytics-yolo11.git
官方源码放在 Github 上,这里用 Gitee 的同步仓库,国内快一点
git clone https://gitee.com/JoveH-H/ultralytics.git
2. 权重下载
当然也可以去 官方 和其他地方下载
含例程的仓库 ultralytics-yolo11
已经包含了说需要的 最小模型 yolo11n
,
重在了解如何使用,实际效果自己应用再琢磨,就以n模型举例就行了
3. 环境配置
官方建议python3.8以上,因为有些语法旧版本不支持
以python3.7为例,需要对 :=
修改成先赋值再用于判断
还有就是在Python 3.8及以上版本中,importlib.metadata
是标准库的一部分
但在Python 3.7及以下版本中,它并不存在,需要通过 importlib_metadata
这个第三方包来支持
最后屏蔽每次提示版本过低就行了,烦
4. 例程测试
4.1. 目标检测
在自定义训练目标检测任务前,先让程序正常跑起来,新建个测试例程 test_det.py
from ultralytics import YOLO# 加载模型
model = YOLO("weights/det/yolo11n.pt")# 模型推理
results = model("ultralytics/assets/zidane.jpg")# 结果可视化
for i in range(len(results)):# 打印边框result_lists = results[i].boxes.data.tolist()for j in range(len(result_lists)):x1, y1 = round(result_lists[j][0]), round(result_lists[j][1])x2, y2 = round(result_lists[j][2]), round(result_lists[j][3])conf = round(result_lists[j][4], 2)cls = int(result_lists[j][5])print('Img{} det{}: {} conf:{} box:({}, {}) ({}, {})'.format(i+1, j+1, results[i].names[cls], conf, x1, y1, x2, y2))# 展示结果results[i].show()
利用 ultralytics/assets/zidane.jpg
的图片,推理检测,打印边框和展示结果
Img1 det1: person conf:0.84 box:(748, 42) (1148, 711)
Img1 det2: person conf:0.78 box:(149, 203) (1125, 715)
Img1 det3: tie conf:0.45 box:(361, 438) (525, 717)
结果和其他参数的更多说明参考 官方说明
4.1.1. 源文件 model
资料来源 | 示例 | 类型 | 说明 |
---|---|---|---|
图像 | ‘image.jpg’ | str 或 Path | 单个图像文件。 |
网址 | ‘https://ultralytics.com/images/bus.jpg’ | str | 图片的 URL。 |
截图 | ‘screen’ | str | 截图 |
PIL | Image.open(‘image.jpg’) | PIL.Image | 具有 RGB 通道的 HWC 格式。 |
OpenCV | cv2.imread(‘image.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’ | str 或 Path | 包含图像、视频或目录路径的 CSV 文件。 |
视频 | ‘video.mp4’ | str 或 Path | MP4 和 AVI 等格式的视频文件 |
目录 | ‘path/’ | str 或 Path | 包含图像或视频的目录路径。 |
球体 | ‘path/*.jpg’ | str | 全局模式来匹配多个文件。使用 * 字符作为通配符。 |
YouTube | ‘https://youtu.be/LNwODJXcvt4’ | str | YouTube 视频的 URL。 |
流 | ‘rtsp://example.com/media.mp4’ | str | 流媒体协议(如 RTSP、RTMP、TCP)的 URL 或 IP 地址。 |
多流 | ‘list.streams’ | str 或 Path | *.streams 文本文件,每行一个流 URL,即 8 个流将以 8 的批处理大小运行。 |
网络摄像头 | 0 | int | 要进行推理的已连接摄像机设备的索引。 |
4.1.2. 结果Results
Results 对象具有以下属性
属性 | 类型 | 说明 |
---|---|---|
orig_img | numpy.ndarray | 原始图像的 numpy 数组。 |
orig_shape | tuple | 原始图像的形状,格式为(高、宽)。 |
boxes | Boxes, optional | 包含检测边界框的方框对象。 |
masks | Masks, optional | 包含检测掩码的掩码对象。 |
probs | Probs, optional | Probs 对象,包含分类任务中每个类别的概率。 |
keypoints | Keypoints, optional | 关键点对象,包含每个对象的检测关键点。 |
obb | OBB, optional | 包含定向包围盒的 OBB 对象。 |
speed | dict | 每幅图像的预处理、推理和后处理速度字典,单位为毫秒。 |
names | dict | 类名字典。 |
path | str | 图像文件的路径。 |
Results 对象有以下方法:
方法 | 返回类型 | 说明 |
---|---|---|
update() | None | 更新结果对象的方框、掩码和 probs 属性。 |
cpu() | Results | 在CPU 内存中返回包含所有张量的 Results 对象副本。 |
numpy() | Results | 返回结果对象的副本,其中所有张量均为 numpy 数组。 |
cuda() | Results | 在GPU 内存中返回包含所有张量的 Results 对象副本。 |
to() | Results | 返回带有指定设备和 dtype 上张量的 Results 对象副本。 |
new() | Results | 返回一个具有相同图像、路径和名称的新结果对象。 |
plot() | numpy.ndarray | 绘制检测结果。返回注释图像的 numpy 数组。 |
show() | None | 在屏幕上显示带注释的结果。 |
save() | None | 将注释结果保存到文件中。 |
verbose() | str | 返回每个任务的日志字符串。 |
save_txt() | None | 将预测结果保存到 txt 文件中。 |
save_crop() | None | 将裁剪后的预测保存到 save_dir/cls/file_name.jpg. |
summary() | List[Dict] | 词典列表,每个词典都包含结果的摘要信息 |
to_df() | DataFrame | 将结果转换为 Pandas 数据帧。 |
to_csv() | str | 将结果转换为 CSV(逗号分隔值)格式。 |
to_xml() | str | 将结果转换为 XML(可扩展标记语言)格式。 |
to_json() | str | 将结果转换为 JSON 格式。 |
to_sql() | None | 将结果转入 SQL 数据库。 |
4.1.3. 边界框 Boxes
Boxes 对象可用于索引、操作和将边界框转换为不同格式
名称 | 类型 | 说明 |
---|---|---|
cpu() | 方法 | 将对象移至CPU 内存。 |
numpy() | 方法 | 将对象转换为 numpy 数组。 |
cuda() | 方法 | 将对象移至CUDA 内存。 |
to() | 方法 | 将对象移动到指定设备。 |
xyxy | 财产 (torch.Tensor) | 以 xyxy 格式返回方框。 |
conf | 财产 (torch.Tensor) | 返回方框的置信度值。 |
cls | 财产 (torch.Tensor) | 返回方框的类值。 |
id | 财产 (torch.Tensor) | 返回盒子的轨道 ID(如果有)。 |
xywh | 财产 (torch.Tensor) | 以 xywh 格式返回方框。 |
xyxyn | 财产 (torch.Tensor) | 以 xyxy 格式返回按原始图像大小归一化的方框。 |
xywhn | 财产 (torch.Tensor) | 以 xywh 格式返回按原始图像大小归一化的方框。 |
2.2. 图像分割
在自定义训练图像分割任务前,先让程序正常跑起来,新建个测试例程 test_seg.py
from ultralytics import YOLO
import numpy as np
import cv2# 加载模型
model = YOLO("weights/seg/yolo11n-seg.pt")# 模型预测
results = model.predict(source='ultralytics/assets/',imgsz=640,project='resources/predict/seg/examples',name='exp',save=True,conf=0.3,iou=0.7)# 打印边框
for i in range(len(results)):print()# 目标检测boxes_lists = results[i].boxes.data.tolist()# 图像分割masks_lists = results[i].masks.data.tolist()for j in range(len(boxes_lists)):# 打印边框x1, y1 = round(boxes_lists[j][0]), round(boxes_lists[j][1])x2, y2 = round(boxes_lists[j][2]), round(boxes_lists[j][3])conf = round(boxes_lists[j][4], 2)cls = int(boxes_lists[j][5])print('Img{} det{}: {} conf:{} box:({}, {}) ({}, {})'.format(i+1, j+1, results[i].names[cls], conf, x1, y1, x2, y2))# 显示分类img = results[i].plot()height, width, channel = img.shapemask_array = np.array(masks_lists[j], dtype=np.uint8)mask_array = cv2.resize(mask_array, (width, height), interpolation=cv2.INTER_AREA)image = cv2.add(img, np.zeros(np.shape(img), dtype=np.uint8), mask=mask_array)cv2.imshow('1', image)cv2.waitKey(0)
预测资源里的两个图片,结果保留在 resources/predict/seg/examples
,
然后打印目标检测的边框,显示每个目标的图像分割
4.2.1. 推理 model.predict
推理参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
source | str | ‘ultralytics/assets’ | 指定推理的数据源。可以是图像路径、视频文件、目录、URL 或用于实时馈送的设备 ID。支持多种格式和来源,可灵活应用于不同类型的输入。 |
conf | float | 0.25 | 设置检测的最小置信度阈值。如果检测到的对象置信度低于此阈值,则将不予考虑。调整该值有助于减少误报。 |
iou | float | 0.7 | 非最大抑制 (NMS) 的交叉重叠(IoU) 阈值。较低的数值可以消除重叠的方框,从而减少检测次数,这对减少重复检测非常有用。 |
imgsz | int 或 tuple | 640 | 定义用于推理的图像大小。可以是一个整数 640 或一个(高度、宽度)元组。适当调整大小可以提高检测效率 精确度 和处理速度。 |
half | bool | False | 启用半精度(FP16)推理,可加快支持的 GPU 上的模型推理速度,同时将对精度的影响降至最低。 |
device | str | None | 指定用于推理的设备(例如:…)、 cpu, cuda:0 或 0).允许用户选择CPU 、特定GPU 或其他计算设备执行模型。 |
batch | int | 1 | 指定推理的批量大小(仅当来源为 目录、视频文件或 .txt 文件).更大的批次规模可以提供更高的吞吐量,缩短推理所需的总时间。 |
max_det | int | 300 | 每幅图像允许的最大检测次数。限制模型在单次推理中可以检测到的物体总数,防止在密集场景中产生过多的输出。 |
vid_stride | int | 1 | 视频输入的帧间距。允许跳过视频中的帧,以加快处理速度,但会牺牲时间分辨率。数值为 1 时会处理每一帧,数值越大越跳帧。 |
stream_buffer | bool | False | 决定是否对接收到的视频流帧进行排队。如果 False,旧帧会被丢弃,以容纳新帧(针对实时应用进行了优化)。如果为 “真”,则在缓冲区中排队等待新帧,确保不会跳过任何帧,但如果推理的 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 | 指定从中提取特征向量或嵌入的层。这对聚类或相似性搜索等下游任务非常有用。 |
project | str | None | 保存预测结果的项目目录名称,如果 save 已启用。 |
name | str | None | 预测运行的名称。用于在项目文件夹内创建一个子目录,在下列情况下存储预测输出结果 save 已启用。 |
4.2.2. 掩码 Masks
Masks 对象可用于索引、操作和将掩码转换为线段
名称 | 类型 | 说明 |
---|---|---|
cpu() | 方法 | 返回CPU 内存中的掩码tensor 。 |
numpy() | 方法 | 以 numpy 数组形式返回掩码tensor 。 |
cuda() | 方法 | 返回GPU 内存中的掩码tensor 。 |
to() | 方法 | 返回具有指定设备和 dtype 的掩码tensor 。 |
xyn | 财产 (torch.Tensor) | 以张量表示的标准化片段列表。 |
xy | 财产 (torch.Tensor) | 以张量表示的像素坐标线段列表。 |
谢谢