MMDetectionV2 + Colab 超详细教程及踩坑实录

本文是关于在Colab上使用MMDetectionV2进行深度学习目标检测的详细教程,涵盖了环境配置、数据集准备、配置文件修改、在线训练和模型效果可视化等步骤。作者在实践中遇到并解决了各种问题,提供了宝贵的踩坑经验,旨在帮助初学者顺利进行目标检测研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

为了参加讯飞的X光目标检测竞赛,我们组研究了目前通用的几种框架。包括Detectron2, Maskrcnn Benchmark和mmdetectionV2,最后决定采用MMDetectonV2,因为他有以下的几个特性:

  • 相比较来说非常丰富的模型库可供选择。基础模型包括:
    1. Faster rcnn
    2. Mask rcnn
    3. Rpn rcnn
    4. Cascade mask rcnn
    5. Cascade rcnn
    6. Retinanet (据说精度差不多的情况下,inference速度最快,可以以后再多了解一下。
  • 较多参考资料
  • 安全的License,Apache License 2.0

先说明下,为什么我要这么执着的使用Colab:

  1. Colab Pro订阅能够提供一般学生无法获得的算力资源:P100, 16g内存,$9.9/month简直在做慈善。
  2. 服务器在国外,免除网速烦恼。所有模型,包都是秒下秒装。虽然每个session重启都要重新装包,不过有这个速度完全不用担心花费过多时间。
  3. 小白能专注上手跑模型,调参本身。配置环境的痛苦,想想你们学者最开始装Docker、Anaconda等工具的时候,一不小心环境全乱了,电脑都打不开,几个小时一事无成的感觉,懂得都懂。

However, 为了获得以上的好处,我尝试在mmdetection官网提供的tutorial 中更改,结果一言难尽。同时,目前绝大多数的mmdetection的笔记都是基于1.x版本,而且几乎没有在Colab环境的配置教程。基本所有能踩的坑我全部踩了个遍,为了纪念一下也为了给其他的目标检测学习者提供一下参考,就有了这篇笔记。
在主体上我将采用colab tutorial的框架来介绍,但是仍然强烈建议在本地安装配置好mmdetectionV2,能省下大把力气。

一、环境配置

# Check nvcc version
!nvcc -V
# Check GCC version
!gcc --version

编写时间:2020.8.11,colab预设为pytorch1.6.0 Cuda 10.1 gcc 7.5.0

# install dependencies: (use cu101 because colab has CUDA 10.1)
# 目前mmdetection只支持pytorch1.5.1及以下版本,使用1.6版本会报各种错。
!pip install -U torch==1.5.1+cu101 torchvision==0.6.1+cu101 -f https://download.pytorch.org/whl/torch_stable.html
# !pip install -U torch==1.6+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html

# install mmcv-full thus we could use CUDA operators,此步需要花费大量时间,be patient
!pip install mmcv-full
# 在2020二月份pycocotools api有更新,而colab没有配置最新的包,需要在这里重新安装,看情况需不需要重启runtime
# install albumentations
!pip install -U git+https://github.com/albu/albumentations --no-cache-dir
!pip install "git+https://github.com/open-mmlab/cocoapi.git#subdirectory=pycocotools"


# Install mmdetection
!rm -rf mmdetection
!git clone https://github.com/open-mmlab/mmdetection.git
%cd mmdetection


!pip install -e .


# install Pillow 7.0.0 back in order to avoid bug in colab
!pip install Pillow==7.0.0
# Check Pytorch installation
import torch, torchvision

print(torch.__version__, torch.cuda.is_available())


# Check MMDetection installation
import mmdet

print(mmdet.__version__)


# Check mmcv installation
from mmcv.ops import get_compiling_cuda_version, get_compiler_version

print(get_compiling_cuda_version())
print(get_compiler_version())

Output:
1.5.1+cu101
True 2.3.0
10.1
GCC 7.5

挂载在自己的drive上:

from google.colab import drive

drive.mount('/content/drive')

在colab上,使用%cd或os.chdir(’…’)来切换工作目录

import os
os.chdir('../content/drive/My Drive/mmdetection')
!pwd
!ls

output:
/content/drive/My Drive/mmdetection/mmdetection
configs docs mmdet.egg-info requirements setup.cfg tools
demo LICENSE pytest.ini requirements.txt setup.py
docker mmdet README.md resources tests

二、准备自己的数据集

这是非常重要的一步,请务必按照以下的Tree准备自己的数据集,能给自己省下大量的麻烦。

mmdetection
├── mmdet
├── tools
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   ├── train2017
│   │   ├── val2017
│   │   ├── test2017
│   ├── cityscapes
│   │   ├── annotations
│   │   ├── leftImg8bit
│   │   │   ├── train
│   │   │   ├── val
│   │   ├── gtFine
│   │   │   ├── train
│   │   │   ├── val
│   ├── VOCdevkit
│   │   ├── VOC2007
│   │   ├── VOC2012

这次任务中,提供给我们的是voc格式的数据。第一步需要做转化,voc2coco.ipynb.
具体操作在这里不详细展开,我将来会详细写一篇各数据集转化到VOC,COCO数据集格式的文章。

Aug.14更新

本地做了mixup strategy数据增广,具体实现见后续博客。
每次做完本地的数据增广后,需要转化成COCO再重新上传。因为COCO的格式需要所有注释放在同一个json文件中,所以需要重新生成。

三:修改config文件

这里是我花了最多时间的地方,在tutorial中,官方是载入了一个config和它对应的模型,之后在colab即ipython 中用命令一行一行修改,这种方法在你非常明确MMDetectionV2的config结构和训练方式的情况下,是有一定灵活性的。但是如果不了解config的搭建方法,这会让你非常懵逼,多达一百多行的config命令实在非常难以轻松上手。这里我会介绍两种方法,一种是在本地修改好config文件上传,同时会介绍如何在colab cells中用命令修改。

3.1 文件结构

.
├── coco_exps
├── configs         #configs主要修改的部分在这里,训练config也是从这里继承的
│   ├── albu_example
│   ├── atss
│   ├── _base_          #最根本的继承
│   │   ├── datasets  #存在着不同数据集的训练方法,包含train_pipeline(augmentation), test_pipeline(TTA), data(batch_size, data root)等信息
│   │   ├── models #保存着基础模型,需要在这里修改num_classes来适配自己的任务
│   │   └── schedules #保存着lr_schedule:1x, 2x, 20e,每x意味着12个epochs
│   ├── carafe    
│   ├── cascade_rcnn
│   ├── cityscapes
│   ├── cornernet
│   ├── dcn
│   ├── deepfashion
│   ├── detectors
│   ├── double_heads
│   ├── dynamic_rcnn
│   ├── empirical_attention
│   ├── faster_rcnn
│   ├── fast_rcnn
│   ├── fcos
│   ├── foveabox
│   ├── fp16
│   ├── free_anchor
│   ├── fsaf
│   ├── gcnet
│   ├── gfl
│   ├── ghm
│   ├── gn
│   ├── gn+ws
│   ├── grid_rcnn
│   ├── groie
│   ├── guided_anchoring
│   ├── hrnet
│   ├── htc
│   ├── instaboost
│   ├── legacy_1.x
│   ├── libra_rcnn
│   ├── lvis
│   ├── mask_rcnn
│   ├── ms_rcnn
│   ├── nas_fcos
│   ├── nas_fpn
│   ├── pafpn
│   ├── pascal_voc
│   ├── pisa
│   ├── point_rend
│   ├── regnet
│   ├── reppoints
│   ├── res2net
│   ├── retinanet
│   ├── rpn
│   ├── scratch
│   ├── ssd
│   └── wider_face
├── data
│   └── coco        #把整理好的coco数据集放在这里
│       ├── annotations
│       ├── test2017
│       ├── train2017
│       └── val2017
├── mmdet            #这里存放着mmdet的一些内部构件
│   ├── datasets        #需要在这里的coco.py更改CLASSES,相当于Detectron2注册数据集
│   │   ├── pipelines
│   │   │   └── __pycache__
│   │   ├── __pycache__
│   │   └── samplers
│   │       └── __pycache__
│   ├── core         
│   │   ├── evaluation #在这里修改evaluation相关的config。如在coco_classes中修改return的classes_names

3.2 (本地)修改config文件

这里非常建议在本地修改config文件再上传到drive上,或者在colab提供的文件目录中修改。如图所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YfTjwL0L-1597826737896)(evernotecid://BC7CFB48-5C18-439C-ADB2-AD1171DE2741/appyinxiangcom/18838120/ENResource/p258)]

因为colab使用的ipython shell,每个参数的修改都需要使用cfg的api去修改,很容易漏项或lose track,而且mmdetection V2有一个非常精密的inherit config系统,不用结构化的IDE修改实在有点可惜。最后一点,在后期inference testset的时候,必须从.py文件中读取test_config,为什么不一劳永逸呢?

3.2.1 (本地)构造自己模型的权重文件

这里有争议,我在线训练并不需要修改权重,使用的预训练.pth模型在num_classes不匹配时会提示,然后自动适配cascade_rcnn_r50_1x.py中的num_classes。
不过修改后肯定不会错。

import torch
pretrained_weights  = torch.load('checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth')

num_class = 1
pretrained_weights['state_dict']['roi_head.bbox_head.fc_cls.weight'].resize_(num_class+1, 1024)
pretrained_weights['state_dict']['roi_head.bbox_head.fc_cls.bias'].resize_(num_class+1)
pretrained_weights['state_dict']['roi_head.bbox_head.fc_reg.weight'].resize_(num_class*4, 1024)
pretrained_weights['state_dict']['roi_head.bbox_head.fc_reg.bias'].resize_(num_class*4)

torch.save(pretrained_weights, "mask_rcnn_r50_fpn_1x_%d.pth"%num_class)

其中num_class为你要训练数据的类别数 (不用加1) V2已经修改了,num_classes不再包含背景。

3.2.2 (本地)修改配置文件
  1. mmdet/coco.py
    在这里修改类别。
@DATASETS.register_module()
class CocoDataset(CustomDataset):

    #CLASSES = ('person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
    #           'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
     #          'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog',
      #         'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe',
    #           'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
     #          'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat',
      #         'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
    #           'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl',
     #          'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot',
      #         'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
    #           'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop',
     #          'mouse', 'remote', 'keyboard', 'cell phone', 'microwave',
      #         'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock',
    #           'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush')
    #在这里修改你所需要的CLASSES
    CLASSES =('knife, scissors, lighter, zippooil, pressure, slingshot, handcuffs, nailpolish, powerbank, firecrackers')

  1. configs/_base_/datasets/coco_detection.py
    在train pipeline修改Data Augmentation在train
dataset_type = 'CocoDataset'
data_root = 'data/coco/'
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
# 在这里加albumentation的aug
albu_train_transforms = [
    dict(
        type='ShiftScaleRotate',
        shift_limit=0.0625,
        scale_limit=0.0,
        rotate_limit=0,
        interpolation=1,
        p=0.5),
    dict(
        type='RandomBrightnessContrast',
        brightness_limit=[0.1
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值