尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PaddleSeg PanopticSeg 全景分割标签编码协议(pan_id)深度解析

发布时间:2026/9/25 10:19:13

资讯中心
01
ARTICLE

PaddleSeg PanopticSeg 全景分割标签编码协议(pan_id)深度解析

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点击查看免费下载导读全景分割Panoptic Segmentation任务需要在一张图上同时输出语义类别thing 与 stuff和每个 thing 实例的编号因此其标签图的像素值编码方式与纯语义分割、纯实例分割都不同。本文以 PaddleSeg 仓库contrib/PanopticSeg子工具箱的官方文档《全景分割标签编码规则》为骨架完整讲解其pan_id编码协议thing / stuff / 未知像素的取值公式、label_divisor常数的语义与默认值并结合 encode.py、transforms.py、后处理器与评估器源码从「标签怎么编码、怎么解码、怎么存成图、怎么由模型产出、怎么被评估消费」五个环节还原整套协议的真实实现。读完本文你将能够读懂任意一张全景分割标签图、手动编解码pan_id并能正确配置label_divisor以适配自定义数据集。一、编码协议总览一张全景分割图就是一个pan_id数组在 PanopticSeg 工具箱中全景分割图参考标签或模型预测输出的每一个像素值都被记作pan_id。它不是普通的语义类别 ID而是一个将「类别信息」与「实例信息」打包进单个整数的复合编码。假设数据集中共有c个类别含 thing 与 stuff单张图中最大的对象实例或 stuff 区域个数为n那么pan_id的取值范围为0 pan_id c * label_divisor n左闭右闭区间上限推导见下文第三节。pan_id与「语义 ID 实例 ID」之间的对应关系由一张简明的编码表决定官方文档原文如下表所示像素类型编码公式说明thing 类别可数对象如人、车pan_id (cat_id 1) * label_divisor ins_idcat_id从0开始计数ins_id从1开始计数stuff 类别不可数区域如天空、道路pan_id (cat_id 1) * label_divisor等价于ins_id 0的特例未知 / 未标注 / 无法确定pan_id 0保留值不参与编码其中label_divisor是预设常数默认值为1000。这一整套规则就是 PanopticSeg 工具箱的标签编码协议英文版见 encoding_protocol_en.md。1.1 一个随手可验的编码实例以默认label_divisor 1000为例cat_id 0如 person的第1个实例 →pan_id (0 1) * 1000 1 1001cat_id 0的第2个实例 →pan_id 1002cat_id 3如 skystuff 类→pan_id (3 1) * 1000 4000无法确定的像素 →pan_id 0。反过来任给一个pan_id也能立刻反推出类别与实例编号cat_id pan_id // 1000 - 1ins_id pan_id % 1000。例如pan_id 4000反推得cat_id 3、ins_id 0stuff 区域。1.2 为什么pan_id的取值范围上限是c * label_divisor n由于cat_id从0开始(cat_id 1)的取值范围是1 ~ c最大类别号对应的基数为c * label_divisor再叠加最大的实例编号n便得到闭区间上限c * label_divisor n。而下限0是为未知像素保留的特殊值。二、关键常数label_divisor协议的核心旋钮label_divisor承担两个职责充当「类别段」与「实例段」的分隔基数pan_id // label_divisor给出类别段再减 1 得到cat_idpan_id % label_divisor给出实例段ins_id决定每个类别最多能容纳多少个实例编号实例段占用[0, label_divisor - 1]其中0留给 stuff / crowd因此单类可用的实例编号上限为label_divisor - 1。官方文档给出的默认值为1000即默认协议下每类最多承载 999 个独立实例编号编号从 1 起。该默认值在源码中多处落地与文档互为印证config.py 中_set_attr_if_not_exists(pp_cfg, label_divisor, 1000)在配置缺失时注入默认值base_dataset.py 中数据集基类同样以1000作为LABEL_DIVISOR的兜底默认两个官方配置都显式声明了该常数例如 mask2former_resnet50_os16_coco_1024x1024_bs4_370k.yml 与 panoptic_deeplab_resnet50_os32_cityscapes_1025x513_bs8_90k.yml 中的label_divisor: label_divisor 1000并在val_dataset、后处理器等环节通过 YAML 锚点引用同一数值。三、源码级实现encode_pan_id/decode_pan_id/is_crowd文档给出的两条编码公式在 encode.py 中被实现为三个工具函数并作为工具箱的统一编解码入口由 utils/init.py 导出。# contrib/PanopticSeg/paddlepanseg/utils/encode.py _CAT_ID_OFFSET 1 def decode_pan_id(pan_id, label_divisor): # 返回 (cat_id, ins_id) return (pan_id // label_divisor) - _CAT_ID_OFFSET, pan_id % label_divisor def encode_pan_id(cat_id, label_divisor, ins_id0): # 与文档公式 pan_id (cat_id 1) * label_divisor ins_id 完全一致 return (cat_id _CAT_ID_OFFSET) * label_divisor ins_id def is_crowd(pan_id, label_divisor): # 实例段为 0 的 pan_id 视为 crowd包括 stuff 区域 return pan_id % label_divisor 0几点值得注意的实现细节源码用常量_CAT_ID_OFFSET 1显式表达文档公式中的「 1」其作用是为cat_id 0的第一类也留出非零的类别段从而把0完整保留给未知像素encode_pan_id的ins_id参数默认为0因此 stuff 类别调用时只需传cat_id与label_divisor两个参数天然满足文档中 stuff 公式is_crowd通过pan_id % label_divisor 0判定「实例段为 0」的像素。按第一节的公式stuff 区域的ins_id恒为 0因此该函数在实例级评估中常被用来把 stuff / crowd 区域从实例集合中过滤出去见下文第六节。3.1 编码公式的对称性自检encode与decode互为逆运算decode_pan_id(encode_pan_id(cat_id, divisor, ins_id), divisor)恒等于(cat_id, ins_id)。这套对称性保证数据在「训练标签解码 → 模型预测 → 评估」全链路中往返无损是协议可靠性的基础。四、标签如何产生训练数据的解码链路DecodeLabels变换数据集原始标注通常以「RGB 编码的标签图 segments_info JSON」的形式提供详细数据准备规则见 full_features_cn.md快速上手见 quick_start_cn.md。训练管线中transforms.py 的DecodeLabels变换负责把原始标注解码为协议规定的pan_id图class 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]) # ... class_id_tracker Counter() for seg in segments_info: id_ seg[id] mask (raw_label id_) cat_id seg[category_id] # ... if cat_id in thing_ids: if seg[iscrowd] 0: ins_id 1 ins_label[mask] ins_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 # ...这段实现印证并深化了文档规则实例编号由类别内的计数器分配class_id_tracker[cat_id]按类维护递增计数同一类的不同实例获得1, 2, 3, ...的ins_id正好对应文档「ins_id从 1 开始计数」的约定thing 与 stuff 走两条分支thing 分支传入ins_idstuff 分支不传取默认0与文档公式一一对应crowd 处理iscrowd 1的拥挤实例不进入实例标签ins_label但仍在类别计数器中占位并参与pan_id编码同步回写解码完成后seg[id] pan_id使 segments_info 中的区域 ID 与pan_label保持一致供后续评估直接使用评估器注释明确指出「Use sample[ann], rather than parsing info from gt」但要求gt与gt_ann的一致性必须得到保证。同一文件中还包含配套的ConvertRGBToID把 RGB 标签图转换为单通道 ID 图与Collect按 key 收集张量它们与DecodeLabels共同构成训练 / 验证数据的预处理链。五、标签如何存储RGB 图与pan_id的互相转换官方文档《全景分割标签编码规则》聚焦于pan_id数值本身而仓库的 full_features_cn.md 补充了标签的存储形态全景标签以 RGB 图像保存三个通道的像素值由pan_id按下式拆分r pan_id % 256 g pan_id // 256 % 256 b pan_id // (256 * 256) % 256对应的实现位于 functional.pydef rgb2id(color): if color.dtype np.uint8: color color.astype(np.int32) return color[:, :, 0] 256 * color[:, :, 1] 256 * 256 * color[:, :, 2] def id2rgb(id_map): id_map_copy id_map.copy() rgb_shape tuple(list(id_map.shape) [3]) rgb_map np.zeros(rgb_shape, dtypenp.uint8) for i in range(3): rgb_map[..., i] id_map_copy % 256 id_map_copy // 256 return rgb_map这一存储方案与pan_id编码协议直接衔接任何合法的pan_id最大不超过c * label_divisor n都可以无损地写入 RGB 三通道的 24 位空间读取时经rgb2id还原回pan_id。因此同一套pan_id协议贯穿「标签文件存储」与「内存中的张量表示」两个层面这也是label_divisor默认取1000的另一个现实考量——在保证每类实例编号空间的同时仍可容纳在 24 位 RGB 编码范围内。六、模型预测如何产出pan_id后处理器的编码调用推理阶段模型输出的掩码与类别打分并不直接是pan_id而是由各后处理器按协议完成编码。PanopticSeg 工具箱为不同模型族实现了对应的后处理器它们都通过统一的encode_pan_id出口产出协议兼容的pan_predMask2Former 后处理器maskformer_pp.py对掩码概率取argmax得到每个像素归属的掩码段后thing 类使用class_id_tracker[pred_class] 1分配实例号并调用encode_pan_id(pred_class, label_divisor, ins_idclass_id_tracker[pred_class])stuff 类则调用encode_pan_id(pred_class, label_divisor)ins_id取默认 0并用stuff_memory_list记录已合并的 stuff 区域PanopticDeepLab 后处理器panoptic_deeplab_pp.py类名即模型名其内部同样以encode_pan_id(class_id, self.label_divisor, ins_idnew_ins_id)与encode_pan_id(class_id, self.label_divisor)分别编码 thing 实例与 stuff 区域。可见训练数据的DecodeLabels与推理阶段的后处理器共享同一套编码函数与label_divisor取值这正是保证「训练标签形态」与「预测输出形态」在评估环节可直接对齐的关键设计。七、评估与可视化如何消费pan_id7.1 全景评估PQ / SQ / RQpan_seg_evaluator.py 中PanSegEvaluator将模型输出的pan_pred与数据集的pan_label直接按pan_id对齐计算混淆矩阵显式声明VOID 0pan_id 0的区域在统计预测 segments 时被跳过对应文档「未知像素取 0」的约定对每个预测pan_id调用decode_pan_id(label, self.label_divisor)还原cat_id用于类别对齐再依据实例 / 区域的重叠面积计算PQ / SQ / RQ。7.2 实例评估PQ 之外的实例级指标ins_seg_evaluator.py 中则同时使用decode_pan_id与is_crowd解码得到(cat_id, ins_id)后若cat_id不在 thing 类别集合内、或is_crowd(pan_id, label_divisor)为真实例段为 0则该pan_id不作为有效实例参与统计——这正是第五节所述「stuff / crowd 不进入实例集合」的协议语义在评估环节的落地。7.3 可视化visualize.py 的visualize_panoptic以decode_pan_id(lab, label_divisor)还原每个pan_id的类别与实例号再依据类别色板着色stuff 区域使用类别基础色thing 实例在基础色上施加随机抖动生成区分色最终可与原图按权重叠加输出。这意味着仅凭一张pan_id图 label_divisor即可完整重建带实例区分的全景分割可视化协议再一次充当了各组件间的通用语言。八、配置实践与注意事项8.1 在哪里配置label_divisorlabel_divisor不需要在训练脚本中单独指定而是随配置文件下发可配置的位置包括顶层label_divisor字段常以 YAML 锚点label_divisor 1000定义供多处引用val_dataset对应 base_dataset.py 的label_divisor参数各后处理器base_pp.py 的构造参数。配置缺失时的解析优先级见 full_features_cn.md后处理器先尝试从val_dataset读取同名配置再回退到预设默认值1000config.py。在评估与预测脚本中如 core/predict.pylabel_divisor同样从val_dataset一路传递保证全链路取值一致。8.2 自定义数据集的三条纪律标签图必须按协议编码thing 区域写(cat_id 1) * label_divisor ins_idstuff 区域写(cat_id 1) * label_divisor未知像素写0并以 RGB 三通道形式存储r pan_id % 256、g pan_id // 256 % 256、b pan_id // (256 * 256) % 256label_divisor全局一致数据集准备、训练配置、评估配置三处的label_divisor必须相同否则decode_pan_id将解出错误的类别与实例号评估指标会整体失真单类实例数不要触及上限默认1000下每类最多 999 个实例编号若数据集中某类实例数逼近该上限例如超大场景的全景标注应相应调大label_divisor同时确认标签图仍能在 24 位 RGB 范围内无损存储即pan_id最大值不超过256^3 - 1。九、总结PaddleSeg PanopticSeg 的标签编码协议用一句话可以概括为以label_divisor为基数把cat_id抬高一段后用余数段承载ins_id用 0 表示未知从而把全景分割的「类别 实例 未知」三态信息压缩进单一像素值pan_id。本文从官方文档的三条公式出发沿「编解码函数 → 训练数据解码 → RGB 存储 → 模型后处理 → 评估与可视化」的完整链路逐一给出了源码级证据encode.py、transforms.py、functional.py、maskformer_pp.py、pan_seg_evaluator.py 等证明了该协议是训练、推理、评估、可视化各环节共用的「通用语言」。无论是理解现有模型输出、准备自定义全景数据集还是为 PanopticSeg 开发新的模型与后处理器可参考 dev_guide_cn.md掌握这套编码规则都是第一步。赞分享人工智能计算机视觉预训练【免费下载链接】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点击查看免费下载相关推荐密码学标准与协议完全解析TLS、SSH、PGP等协议深度剖析密码学标准与协议完全解析TLS、SSH、PGP等协议深度剖析 在当今数字化时代网络安全已成为不可或缺的一部分而密码学标准与协议则是保障信息安全的基石。本文密码学文档nhost 背后的 PostgreSQL 线协议pgproto3 v3 协议编解码器深度解析nhost 背后的 PostgreSQL 线协议pgproto3 v3 协议编解码器深度解析 pgproto3 是 Go 生态中广泛使用的 PostgreSQ后端认证鉴权数据库无服务开发工具云原生探索智能图像分割PaddleSeg深度学习框架详解探索智能图像分割PaddleSeg深度学习框架详解 在人工智能领域图像处理和计算机视觉是至关重要的部分而在这些应用中图像分割扮演着核心角色。 是由阿里云人工智能计算机视觉预训练上一篇番茄小说下载器终极指南从零开始构建你的个人数字图书馆下一篇企业级Gofile批量下载工具5大核心优势与生产环境部署指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。