在开始实例分割项目前,环境配置是第一步也是最重要的一步。我遇到过不少开发者因为环境问题浪费好几天时间,其实只要注意几个关键点就能避免踩坑。
首先确认你的CUDA版本,这决定了后续所有组件的兼容性。运行nvidia-smi查看驱动支持的CUDA最高版本,再通过nvcc --version查看当前安装的CUDA版本。建议使用CUDA 11.3以上版本,这是目前主流深度学习框架的最佳兼容版本。
安装PyTorch时要注意与CUDA版本的匹配。比如对于CUDA 11.3,应该使用:
bash复制pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
接下来安装mmcv-full,这是mmdetection的核心依赖。必须严格匹配PyTorch和CUDA版本:
bash复制pip install mmcv-full==1.7.1 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.12.1/index.html
最后安装mmdetection:
bash复制git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -v -e .
注意:如果使用Docker环境,推荐直接使用OpenMMLab官方镜像,可以省去环境配置的麻烦:
bash复制docker pull openmmlab/mmdetection:latest
验证安装是否成功:
python复制from mmdet.apis import init_detector
print(init_detector.__doc__) # 能看到函数说明即表示安装成功
数据标注质量直接决定模型上限。在工业质检项目中,我标注过上万张PCB缺陷图片,总结出几个实用技巧:
标注完成后,目录结构应该如下:
code复制data_annotated/
├── img1.jpg
├── img1.json
├── img2.jpg
└── img2.json
转换为COCO格式的脚本需要特别注意几点:
python复制# labelme2coco.py关键修改点
def convert(self):
# 确保categories中的id从1开始
for i, name in enumerate(self.label_names, 1):
self.categories.append({
"id": i,
"name": name,
"supercategory": name
})
# 处理每个标注文件
for image_id, filename in enumerate(self.filenames):
# 转换多边形坐标时要处理嵌套情况
for shape in label_data["shapes"]:
if len(shape["points"]) < 3:
continue # 跳过不构成多边形的标注
segmentation = self._get_segmentation(shape["points"])
转换后的COCO数据集结构:
code复制data_dataset_coco/
├── annotations
│ └── instances_train.json
└── train
├── img1.jpg
└── img2.jpg
提示:对于工业场景,建议保留10%的标注数据作为测试集,不要参与任何数据增强,这样才能真实评估模型性能。
mmdetection的配置文件系统非常灵活但也容易让人困惑。通过一个交通标志识别项目来具体说明:
首先复制基础配置文件:
bash复制cp configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py configs/my_config/mask_rcnn_traffic.py
关键修改部分:
python复制# 模型头修改
model = dict(
roi_head=dict(
bbox_head=dict(
num_classes=6), # 修改为实际类别数
mask_head=dict(
num_classes=6)))
# 数据流水线增强
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True, with_mask=True),
dict(
type='Resize',
img_scale=[(1333, 640), (1333, 800)], # 多尺度训练
keep_ratio=True),
dict(type='RandomFlip', flip_ratio=0.5),
dict(
type='Normalize',
mean=[123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375],
to_rgb=True),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks'])
]
# 学习率策略调整
optimizer = dict(
type='AdamW',
lr=0.0001,
weight_decay=0.0001,
paramwise_cfg=dict(
custom_keys={
'backbone': dict(lr_mult=0.1),
'norm': dict(decay_mult=0.)
}))
对于小数据集,建议启用以下配置提升性能:
python复制# 在小样本场景下特别有效
train_cfg = dict(
rpn=dict(
sampler=dict(
num=256,
pos_fraction=0.5,
neg_pos_ub=-1,
add_gt_as_proposals=False)),
rcnn=dict(
sampler=dict(
num=512,
pos_fraction=0.25,
neg_pos_ub=-1,
add_gt_as_proposals=True)))
启动训练时有几个实用技巧:
bash复制# 分布式训练(2块GPU)
./tools/dist_train.sh configs/my_config/mask_rcnn_traffic.py 2 \
--work-dir work_dirs/mask_rcnn_traffic \
--seed 42 \
--deterministic \
--options model.pretrained='checkpoints/mask_rcnn_r50_fpn_1x_coco.pth'
训练过程中的关键监控指标:
当出现以下情况时需要调整策略:
一个实用的学习率自动调整策略:
python复制# 在schedule配置中添加
lr_config = dict(
policy='CosineAnnealing',
warmup='linear',
warmup_iters=500,
warmup_ratio=0.001,
min_lr_ratio=1e-5,
by_epoch=False) # 按迭代次数调整
模型评估不仅是跑个测试脚本那么简单。在医疗影像项目中,我们发现这些分析方法特别有用:
批量测试时添加--show选项可以保存预测结果:
bash复制./tools/dist_test.sh configs/my_config/mask_rcnn_traffic.py \
work_dirs/mask_rcnn_traffic/latest.pth 2 \
--eval bbox segm \
--show-dir results_visualization \
--show-score-thr 0.3
对于关键样本分析,这个可视化脚本很实用:
python复制import matplotlib.pyplot as plt
from mmdet.apis import init_detector, show_result_pyplot
config = 'configs/my_config/mask_rcnn_traffic.py'
checkpoint = 'work_dirs/mask_rcnn_traffic/latest.pth'
model = init_detector(config, checkpoint)
img = 'test_images/001.jpg'
result = inference_detector(model, img)
# 自定义可视化
fig = plt.figure(figsize=(16, 9))
ax = fig.add_subplot(1, 1, 1)
ax.imshow(plt.imread(img))
model.show_result(
img,
result,
score_thr=0.5,
show=False,
wait_time=0,
bbox_color=(72, 101, 241),
text_color=(72, 101, 241),
mask_color='red',
ax=ax)
plt.savefig('detailed_analysis.jpg', dpi=300)
常见问题诊断方法:
实际部署时发现原始模型太大,通过以下方法优化:
首先进行模型剪枝:
python复制# 在配置文件中添加
model = dict(
backbone=dict(
type='ResNeXt',
depth=101,
groups=32,
base_width=4,
num_stages=4,
out_indices=(0, 1, 2, 3),
frozen_stages=1,
norm_cfg=dict(type='BN', requires_grad=True),
style='pytorch',
dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False),
stage_with_dcn=(False, True, True, True)))
然后使用MMDeploy转换模型:
bash复制python tools/deploy.py \
configs/mmdet/instance-seg/instance-seg_tensorrt_dynamic-320x320-1344x1344.py \
../mmdetection/configs/my_config/mask_rcnn_traffic.py \
../mmdetection/work_dirs/mask_rcnn_traffic/latest.pth \
../mmdetection/demo/demo.jpg \
--work-dir work_dirs/trt_model \
--device cuda:0 \
--dump-info
部署后的性能对比:
| 模型类型 | 推理速度(FPS) | mAP | 显存占用 |
|---|---|---|---|
| 原始模型 | 15.2 | 0.42 | 3421MB |
| 优化后 | 28.7 | 0.41 | 1876MB |
在Jetson Xavier NX上的实测建议: