python tools/misc/print_config.py PATHTOCONFIG
在config/_base_
文件夹下有 4 个基本组件类型,分别是:数据集(dataset),模型(model),训练策略(schedule)和运行时的默认设置(default runtime)。许多方法,例如 Faster R-CNN、Mask R-CNN、Cascade R-CNN、RPN、SSD 能够很容易地构建出来。由 _base_
下的组件组成的配置,被我们称为 原始配置(primitive)。
对于同一文件夹下的所有配置,推荐只有一个对应的原始配置文件。所有其他的配置文件都应该继承自这个原始配置文件。这样就能保证配置文件的最大继承深度为 3。
为了便于理解,建议大家继承现有方法。例如,如果在 Faster R-CNN 的基础上做了一些修改,用户首先可以通过指定 _base_ = ../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py
来继承基础的 Faster R-CNN 结构,然后修改配置文件中的必要参数以完成继承。
将给大家的猫狗数据集(可联系博主无偿提供数据集)导入到根目录下的新建文件夹data
下,注意要保持该COCO文件格式,否则会导致错误。
COCO 格式的 json 标注文件有三个必要的键:
images
: 包含多个图片以及它们的信息的数组,例如 file_name
、height
、width
和 id
。
annotations
: 包含多个实例标注信息的数组。
categories
: 包含多个类别名字和 ID 的数组。
配置文件的修改涉及两个方面:
data
部分。需要在 data.train
、data.val
和 data.test
中添加 classes
。model
部分中的 num_classes
。需要将默认值(COCO 数据集中为 80)修改为自定义数据集中的类别数(2)。configs/my_custom_config.py
内容如下:
# 新的配置来自基础的配置以更好地说明需要修改的地方
_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py'
# 1. 数据集设定
dataset_type = 'CocoDataset'
classes = ('a', 'b', 'c', 'd', 'e')
data = dict(
samples_per_gpu=2,
workers_per_gpu=2,
train=dict(
type=dataset_type,
# 将类别名字添加至 `classes` 字段中
classes=classes,
ann_file='path/to/your/train/annotation_data',
img_prefix='path/to/your/train/image_data'),
val=dict(
type=dataset_type,
# 将类别名字添加至 `classes` 字段中
classes=classes,
ann_file='path/to/your/val/annotation_data',
img_prefix='path/to/your/val/image_data'),
test=dict(
type=dataset_type,
# 将类别名字添加至 `classes` 字段中
classes=classes,
ann_file='path/to/your/test/annotation_data',
img_prefix='path/to/your/test/image_data'))
# 2. 模型设置
# 将所有的 `num_classes` 默认值修改为5(原来为80)
model = dict(
roi_head=dict(
bbox_head=[
dict(
type='Shared2FCBBoxHead',
# 将所有的 `num_classes` 默认值修改为 5(原来为 80)
num_classes=5),
dict(
type='Shared2FCBBoxHead',
# 将所有的 `num_classes` 默认值修改为 5(原来为 80)
num_classes=5),
dict(
type='Shared2FCBBoxHead',
# 将所有的 `num_classes` 默认值修改为 5(原来为 80)
num_classes=5)],
# 将所有的 `num_classes` 默认值修改为 5(原来为 80)
mask_head=dict(num_classes=5)))
我们的数据集是 COCO 格式,也可以通过以下方式检查数据的标注没有问题:
categories
的长度要与配置中的 classes
元组长度相匹配,它们都表示有几类。(如例子中有 2个类别)classes
字段应与标注文件里 categories
下的 name
有相同的元素且顺序一致。MMDetection 会自动将 categories
中不连续的 id
映射成连续的索引,因此 categories
下的 name
的字符串顺序会影响标签的索引。同时,配置文件中的 classes
的字符串顺序也会影响到预测框可视化时的标签。annotations
中的 category_id
必须是有效的值。比如所有 category_id
的值都应该属于 categories
中的 id
。 微调超参数与默认的训练策略不同,它通产需要更小的学习率和更少的训练回合。
configs/_base_/schedules/schedule_1x.py
内容如下:
# 优化器
# 配置文件中的 lr 配置
optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=None)
# learning policy
lr_config = dict(
policy='step',
warmup='linear',
warmup_iters=500,
warmup_ratio=0.001,
step=[8, 11])
runner = dict(type='EpochBasedRunner', max_epochs=12)
在配置文件中的学习率是在8块GPU,每块GPU有2张图像(批大小为8*2=16)的情况下设置的。其已经设置在config/_base_/default_runtime.py
中的 auto_scale_lr.base_batch_size
。当配置文件的批次大小为16
时,学习率会基于该值进行自动缩放。同时,为了不影响其他基于 mmdet 的 codebase,启用自动缩放标志 auto_scale_lr.enable
默认设置为 False
。如果要启用此功能,需在命令添加参数 --auto-scale-lr
。并且在启动命令之前,请检查下即将使用的配置文件的名称,因为配置名称指示默认的批处理大小。 在默认情况下,批次大小是 8 x 2 = 16
,例如:faster_rcnn_r50_caffe_fpn_90k_coco.py
。执行学习率自动缩放命令后,会根据机器的GPU数量和训练的批次大小对学习率进行自动缩放,比如:在 4 块 GPU 并且每张 GPU 上有 2 张图片的情况下 lr=0.01
,那么在 16 块 GPU 并且每张 GPU 上有 4 张图片的情况下, LR 会自动缩放至lr=0.08
。
如果不启用该功能,则需要根据 学习率缩放规则来手动计算并修改配置文件里面 optimizer.lr
的值。(配置文件中batch_size
为16时lr
为0.02,按照缩放规则batch_size
为8时lr
为0.01,以此类推)
为了使用新的配置方法来对模型进行训练,你只需要运行如下命令(单GPU训练):
python tools/train.py configs/faster_rcnn/my_custom_config.py --work-dir work_dirs
为了测试训练完毕的模型,你只需要运行如下命令:
python tools/test.py configs/faster_rcnn/my_custom_config.py work_dirs2/latest.pth --eval bbox
python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/20220810_135019.log.json --keys loss --out work_dirs/train_loss.jpg
先使用 test.py
生成 results.pkl
文件, 加入--out
指令并指定输出文件目录
评估指标
tools/analysis_tools/eval_metric.py
根据配置文件评估 pkl 结果文件的某些指标:
python tools/analysis_tools/eval_metric.py configs/faster_rcnn/my_custom_config.py work_dirs/results.pkl --eval bbox
混淆矩阵
混淆矩阵是预测结果的摘要。
tools/analysis_tools/confusion_matrix.py
可以分析预测结果并绘制混淆矩阵表:
python tools/analysis_tools/confusion_matrix.py configs/faster_rcnn/my_custom_config.py work_dirs/results.pkl work_dirs