-
Notifications
You must be signed in to change notification settings - Fork 9.8k
Open
Description
Checklist
- I have searched related issues but cannot get the expected help.
- I have read the FAQ documentation but cannot get the expected help.
- The bug has not been fixed in the latest version.
Describe the bug
I am trying to train the RTMDet-X model using my custom dataset.
I use the coco metric to evaluate the model and get a bbox of over 70 %, while the segm AP stays at 30-40 %.
The masks are correct as other models achieve AP higher that 65 %.
I am training on a single GPU.
My guess that something in the config is not correct.
Reproduction
- What command or script did you run?
python tools/train.py configs/rtmdet-x.py --work-dir "$OUTPUT_FOLDER"
- Did you make any modifications on the code or config? Did you understand what you have modified?
See config below.
- What dataset did you use?
My own dataset, size of train is about 1200 images, with 300 test and 21 classes.
Environment
Environment installed inside of a conda evnrionment.
sys.platform: linux
Python: 3.8.16 (default, Mar 2 2023, 03:21:46) [GCC 11.2.0]
CUDA available: True
numpy_random_seed: 2147483648
GPU 0: GeForce RTX 3090
CUDA_HOME: /usr/local/cuda-11.1/
NVCC: Cuda compilation tools, release 11.1, V11.1.105
GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
PyTorch: 1.10.0+cu111
PyTorch compiling details: PyTorch built with:
- GCC 7.3
- C++ Version: 201402
- Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications
- Intel(R) MKL-DNN v2.2.3 (Git Hash 7336ca9f055cf1bfa13efb658fe15dc9b41f0740)
- OpenMP 201511 (a.k.a. OpenMP 4.5)
- LAPACK is enabled (usually provided by MKL)
- NNPACK is enabled
- CPU capability usage: AVX2
- CUDA Runtime 11.1
- NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86
- CuDNN 8.0.5
- Magma 2.5.2
- Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.1, CUDNN_VERSION=8.0.5, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.10.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON,
TorchVision: 0.11.0+cu111
OpenCV: 4.7.0
MMEngine: 0.7.2
MMDetection: 3.0.0rc6+61dd8d5
Installed via this commands:
pip install torch==1.10.0+cu111 torchvision==0.11.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
pip install openmim
pip install mmengine
pip install mmcv
pip install setuptools==59.5.0
%cd mmdetection/
!pip install -v -e .
Config
If applicable, paste the error trackback here.
default_scope = 'mmdet'
default_hooks = dict(
timer=dict(type='IterTimerHook'),
logger=dict(type='LoggerHook', interval=50),
param_scheduler=dict(type='ParamSchedulerHook'),
checkpoint=dict(type='CheckpointHook', interval=10, max_keep_ckpts=3),
sampler_seed=dict(type='DistSamplerSeedHook'),
visualization=dict(type='DetVisualizationHook'))
env_cfg = dict(
cudnn_benchmark=False,
mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),
dist_cfg=dict(backend='nccl'))
vis_backends = [dict(type='LocalVisBackend')]
visualizer = dict(
type='Visualizer',
vis_backends=[dict(type='TensorboardVisBackend')],
name='visualizer')
log_processor = dict(type='LogProcessor', window_size=50, by_epoch=True)
log_level = 'DEBUG'
load_from = 'weights/coco/rtmdet-ins_x_8xb16-300e_coco.pth'
resume = False
train_cfg = dict(
type='EpochBasedTrainLoop',
max_epochs=20,
val_interval=1,
dynamic_intervals=[(280, 1)])
val_cfg = dict(type='ValLoop')
test_cfg = dict(type='TestLoop')
param_scheduler = [
dict(
type='LinearLR', start_factor=1e-05, by_epoch=False, begin=0, end=500),
dict(
type='CosineAnnealingLR',
eta_min=5e-05,
begin=10,
end=20,
T_max=10,
by_epoch=True,
convert_to_iter_based=True)
]
optim_wrapper = dict(
type='OptimWrapper',
optimizer=dict(type='AdamW', lr=0.001, weight_decay=0.05),
paramwise_cfg=dict(
norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True))
auto_scale_lr = dict(enable=True, base_batch_size=16)
dataset_type = 'CocoDataset'
data_root = 'data/'
file_client_args = dict(backend='disk')
train_pipeline = [
dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')),
dict(
type='LoadAnnotations',
with_bbox=True,
with_mask=True,
poly2mask=False),
dict(type='CachedMosaic', img_scale=(640, 640), pad_val=114.0),
dict(
type='RandomResize',
scale=(1280, 1280),
ratio_range=(0.1, 2.0),
keep_ratio=True),
dict(
type='RandomCrop',
crop_size=(640, 640),
recompute_bbox=True,
allow_negative_crop=True),
dict(type='YOLOXHSVRandomAug'),
dict(type='RandomFlip', prob=0.5),
dict(type='Pad', size=(640, 640), pad_val=dict(img=(114, 114, 114))),
dict(
type='CachedMixUp',
img_scale=(640, 640),
ratio_range=(1.0, 1.0),
max_cached_images=20,
pad_val=(114, 114, 114)),
dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1)),
dict(type='PackDetInputs')
]
test_pipeline = [
dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')),
dict(type='Resize', scale=(640, 640), keep_ratio=True),
dict(type='Pad', size=(640, 640), pad_val=dict(img=(114, 114, 114))),
dict(
type='PackDetInputs',
meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
'scale_factor'))
]
train_dataloader = dict(
batch_size=2,
num_workers=2,
persistent_workers=True,
sampler=dict(type='DefaultSampler', shuffle=True),
batch_sampler=None,
dataset=dict(
type='CocoDataset',
data_root='data/',
ann_file='train.json',
data_prefix=dict(train/'),
filter_cfg=dict(filter_empty_gt=True, min_size=32),
pipeline=[
dict(
type='LoadImageFromFile',
file_client_args=dict(backend='disk')),
dict(
type='LoadAnnotations',
with_bbox=True,
with_mask=True,
poly2mask=False),
dict(type='CachedMosaic', img_scale=(640, 640), pad_val=114.0),
dict(
type='RandomResize',
scale=(1280, 1280),
ratio_range=(0.1, 2.0),
keep_ratio=True),
dict(
type='RandomCrop',
crop_size=(640, 640),
recompute_bbox=True,
allow_negative_crop=True),
dict(type='YOLOXHSVRandomAug'),
dict(type='RandomFlip', prob=0.5),
dict(
type='Pad', size=(640, 640),
pad_val=dict(img=(114, 114, 114))),
dict(
type='CachedMixUp',
img_scale=(640, 640),
ratio_range=(1.0, 1.0),
max_cached_images=20,
pad_val=(114, 114, 114)),
dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1)),
dict(type='PackDetInputs')
],
metainfo=dict(
classes=CLASSES,
palette=PALETTE,
pin_memory=True)
val_dataloader = dict(
batch_size=1,
num_workers=1,
persistent_workers=True,
drop_last=False,
sampler=dict(type='DefaultSampler', shuffle=False),
dataset=dict(
type='CocoDataset',
data_root='data/',
ann_file='test.json',
data_prefix=dict(img='test/'),
test_mode=True,
pipeline=[
dict(
type='LoadImageFromFile',
file_client_args=dict(backend='disk')),
dict(type='Resize', scale=(640, 640), keep_ratio=True),
dict(
type='Pad', size=(640, 640),
pad_val=dict(img=(114, 114, 114))),
dict(
type='PackDetInputs',
meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
'scale_factor'))
],
metainfo=dict(
classes=CLASSES,
palette=PALETTE))
test_dataloader = dict(
batch_size=1,
num_workers=1,
persistent_workers=True,
drop_last=False,
sampler=dict(type='DefaultSampler', shuffle=False),
dataset=dict(
type='CocoDataset',
data_root='data/',
ann_file='test.json',
data_prefix=dict(img='test/'),
test_mode=True,
pipeline=[
dict(
type='LoadImageFromFile',
file_client_args=dict(backend='disk')),
dict(type='Resize', scale=(640, 640), keep_ratio=True),
dict(
type='Pad', size=(640, 640),
pad_val=dict(img=(114, 114, 114))),
dict(
type='PackDetInputs',
meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
'scale_factor'))
],
metainfo=dict(
classes=CLASSES
palette=PALETTE)
val_evaluator = dict(
type='CocoMetric',
ann_file='test_ann.json',
metric=['bbox', 'segm'],
format_only=True,
proposal_nums=(100, 1, 10),
outfile_prefix='./work_dirs/rtmdet-x/test')
test_evaluator = dict(
type='CocoMetric',
ann_file='test_ann.json',
metric=['bbox', 'segm'],
format_only=True,
proposal_nums=(100, 1, 10),
outfile_prefix='./work_dirs/rtmdet-x/test')
tta_model = dict(
type='DetTTAModel',
tta_cfg=dict(nms=dict(type='nms', iou_threshold=0.6), max_per_img=100))
img_scales = [(640, 640), (320, 320), (960, 960)]
tta_pipeline = [
dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')),
dict(
type='TestTimeAug',
transforms=[[{
'type': 'Resize',
'scale': (640, 640),
'keep_ratio': True
}, {
'type': 'Resize',
'scale': (320, 320),
'keep_ratio': True
}, {
'type': 'Resize',
'scale': (960, 960),
'keep_ratio': True
}],
[{
'type': 'RandomFlip',
'prob': 1.0
}, {
'type': 'RandomFlip',
'prob': 0.0
}],
[{
'type': 'Pad',
'size': (960, 960),
'pad_val': {
'img': (114, 114, 114)
}
}],
[{
'type':
'PackDetInputs',
'meta_keys':
('img_id', 'img_path', 'ori_shape', 'img_shape',
'scale_factor', 'flip', 'flip_direction')
}]])
]
model = dict(
type='RTMDet',
data_preprocessor=dict(
type='DetDataPreprocessor',
mean=[103.53, 116.28, 123.675],
std=[57.375, 57.12, 58.395],
bgr_to_rgb=False,
batch_augments=None),
backbone=dict(
type='CSPNeXt',
arch='P5',
expand_ratio=0.5,
deepen_factor=1.33,
widen_factor=1.25,
channel_attention=True,
norm_cfg=dict(type='BN', requires_grad=True),
act_cfg=dict(type='SiLU', inplace=True)),
neck=dict(
type='CSPNeXtPAFPN',
in_channels=[320, 640, 1280],
out_channels=320,
num_csp_blocks=4,
expand_ratio=0.5,
norm_cfg=dict(type='BN', requires_grad=True),
act_cfg=dict(type='SiLU', inplace=True)),
bbox_head=dict(
type='RTMDetInsSepBNHead',
num_classes=21,
in_channels=320,
stacked_convs=2,
share_conv=True,
pred_kernel_size=1,
feat_channels=320,
act_cfg=dict(type='SiLU', inplace=True),
norm_cfg=dict(type='BN', requires_grad=True),
anchor_generator=dict(
type='MlvlPointGenerator', offset=0, strides=[8, 16, 32]),
bbox_coder=dict(type='DistancePointBBoxCoder'),
loss_cls=dict(
type='QualityFocalLoss',
use_sigmoid=True,
beta=2.0,
loss_weight=1.0),
loss_bbox=dict(type='GIoULoss', loss_weight=2.0),
loss_mask=dict(
type='DiceLoss', loss_weight=2.0, eps=5e-06, reduction='mean')),
train_cfg=dict(
assigner=dict(type='DynamicSoftLabelAssigner', topk=13),
allowed_border=-1,
pos_weight=-1,
debug=False),
test_cfg=dict(
nms_pre=1000,
min_bbox_size=0,
score_thr=0.05,
nms=dict(type='nms', iou_threshold=0.6),
max_per_img=100,
mask_thr_binary=0.5))
train_pipeline_stage2 = [
dict(type='LoadImageFromFile', file_client_args=dict(backend='disk')),
dict(
type='LoadAnnotations',
with_bbox=True,
with_mask=True,
poly2mask=False),
dict(
type='RandomResize',
scale=(640, 640),
ratio_range=(0.1, 2.0),
keep_ratio=True),
dict(
type='RandomCrop',
crop_size=(640, 640),
recompute_bbox=True,
allow_negative_crop=True),
dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1)),
dict(type='YOLOXHSVRandomAug'),
dict(type='RandomFlip', prob=0.5),
dict(type='Pad', size=(640, 640), pad_val=dict(img=(114, 114, 114))),
dict(type='PackDetInputs')
]
max_epochs = 20
stage2_num_epochs = 20
base_lr = 0.001
interval = 10
custom_hooks = [
dict(
type='EMAHook',
ema_type='ExpMomentumEMA',
momentum=0.0002,
update_buffers=True,
priority=49),
dict(
type='PipelineSwitchHook',
switch_epoch=10,
switch_pipeline=[
dict(
type='LoadImageFromFile',
file_client_args=dict(backend='disk')),
dict(
type='LoadAnnotations',
with_bbox=True,
with_mask=True,
poly2mask=False),
dict(
type='RandomResize',
scale=(640, 640),
ratio_range=(0.1, 2.0),
keep_ratio=True),
dict(
type='RandomCrop',
crop_size=(640, 640),
recompute_bbox=True,
allow_negative_crop=True),
dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1)),
dict(type='YOLOXHSVRandomAug'),
dict(type='RandomFlip', prob=0.5),
dict(
type='Pad', size=(640, 640),
pad_val=dict(img=(114, 114, 114))),
dict(type='PackDetInputs')
])
]
metainfo = dict(
classes=CLASSES,
palette=PALETTE
)
num_classes = 21
norm_cfg = dict(type='BN', requires_grad=True)
val_epochs = 1
checkpoint_config = dict(interval=1)
launcher = 'none'
work_dir = 'weights/rtmdet-x-18-04/'
Final training output exmaple
...
{"lr": 5.004839623460682e-06, "data_time": 0.001753063201904297, "loss": 0.5111260455846787, "loss_cls": 0.20436065793037414, "loss_bbox": 0.21127558320760728, "loss_mask": 0.09548979647457599, "time": 0.2601747989654541, "epoch": 100, "memory": 7226, "step": 57969}
{"lr": 5.001867651945779e-06, "data_time": 0.001802234649658203, "loss": 0.5247807222604751, "loss_cls": 0.21531012520194054, "loss_bbox": 0.21319715946912765, "loss_mask": 0.09627343453466893, "time": 0.26142349243164065, "epoch": 100, "memory": 7146, "step": 58019}
{"lr": 5.000284426861501e-06, "data_time": 0.0016004276275634766, "loss": 0.47425432741642, "loss_cls": 0.19011285960674285, "loss_bbox": 0.2007560098171234, "loss_mask": 0.08338545847684145, "time": 0.26022379398345946, "epoch": 100, "memory": 7175, "step": 58069}
{"coco/bbox_mAP": 0.719, "coco/bbox_mAP_50": 0.868, "coco/bbox_mAP_75": 0.779, "coco/bbox_mAP_s": 0.539, "coco/bbox_mAP_m": 0.696, "coco/bbox_mAP_l": 0.784, "coco/segm_mAP": 0.366, "coco/segm_mAP_50": 0.445, "coco/segm_mAP_75": 0.388, "coco/segm_mAP_s": 0.526, "coco/segm_mAP_m": 0.435, "coco/segm_mAP_l": 0.414, "data_time": 0.0009068536758422851, "time": 0.05234174251556396, "step": 100}
Metadata
Metadata
Assignees
Labels
No labels