YOLO 实例分割与目标跟踪实战:基于 Ultralytics 的 `seg_bbox` 可视化指南

发布时间:2026/9/15 14:52:03
YOLO 实例分割与目标跟踪实战:基于 Ultralytics 的 `seg_bbox` 可视化指南
YOLO 实例分割与目标跟踪实战基于 Ultralytics 的seg_bbox可视化指南【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10导读本指南围绕 Ultralytics 官方文档「Instance Segmentation and Tracking」展开面向希望在视频流中同时获得像素级物体轮廓与跨帧身份追踪能力的开发者。通过阅读本文你将掌握基于 YOLO 分割模型如yolov8n-seg.pt调用model.predict与model.track的两种实战模式并深入理解Annotator.seg_bbox的底层绘图原理可直接将完整脚本复用于自己的检测与跟踪项目。什么是实例分割实例分割Instance Segmentation是计算机视觉中比目标检测更精细的一层任务它不仅要像普通检测器那样给出物体的边界框bounding box还要逐像素识别并勾勒出每个独立物体的轮廓从而提供对场景空间分布的细致理解。与语义分割Semantic Segmentation不同——语义分割将整幅图像按类别划分例如所有汽车归为一类实例分割则要求唯一标记并精确勾勒每一个个体。即使同一帧画面中存在多个同类物体每个物体也会被当作独立实例分别处理。正因如此实例分割在目标检测、医疗影像分析、自动驾驶感知、工业质检等需要逐个体区分的场景中至关重要。在 Ultralytics 工具包中基于 YOLO 分割模型进行实例分割跟踪官方提供了两种可视化模式按类别对象的实例分割Instance Segmentation with Class Objects为每个类别分配唯一颜色实现清晰的视觉区分。同一类别的所有实例共享同一种颜色。按对象轨迹的实例分割Instance Segmentation with Object Tracks为每一条**跟踪轨迹Track ID**分配独特颜色方便在多帧视频中一眼识别同一个物体的运动轨迹。两者的核心区别在于着色依据前者按是什么着色后者按是谁着色。以下两份完整脚本将分别演示这两种模式。环境准备两份脚本均依赖opencv-python代码中导入为cv2与当前仓库的ultralytics包。安装依赖后即可运行pip install ultralytics opencv-python脚本中的model YOLO(yolov8n-seg.pt)会在首次运行时自动下载分割权重。若希望用更大模型提升精度可将权重替换为yolov8s-seg.pt、yolov8m-seg.pt等本仓库的分割模型配置可在 ultralytics/cfg/models/v8/yolov8-seg.yaml 中查看当前仓库的 YOLOv10 系列配置位于 ultralytics/cfg/models/v10而官方文档中的分割演示默认采用 v8 分割系列权重。模式一纯实例分割按类别着色第一个脚本的目标是读取视频的每一帧 → 用分割模型推理 → 在原始帧上画出每个实例的轮廓与其类别标签 → 写回输出视频并实时显示。当检测到掩码masks不为空时脚本取出类别编号clss与掩码轮廓点集masks.xy逐实例调用annotator.seg_bbox完成绘制。import cv2 from ultralytics import YOLO from ultralytics.utils.plotting import Annotator, colors model YOLO(yolov8n-seg.pt) # segmentation model names model.model.names cap cv2.VideoCapture(path/to/video/file.mp4) w, h, fps (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS)) out cv2.VideoWriter(instance-segmentation.avi, cv2.VideoWriter_fourcc(*MJPG), fps, (w, h)) while True: ret, im0 cap.read() if not ret: print(Video frame is empty or video processing has been successfully completed.) break results model.predict(im0) annotator Annotator(im0, line_width2) if results[0].masks is not None: clss results[0].boxes.cls.cpu().tolist() masks results[0].masks.xy for mask, cls in zip(masks, clss): annotator.seg_bbox(maskmask, mask_colorcolors(int(cls), True), det_labelnames[int(cls)]) out.write(im0) cv2.imshow(instance-segmentation, im0) if cv2.waitKey(1) 0xFF ord(q): break out.release() cap.release() cv2.destroyAllWindows()要点拆解results[0].masks是 Ultralytics 的Masks对象定义于 ultralytics/engine/results.py其xy属性返回像素坐标下的分段轮廓点列表xyn则返回归一化坐标这正是seg_bbox所需的mask输入。colors(int(cls), True)通过类别编号取色。Colors类内置 20 色调色板源码见 ultralytics/utils/plotting.py取色时以编号 % 20循环复用bgrTrue参数返回 OpenCV 绘图所需的 BGR 通道顺序。Annotator负责在帧上叠加绘制line_width2控制轮廓线宽。输出视频使用MJPG编码写入instance-segmentation.avi按q键可提前退出循环。模式二实例分割 目标跟踪按轨迹着色第二个脚本在模式一的基础上引入了目标跟踪。核心差异在于推理调用由model.predict(im0)改为model.track(im0, persistTrue)为每个实例分配跨帧稳定的Track ID颜色依据从类别编号改为跟踪编号track_ids标签从类别名改为Track ID字符串额外维护track_history字典defaultdict(lambda: [])可用于后续扩展轨迹点记录。import cv2 from ultralytics import YOLO from ultralytics.utils.plotting import Annotator, colors from collections import defaultdict track_history defaultdict(lambda: []) model YOLO(yolov8n-seg.pt) # segmentation model cap cv2.VideoCapture(path/to/video/file.mp4) w, h, fps (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS)) out cv2.VideoWriter(instance-segmentation-object-tracking.avi, cv2.VideoWriter_fourcc(*MJPG), fps, (w, h)) while True: ret, im0 cap.read() if not ret: print(Video frame is empty or video processing has been successfully completed.) break annotator Annotator(im0, line_width2) results model.track(im0, persistTrue) if results[0].boxes.id is not None and results[0].masks is not None: masks results[0].masks.xy track_ids results[0].boxes.id.int().cpu().tolist() for mask, track_id in zip(masks, track_ids): annotator.seg_bbox(maskmask, mask_colorcolors(track_id, True), track_labelstr(track_id)) out.write(im0) cv2.imshow(instance-segmentation-object-tracking, im0) if cv2.waitKey(1) 0xFF ord(q): break out.release() cap.release() cv2.destroyAllWindows()要点拆解model.track是模型入口方法定义于 ultralytics/engine/model.py内部会调用跟踪器完成 ID 关联persistTrue表示跟踪状态在连续帧间保持是跨帧 ID 一致性的关键。results[0].boxes.id保存每个实例的跟踪 ID当boxes.id is not None且masks is not None时说明当前帧同时具备跟踪与分割结果才进行绘制。colors(track_id, True)让不同轨迹拥有不同颜色直观呈现每个物体的运动轨迹。由于按 Track ID 着色同一物体在不同帧中颜色保持稳定这正是按对象轨迹的实例分割模式的核心价值。seg_bbox参数详解两个脚本的核心绘图都落在Annotator.seg_bbox方法上其完整签名位于 ultralytics/utils/plotting.py参数名类型默认值说明maskarrayNone分割掩码坐标实例轮廓点集mask_colortuple(255, 0, 255)每个分割框的掩码颜色默认品红色det_labelstrNone分割对象的标签用于检测模式track_labelstrNone分割并跟踪对象的标签用于跟踪模式底层绘图原理结合源码ultralytics/utils/plotting.pyseg_bbox的实际绘制流程可概括为三步绘制轮廓通过cv2.polylines(self.im, [np.int32([mask])], isClosedTrue, colormask_color, thickness2)将掩码轮廓点连接成闭合多边形。这是实例分割可视化的本质动作——用多边形逼近物体边界。生成标签文本标签优先级为track_label优先fTrack ID: {track_label}若未提供track_label则回退到det_label。随后用cv2.getTextSize测量文本尺寸以确定背景框大小。绘制标签背景与文字在轮廓起始点附近绘制与mask_color同色的填充矩形作为标签背景再以白色文本cv2.putText叠加标签内容保证文字可读性。从源码可以看到Annotator类同时支持 PIL 与 OpenCV 两种绘图后端self.pil标志见 ultralytics/utils/plotting.py当图像为 PIL 格式或包含非 ASCII 文本时自动切换为 PIL 渲染seg_bbox本身则固定使用 OpenCV 的cv2绘图函数。两种模式的选型建议**按类别着色模式一**适合需要快速区分画面中有哪些类别的物体的场景例如交通监控中的行人/车辆/自行车统计颜色语义与类别一一对应画面整体简洁。**按轨迹着色模式二**适合需要持续追踪个体行为的场景例如顾客动线分析、动物行为研究、体育动作拆解等同一轨迹的恒定颜色让观察者能轻松跟随单个对象。两者共享同一套Masks.xy轮廓数据与seg_bbox绘制管线切换成本极低只需将循环体内的着色依据与标签字段替换即可。注意事项与常见问题masks为空当模型未检测到任何可分割实例时results[0].masks为None。脚本中通过if results[0].masks is not None保护绘制逻辑避免空指针错误。boxes.id为空跟踪模式下若跟踪器未成功关联例如视频起始帧boxes.id可能为None需与masks一起联合判断后再访问。视频读取结束cap.read()返回retFalse时表示读取完毕脚本会打印提示并跳出循环随后统一release()释放视频写入器与摄像头资源。颜色循环Colors调色板共 20 色见 ultralytics/utils/plotting.py当类别数或 Track ID 数超过 20 时颜色会循环复用但不同实例仍可通过标签文本区分。延伸阅读想系统了解分割任务的预测、训练与验证用法可阅读 docs/en/tasks/segment.md深入理解model.track的参数如persist、conf、iou、tracker等与跟踪器配置可参考 docs/en/modes/track.md 以及仓库中的跟踪器配置 ultralytics/cfg/trackersbotsort.yaml与bytetrack.yaml实例分割与跟踪的完整 API 说明见 docs/en/reference/engine/results.md 与 docs/en/reference/utils/plotting.md更多基于视觉解决方案的实用案例目标计数、速度估计、热力图等可在 docs/en/guides/index.md 中浏览。【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考