本文所使用的数据集为口腔数据集,共有5个类别,分别为:mouth,teeth,tongue,uvula,和oropharynx。
在mmdetection/data文件夹下新建文件夹,将数据集放到这里。
需要将数据集格式转化为VOC或COCO数据集的格式,因为configs里提供的依赖coco的模型较多,因此,我们建议将数据集转化成coco格式。
转化方法参考博客:
Labelme标注的json数据转化为coco格式的数据
官方建议直接修改coco数据集定义文件
修改数据集路径文件: configs/base/datasets/coco_detection.py
(1)修改data_root为自己数据集的路径;
(2)修改data字典中train、val、teat相关路径。
修改模型配置文件:configs/base/models/ssd300.py
(1)修改bbox_head字典中的num_classes为3。
修改coco数据集定义文件:mmdet/datasets/coco.py
(1)将CLASSES那里的参数修改为:CLASSES = (‘mouth’, ‘teeth’, ‘tongue’, ‘uvula’, ‘oropharynx’)
(2)将PALETTE参数随意选5个留下即可,例如:PALETTE = [(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228)],这个参数用来指定每个类别框的显示颜色。
修改class_name:mmdet/core/evaluation/class_names.py
(1)定位到coco_classes函数,修改return中的参数为:‘mouth’, ‘teeth’, ‘tongue’, ‘uvula’, ‘oropharynx’
# 保存checkpoints的间隔 默认每次都保存
checkpoint_config = dict(interval=1)
# yapf:disable
# # yapf:disable 打印log的间隔(每个epoch中) 默认迭代50次打印一次(datasets的大小除以batchsize)
log_config = dict(
interval=50,
hooks=[
dict(type='TextLoggerHook'),
# dict(type='TensorboardLoggerHook')
])
# yapf:enable
custom_hooks = [dict(type='NumClassCheckHook')]
dist_params = dict(backend='nccl')
log_level = 'INFO'
load_from = None # 加载参数
resume_from = None # 断点续训 重新加载已训练好的checkpoints 包含epoch等信息 会覆盖load_form
workflow = [('train', 1)] # 工作流
# disable opencv multithreading to avoid system being overloaded
opencv_num_threads = 0
# set multi-process start method as `fork` to speed up the training
mp_start_method = 'fork'
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (2 samples per GPU).
auto_scale_lr = dict(enable=False, base_batch_size=16)
python tools/train.py configs/ssd/ssd300_coco.py --gpus 1
CUDA_VISIBLE_DEVICES=2,3 bash tools/dist_train.sh configs/ssd/ssd300_coco.py 2
训练完之后work_dirs文件夹中会保存下训练过程中的log日志文件、每个epoch的pth文件(因为在default_runtime.py设置了checkpoint_config = dict(interval=1)),这个文件将会用于后面的test测试。

pythonpython tools/test.py configs/ssd/ssd300_coco.py work_dirs/ssd300_coco/latest.pth --eval bbox --out work_dirs/ssd300_coco/result.pkl --show

并在work_dirs/ssd300_coco文件夹内生成result.pkl 文件python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/ssd300_coco/20220823_210651.log.json --keys loss_cls loss_bbox
将训练结果20220312_094204.log.json中的参数acc、loss_cls和loss_bbox进行可视化,结果如下


在MMDetection中可以使用tools/analysis_tools/get_flops.py命令来获取模型的复杂度:
python tools/analysis_tools/get_flops.py work_dirs/ssd300_coco/ssd300_coco.py
输出结果显示:

使用tools/analysis_tools/benchmark.py函数来输出模型的推理速度,注意,mmdet只支持分布式版本,并且它测试的是2000张图片(前500忽略)的平均值。每50张图片显示一次结果
python -m torch.distributed.launch --nproc_per_node=1 --master_port=12345 tools/analysis_tools/benchmark.py work_dirs/ssd300_coco/ssd300_coco.py work_dirs/ssd300_coco/latest.pth --launcher pytorch
运行结果:
