1. 环境准备与Detectron2安装第一次接触Detectron2时我花了两天时间才把环境配好。这里分享几个关键点帮你避开我踩过的坑。Detectron2对PyTorch和CUDA版本有严格要求建议使用Python 3.8和PyTorch 1.9的组合。实测在RTX 3090上PyTorch 1.12 CUDA 11.3最稳定。安装其实就一行命令pip install githttps://github.com/facebookresearch/detectron2.git但有几个隐藏细节需要注意如果遇到Could not build wheels错误先安装VS Build ToolsWindows或gccLinux国内用户建议用清华镜像源加速安装安装完成后务必验证import detectron2 print(detectron2.__version__)我推荐用conda创建独立环境避免与其他项目冲突。曾经有个项目因为numpy版本不兼容导致训练崩溃重装环境浪费了半天时间。环境配置看似简单却是后续所有工作的基础值得多花点时间确保万无一失。2. 数据集注册实战技巧原始文章提到了修改builtin.py的方法但实际开发中我强烈建议不要直接修改框架源码。更好的做法是通过代码动态注册这样更利于团队协作和版本控制。假设你的数据集结构如下/my_dataset ├── annotations │ ├── instances_train.json │ └── instances_val.json ├── train └── val注册代码可以这样写from detectron2.data import DatasetCatalog, MetadataCatalog from detectron2.data.datasets import register_coco_instances def register_dataset(): register_coco_instances(my_train, {}, /my_dataset/annotations/instances_train.json, /my_dataset/train) register_coco_instances(my_val, {}, /my_dataset/annotations/instances_val.json, /my_dataset/val) MetadataCatalog.get(my_train).thing_classes [cat, dog] MetadataCatalog.get(my_val).thing_classes [cat, dog]这里有个实用技巧在训练前用可视化工具检查标注是否正确from detectron2.utils.visualizer import Visualizer import random dataset_dicts DatasetCatalog.get(my_train) metadata MetadataCatalog.get(my_train) for d in random.sample(dataset_dicts, 3): img cv2.imread(d[file_name]) visualizer Visualizer(img[:, :, ::-1], metadatametadata, scale0.5) vis visualizer.draw_dataset_dict(d) cv2_imshow(vis.get_image()[:, :, ::-1])3. 配置文件深度定制Mask R-CNN在Detectron2中有多种预置配置我推荐从R50-FPN-3x.yaml开始。这个配置文件包含几个关键部分需要调整模型结构配置MODEL: META_ARCHITECTURE: GeneralizedRCNN WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl BACKBONE: NAME: build_resnet_fpn_backbone RESNETS: DEPTH: 50 ROI_HEADS: NUM_CLASSES: 2 # 你的类别数数据加载配置DATALOADER: NUM_WORKERS: 4 # 根据CPU核心数调整 FILTER_EMPTY_ANNOTATIONS: True INPUT: MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) # 多尺度训练 MAX_SIZE_TRAIN: 1333 MIN_SIZE_TEST: 800 MAX_SIZE_TEST: 1333优化器配置根据显存调整SOLVER: IMS_PER_BATCH: 8 # 总batch size BASE_LR: 0.02 # 对应8GPU的基准学习率 MAX_ITER: 90000 STEPS: (60000, 80000) CHECKPOINT_PERIOD: 5000实测发现对于小数据集1万张将MAX_ITER减半效果更好。学习率调整有个经验公式BASE_LR 0.02 * (你的batch_size / 16)。4. 训练过程监控与调优启动训练后我习惯用TensorBoard监控关键指标tensorboard --logdir output/ --port 6006几个需要重点关注的曲线total_loss应该稳步下降如果震荡剧烈可能需要降低学习率fast_rcnn/cls_accuracy分类准确率正常应在0.9以上mask_rcnn/accuracy分割准确率反映模型分割能力遇到常见问题时可以这样处理显存不足减小IMS_PER_BATCH或使用梯度累积训练不收敛检查数据标注质量适当减小BASE_LR过拟合增加数据增强如随机翻转、裁剪我常用的数据增强配置from detectron2.data import transforms as T def build_train_aug(cfg): return [ T.RandomFlip(horizontalTrue), T.RandomRotation(angle[-15, 15]), T.RandomBrightness(0.8, 1.2), T.RandomContrast(0.8, 1.2), ]5. 模型评估与结果分析训练完成后用COCO API评估模型性能from detectron2.evaluation import COCOEvaluator evaluator COCOEvaluator(my_val, output_dir./output) val_loader build_detection_test_loader(cfg, my_val) print(inference_on_dataset(trainer.model, val_loader, evaluator))关键指标解读AP平均精度IoU阈值0.5:0.95AP50IoU阈值0.5时的精度AP75IoU阈值0.75时的精度APs/m/l小/中/大目标的精度如果发现小目标(APs)表现差可以尝试减小RPN的ANCHOR_SIZE增加FPN的P6/P7层使用更密集的anchor设置最后保存模型用于推理from detectron2.modeling import build_model model build_model(cfg) DetectionCheckpointer(model).save(model_final)6. 实战中的经验分享在多个工业项目中我发现这些技巧特别实用类别不平衡处理在ROI_HEADS中添加类别权重cfg.MODEL.ROI_HEADS.CLASS_WEIGHT [1.0, 2.0] # 对少数类别加权冻结部分层加速训练for name, param in model.named_parameters(): if backbone in name: param.requires_grad False自定义评估指标继承COCOEvaluator实现业务特定指标模型量化部署使用torchscript导出优化后的模型ts_model torch.jit.script(model) ts_model.save(model_ts.pt)记得定期保存checkpoint我曾经因为服务器宕机丢失了三天训练结果。建议设置CHECKPOINT_PERIOD为每epoch迭代次数的整数倍。
从零到一:基于Detectron2与Mask R-CNN的自定义实例分割模型实战训练
发布时间:2026/6/23 19:43:34
1. 环境准备与Detectron2安装第一次接触Detectron2时我花了两天时间才把环境配好。这里分享几个关键点帮你避开我踩过的坑。Detectron2对PyTorch和CUDA版本有严格要求建议使用Python 3.8和PyTorch 1.9的组合。实测在RTX 3090上PyTorch 1.12 CUDA 11.3最稳定。安装其实就一行命令pip install githttps://github.com/facebookresearch/detectron2.git但有几个隐藏细节需要注意如果遇到Could not build wheels错误先安装VS Build ToolsWindows或gccLinux国内用户建议用清华镜像源加速安装安装完成后务必验证import detectron2 print(detectron2.__version__)我推荐用conda创建独立环境避免与其他项目冲突。曾经有个项目因为numpy版本不兼容导致训练崩溃重装环境浪费了半天时间。环境配置看似简单却是后续所有工作的基础值得多花点时间确保万无一失。2. 数据集注册实战技巧原始文章提到了修改builtin.py的方法但实际开发中我强烈建议不要直接修改框架源码。更好的做法是通过代码动态注册这样更利于团队协作和版本控制。假设你的数据集结构如下/my_dataset ├── annotations │ ├── instances_train.json │ └── instances_val.json ├── train └── val注册代码可以这样写from detectron2.data import DatasetCatalog, MetadataCatalog from detectron2.data.datasets import register_coco_instances def register_dataset(): register_coco_instances(my_train, {}, /my_dataset/annotations/instances_train.json, /my_dataset/train) register_coco_instances(my_val, {}, /my_dataset/annotations/instances_val.json, /my_dataset/val) MetadataCatalog.get(my_train).thing_classes [cat, dog] MetadataCatalog.get(my_val).thing_classes [cat, dog]这里有个实用技巧在训练前用可视化工具检查标注是否正确from detectron2.utils.visualizer import Visualizer import random dataset_dicts DatasetCatalog.get(my_train) metadata MetadataCatalog.get(my_train) for d in random.sample(dataset_dicts, 3): img cv2.imread(d[file_name]) visualizer Visualizer(img[:, :, ::-1], metadatametadata, scale0.5) vis visualizer.draw_dataset_dict(d) cv2_imshow(vis.get_image()[:, :, ::-1])3. 配置文件深度定制Mask R-CNN在Detectron2中有多种预置配置我推荐从R50-FPN-3x.yaml开始。这个配置文件包含几个关键部分需要调整模型结构配置MODEL: META_ARCHITECTURE: GeneralizedRCNN WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl BACKBONE: NAME: build_resnet_fpn_backbone RESNETS: DEPTH: 50 ROI_HEADS: NUM_CLASSES: 2 # 你的类别数数据加载配置DATALOADER: NUM_WORKERS: 4 # 根据CPU核心数调整 FILTER_EMPTY_ANNOTATIONS: True INPUT: MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) # 多尺度训练 MAX_SIZE_TRAIN: 1333 MIN_SIZE_TEST: 800 MAX_SIZE_TEST: 1333优化器配置根据显存调整SOLVER: IMS_PER_BATCH: 8 # 总batch size BASE_LR: 0.02 # 对应8GPU的基准学习率 MAX_ITER: 90000 STEPS: (60000, 80000) CHECKPOINT_PERIOD: 5000实测发现对于小数据集1万张将MAX_ITER减半效果更好。学习率调整有个经验公式BASE_LR 0.02 * (你的batch_size / 16)。4. 训练过程监控与调优启动训练后我习惯用TensorBoard监控关键指标tensorboard --logdir output/ --port 6006几个需要重点关注的曲线total_loss应该稳步下降如果震荡剧烈可能需要降低学习率fast_rcnn/cls_accuracy分类准确率正常应在0.9以上mask_rcnn/accuracy分割准确率反映模型分割能力遇到常见问题时可以这样处理显存不足减小IMS_PER_BATCH或使用梯度累积训练不收敛检查数据标注质量适当减小BASE_LR过拟合增加数据增强如随机翻转、裁剪我常用的数据增强配置from detectron2.data import transforms as T def build_train_aug(cfg): return [ T.RandomFlip(horizontalTrue), T.RandomRotation(angle[-15, 15]), T.RandomBrightness(0.8, 1.2), T.RandomContrast(0.8, 1.2), ]5. 模型评估与结果分析训练完成后用COCO API评估模型性能from detectron2.evaluation import COCOEvaluator evaluator COCOEvaluator(my_val, output_dir./output) val_loader build_detection_test_loader(cfg, my_val) print(inference_on_dataset(trainer.model, val_loader, evaluator))关键指标解读AP平均精度IoU阈值0.5:0.95AP50IoU阈值0.5时的精度AP75IoU阈值0.75时的精度APs/m/l小/中/大目标的精度如果发现小目标(APs)表现差可以尝试减小RPN的ANCHOR_SIZE增加FPN的P6/P7层使用更密集的anchor设置最后保存模型用于推理from detectron2.modeling import build_model model build_model(cfg) DetectionCheckpointer(model).save(model_final)6. 实战中的经验分享在多个工业项目中我发现这些技巧特别实用类别不平衡处理在ROI_HEADS中添加类别权重cfg.MODEL.ROI_HEADS.CLASS_WEIGHT [1.0, 2.0] # 对少数类别加权冻结部分层加速训练for name, param in model.named_parameters(): if backbone in name: param.requires_grad False自定义评估指标继承COCOEvaluator实现业务特定指标模型量化部署使用torchscript导出优化后的模型ts_model torch.jit.script(model) ts_model.save(model_ts.pt)记得定期保存checkpoint我曾经因为服务器宕机丢失了三天训练结果。建议设置CHECKPOINT_PERIOD为每epoch迭代次数的整数倍。