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就自动结束,尝试使用训练结果进行测试,也测试失败
参考: