新闻详情

新闻详情

首页 / 资讯中心 / 详情

PaddleSeg PanopticSeg 全景分割标签编码协议全解:pan_id 生成、解码与源码级实践

发布时间:2026/9/25 7:21:26来源:尧图网络
PaddleSeg PanopticSeg 全景分割标签编码协议全解:pan_id 生成、解码与源码级实践
人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载本文围绕 PaddleSeg 仓库中 contrib/PanopticSeg 全景分割工具包所使用的标签编码协议展开。全景分割Panoptic Segmentation将语义分割semantic segmentation与实例分割instance segmentation统一到同一张标注图上每个像素不仅携带属于哪个类别的信息还携带属于该类别的第几个实例的信息。读懂这套pan_id编码协议是理解 PanopticSeg 数据预处理、模型后处理、可视化与 PQPanoptic Quality评测的前提。读完本文你将掌握pan_id的数学构成、thing/stuff/未知像素三类标签的编码规则、默认常量label_divisor的由来以及该协议在数据加载、后处理和评测链路中的真实调用方式。1. 协议总览一张图上每个像素的pan_id在 PanopticSeg 工具包中全景分割图无论是数据集提供的参考标签图还是模型推理输出的预测图的每个像素值都被称为pan_idpanoptic ID。协议规定假设共有c个类别最大实例个数为n则pan_id的取值范围为0到c * label_divisor n闭区间。也就是说pan_id不是简单的类别编号而是把类别维度与实例维度压缩进同一个整数。这一设计的核心收益是一张单通道整型图即可同时表达语义与实例信息无需为二者维护两张独立标签图同时任意一个pan_id都可以通过除法和取模运算唯一地还原出(cat_id, ins_id)二元组便于评测与可视化。2. 三种标签的编码规则2.1 thing 类别可数物体类对于 thing 类如人、车、动物等可以逐个计数的物体类别pan_id由类别 ID 与实例 ID 联合编码pan_id (cat_id 1) * label_divisor ins_id其中cat_id是类别 ID从0开始计数ins_id是实例 ID从1开始计数。注意两个细节类别部分带1偏移实例 ID 从1而不是0起步。这两点都是为了让编码结果严格避开未知标签的保留值0并让 stuff 类与 thing 类在数值空间上自然分层见下文。2.2 stuff 类不可数区域类对于 stuff 类如天空、地面、墙壁等背景区域不区分个体pan_id不再附加实例分量pan_id (cat_id 1) * label_divisor等价于ins_id 0的特例。stuff 像素的pan_id恰好落在其类别区间内的基准位置上即pan_id % label_divisor 0。这一性质被工具包直接利用来判定该标签是否属于 crowd / 未分实例区域见第 5 节的is_crowd。2.3 未知标签对于无法确定结果或未标注的像素pan_id统一取值为0。由于cat_id 1 1且 stuff 编码最小值为1 * label_divisor 10000在编码空间中是独立保留的不会与任何合法标签冲突。2.4 常量label_divisorlabel_divisor是一个预设常量用于在数值空间中划分类别段与实例段的宽度。协议规定其默认值为1000。以默认值为例cat_id 0的 thing 类第 1 个实例编码为1001cat_id 0的 stuff 类编码为1000而cat_id 1的 thing 类第 3 个实例编码为2003等等。可以直观理解为每个类别占用连续 1000 个 ID 号段其中(cat_id1)*1000为该类 stuff 基准其后的若干正整数为该类各实例。3. 源码中的编码与解码实现3.1encode.py协议的唯一权威实现协议的数学公式在 paddlepanseg/utils/encode.py 中被完整落地共 3 个函数_CAT_ID_OFFSET 1 def decode_pan_id(pan_id, label_divisor): return (pan_id // label_divisor) - _CAT_ID_OFFSET, pan_id % label_divisor def encode_pan_id(cat_id, label_divisor, ins_id0): return (cat_id _CAT_ID_OFFSET) * label_divisor ins_id def is_crowd(pan_id, label_divisor): return pan_id % label_divisor 0encode_pan_id(cat_id, label_divisor, ins_id0)与文档公式一一对应ins_id缺省为0即默认编码 stuff 标签decode_pan_id(pan_id, label_divisor)是编码的逆运算pan_id // label_divisor - 1得到cat_idpan_id % label_divisor得到ins_idstuff 时为0is_crowd(pan_id, label_divisor)利用ins_id 0的性质判定该 ID 是否属于未分实例的 crowd/stuff 区域。源码文件头部的注释TODO: Make the encoding system object-oriented and configurable.也提示我们目前这套编码以模块级函数形式存在工具包仍以label_divisor作为唯一可调参数。3.2 从 COCO 标注到三张标签图DecodeLabels数据预处理阶段是编码协议最核心的消费方。在 paddlepanseg/transforms/transforms.py 的DecodeLabels中工具包把 COCO 风格的 JSON 标注segments_info其中id为原始标注 ID、category_id为原始类别 ID、iscrowd标记是否属于拥挤区域重编码为统一的pan_idclass DecodeLabels(object): def __init__(self, label_divisor, ignore_index): self.label_divisor label_divisor self.ignore_index ignore_index def __call__(self, data): raw_label data[label] segments_info data[ann] thing_ids set(data[thing_ids]) ins_label np.zeros_like(raw_label, dtypeint64) sem_label np.full_like(raw_label, self.ignore_index, dtypeint64) pan_label np.zeros_like(raw_label, dtypeint64) ins_id 0 class_id_tracker Counter() for seg in segments_info: id_ seg[id] mask (raw_label id_) cat_id seg[category_id] sem_label[mask] cat_id if cat_id in thing_ids: if seg[iscrowd] 0: # Do not include crowded instances in ins_label ins_id 1 ins_label[mask] ins_id # Re-encode pan_id using cat_id and tracked class instance id class_id_tracker[cat_id] 1 pan_id encode_pan_id( cat_id, self.label_divisor, ins_idclass_id_tracker[cat_id]) pan_label[mask] pan_id else: pan_id encode_pan_id(cat_id, self.label_divisor) pan_label[mask] pan_id seg[id] pan_id ...该实现透露了三个重要的工程细节实例 ID 按类别分别计数class_id_tracker以cat_id为键分别计数因此每个类别的实例都从 1 开始编号而非全局连续编号——这与第 2 节公式中ins_id是该类别内的实例 ID的语义严格一致crowd 区域只参与 pan 编码iscrowd 1的区域不写入ins_label但仍会通过class_id_tracker占用一个实例计数并生成对应的pan_id一图三用同一份标注被展开为ins_label纯实例图、sem_label纯语义图背景像素填ignore_index255和pan_labelpan_id全景图训练与评测阶段按需取用。4. 配置层面的串联label_divisor从 YAML 到运行时label_divisor不仅在数据侧生效还贯穿后处理器与评测器因此它在配置文件中被统一声明并通过 YAML 锚点anchor共享。以 Mask2Former COCO 配置 configs/mask2former/mask2former_resnet50_os16_coco_1024x1024_bs4_370k.yml 为例num_classes: num_classes 133 ignore_index: ignore_index 255 label_divisor: label_divisor 1000 ... train_dataset: type: COCO ... label_divisor: *label_divisor num_classes: *num_classes ignore_index: *ignore_index val_dataset: ... - type: DecodeLabels label_divisor: *label_divisor ignore_index: *ignore_index ...同一套label_divisor 1000锚点被train_dataset、val_dataset以及后处理器postprocessor多处复用保证数据编码、模型输出重编码与评测三方使用完全一致的除数。Panoptic DeepLab 的 Cityscapes 配置 configs/panoptic_deeplab/panoptic_deeplab_resnet50_os32_cityscapes_1025x513_bs8_90k.yml 同样遵循这一模式。从源码看label_divisor有多级默认值兜底机制配置解析层paddlepanseg/cvlibs/config.py 中_set_attr_if_not_exists(pp_cfg, label_divisor, 1000)未配置时写入默认值1000数据集层paddlepanseg/datasets/base_dataset.py 中PanopticDataset定义类常量LABEL_DIVISOR 1000构造参数label_divisorNone时自动回退到该类常量后处理器层Postprocessor基类与PanopticDeepLabPostprocessor、MaskFormerPostprocessor的构造参数均带label_divisor1000默认值。因此即便用户完全不写该字段协议也能以默认值1000正常工作而 COCO、Cityscapes 等数据集的类别数均远小于 1000默认除数在工程上是安全的。5. 编码协议在后处理与评测中的应用5.1 PanopticDeepLab 后处理重编码预测结果模型输出的原始张量并不是pan_id图需要后处理器按同一协议重新编码。在 paddlepanseg/postprocessors/panoptic_deeplab_pp.py 的_merge_semantic_and_instance中thing 实例先经中心点检测、像素分组得到实例图再对每个实例的掩码在其语义类内做多数投票majority voting确定class_id并通过class_id_tracker按类计实例随后调用encode_pan_id(class_id, self.label_divisor, ins_idnew_ins_id)写入pan_segstuff 区域则要求语义预测一致且面积不小于stuff_area默认 2048 像素直接调用encode_pan_id(class_id, self.label_divisor)即ins_id0写入。由此预测全景图与参考标签共用同一套数值空间评测时可以直接逐像素比对。5.2 PQ 评测从pan_id还原cat_idPanoptic QualityPQ评测需要把预测的每个pan_id映射回类别。在 paddlepanseg/utils/evaluation/pan_seg_evaluator.py 中labels, labels_cnt np.unique(pred, return_countsTrue) for label, label_cnt in zip(labels, labels_cnt): if label VOID: # id0 stands for area to be ignored continue cat_id, _ decode_pan_id(label, self.label_divisor) ...未知像素pan_id 0在评测时被直接跳过其余每个pan_id都通过decode_pan_id还原出cat_id并组装预测标注字典随后与 GT 标注做匹配与混淆矩阵统计。同理实例分割评测器 paddlepanseg/utils/evaluation/ins_seg_evaluator.py 也通过decode_pan_id(i, self.label_divisor)解析类别并用is_crowd(i, self.label_divisor)跳过未分实例的区域。5.3 可视化按类取色 按实例抖动编码协议同样服务于可视化。在 paddlepanseg/utils/visualize.py 的visualize_panoptic中逐一遍历图中唯一的pan_id通过decode_pan_id(lab, label_divisor)得到(cat_id, ins_id)基础色取自类别的 colormap当ins_id 0时在基础色附近做随机抖动生成该实例专属颜色从而让同一类别下的不同实例在视觉上可区分。这正是单通道pan_id图能支撑完整彩色全景可视化的原因。6. 数值示例与自检为便于理解下面用label_divisor 1000给出几个具体编码场景cat_idins_idpan_id 计算pan_idthing 类第 1 个实例01(01)×1000 11001thing 类第 2 个实例02(01)×1000 21002thing 类第 1 个实例11(11)×1000 12001stuff 类20(21)×1000 03000未知 / 未标注———0反向验证pan_id 2001时decode_pan_id(2001, 1000)得到(2001 // 1000 - 1, 2001 % 1000) (1, 1)与编码输入一致而pan_id 3000时is_crowd(3000, 1000)返回True符合 stuff 语义。7. 协议要点小结单图双语义pan_id一张单通道图同时编码语义类别与实例序号pan_id (cat_id 1) * label_divisor ins_idthing 与 stuff 分层thing 使用ins_id 1stuff 退化为ins_id 0二者在数值上不重叠且均可由% label_divisor快速区分0号保留pan_id 0专用于未知/未标注像素评测时按 VOID 忽略label_divisor默认 1000在配置、数据集、后处理器与评测器四层均有默认值兜底可通过 YAML 锚点全局统一定制全链路一致数据加载DecodeLabels、模型后处理encode_pan_id重编码、PQ 评测decode_pan_id还原与可视化decode_pan_id取色共用 utils/encode.py 中的同一套编解码函数确保训练、推理与评估的数值口径完全统一。如需进一步了解该协议在完整数据流程中的位置可继续阅读 quick_start_en.md、full_features_en.md 与 dev_guide_en.md或直接对照 mask2former 配置 与 panoptic_deeplab 配置 验证各环节的label_divisor取值。赞分享人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载相关推荐零代码搞定图像分割数据集PaddleSeg数据生成工具全攻略零代码搞定图像分割数据集PaddleSeg数据生成工具全攻略 图像分割模型训练中高质量标注数据短缺是最棘手的问题。标注一张语义分割图像平均需要30分钟专业人工智能计算机视觉预训练SRS 实时媒体服务器全景指南协议、转封装、编解码与部署实践SRS 实时媒体服务器全景指南协议、转封装、编解码与部署实践 SRSSimple Realtime Server是一个 简单、高性能、AI 驱动的实时媒体音视频后端直播Transformers 中的 SegFormerMiT 编码器与全 MLP 解码器的语义分割实践指南Transformers 中的 SegFormerMiT 编码器与全 MLP 解码器的语义分割实践指南 本文围绕 Transformers 官方模型文档 Se人工智能深度学习机器学习预训练微调NLP计算机视觉语音多模态上一篇AidokuiOS终极免费漫画阅读神器下一篇WinPmemWindows内存取证的终极完整指南 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Java多智能体系统实战:用ADK构建旅游规划助手,让AI智能体协作完成任务_google adk java-CSDN博客 2026/9/25 7:58:32

Java多智能体系统实战:用ADK构建旅游规划助手,让AI智能体协作完成任务_google adk java-CSDN博客

首屏导读 本教程配套付费专栏: 大模型工程师修炼手记 19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程) AI时代程序员的自我提升 49.9 元(AI 时代成长方法论)。 单篇不过瘾?订阅解锁全量源…

阅读更多 →
幼儿园大班名胜古迹主题测评方案设计与实践 2026/9/25 7:58:32

幼儿园大班名胜古迹主题测评方案设计与实践

1. 项目背景与设计思路这个幼儿园大班上学期期末的中文测评项目,以《名胜古迹》为主题设计社会课程,是典型的幼教领域跨学科教学实践。我在参与多家幼儿园课程设计时发现,将语言能力测评与文化认知相结合,能有效提升5-6岁儿童的学…

阅读更多 →
如何安全删除死代码:Fallow trace 证据链 + fix 自动修复完整指南 2026/9/25 7:58:26

如何安全删除死代码:Fallow trace 证据链 + fix 自动修复完整指南

如何安全删除死代码:Fallow trace 证据链 fix 自动修复完整指南 【免费下载链接】fallow Codebase intelligence for TypeScript and JavaScript. Free static analysis of code and styles: unused code, duplication, circular deps, complexity hotspots, archi…

阅读更多 →
WorkBuddy Enterprise企业级Agent平台:SkillHub与多Agent协同落地实践 2026/9/25 7:58:26

WorkBuddy Enterprise企业级Agent平台:SkillHub与多Agent协同落地实践

1. 从「超级个体」到「超级团队」:这个平台到底在解决什么问题第一次看到「WorkBuddy Enterprise」这个名字,我脑子里蹦出来的第一个念头是:腾讯云终于把 CodeBuddy 那套东西从个人开发者手里往团队场景搬了。如果你最近半年一直在关注 AI Ag…

阅读更多 →
PaddleSpeech 流式 ASR 服务客户端实战:从 WAV 文件模拟到麦克风实时识别 2026/9/25 7:58:26

PaddleSpeech 流式 ASR 服务客户端实战:从 WAV 文件模拟到麦克风实时识别

人工智能语音音频NLP媒体生成 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation …

阅读更多 →
Optimus产线级技术拆解:力控执行器与谐波减速器的硬核标准 2026/9/25 7:58:26

Optimus产线级技术拆解:力控执行器与谐波减速器的硬核标准

简介:本资源为2023年深度行业分析报告《特斯拉人形机器人Optimus发展优势及产业链梳理》,面向人工智能、机器人、智能硬件及产业研究领域的工程师、研究人员与投资分析人员,聚焦人形机器人技术路径、商业化潜力与国产供应链机会。报告系统拆解…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉