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 的分割不是"每个框现画一个轮廓",而是"一套底稿 + 一份配方"。
整条数据流分四层:
- 骨干网(backbone):图像经卷积不断下采样,产出 P3/P4/P5 三个尺度的特征图,分别负责小、中、大目标。
- 多尺度融合头(head):特征先自顶向下上采样、再自底向下降采样,小目标的大特征图和小特征图互相补充。
- 掩码头:输出两样东西——
proto(32 个低分辨率"底稿"掩码)和每个检测框对应的"系数向量"。最终某物体的掩码 = 它的系数与所有底稿做线性组合,再放大到原图尺寸。这就是为什么几十个物体也能只花固定计算量。 - 后处理: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-thres | 0.25 | 误检变少,但边缘物体开始漏检 | 召回变高,画面里冒出低置信度杂框 |
--iou-thres | 0.45 | 重叠的相邻物体更不容易被 NMS 误删 | 紧挨着的同类物体容易被当成重复框删掉 |
--imgsz | 640 | 小目标更清晰、掩码更细,但推理变慢 | 速度快,密集小目标容易糊成一团 |
--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.pt和yolo-pan.pt,而仓库提供的预训练权重叫gelan-c-seg.pt、gelan-c-pan.pt。不显式传--weights就会找不到文件。反过来也一样:检测权重没有掩码输出,拿它跑分割脚本会得到空结果。
坑 2:掩码边缘发虚、有锯齿。默认掩码来自 32 通道低分辨率底稿的上采样,输入分辨率越高,相对损失越小。两个解法:开--retina-masks,或把--imgsz提到 1280。掩码的合成逻辑在 utils/segment/general.py 的process_mask,想深入看可以打开它。
坑 3:结果找不到。输出默认落在runs/predict-seg/exp/,每跑一次目录名自动加 1(exp、exp2…)。批量重复实验想复用同一目录,加--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),仅供参考