Ultralytics YOLO27: 加入候补名单。
Get Started
计算机视觉基础·选择任务·课程 2/10
课程初级

七项视觉任务

将输出行映射到分类、检测、实例分割、语义分割、深度估计、姿态或 OBB,并选择用于起步的 YOLO26 权重。

选择任务是训练前代价最高的决定。明明用框就够了,却选择分割,标注成本就会成倍增加;无人机拍摄船只,却选择直立框,每个框里大部分就会是海水。Ultralytics YOLO 通过同一个 API 支持七项任务,因此选择的关键在于你需要什么输出,而不是使用什么工具。

学习成果

确定与你的输出行相匹配的一项任务和一个 YOLO26 权重文件,并用一句话说明为何无需选择下一个成本更高的任务。

快速通道
如果你已经熟悉相关内容,以下是简要版。
  1. 整张图像对应一个标签:分类。

  2. 识别是什么以及在哪里,且矩形框足够:检测。

  3. 每个对象都需要精确轮廓:实例分割。为每个像素分配类别:语义分割。

  4. 为每个像素估算距离:深度估计。

  5. 关节或关键点:姿态。从上方观察角度倾斜的物体:OBB。

  6. 七项任务都使用相同的 YOLO() API;只需更换权重文件。

实践操作

七项任务一览#

Ultralytics YOLO 七项任务的输出:分类后的叶片、检测到的汽车和行人、分割后的汽车、语义街道地图、跑步者的姿态骨架、船只的旋转框以及深度图

根据输出列阅读表格——你的规格说明中的输出行必须与之匹配。

任务输出回答的问题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

看右侧列:分割和姿态任务也会返回边界框,因为它们是在检测基础上增加了其他输出。语义分割和深度估计完全不返回逐对象输出,而是描述每个像素。下游代码只会读取其中一个属性,因此你的规格说明中的输出项应该写明该属性。

实际选择时#

先确定一次预测必须描述什么,然后选能满足决策要求、成本最低的任务:

  1. 为整张图像指定一个标签 → 分类。
  2. 为每个像素指定一个类别,不必区分对象 → 语义分割。
  3. 为每个像素估计距离 → 深度估计。
  4. 描述每个对象的某些信息:
    • 对象在哪里,以便计数、定位或筛选 → 检测(添加跟踪,即可跨帧保持对象身份);
    • 对象的精确形状、边界或面积 → 实例分割;
    • 对象的姿态 → 姿态估计;
    • 俯视图像中对象的旋转角度 → OBB。

如果两种任务都适用,就选标注和运行成本更低的那个。对大多数产品来说,检测是默认选择:边界框绘制和审核都很快;再加上跟踪,就能实现计数、区域告警和交通分析,例如下面的高速公路画面:

Ultralytics YOLO 跟踪的高速公路交通画面,每辆汽车、公交车和卡车都带有持续 ID 和运动轨迹

深度:回答“有多远”的任务#

深度估计会返回一张与图像尺寸相同的深度图,每个像素对应一个以米为单位的距离——不包含类别或边界框。当距离会影响决策时,就可以使用深度估计:例如机器人避开障碍物、车辆在物体靠近时减速,或粗略估算一堆物料的体积。

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
对多对象场景使用分类标签取决于某个小对象检测加规则
需要计数时使用语义分割相接的对象合并成一个区域实例分割
用边界框尺寸估算距离对象尺寸变化时,规则就会失效深度估计,或检测加深度估计
用姿态估计检查是否存在你从未读取任何关键点检测
别为用不到的输出买单

输出越丰富,每个阶段的成本都越高:绘制掩码和关键点需要更长时间,审核也更耗时,还需要更严格的标注规则。从能满足决策规则的最简单任务开始,只有在实际使用方需要更多细节时才升级。

试试看

拿出第 1 课规格说明中的输出项,对照上面的选择步骤逐项判断。写下任务、你准备使用的 YOLO26 权重文件、代码将读取的 Results 属性,以及一句说明为什么不需要下一个成本更高的任务。还没有项目?就用叉车规格说明。

完成条件
满足以下所有条件,即表示你已完成本课程。
  • 你已经确定了一个任务、对应的 YOLO26 权重文件,以及代码会读取的 Results 属性。

  • 你已经写下一句话,说明为什么不需要下一个成本更高的任务。

  • 你能说明项目是否需要实例分割、语义分割、深度估计,或者都不需要,并解释原因。

显示解答

对于叉车规格说明,答案是使用 yolo26n.pt 进行检测,并从 result.boxes 读取结果。

决策要求需要知道叉车和人员在哪里,这样代码才能判断它们之间的距离。边界框可以提供这些信息。实例分割会增加标注成本,却不会改变告警结果,因为边界框的底边已经能表示对象在地面上的位置。决策不涉及姿态,因此不需要姿态估计。深度估计可以帮助将图像位置转换为米,但经过标定的固定摄像头无需深度估计也能映射地面平面。只有在摄像头朝向正下方,且叉车呈明显斜角时,才值得测试 OBB。

接下来做什么

接下来,我们更深入地了解检测——这项主力任务也是大多数产品的起点。

登录以保存学习进度