YOLOv9 分割实战:从边界框到像素级掩码的完整指南
2026/9/18 19:05:21 网站建设 项目流程

YOLOv9 分割实战:从边界框到像素级掩码的完整指南

【免费下载链接】yolov9Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information项目地址: https://gitcode.com/GitHub_Trending/yo/yolov9

只跑检测的 YOLOv9 每个物体只给你一个矩形框。但质检、医疗影像这类场景,你要的是物体精确的轮廓。YOLOv9 内置的实例分割与全景分割能在一次前向推理里给出像素级掩码,本文带你跑通全流程,并讲清楚哪些参数值得调、哪些坑要避开。

先分清:两种分割各输出什么

一句话结论:实例分割告诉你"每个物体长什么样",全景分割告诉你"每个像素属于什么"。

你喂进去拿到的东西什么时候用
一张普通照片 + 实例分割权重每个物体的边界框 + 独立轮廓掩码 + 类别数得清的物体:零件计数、缺陷勾边、目标抠图
一张普通照片 + 全景分割权重实例掩码 + 逐像素语义图(含背景、天空等不可数区域)需要完整画面理解:自动驾驶、室内场景建模

实例分割的预测入口在 segment/predict.py,全景分割在 panoptic/predict.py。两者共用同一套推理骨架,区别只在模型最后的"头"。

一条命令跑通实例分割

先跑通,再理解。三步:

第一步,装依赖。核心就是 torch、opencv-python、numpy:

pip install -r requirements.txt

第二步,备权重。把仓库提供的实例分割权重(如gelan-c-seg.pt)放到项目根目录。

第三步,跑预测。用仓库自带的马匹测试图:

python segment/predict.py --weights gelan-c-seg.pt --source data/images/horses.jpg

跑完打开runs/predict-seg/exp/,就能看到结果:

图里每匹马都有独立框、置信度和轮廓掩码,重叠区域也彼此分开。想批量处理整个目录,把--source换成目录路径即可;加--save-txt还会把每个实例的多边形坐标写成 txt,方便后续做矢量处理。

掩码黑盒拆解:矩形框怎么变成轮廓

先给结论:YOLOv9 的分割不是"每个框现画一个轮廓",而是"一套底稿 + 一份配方"。

整条数据流分四层:

  1. 骨干网(backbone):图像经卷积不断下采样,产出 P3/P4/P5 三个尺度的特征图,分别负责小、中、大目标。
  2. 多尺度融合头(head):特征先自顶向下上采样、再自底向下降采样,小目标的大特征图和小特征图互相补充。
  3. 掩码头:输出两样东西——proto(32 个低分辨率"底稿"掩码)和每个检测框对应的"系数向量"。最终某物体的掩码 = 它的系数与所有底稿做线性组合,再放大到原图尺寸。这就是为什么几十个物体也能只花固定计算量。
  4. 后处理:NMS 去重、掩码上采样、与原图对齐,最后由 Annotator 画出来。

结构蓝图就是 YAML 文件。实例分割的配置 models/segment/yolov9-c-dseg.yaml 最后一行是DualDSegment头;全景分割的 models/panoptic/gelan-c-pan.yaml 用的是Panoptic头,额外多一个 UConv 语义分支——它逐像素分类"可数物体 + 不可数背景(stuff)",这就是全景分割比实例分割多出来的那块能力。

下图从左到右依次是原图、检测+实例分割、语义分割、全景分割,四种输出摆在一起,差别一目了然:

全景分割的预测命令与实例分割只差两处:

python panoptic/predict.py --weights gelan-c-pan.pt --source data/images/

4 个最影响效果的旋钮

默认值都能跑,但效果好不好看这四个参数:

参数默认调高会怎样调低会怎样
--conf-thres0.25误检变少,但边缘物体开始漏检召回变高,画面里冒出低置信度杂框
--iou-thres0.45重叠的相邻物体更不容易被 NMS 误删紧挨着的同类物体容易被当成重复框删掉
--imgsz640小目标更清晰、掩码更细,但推理变慢速度快,密集小目标容易糊成一团
--retina-masks关闭掩码放大到原图分辨率再绘制,边缘更贴合掩码按低分辨率直出,大图上边缘偏硬

一次典型的"要精度"组合:

python segment/predict.py --weights gelan-c-seg.pt --source data/images/horses.jpg \ --conf-thres 0.5 --imgsz 1280 --retina-masks

注意--iou-thres与目标密度相关:马群这种重叠场景,0.45 默认值合适;如果物体排布很散,可以适当调低。

新手高频 3 个坑

坑 1:权重和脚本对不上,报"文件不存在"或输出格式错。两个脚本的默认权重名分别是yolo-seg.ptyolo-pan.pt,而仓库提供的预训练权重叫gelan-c-seg.ptgelan-c-pan.pt。不显式传--weights就会找不到文件。反过来也一样:检测权重没有掩码输出,拿它跑分割脚本会得到空结果。

坑 2:掩码边缘发虚、有锯齿。默认掩码来自 32 通道低分辨率底稿的上采样,输入分辨率越高,相对损失越小。两个解法:开--retina-masks,或把--imgsz提到 1280。掩码的合成逻辑在 utils/segment/general.py 的process_mask,想深入看可以打开它。

坑 3:结果找不到。输出默认落在runs/predict-seg/exp/,每跑一次目录名自动加 1(expexp2…)。批量重复实验想复用同一目录,加--exist-ok;想换保存位置,用--project

继续往深处走

  • 想改网络结构:models/segment/ 下的 YAML 就是全部蓝图,加层、改通道都在这做
  • 想懂训练与损失:utils/segment/ 里有分割损失、TAL 标签分配和评估指标

现在就动手

先跑一遍马匹图确认环境没问题,然后换成你自己的业务图片。如果发现某类物体频繁漏检,从--imgsz--conf-thres两个旋钮开始排查——大多数"模型不行"的表象,其实是参数没配对。

【免费下载链接】yolov9Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information项目地址: https://gitcode.com/GitHub_Trending/yo/yolov9

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询