MMDetection中使用Mask-RCNN训练BDD100K数据集

1. Convert label to COCO format

使用官方提供的工具bdd100k2coco.py

注意:使用bdd100k2coco分支下的文件,master中的该文件无法正常使用

在使用前,还需要对该文件进行部分修改:

# 将69行修改为	
image["file_name"] = frame["name"]+".jpg"
# 在73行之后增加
frame = frame["frames"][0]

之后按如下方式运行

python bdd100k2coco.py -i {JSON文件夹路径} -o {输出一个coco json文件} -m {转换方式det or track,使用det即可}

调用两次分别将train、val数据集的label转换

2. Set COCO-like directory tree

按如下目录结构保存我们的数据集

data
├── annotations
   ├── instances_train2017.json # 训练集json
   ├── instances_val2017.json	# 验证集json
├── train2017
   └── abcdefg-1234567.jpg
   └── ...
├── test2017
   └── abcdefg-1234567.jpg
   └── ...
├── val2017
   └── abcdefg-1234567.jpg
   └── ...

接下来进行数据集的定义,我们这里通过直接修改coco数据集定义文件进行操作

3. Modify relevant documents

./mmdet/datasets/coco.py

class CocoDataset(CustomDataset):中,将CLASSES修改为你自己的数据集类别,如我们修改为BDD100K中的类别:

    CLASSES = ("person", "rider", "car", "bus", "truck", "bike",
               "motor", "traffic light", "traffic sign", "train")

./mmdet/core/evaluation/class_names.py

def coco_classes():中,同样修改数据集类别

	return [
        "pedestrian", "rider", "car", "bus", "truck", "bicycle",
        "motorcycle", "traffic light", "traffic sign", "train"
    ]

4. Set Config file

在这一步,我们可以从./configs文件夹中选取预训练的模型。

我选择的是mask_rcnn_r50_fpn_1x_coco.py,可以看到该文件内容为:

_base_ = [
    '../_base_/models/mask_rcnn_r50_fpn.py',
    '../_base_/datasets/coco_instance.py',
    '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
]

为了便于修改参数,我将其中引用的各文件内容均复制到了一个新建的config文件bdd100_mask_rcnn_r50_fpn_1x_coco.py

Config文件中各参数含义可参考:mmdetection的configs中的各项参数具体解释官方文档

接下来开始修改参数

# data path
dataset_type = 'CocoDataset'
data_root = './data/'	# 即数据集的根目录位置

# model
model.roi_head.bbox_head.num_classes = 10 	# 即数据集中分类数量

# set up working dir to save files and logs
work_dir = './tutorial_exps'

# LR
optimizer.lr = 0.02 / 8 # 默认值0.02对应8块GPU,若使用一块则为0.02/8

# Epoches
total_epochs = 12 	# default:12

# Multiple GPUs
gpu_ids = (1, 2, 3)	# GPU id

# Batch Size
data.sample_per_gpu = 5		# batch size of a single GPU
data.workers_per_gpu = 2 	# Worker to pre-fetch data for each single GPU

# Evaluation Metric
evaluation.metric = 'mAP'	# 由于使用了自定义的数据集,因此修改评价指标
evaluation.interval = 12	# 通过修改评价区间减少评价用时

# Checpoint
checkpoint_config.interval = 12	# 通过修改检查点保存间隔降低存储成本

5. Train

Preference

mmdet\datasets\builder.py

第131行,默认为pin_memory=False

修改为pin_memory=True

参考https://discuss.pytorch.org/t/when-to-set-pin-memory-to-true/19723

Single GPU

使用./tools/train.py即可,如

python ./tools/train.py ./configs/bdd100_mask_rcnn_r50_fpn_1x_coco.py --gpus 1 --validate --work_dir work_dirs

Multiple GPUs

使用./tools/dist_train.sh即可进行多卡训练,如下:

./tools/dist_train.sh {config path} {gpu nums}
> ./tools/dist_train.sh ./configs/bdd100_mask_rcnn_r50_fpn_1x_coco.py 3

仍有问题待解决:

  • 虽然设置的是第1,2,3块GPU,但是实际运行后程序却尝试使用第0,1,2块GPU
  • GPU内存占满,但是训练过程中GPU利用率(Volatile GPU-Util)较低,一直维持在40%左右-
  • 只训练了一个epoch就自动结束,尝试使用训练结果进行测试,也测试失败

参考:

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus