七项视觉任务
将输出行映射到分类、检测、实例分割、语义分割、深度估计、姿态或 OBB,并选择用于起步的 YOLO26 权重。
选择任务是训练前代价最高的决定。明明用框就够了,却选择分割,标注成本就会成倍增加;无人机拍摄船只,却选择直立框,每个框里大部分就会是海水。Ultralytics YOLO 通过同一个 API 支持七项任务,因此选择的关键在于你需要什么输出,而不是使用什么工具。
实践操作
七项任务一览#

根据输出列阅读表格——你的规格说明中的输出行必须与之匹配。
| 任务 | 输出 | 回答的问题 | YOLO26 权重 |
|---|---|---|---|
| 分类 | 每张图像对应一个标签,并附带概率 | “这张图像是什么?” | yolo26n-cls.pt |
| 检测 | 每个对象对应类别、框和置信度 | “什么东西在哪里?” | yolo26n.pt |
| 实例分割 | 每个对象的类别和像素掩码 | “每个对象的精确形状是什么?” | yolo26n-seg.pt |
| 语义分割 | 为每个像素指定一个类别 | “每个像素属于哪种区域?” | yolo26n-sem.pt |
| 深度估计 | 每个像素的距离(米) | “每个像素距离有多远?” | yolo26n-depth.pt |
| 姿态估计 | 为每个人或对象提供边界框和关键点 | “身体处于什么姿态?” | yolo26n-pose.pt |
| 有向边界框 | 每个对象对应一个旋转边界框 | “什么东西在哪里,角度是多少?” | yolo26n-obb.pt |
有两组概念容易混淆。实例分割与语义分割:实例分割会分开每个对象(三辆车、三个掩码);语义分割只按类别标记像素(一个“汽车”区域,不区分数量)。检测与 OBB:两者都会为每个对象返回一个边界框,但 OBB 会随对象旋转;当俯视图像中的对象呈倾斜角度时,这一点很重要。
一个 API,七种输出#
切换任务不意味着要更换工具。返回什么取决于权重文件,而 Results 对象会填充对应的属性:
from ultralytics import YOLO
image = "https://ultralytics.com/images/bus.jpg"
outputs = ["probs", "boxes", "masks", "semantic_mask", "depth", "keypoints", "obb"]
for suffix in ["-cls", "", "-seg", "-sem", "-depth", "-pose", "-obb"]:
weights = f"yolo26n{suffix}.pt"
model = YOLO(weights)
result = model(image, verbose=False)[0]
filled = [name for name in outputs if getattr(result, name) is not None]
print(f"{weights:18} task={model.task:9} -> {', '.join(filled)}")yolo26n-cls.pt task=classify -> probs
yolo26n.pt task=detect -> boxes
yolo26n-seg.pt task=segment -> boxes, masks
yolo26n-sem.pt task=semantic -> semantic_mask
yolo26n-depth.pt task=depth -> depth
yolo26n-pose.pt task=pose -> boxes, keypoints
yolo26n-obb.pt task=obb -> obb看右侧列:分割和姿态任务也会返回边界框,因为它们是在检测基础上增加了其他输出。语义分割和深度估计完全不返回逐对象输出,而是描述每个像素。下游代码只会读取其中一个属性,因此你的规格说明中的输出项应该写明该属性。
实际选择时#
先确定一次预测必须描述什么,然后选能满足决策要求、成本最低的任务:
- 为整张图像指定一个标签 → 分类。
- 为每个像素指定一个类别,不必区分对象 → 语义分割。
- 为每个像素估计距离 → 深度估计。
- 描述每个对象的某些信息:
- 对象在哪里,以便计数、定位或筛选 → 检测(添加跟踪,即可跨帧保持对象身份);
- 对象的精确形状、边界或面积 → 实例分割;
- 对象的姿态 → 姿态估计;
- 俯视图像中对象的旋转角度 → OBB。
如果两种任务都适用,就选标注和运行成本更低的那个。对大多数产品来说,检测是默认选择:边界框绘制和审核都很快;再加上跟踪,就能实现计数、区域告警和交通分析,例如下面的高速公路画面:

深度:回答“有多远”的任务#
深度估计会返回一张与图像尺寸相同的深度图,每个像素对应一个以米为单位的距离——不包含类别或边界框。当距离会影响决策时,就可以使用深度估计:例如机器人避开障碍物、车辆在物体靠近时减速,或粗略估算一堆物料的体积。
from ultralytics import YOLO
model = YOLO("yolo26n-depth.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
depth = result.depth.data # meters, one value per pixel
print(f"depth map {tuple(depth.shape)}, nearest {float(depth.min()):.1f} m, farthest {float(depth.max()):.1f} m")depth map (1080, 810), nearest 2.0 m, farthest 14.9 m单目摄像头会根据透视、物体尺寸等学到的线索推断深度,因此在将其用于安全关键距离测量之前,应先在自己的场景中评估误差。深度估计也适合与检测结合:先检测对象,再读取其边界框内的深度图。
常见问题#
| 常见误选 | 症状 | 更好的选择 |
|---|---|---|
| 本可用边界框解决,却用了分割 | 下游代码从未读取掩码 | 检测 |
| 在俯视图像中使用直立边界框 | 边界框大部分覆盖背景,而且相邻对象会互相抑制 | OBB |
| 对多对象场景使用分类 | 标签取决于某个小对象 | 检测加规则 |
| 需要计数时使用语义分割 | 相接的对象合并成一个区域 | 实例分割 |
| 用边界框尺寸估算距离 | 对象尺寸变化时,规则就会失效 | 深度估计,或检测加深度估计 |
| 用姿态估计检查是否存在 | 你从未读取任何关键点 | 检测 |
输出越丰富,每个阶段的成本都越高:绘制掩码和关键点需要更长时间,审核也更耗时,还需要更严格的标注规则。从能满足决策规则的最简单任务开始,只有在实际使用方需要更多细节时才升级。
显示解答
对于叉车规格说明,答案是使用 yolo26n.pt 进行检测,并从 result.boxes 读取结果。
决策要求需要知道叉车和人员在哪里,这样代码才能判断它们之间的距离。边界框可以提供这些信息。实例分割会增加标注成本,却不会改变告警结果,因为边界框的底边已经能表示对象在地面上的位置。决策不涉及姿态,因此不需要姿态估计。深度估计可以帮助将图像位置转换为米,但经过标定的固定摄像头无需深度估计也能映射地面平面。只有在摄像头朝向正下方,且叉车呈明显斜角时,才值得测试 OBB。