【避坑指南】SOLO/SOLOv2实例分割:从零到一的服务器环境配置与COCO指标生成实战
1. 环境配置:从零搭建SOLO/SOLOv2开发环境
第一次在服务器上配置SOLO环境时,我盯着满屏的版本冲突报错整整两天。如果你用的也是RTX 20系列显卡(比如2080Ti或2060),下面这套经过实战检验的配置方案能帮你省下80%的排查时间。关键点在于版本锁死——PyTorch 1.4.0+mmdetection v1.0.0+mmcv 0.2.15这个组合,是我在五台不同配置的服务器上验证过的稳定方案。
先说说为什么30系显卡容易翻车。CUDA 11.x对新显卡的支持确实更好,但SOLO原始代码库对PyTorch 1.4.0的依赖导致很多算子需要重新编译。有次我用RTX 3090折腾了三天都没搞定,最后换回2080Ti一次成功。所以如果你的项目周期紧张,建议直接使用20系显卡。
具体操作步骤:
- 创建隔离环境(避免污染系统Python):
conda create -n solo python==3.7.3 conda activate solo- 安装指定版本的PyTorch(注意cuda版本要匹配驱动):
pip install torch==1.4.0 torchvision==0.5.0 -i https://pypi.tuna.tsinghua.edu.cn/simple- 克隆特定版本的mmdetection:
git clone -b v1.0.0 https://github.com/open-mmlab/mmdetection.git cd mmdetection这里有个隐藏坑点:pytest-runner必须在mmcv之前安装。我有次把这两个包的安装顺序搞反,结果编译时出现诡异的循环依赖错误。正确的完整依赖安装命令应该是:
pip install cython numpy albumentations==0.3.2 imagecorruptions matplotlib pip install pytest-runner # 关键!必须在前 pip install mmcv==0.2.15 Pillow==6.2.2编译时如果遇到"undefined symbol"错误,大概率是CUDA版本不匹配。可以用nvcc --version和python -c "import torch; print(torch.version.cuda)"对比查看,两者显示的CUDA版本号必须一致。
2. 测试环境:验证安装正确性的完整流程
环境装好只是第一步,真正的考验是让模型跑起来。我建议在开始训练前,先用官方demo做完整测试。这个环节能提前暴露90%的环境问题,比等到训练时才发现问题要高效得多。
测试数据准备阶段有个易错点:很多人会直接下载最新的预训练模型,但这可能和我们的老版本环境不兼容。正确的做法是从SOLOv2的release页面下载v1.0对应的模型文件。我有次用错模型版本,结果inference时出现诡异的张量维度错误。
具体测试步骤:
- 在SOLO目录下创建checkpoints文件夹
- 下载对应的模型权重文件(如solo_r50_fpn_1x.pth)
- 修改demo/inference_demo.py中的模型路径:
config_file = 'configs/solo/solo_r50_fpn_1x.py' checkpoint_file = 'checkpoints/solo_r50_fpn_1x.pth'- 运行测试脚本:
cd demo python inference_demo.py成功运行时会在demo目录生成demo_out.jpg。如果报错"KeyError: 'CLASSES'",说明mmdetection的版本有问题——v1.0.0和v2.x的API接口有重大变更。这也是为什么我强调必须用指定版本。
3. 自定义数据集训练:COCO格式适配实战
用公开数据集跑通demo只是开始,真正的挑战是如何训练自己的数据。SOLO要求数据必须是COCO格式,但很多新手会在数据预处理阶段踩坑。去年我帮一个医疗影像团队做适配时,就遇到过标注文件格式错误导致训练崩溃的问题。
数据准备的关键点:
- 目录结构必须严格遵循:
data/coco/ ├── annotations │ ├── instances_train2017.json │ └── instances_val2017.json ├── train2017 │ └── *.jpg └── val2017 └── *.jpg- JSON文件中的categories字段需要包含所有类别ID和名称:
"categories": [ {"id": 1, "name": "cat"}, {"id": 2, "name": "dog"} ]对于从labelme标注转换的场景,推荐使用这个Python脚本处理:
import json from labelme2coco import convert convert('labelme_annotations', 'coco_output', 'your_dataset')配置文件修改有三个致命细节:
- 在mmdet/datasets/下新建your_data.py:
from .coco import CocoDataset from .registry import DATASETS @DATASETS.register_module class YourData(CocoDataset): CLASSES = ('cat', 'dog') # 你的类别列表- 修改mmdet/datasets/init.py注册新数据集:
from .your_data import YourData __all__ += ['YourData']- 调整config中的关键参数:
model = dict( bbox_head=dict(num_classes=3)) # 类别数+1(背景) data = dict( train=dict( ann_file='data/coco/annotations/instances_train2017.json', img_prefix='data/coco/train2017/'))4. COCO指标生成与结果分析
训练完成后,用COCO标准评估模型性能是验证效果的关键。但很多开发者会忽略评估时的细节配置,导致结果出现偏差。我在最近一个工业检测项目中就发现,同样的模型在不同评估参数下mAP相差超过5%。
正确的评估命令应该是:
python tools/test_ins.py \ configs/solo/solo_r50_fpn_8gpu_3x.py \ work_dirs/solo_release_r50_fpn_8gpu_3x/epoch_36.pth \ --eval segm \ --out results.pkl关键参数说明:
--eval segm:计算实例分割指标(默认只算检测指标)--show:可视化预测结果(调试时建议开启)--options "classwise=True":显示每个类别的详细指标
解读结果时要特别注意几个指标:
- AP(Average Precision):IoU阈值从0.5到0.95的平均精度
- AP50:IoU阈值为0.5时的精度
- AP75:IoU阈值为0.75时的精度
- AR(Average Recall):最大检测数为100时的平均召回率
如果发现AP50远高于AP,说明模型对边界定位不够精确。这时应该:
- 检查数据集中是否存在标注偏移
- 调整模型中的mask_thr参数(默认0.5)
- 增加训练时的多尺度数据增强
最后提醒一个存储细节:评估生成的results.pkl文件可能很大(特别是测试集较大时),建议定期清理以免占满磁盘空间。我有次就因为这个文件把服务器200G的存储空间撑爆了。
