ARTICLE DETAIL

资讯详情

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

Mask R-CNN 实例分割实战:基于 deep-learning-for-image-processing 仓库的 COCO / Pascal VOC 训练、验证与部署指南

Mask R-CNN 实例分割实战:基于 deep-learning-for-image-processing 仓库的 COCO / Pascal VOC 训练、验证与部署指南 示例工程【免费下载链接】deep-learning-for-image-processingdeep learning for image processing including classification and object-detection etc.项目地址https://gitcode.com/gh_mirrors/de/deep-learning-for-image-processing点击查看免费下载本指南以 pytorch_object_detection/mask_rcnn/README.md 为骨架结合该仓库的完整源码实现系统讲解 Mask R-CNNResNet50 FPN在 COCO2017 与 Pascal VOC2012 数据集上的数据准备、环境配置、单卡 / 多卡训练、COCO 指标验证与推理预测全流程。读完本文你将能够正确下载并重命名预训练权重、按目录规范组织两种数据集、用train.py或torchrun多卡脚本启动训练、解读每轮生成的det_results与seg_results指标文件并独立复现出文档给出的 COCO 验证集 mAP 结果。一、项目定位与文件结构本项目参考 PyTorch 官方 torchvision 仓库references/detection中的源码实现仅在 pycocotools 的使用细节上略有差异在此基础上重构并补充了 VOC 数据集支持、多 GPU 训练、指标保存与可视化等能力。整个 Mask R-CNN 模块的代码组织如下pytorch_object_detection/mask_rcnn/ ├── backbone/ # 特征提取网络ResNet50 FPN ├── network_files/ # Mask R-CNN 网络主体 ├── train_utils/ # 训练/验证相关模块含 COCO 评估 ├── my_dataset_coco.py # 自定义 dataset读取 COCO2017 ├── my_dataset_voc.py # 自定义 dataset读取 Pascal VOC ├── train.py # 单 GPU / CPU 训练脚本 ├── train_multi_GPU.py # 多 GPU 分布式训练脚本 ├── predict.py # 推理脚本加载权重预测并可视化 ├── validation.py # 验证/测试脚本计算 COCO 指标并写入 record_mAP.txt ├── transforms.py # 数据预处理随机水平翻转、PIL 转 Tensor ├── plot_curve.py # 损失、学习率与 mAP 曲线绘制 ├── draw_box_utils.py # 预测结果可视化工具 ├── coco91_indices.json # COCO 类别索引映射含背景 N/A 补齐 ├── pascal_voc_indices.json # VOC 类别索引映射 └── requirements.txt # 依赖清单从源码结构看各目录职责清晰backbone/只负责特征提取network_files/负责 Mask R-CNN 的检测 分割头train_utils/负责训练循环与评估指标计算三部分通过train.py/train_multi_GPU.py组装起来这与 torchvision 官方的模块化设计保持一致。二、环境配置文档明确要求如下环境以仓库 requirements.txt 为准Python 3.6 / 3.7 / 3.8PyTorch 1.10 或以上仓库锁定的版本组合为torch1.13.1torchvision0.11.1pycocotoolsLinux 下pip install pycocotoolsWindows 下pip install pycocotools-windows无需额外安装 VS操作系统建议 Ubuntu 或 CentOS不建议 Windows强烈建议使用 GPU 训练requirements.txt中除 torch/torchvision 外还包含lxmlVOC XML 解析、matplotlib曲线绘制、numpy、tqdm进度条、pycocotoolsCOCO 评估、Pillow图像读写。安装时可直接执行pip install -r requirements.txt三、预训练权重下载与重命名关键细节文档特别强调下载后必须重命名因为训练脚本中硬编码读取的文件名不是官网默认文件名。ResNet50 预训练权重https://download.pytorch.org/models/resnet50-0676ba61.pth→ 重命名为resnet50.pth放入当前目录Mask R-CNNResNet50FPNCOCO 预训练权重https://download.pytorch.org/models/maskrcnn_resnet50_fpn_coco-bf2d0c1e.pth→ 重命名为maskrcnn_resnet50_fpn_coco.pth为什么必须重命名在 train.py 中resnet50_fpn_backbone(pretrain_pathresnet50.pth, ...)在 train.py 中torch.load(./maskrcnn_resnet50_fpn_coco.pth, ...)脚本直接按固定文件名读取因此权重文件必须落在当前目录并改名为上述两个名字。值得注意的细节加载 Mask R-CNN COCO 权重时train.py 会先删除权重字典中所有box_predictor与mask_fcn_logits相关的键再以strictFalse载入因为检测头与分割头的输出类别数与 COCO 预训练不同需要重新初始化这两部分参数只复用 backbone 与 RPN 部分。四、数据集准备本项目支持两种数据集COCO2017 与 Pascal VOC2012二者二选一即可通过修改训练脚本中的 dataset 类来切换。4.1 COCO2017 数据集从 COCO 官网下载三个文件2017 Train images [118K/18GB]训练图像2017 Val images [5K/1GB]验证图像2017 Train/Val annotations [241MB]训练集与验证集标注 json全部解压到coco2017文件夹后目录结构应为coco2017: 数据集根目录 ├── train2017: 训练图像118287 张 ├── val2017: 验证图像5000 张 └── annotations: ├── instances_train2017.json # 目标检测/实例分割训练标注 ├── instances_val2017.json # 目标检测/实例分割验证标注 ├── captions_train2017.json # 图像描述训练标注 ├── captions_val2017.json # 图像描述验证标注 ├── person_keypoints_train2017.json # 人体关键点训练标注 └── person_keypoints_val2017.json # 人体关键点验证标注对应源码 my_dataset_coco.py 中CocoDetection按root/train2017、root/annotations/instances_train2017.json拼接路径与上述结构严格对应。源码里还有一个细节值得了解COCO 的 80 个目标类别沿用了 stuff91 的稀疏索引最大索引为 90并非连续编号。CocoDetection在初始化时会把缺失的类别名补成N/A生成完整的coco91_indices.json供预测脚本映射类别名这正是 predict.py 中label_json_path./coco91_indices.json的来源。4.2 Pascal VOC2012 数据集从 VOC 官网下载 devkit 并解压后目录结构如下VOCdevkit └── VOC2012 ├── Annotations # 所有图像的 XML 标注 ├── ImageSets │ ├── Action # 人的行为动作图像信息 │ ├── Layout # 人的各个部位图像信息 │ ├── Main # 目标检测分类图像信息 │ │ ├── train.txt # 训练集(5717) │ │ ├── val.txt # 验证集(5823) │ │ └── trainval.txt # 训练集验证集(11540) │ └── Segmentation # 目标分割图像信息 │ ├── train.txt # 训练集(1464) │ ├── val.txt # 验证集(1449) │ └── trainval.txt # 训练集验证集(2913) ├── JPEGImages # 所有图像文件 ├── SegmentationClass # 语义分割 png基于类别 └── SegmentationObject # 实例分割 png基于目标注意使用 VOC 训练 Mask R-CNN 时实例分割的监督信号来自SegmentationObject基于目标编号的掩码图因此 my_dataset_voc.py 读取的是SegmentationObject目录。该脚本会用lxml解析 XML 得到 bbox 与类别my_dataset_voc.py并逐图检查 XML 中目标数量与掩码图中实例数量是否一致不一致的图片会被跳过并打印 warningmy_dataset_voc.py。五、训练方法5.1 单 GPU / CPU 训练train.py训练前需要确认三件事数据集已就绪、预训练权重已下载到当前目录、--num-classes与--data-path已正确设置。关键命令行参数来源train.py 的 argparse 定义参数默认值说明--data-path/data/coco2017数据集根目录--num-classes90目标类别数不包含背景--epochs26训练总轮数--lr0.004初始学习率8 卡每卡 2 图时的参考值为 0.02--momentum0.9SGD 动量--wd1e-4权重衰减--lr-steps[16, 22]MultiStepLR 的里程碑轮次--lr-gamma0.1学习率衰减倍数--batch-size2训练 batch size--aspect-ratio-group-factor3按高宽比分组采样减小显存占用--pretrainTrue是否加载 COCO 预训练权重--ampFalse是否启用混合精度训练--resume空上次训练权重路径支持断点续训--output-dir./save_weights权重保存目录训练指令以 COCO 为例--data-path必须指向数据集根目录# COCO 数据集 python train.py --data-path /data/coco2017 # Pascal VOC 数据集 python train.py --data-path /data/VOCdevkit5.2 多 GPU 分布式训练train_multi_GPU.py多卡训练使用torchrun启动--nproc_per_node为使用的 GPU 数量如需指定具体显卡在前面加CUDA_VISIBLE_DEVICES# 使用全部 8 块 GPU torchrun --nproc_per_node8 train_multi_GPU.py --batch-size 8 --lr 0.08 --pretrain False --amp True # 只使用设备中的第 1 块和第 4 块 GPU编号 0、3 CUDA_VISIBLE_DEVICES0,3 torchrun --nproc_per_node2 train_multi_GPU.py从 train_multi_GPU.py 可以看到完整的分布式训练流程init_distributed_mode(args)初始化进程组 →DistributedSampler划分数据 →SyncBatchNorm.convert_sync_batchnorm(model)可选同步 BN →DistributedDataParallel包裹模型 → 每个 epoch 开始时train_sampler.set_epoch(epoch)保证数据切分不重复。权重与日志写入只在主进程args.rank in [-1, 0]执行避免多进程重复写文件。多卡脚本的 batch size 是每块 GPU 上的 batch size学习率需要按0.02 / bs * num_GPU的规律缩放train_multi_GPU.py这就是复现命令中--batch-size 8 --lr 0.088 卡 × 每卡 8 张 总 batch 64对应 lr 0.08的由来。5.3 关键训练技巧与注意事项--data-path必须指向数据集根目录COCO 传/data/coco2017内部再拼train2017、annotationsVOC 传/data/VOCdevkit内部再拼VOC2012。学习率与 batch size 联动若 batch size 从 4 增到 8学习率也应从 0.004 增到 0.008保持线性缩放关系。BatchNorm 下限使用nn.BatchNorm2d时 batch size 不能小于 4否则效果变差。若显存不足必须小于 4建议在创建resnet50_fpn_backbone时将norm_layer设为FrozenBatchNorm2d或将trainable_layers设为 0冻结整个 backbone。这个建议在 train.py 的注释中给出了可取消注释的写法backbone 实现 resnet50_fpn_model.py 也对两个参数做了完整支持。训练日志训练过程会生成det_results{时间戳}.txt检测任务与seg_results{时间戳}.txt分割任务每行 14 个值 前 12 个 COCO 指标 平均损失 当前学习率train.py。推理脚本使用前必须将weights_path改为自己训练的权重路径predict.py。验证脚本需修改--num-classes、--data-path、--weights-path与--label-json-path按训练数据集设置其余代码尽量不要改动且要确保验证集/测试集中每个类别都有目标否则该类别的 mAP 无法计算。5.4 断点续训与混合精度--resume参数支持从断点继续训练。保存的 checkpoint 字典包含model、optimizer、lr_scheduler、epoch四部分开启--amp时还会额外保存scaler状态加载后从checkpoint[epoch] 1继续train.py。--amp开启混合精度训练后训练循环通过torch.cuda.amp.autocast与GradScaler配合完成前向与反向train_eval_utils.py在显存有限的情况下可以显著降低占用并加速训练。六、训练过程监控结果文件解读每个 epoch 训练结束后脚本会自动在验证集上评估并追加写入两个文本文件train.py。以仓库自带的 det_results20220406-141544.txt 为例epoch:0 0.171 0.342 0.154 0.099 0.211 0.213 0.184 0.315 0.334 0.168 0.375 0.440 1.3826 0.08每行 14 个数字依次对应COCO 标准 12 项指标AP[0.5:0.95]、AP0.5、AP0.75、小/中/大目标 AP、ARmaxDets1/10/100、小/中/大目标 AR 平均训练损失 学习率。可以看到 loss 随 epoch 递减1.38 → 0.91mAP 稳步上升这正是监控训练是否收敛的标准做法。训练结束后 plot_curve.py 会自动绘制 loss/lr 曲线与 mAP 曲线train.py方便直观观察训练动态。七、模型结构Mask R-CNN 网络实现剖析理解模型结构有助于调整超参。整个网络以 MaskRCNN 类为核心它继承自 Faster R-CNN 框架在其基础上额外挂载了掩码分支。7.1 前向流程FasterRCNNBase.forward 定义了完整调用链self.transform预处理图像归一化、缩放self.backbone提取多尺度特征图self.rpn生成候选框 proposals 并计算 RPN 损失self.roi_heads完成 ROI 分类、回归与掩码预测后处理将 bbox 还原到原图尺度。7.2 backboneResNet50 FPNresnet50_fpn_backbone 使用不含分类头的 ResNet50include_topFalse默认输出 layer1~layer4 四层特征图经 FPN 融合后每层通道统一为 256并在顶层额外挂LastLevelMaxPool得到 P5。关键参数trainable_layers0~5指定可训练的骨干层数。[layer4,layer3,layer2,layer1,conv1]依次对应 5 到 15 表示全部可训练此时会额外解冻bn1冻结部分通过parameter.requires_grad_(False)实现。本项目训练脚本默认传trainable_layers3即只训练 layer4、layer3 两层与后续检测头。norm_layer默认nn.BatchNorm2d显存受限时可改用FrozenBatchNorm2d参数不更新配合overwrite_eps将 eps 置 0 以兼容旧权重。7.3 掩码分支掩码分支由 MaskRCNNHeads4 层 3×3 卷积通道 256→256→256→256默认 dilation1与 MaskRCNNPredictor转置卷积上采样 2 倍 1×1 卷积输出每类别 logits组成。ROI 池化使用MultiScaleRoIAlign(output_size14, sampling_ratio2)mask_rcnn.py在 FPN 的 P2~P5 层上按 box 尺寸自适应选取特征层裁剪。推理阶段输出掩码为 [N, 1, H, W] 的连续值0-1需用阈值通常 0.5二值化得到最终实例分割图这正是文档与代码注释中反复强调的用法。7.4 关键超参一览MaskRCNN构造函数mask_rcnn.py中可调的默认值包括图像缩放min_size800, max_size1333RPN 侧rpn_pre_nms_top_n_train2000 / test1000、rpn_post_nms_top_n_train2000 / test1000、rpn_nms_thresh0.7、rpn_batch_size_per_image256检测头box_score_thresh0.05、box_nms_thresh0.5、box_detections_per_img100。predict.py会显式把 RPN 与检测头的 score 阈值统一设为 0.5 以获得更干净的预测结果predict.py。八、验证与推理8.1 推理预测predict.pypredict.py 是轻量推理脚本流程为加载权重 → 读取类别映射 json → 读取测试图 →ToTensor转 Tensor 并扩 batch 维 → 模型前向先用一张全零图预热以稳定推理计时→ 解析boxes / labels / scores / masks输出 → 调用 draw_box_utils.py 中的draw_objs绘制检测框 掩码并保存为test_result.jpg。使用前需按文档要求修改三处weights_path改成自己的权重、img_path改成测试图、label_json_pathCOCO 用coco91_indices.jsonVOC 用pascal_voc_indices.json。8.2 验证集指标计算validation.pyvalidation.py 用于在验证集/测试集上计算标准 COCO 指标并额外输出每个类别的 mAPIoU0.5。它通过EvalCOCOMetric分别按bbox与segm两种 iouType 评估validation.py最终把 COCO 12 项汇总指标写入det_record_mAP.txt与seg_record_mAP.txt并把逐类别 mAP 一并写入。必须注意验证集必须包含每个类别的目标否则summarize中s[s -1]为空会得到 -1。文档要求此时只需修改--num-classes、--data-path、--weights-path、--label-json-path四个参数其他代码不要改动。九、复现结果文档给出了在 COCO2017 上仅加载 ResNet50 预训练权重、训练 26 个 epoch 的复现方案torchrun --nproc_per_node8 train_multi_GPU.py --batch-size 8 --lr 0.08 --pretrain False --amp True在 COCO2017 验证集上的复现指标如下。目标检测任务bboxAverage Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.381 Average Precision (AP) [ IoU0.50 | area all | maxDets100 ] 0.588 Average Precision (AP) [ IoU0.75 | area all | maxDets100 ] 0.411 Average Precision (AP) [ IoU0.50:0.95 | area small | maxDets100 ] 0.215 Average Precision (AP) [ IoU0.50:0.95 | areamedium | maxDets100 ] 0.420 Average Precision (AP) [ IoU0.50:0.95 | area large | maxDets100 ] 0.492 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets 1 ] 0.315 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets 10 ] 0.499 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets100 ] 0.523 Average Recall (AR) [ IoU0.50:0.95 | area small | maxDets100 ] 0.319 Average Recall (AR) [ IoU0.50:0.95 | areamedium | maxDets100 ] 0.565 Average Recall (AR) [ IoU0.50:0.95 | area large | maxDets100 ] 0.666实例分割任务segmAverage Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.340 Average Precision (AP) [ IoU0.50 | area all | maxDets100 ] 0.552 Average Precision (AP) [ IoU0.75 | area all | maxDets100 ] 0.361 Average Precision (AP) [ IoU0.50:0.95 | area small | maxDets100 ] 0.151 Average Precision (AP) [ IoU0.50:0.95 | areamedium | maxDets100 ] 0.369 Average Precision (AP) [ IoU0.50:0.95 | area large | maxDets100 ] 0.500 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets 1 ] 0.290 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets 10 ] 0.449 Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets100 ] 0.468 Average Recall (AR) [ IoU0.50:0.95 | area small | maxDets100 ] 0.266 Average Recall (AR) [ IoU0.50:0.95 | areamedium | maxDets100 ] 0.509 Average Recall (AR) [ IoU0.50:0.95 | area large | maxDets100 ] 0.619可见在仅用 ResNet50 预训练不加载 Mask R-CNN 的 COCO 权重的情况下26 个 epoch 后检测 AP 可达 0.381、分割 AP 达 0.340验证了本项目代码实现的有效性。仓库中的 det_results20220406-141544.txt 与 seg_results20220406-141544.txt 记录了同一次训练逐 epoch 的完整指标曲线可作为对照参考。十、扩展阅读若想深入理解 Mask R-CNN 的检测部分RPN、ROI Head、FPN本仓库同目录下的 pytorch_object_detection/faster_rcnn 提供了 Faster R-CNN 的完整实现与训练教程mask_rcnn/network_files/中的框架代码与其高度共享训练循环与 COCO 评估器的具体实现位于 train_eval_utils.py 与 coco_eval.py如需改造损失或指标可重点研读若对 Mask R-CNN 的原理细节如 ROI Align、掩码分支训练不熟悉可参考文档末尾推荐的视频讲解资料。赞分享示例工程【免费下载链接】deep-learning-for-image-processingdeep learning for image processing including classification and object-detection etc.项目地址https://gitcode.com/gh_mirrors/de/deep-learning-for-image-processing点击查看免费下载相关推荐U-Net 图像分割实战基于 deep-learning-for-image-processing 仓库的 DRIVE 视网膜血管分割与 PyTorch 训练部署指南U Net 图像分割实战基于 deep learning for image processing 仓库的 DRIVE 视网膜血管分割与 PyTorch 训练示例工程Mask R-CNN 实例分割实战指南基于 Keras TensorFlow 的完整训练与检测管线Mask R CNN 实例分割实战指南基于 Keras TensorFlow 的完整训练与检测管线 本文以 Matterport 开源的 Mask_RCN人工智能深度学习计算机视觉deep-learning-for-image-processing 实战使用 PyTorch 训练与部署 Swin Transformer 图像分类模型deep learning for image processing 实战使用 PyTorch 训练与部署 Swin Transformer 图像分类模型 本示例工程上一篇IDB-Keyval错误处理完全指南从DataError到DataCloneError下一篇用 Flax 在 LM1B 上训练 Transformer 语言模型完整实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表