mmdet训练、测试centernet,经常使用框架,却对里面的参数细节研究不深入,发生严重低级错误。
训练和测试pipline代码
train_pipeline = [
dict(type='LoadImageFromFile', to_float32=True, color_type='color'),
dict(type='LoadAnnotations', with_bbox=True),
dict(
type='RandomCenterCropPad',
crop_size=(512, 512),
ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3),
mean=[0, 0, 0],
std=[1, 1, 1],
to_rgb=True,
test_pad_mode=None),
dict(type='Resize', img_scale=(512, 512), keep_ratio=True),
dict(type='RandomFlip', flip_ratio=0.5),
dict(type='Normalize', **img_norm_cfg),
#dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels'])
]
test_pipeline = [
dict(type='LoadImageFromFile', to_float32=True),
dict(
type='MultiScaleFlipAug',
image_scale=(512,512),
flip=False,
transforms=[
dict(type='Resize', keep_ratio=True),
dict(
type='RandomCenterCropPad',
ratios=None,
border=None,
mean=[0, 0, 0],
std=[1, 1, 1],
to_rgb=True,
test_mode=True,
test_pad_mode=['logical_or', 31],
test_pad_add_pix=1),
dict(type='RandomFlip'),
dict(type='Normalize', **img_norm_cfg),
dict(type='DefaultFormatBundle'),
dict(
type='Collect',
meta_keys=('filename', 'ori_filename', 'ori_shape',
'img_shape', 'pad_shape', 'scale_factor', 'flip',
'flip_direction', 'img_norm_cfg', 'border'),
keys=['img'])
])
]
在训练和测试中,都涉及到图像的resize操作,代码中均有resize到(512,512)的操作
但是,仔细校对原始算法中,在测试时,并没有resize到512,而是用了如下代码
dict(
type='MultiScaleFlipAug',
scale_factor=1.0,
经跟踪调试,结论是测试时,pipline中并没有resize数据
这个改动,导致test的map相差了4个点
按常理说,图片最终是一定会被resize到512的,有待进一步分析。
————————————————————————————————
又仔细看了算法,centernet是全卷积的网络,算法从头到尾,只有卷积核尺寸,输入、输出深度的现在,对图像的长、宽没有限制。
所以,不需要限制图像尺寸。
测试也表明了,resize操作,会大幅度影响准确率。