【YOLO 入门到精通 11】进阶任务实战:分割、姿态、OBB 与深度估计
标签 :
实例分割姿态估计OBB深度估计YOLO多任务难度 :⭐⭐⭐⭐ | 阅读时长 :约 75 分钟 | 系列 :第 11/12 集

写在前面
检测只是起点。医学影像要分割 ,健身房要姿态 ,卫星图要旋转框 ,AR 要深度------YOLO26 用统一框架覆盖 7 大任务。
本集带你逐个击破,每个任务都有「是什么 → 怎么训 → 怎么用」的完整路径。
本集学习目标
- 完成实例分割训练与推理
- 实现姿态估计与角度计算
- 处理旋转目标检测 (OBB)
- 了解分类、语义分割、深度估计
文章目录
- [【YOLO 入门到精通 11】进阶任务实战:分割、姿态、OBB 与深度估计](#【YOLO 入门到精通 11】进阶任务实战:分割、姿态、OBB 与深度估计)
-
- 写在前面
- 本集学习目标
- [11.1 进阶任务概览](#11.1 进阶任务概览)
- [11.2 实例分割 (Segmentation)](#11.2 实例分割 (Segmentation))
- [11.3 姿态估计 (Pose)](#11.3 姿态估计 (Pose))
-
- [17 个 COCO 关键点](#17 个 COCO 关键点)
- 训练与推理
- 角度计算(健身场景)
- [11.4 旋转目标检测 (OBB)](#11.4 旋转目标检测 (OBB))
- [11.5 图像分类 (Classification)](#11.5 图像分类 (Classification))
- [11.6 语义分割 (Semantic)](#11.6 语义分割 (Semantic))
- [11.7 深度估计 (Depth)](#11.7 深度估计 (Depth))
- [11.8 任务选择决策](#11.8 任务选择决策)
- [11.9 踩坑指南](#11.9 踩坑指南)
- [11.10 本集小结](#11.10 本集小结)
11.1 进阶任务概览
| 任务 | 后缀 | 输出 | 场景 |
|---|---|---|---|
| 检测 | 无 | 框+类 | 通用 |
| 实例分割 | -seg | 掩码 | 抠图/医学 |
| 姿态 | -pose | 17关键点 | 健身/安防 |
| OBB | -obb | 旋转框 | 航拍 |
| 分类 | -cls | 类别概率 | 质检 |
| 语义分割 | -sem | 像素类别图 | 场景理解 |
| 深度 | -depth | 深度图(米) | AR/机器人 |
11.2 实例分割 (Segmentation)
检测 vs 分割
| 检测 | 分割 | |
|---|---|---|
| 输出 | 矩形框 | 像素掩码 |
| 精度 | 粗略 | 像素级 |
| 模型 | yolo26n.pt | yolo26n-seg.pt |
训练
python
from ultralytics import YOLO
model = YOLO("yolo26n-seg.pt")
model.train(data="seg_dataset.yaml", epochs=100, imgsz=640, batch=8)
标签格式(多边形):class x1 y1 x2 y2 x3 y3 ...
推理
python
model = YOLO("yolo26n-seg.pt")
results = model("image.jpg")
for r in results:
if r.masks:
masks = r.masks.data # (N, H, W)
print(f"{len(masks)} 个实例")
r.save("segmented.jpg")
| 场景 | 推荐模型 |
|---|---|
| 医学影像 | yolo26m-seg |
| 电商抠图 | yolo26s-seg |
| 工业缺陷 | yolo26m-seg |
11.3 姿态估计 (Pose)
17 个 COCO 关键点
0鼻
/ \
1左眼 2右眼
3左耳 4右耳
5左肩-6右肩
/ \ / \
7左肘 8右肘
9左腕 10右腕
11左髋-12右髋
/ \ / \
13左膝 14右膝
15左踝 16右踝
训练与推理
python
model = YOLO("yolo26n-pose.pt")
model.train(data="coco-pose.yaml", epochs=100)
results = model("person.jpg")
角度计算(健身场景)
python
import numpy as np
def angle(p1, p2, p3):
v1, v2 = np.array(p1)-np.array(p2), np.array(p3)-np.array(p2)
cos = np.dot(v1,v2) / (np.linalg.norm(v1)*np.linalg.norm(v2)+1e-6)
return np.degrees(np.arccos(np.clip(cos, -1, 1)))
r = model("squat.jpg")[0]
if r.keypoints is not None:
kps = r.keypoints.xy[0].cpu().numpy()
knee_angle = angle(kps[11], kps[13], kps[15]) # 左膝
print(f"左膝角度: {knee_angle:.1f}°")
if knee_angle < 90:
print("深蹲到位!")
11.4 旋转目标检测 (OBB)
适用于目标有任意角度的情况(航拍、文档)。
python
model = YOLO("yolo26n-obb.pt")
model.train(data="dota.yaml", epochs=100, imgsz=1024)
results = model("aerial.jpg")
for r in results:
if r.obb:
for i in range(len(r.obb)):
xywhr = r.obb.xywhr[i].cpu().numpy()
x, y, w, h, angle = xywhr
cls_name = model.names[int(r.obb.cls[i])]
print(f"{cls_name}: 中心({x:.1f},{y:.1f}), 角度{np.degrees(angle):.1f}°")
标签:class x_center y_center width height angle(弧度)
11.5 图像分类 (Classification)
python
model = YOLO("yolo26n-cls.pt")
# 数据结构: dataset/train/cat/, dataset/train/dog/
model.train(data="classification_dataset", epochs=100, imgsz=224)
results = model("animal.jpg")
probs = results[0].probs
for i, (cid, conf) in enumerate(zip(probs.top5, probs.top5conf)):
print(f"{i+1}. {model.names[cid]}: {conf:.2%}")
11.6 语义分割 (Semantic)
与实例分割区别:不区分同类个体。
python
model = YOLO("yolo26n-sem.pt")
model.train(data="cityscapes.yaml", epochs=100)
results = model("street.jpg")
# 输出每像素类别图,适合场景理解
11.7 深度估计 (Depth)
从单张 RGB 图预测每像素距离(米)。
python
import cv2
import numpy as np
model = YOLO("yolo26n-depth.pt")
results = model("room.jpg")
for r in results:
if r.depth is not None:
depth = r.depth.data[0].cpu().numpy()
vis = cv2.applyColorMap(
((depth - depth.min()) / (depth.max() - depth.min() + 1e-6) * 255).astype(np.uint8),
cv2.COLORMAP_INFERNO
)
cv2.imwrite("depth.jpg", vis)
print(f"中心深度: {depth[depth.shape[0]//2, depth.shape[1]//2]:.2f}m")
| 应用 | 用途 |
|---|---|
| AR/VR | 虚拟物体放置 |
| 机器人 | 障碍物距离 |
| 3D重建 | 单目深度图 |
11.8 任务选择决策
#mermaid-svg-4Okq47ZFep2H1YXa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4Okq47ZFep2H1YXa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4Okq47ZFep2H1YXa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4Okq47ZFep2H1YXa .error-icon{fill:#552222;}#mermaid-svg-4Okq47ZFep2H1YXa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4Okq47ZFep2H1YXa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4Okq47ZFep2H1YXa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4Okq47ZFep2H1YXa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4Okq47ZFep2H1YXa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4Okq47ZFep2H1YXa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4Okq47ZFep2H1YXa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4Okq47ZFep2H1YXa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4Okq47ZFep2H1YXa .marker.cross{stroke:#333333;}#mermaid-svg-4Okq47ZFep2H1YXa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4Okq47ZFep2H1YXa p{margin:0;}#mermaid-svg-4Okq47ZFep2H1YXa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4Okq47ZFep2H1YXa .cluster-label text{fill:#333;}#mermaid-svg-4Okq47ZFep2H1YXa .cluster-label span{color:#333;}#mermaid-svg-4Okq47ZFep2H1YXa .cluster-label span p{background-color:transparent;}#mermaid-svg-4Okq47ZFep2H1YXa .label text,#mermaid-svg-4Okq47ZFep2H1YXa span{fill:#333;color:#333;}#mermaid-svg-4Okq47ZFep2H1YXa .node rect,#mermaid-svg-4Okq47ZFep2H1YXa .node circle,#mermaid-svg-4Okq47ZFep2H1YXa .node ellipse,#mermaid-svg-4Okq47ZFep2H1YXa .node polygon,#mermaid-svg-4Okq47ZFep2H1YXa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4Okq47ZFep2H1YXa .rough-node .label text,#mermaid-svg-4Okq47ZFep2H1YXa .node .label text,#mermaid-svg-4Okq47ZFep2H1YXa .image-shape .label,#mermaid-svg-4Okq47ZFep2H1YXa .icon-shape .label{text-anchor:middle;}#mermaid-svg-4Okq47ZFep2H1YXa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4Okq47ZFep2H1YXa .rough-node .label,#mermaid-svg-4Okq47ZFep2H1YXa .node .label,#mermaid-svg-4Okq47ZFep2H1YXa .image-shape .label,#mermaid-svg-4Okq47ZFep2H1YXa .icon-shape .label{text-align:center;}#mermaid-svg-4Okq47ZFep2H1YXa .node.clickable{cursor:pointer;}#mermaid-svg-4Okq47ZFep2H1YXa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4Okq47ZFep2H1YXa .arrowheadPath{fill:#333333;}#mermaid-svg-4Okq47ZFep2H1YXa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4Okq47ZFep2H1YXa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4Okq47ZFep2H1YXa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4Okq47ZFep2H1YXa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4Okq47ZFep2H1YXa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4Okq47ZFep2H1YXa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4Okq47ZFep2H1YXa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4Okq47ZFep2H1YXa .cluster text{fill:#333;}#mermaid-svg-4Okq47ZFep2H1YXa .cluster span{color:#333;}#mermaid-svg-4Okq47ZFep2H1YXa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4Okq47ZFep2H1YXa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4Okq47ZFep2H1YXa rect.text{fill:none;stroke-width:0;}#mermaid-svg-4Okq47ZFep2H1YXa .icon-shape,#mermaid-svg-4Okq47ZFep2H1YXa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4Okq47ZFep2H1YXa .icon-shape p,#mermaid-svg-4Okq47ZFep2H1YXa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4Okq47ZFep2H1YXa .icon-shape .label rect,#mermaid-svg-4Okq47ZFep2H1YXa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4Okq47ZFep2H1YXa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4Okq47ZFep2H1YXa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4Okq47ZFep2H1YXa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
是
否
是
否
需求
要位置?
Classification
要精确轮廓?
Segmentation
目标旋转?
OBB
Detection
人体动作?
Pose
距离信息?
Depth
多任务体验
python
image = "scene.jpg"
for task, name in [("yolo26n.pt","检测"), ("yolo26n-seg.pt","分割"), ("yolo26n-pose.pt","姿态")]:
r = YOLO(task)(image)[0]
r.save(f"result_{name}.jpg")
11.9 踩坑指南
| 坑 | 解决 |
|---|---|
| 分割显存不够 | 减 batch,用 n/s 模型 |
| 姿态只能检人 | -pose 模型针对人体 |
| OBB 需大 imgsz | 建议 1024+ |
| 分类数据目录错 | 必须 train/class_name/ 结构 |
| 深度值不准 | 单目深度为相对值,需场景校准 |
11.10 本集小结
| 需求 | 选 |
|---|---|
| 有什么在哪 | Detection |
| 精确轮廓 | -seg |
| 人体动作 | -pose |
| 航拍倾斜 | -obb |
| 整图分类 | -cls |
| 场景理解 | -sem |
| 3D/距离 | -depth |
| ← 第10集 | 第12集:生产实践 → |
|---|