十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Detectron2 中的 PointRend 实战指南:将图像分割当作渲染的自适应点细化方案

Detectron2 中的 PointRend 实战指南:将图像分割当作渲染的自适应点细化方案 Detectron2 中的 PointRend 实战指南将图像分割当作渲染的自适应点细化方案【免费下载链接】detectron2Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.项目地址: https://gitcode.com/GitHub_Trending/de/detectron2导读PointRendPoint-based Rendering点渲染是由 Alexander Kirillov、Yuxin Wu、Kaiming He 与 Ross Girshick 提出的分割细化方法论文题为PointRend: Image Segmentation as RenderingarXiv:1912.08193。本仓库在 Detectron2 之上开源了 PointRend 的完整实现可灵活叠加在现有 SOTA 模型之上同时用于实例分割Instance Segmentation与语义分割Semantic Segmentation。阅读本文后你将掌握 PointRend 的完整原理、配置项语义、训练与评估命令、推理期自适应细分流程以及 Implicit PointRendPointly-Supervised 点级弱监督扩展的用法。PointRend 核心思想分割即渲染PointRend 的核心洞察源于计算机图形学中的渲染概念与其在整幅高分辨率网格上等权计算不如只对少数关键位置点进行精细化预测再通过迭代细分subdivision逐步逼近精细边界。其核心由三部分组成粗预测Coarse Prediction用常规分割头生成低分辨率输出例如实例分割中的 7×7 粗掩码或语义分割中低分辨率的 logits 图点选择Point Selection训练时基于不确定性采样uncertainty sampling挑选最有信息量的点推理时在每一轮细分中选取当前不确定性最高的点点级预测Point Head对每个采样点将**细粒度特征fine-grained features来自 FPN 的高分辨率特征图与粗预测特征coarse prediction features来自粗掩码的双线性采样**拼接后送入一个小型 MLP逐点输出掩码 logits。从源码结构看这三部分分别落在 point_features.py点坐标生成与特征采样、point_head.py逐点 MLP 预测器与 mask_head.py实例分割的粗头与细分推理中。仓库模块地图PointRend 在项目中的组织方式PointRend 作为 Detectron2 的一个独立 project 存在目录结构如下projects/PointRend/train_net.py训练/评估入口脚本projects/PointRend/point_rend/config.pyadd_pointrend_config注册 PointRend 全部自定义配置项projects/PointRend/point_rend/mask_head.pyPointRendMaskHead与ImplicitPointRendMaskHeadprojects/PointRend/point_rend/point_head.pyStandardPointHead与ImplicitPointHead注册于POINT_HEAD_REGISTRYprojects/PointRend/point_rend/point_features.py点采样、不确定性计算、标签采样等基础算子projects/PointRend/point_rend/semantic_seg.pyPointRendSemSegHead注册于SEM_SEG_HEADS_REGISTRYprojects/PointRend/point_rend/roi_heads.pyPointRendROIHeads负责旧模型权重自动转换projects/PointRend/point_rend/color_augmentation.py语义分割训练用的 SSD 色彩增强。逐点特征采样point_sample 与不确定性采样point_features.py 提供了整个系统的底层算子point_sample对torch.nn.functional.grid_sample的封装将归一化在 [0,1]×[0,1] 的点坐标转换为 grid_sample 所需的 [-1,1] 坐标从而从任意特征图上按双线性插值取出 P 个点的特征输出形状(N, C, P)generate_regular_grid_point_coords生成规则正方形网格点用于初始化与粗特征池化get_uncertain_point_coords_with_randomness训练期点选择的核心实现。先按oversample_ratio论文参数 k默认 3均匀随机采样num_points * k个点计算每个点的 logits 后取不确定性通过torch.topk选出importance_sample_ratio * num_points论文参数 β默认 0.75个最不确定点再补充随机点凑齐总数。代码注释特别强调不确定性必须基于采样点的预测值计算而不是先算粗预测网格的不确定性再插值否则会导致错误结果get_uncertain_point_coords_on_grid推理期在已上采样的网格上直接topk选取最不确定的 N 个点及其坐标sample_point_labels用 GT bitmask 为采样点生成二值标签。不确定性度量两种任务两种定义源码中实例分割与语义分割使用不同的不确定性定义实例分割mask_head.py 的calculate_uncertainty取前景类 logits 的绝对值并取负即 logits 越接近 0 的点越不确定语义分割semantic_seg.py取 top-1 与 top-2 logits 之差差值越小说明类别间越混淆、越不确定。实例分割配置解析与参数语义PointRend 实例分割的基座配置位于 Base-PointRend-RCNN-FPN.yaml继承自仓库根目录的 Base-RCNN-FPN.yaml_BASE_: ../../../../configs/Base-RCNN-FPN.yaml MODEL: MASK_ON: true ROI_BOX_HEAD: TRAIN_ON_PRED_BOXES: True ROI_MASK_HEAD: POOLER_TYPE: # 不使用 RoI pooling让 head 直接处理图像级特征 NAME: PointRendMaskHead FC_DIM: 1024 NUM_FC: 2 OUTPUT_SIDE_RESOLUTION: 7 IN_FEATURES: [p2] # 粗掩码头使用的特征图 POINT_HEAD_ON: True POINT_HEAD: FC_DIM: 256 NUM_FC: 3 IN_FEATURES: [p2] INPUT: # PointRend 实例分割不兼容 polygon 掩码格式 MASK_FORMAT: bitmask要点说明POOLER_TYPE: PointRend 放弃了传统的 RoIAlign 池化改为用point_sample直接对图像级特征按点采样因此mask_head.py中的_roi_pooler等价于逐点 RoIAlignOUTPUT_SIDE_RESOLUTION: 7粗掩码输出为 7×7MASK_FORMAT: bitmaskpoint head 需要从 GT bitmask 上采样点标签见 point_features.py 中sample_point_labels对BitMasks的断言polygon 格式不可用。完整可用的 COCO 实例分割配置为 pointrend_rcnn_R_50_FPN_1x_coco.yaml并可通过注释开关加入COCO 掩码 AP 对 LVIS 高质量标注评估见下文 AP* 说明。全部自定义配置项一览config.py 中的add_pointrend_config注册了以下参数训练脚本通过setup调用它后合并配置文件配置项默认值语义INPUT.CROP.SINGLE_CATEGORY_MAX_AREA1.0语义分割随机裁剪重试条件裁剪块内单个类别占比上限INPUT.COLOR_AUG_SSDFalse是否启用 SSD 色彩增强MODEL.ROI_MASK_HEAD.IN_FEATURES(p2,)粗掩码头输入特征MODEL.ROI_MASK_HEAD.FC_DIM1024粗头 FC 维度MODEL.ROI_MASK_HEAD.NUM_FC2粗头 FC 层数MODEL.ROI_MASK_HEAD.OUTPUT_SIDE_RESOLUTION7粗掩码边长MODEL.ROI_MASK_HEAD.POINT_HEAD_ONFalse是否启用 point headMODEL.POINT_HEAD.NAMEStandardPointHead点预测头类型可换为 ImplicitPointHeadMODEL.POINT_HEAD.NUM_CLASSES80前景类别数MODEL.POINT_HEAD.IN_FEATURES(p2,)细粒度特征来源MODEL.POINT_HEAD.TRAIN_NUM_POINTS14×14196训练期每掩码采样点数MODEL.POINT_HEAD.OVERSAMPLE_RATIO3过采样参数 k论文记号MODEL.POINT_HEAD.IMPORTANCE_SAMPLE_RATIO0.75重要性采样比例 β论文记号MODEL.POINT_HEAD.SUBDIVISION_STEPS5推理期细分步数MODEL.POINT_HEAD.SUBDIVISION_NUM_POINTS28×28784每步细分最大点数 NMODEL.POINT_HEAD.FC_DIM256点 MLP 隐藏维度MODEL.POINT_HEAD.NUM_FC3点 MLP 层数MODEL.POINT_HEAD.CLS_AGNOSTIC_MASKFalse是否类别无关掩码MODEL.POINT_HEAD.COARSE_PRED_EACH_LAYERTrue是否每层都拼接粗预测特征MODEL.POINT_HEAD.COARSE_SEM_SEG_HEAD_NAMESemSegFPNHead语义分割的粗头MODEL.IMPLICIT_POINTREND.IMAGE_FEATURE_ENABLEDTrue是否使用图像级特征MODEL.IMPLICIT_POINTREND.POS_ENC_ENABLEDTrue是否使用位置编码MODEL.IMPLICIT_POINTREND.PARAMS_L2_REGULARIZER0.00001动态参数 L2 正则权重StandardPointHead 的结构point_head.py 中的StandardPointHead是一个用 kernel size1 的 Conv1d 实现的 MLP输入为细粒度特征与粗预测特征的拼接逐层经 ReLU 输出若COARSE_PRED_EACH_LAYERTrue每一层的输入都会再次拼接粗预测特征最后接一个预测层输出逐点 logits。训练损失roi_mask_point_loss使用带 logits 的二元交叉熵F.binary_cross_entropy_with_logits标签为 -1 的点被忽略同时以point/accuracy的名义写入 event 便于监控。训练与评估命令行实操训练官方推荐以 8 卡 GPU 训练。进入 PointRend 项目目录后执行cd projects/PointRend python train_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml --num-gpus 8训练入口 train_net.py 是tools/plain_train_net.py的精简版setup中先get_cfg()再调用add_pointrend_config(cfg)随后merge_from_file合并配置并冻结。训练器继承DefaultTrainer其build_evaluator根据数据集的evaluator_type元数据自动选择COCOEvaluator、LVISEvaluator、SemSegEvaluator、CityscapesInstanceEvaluator或CityscapesSemSegEvaluator。评估评估命令与训练几乎一致只需追加--eval-only并指定权重cd projects/PointRend python train_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml --eval-only MODEL.WEIGHTS /path/to/model_checkpoint训练期实例分割的数据流从 mask_head.py 的forward可见训练分支完整链路用_roi_pooler对每个 proposal 提取池化特征coarse_head生成 7×7 粗掩码_sample_train_points以get_uncertain_point_coords_with_randomness采样约 196 个训练点并从 GT bitmask 采样标签_point_pooler在 p2 特征图上取这些点的细粒度特征point_head融合细粒度与粗特征输出逐点 logits计算loss_mask粗掩码与loss_mask_point逐点两个损失。推理期的自适应细分Subdivision推理分支_subdivision_inference实现了论文中的迭代细化先生成OUTPUT_SIDE_RESOLUTION7×7的规则网格用 point head 计算初始掩码 logits每一轮将 logits 双线性上采样 2 倍计算不确定性图用get_uncertain_point_coords_on_grid选出SUBDIVISION_NUM_POINTS28×28个最不确定点只对这 N 个点运行 point head用scatter_将预测写回上采样网格的对应位置重复SUBDIVISION_STEPS5轮后得到最终高分辨率掩码。_init_roi_head中还有一个工程优化若细分后整张掩码都会被重新计算4 * init_resolution² subdivision_num_points则直接倍增初始分辨率并减少细分步数跳过无效步骤。推理期mask_head.py中roi_pooler的注释还指出PointRend 的逐点池化等价于采样比1 的 RoIAlign由于配置只用了 p2 单层特征二者无差异。语义分割变体SemanticFPN PointRendPointRend 同样可用于语义分割。基座配置 Base-PointRend-Semantic-FPN.yaml 要点MODEL: META_ARCHITECTURE: SemanticSegmentor BACKBONE: FREEZE_AT: 0 SEM_SEG_HEAD: NAME: PointRendSemSegHead POINT_HEAD: NUM_CLASSES: 54 FC_DIM: 256 NUM_FC: 3 IN_FEATURES: [p2] TRAIN_NUM_POINTS: 1024 SUBDIVISION_STEPS: 2 SUBDIVISION_NUM_POINTS: 8192 COARSE_SEM_SEG_HEAD_NAME: SemSegFPNHead COARSE_PRED_EACH_LAYER: False DATASETS: TRAIN: (coco_2017_train_panoptic_stuffonly,) TEST: (coco_2017_val_panoptic_stuffonly,)与实例分割的差异粗头为SemSegFPNHead由COARSE_SEM_SEG_HEAD_NAME指定训练点数更多1024、细分步数更少2 步、每步 8192 点语义分支在 semantic_seg.py 中实现训练损失使用F.cross_entropyloss_sem_seg_pointIGNORE_VALUE标签被忽略。语义分割还有专属训练增强train_net.py 的build_sem_seg_train_augResizeShortestEdge→ 可选的RandomCrop_CategoryAreaConstraint受SINGLE_CATEGORY_MAX_AREA约束的类别面积裁剪重试→ 可选的ColorAugSSDTransformcolor_augmentation.py来自 SSD 论文的亮度/对比度/饱和度/色相扰动→RandomFlip。Implicit PointRend点级弱监督扩展PointRend 项目还包含 Pointly-Supervised Instance SegmentationCheng、Parkhi、Kirillov2021的 Implicit PointRend 实现基座配置 Base-Implicit-PointRend.yamlMODEL: ROI_MASK_HEAD: NAME: ImplicitPointRendMaskHead POOLER_TYPE: # 不使用 RoI pooling让 head 直接处理图像级特征 POINT_HEAD: NAME: ImplicitPointHead FC_DIM: 256 NUM_FC: 3 IN_FEATURES: [p2] NUM_CLASSES: 80 TRAIN_NUM_POINTS: 196 SUBDIVISION_STEPS: 3 SUBDIVISION_NUM_POINTS: 784 IMPLICIT_POINTREND: IMAGE_FEATURE_ENABLED: True POS_ENC_ENABLED: True PARAMS_L2_REGULARIZER: 0.00001 INPUT: MASK_FORMAT: bitmask其核心是 point_head.py 中的ImplicitPointHead不再使用共享权重而是由ImplicitPointRendMaskHead中的parameter_head为每个实例动态生成 MLP 参数再通过torch.einsum(nck,ndc-ndk, ...)执行动态前向_dynamic_mlp训练时点坐标改为均匀采样_uniform_sample_train_points并额外加入参数 L2 正则损失loss_l2权重PARAMS_L2_REGULARIZER。位置编码使用可学习的随机高斯矩阵将归一化坐标映射为 256 维正弦/余弦特征与图像级特征拼接后送入动态 MLP。该变体不依赖点级不确定性采样天然适配只有点标注的弱监督场景。预训练模型与精度基准实例分割COCOMask headBackbonelr sched输出分辨率mask APmask AP*PointRendpointrend_rcnn_R_50_FPN_1x_coco.yamlR50-FPN1×224×22436.239.7PointRendpointrend_rcnn_R_50_FPN_3x_coco.yamlR50-FPN3×224×22438.341.6PointRendpointrend_rcnn_R_101_FPN_3x_coco.yamlR101-FPN3×224×22440.143.8PointRendpointrend_rcnn_X_101_32x8d_FPN_3x_coco.yamlX101-FPN3×224×22441.144.7AP* 说明AP* 是 COCO mask AP 针对质量更高的 LVIS 标注重新评估的结果详见论文。评估前需运行仓库根目录下的 datasets/prepare_cocofied_lvis.py 生成 cocofied 的 GT 文件由于 LVIS 标注并非穷尽式标注AP* 评估必须使用lvis-api而非cocoapi。对应的 cocofied 数据集加载逻辑可参考 detectron2/data/datasets/lvis.py 与 detectron2/data/datasets/builtin.py。实例分割CityscapesImageNet 预训练Mask headBackbonelr sched输出分辨率mask APmodel idPointRendpointrend_rcnn_R_50_FPN_1x_cityscapes.yamlR50-FPN1×224×22435.9164255101语义分割CityscapesImageNet 预训练MethodBackbone输出分辨率mIoUmodel idSemanticFPN PointRendpointrend_semantic_R_101_FPN_1x_cityscapes.yamlR101-FPN1024×204878.9202576688各模型权重与训练日志metrics.json的官方下载链接、model id 对照表均收录于 projects/PointRend/README.md模型权重加载由 detectron2/checkpoint/detection_checkpoint.py 支持。需要注意的是由于 PointRend 的权重格式经历过一次变更roi_heads.py 中的PointRendROIHeads与 mask_head.py 中的ConvFCHead均实现了旧权重自动转换将mask_point_head→mask_head.point_head、coarse_mask_fc→fc等加载旧版 checkpoint 时会自动完成迁移。引用规范若你的工作使用了 PointRend请引用原论文InProceedings{kirillov2019pointrend, title{{PointRend}: Image Segmentation as Rendering}, author{Alexander Kirillov and Yuxin Wu and Kaiming He and Ross Girshick}, journal{ArXiv:1912.08193}, year{2019} }若使用了 Implicit PointRend点级弱监督请引用InProceedings{cheng2021pointly, title{Pointly-Supervised Instance Segmentation, author{Bowen Cheng and Omkar Parkhi and Alexander Kirillov}, journal{ArXiv}, year{2021} }延伸阅读完整项目说明与模型下载projects/PointRend/README.md配置项注册入口projects/PointRend/point_rend/config.py训练与评估脚本projects/PointRend/train_net.py实例分割基座配置projects/PointRend/configs/InstanceSegmentation/Base-PointRend-RCNN-FPN.yaml语义分割基座配置projects/PointRend/configs/SemanticSegmentation/Base-PointRend-Semantic-FPN.yamlDetectron2 数据集准备与注册detectron2/data/datasets/README.md、datasets/README.md【免费下载链接】detectron2Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.项目地址: https://gitcode.com/GitHub_Trending/de/detectron2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表