open-mmlab / mmyolo

OpenMMLab YOLO series toolbox and benchmark. Implemented RTMDet, RTMDet-Rotated,YOLOv5, YOLOv6, YOLOv7, YOLOv8,YOLOX, PPYOLOE, etc.
https://mmyolo.readthedocs.io/zh_CN/dev/
GNU General Public License v3.0
2.97k stars 537 forks source link

loss_cls: 0.0000, loss_bbox: 0.0000 when training YOLOv7 on my own dataset and The testing results of the whole dataset is empty #447

Closed 52THANOS closed 1 year ago

52THANOS commented 1 year ago

Prerequisite

🐞 Describe the bug

loss_cls: 0.0000, loss_bbox: 0.0000 when training YOLOv7 on my own dataset and The testing results of the whole dataset is empty

Environment

base = '../base/default_runtime.py'

dataset settings

data_root = 'data/coco/' dataset_type = 'YOLOv5CocoDataset'

parameters that often need to be modified

img_scale = (640, 640) # height, width max_epochs = 300 save_epoch_intervals = 10 train_batch_size_per_gpu = 10 train_num_workers = 8

persistent_workers must be False if num_workers is 0.

persistent_workers = True val_batch_size_per_gpu = 1 val_num_workers = 2 class_name=('ctl',)

only on Val

batch_shapes_cfg = dict( type='BatchShapePolicy', batch_size=val_batch_size_per_gpu, img_size=img_scale[0], size_divisor=32, extra_pad_ratio=0.5)

different from yolov5

anchors = [ [(12, 16), (19, 36), (40, 28)], # P3/8 [(36, 75), (76, 55), (72, 146)], # P4/16 [(142, 110), (192, 243), (459, 401)] # P5/32 ] strides = [8, 16, 32] num_det_layers = 3

num_classes = 80

num_classes = 1 metainfo = dict(classes=class_name, palette=[(220, 20, 60)])

single-scale training is recommended to

be turned on, which can speed up training.

env_cfg = dict(cudnn_benchmark=True)

model = dict( type='YOLODetector', data_preprocessor=dict( type='YOLOv5DetDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], bgr_to_rgb=True), backbone=dict( type='YOLOv7Backbone', arch='L', norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), act_cfg=dict(type='SiLU', inplace=True)), neck=dict( type='YOLOv7PAFPN', block_cfg=dict( type='ELANBlock', middle_ratio=0.5, block_ratio=0.25, num_blocks=4, num_convs_in_block=1), upsample_feats_cat_first=False, in_channels=[512, 1024, 1024],

The real output channel will be multiplied by 2

    out_channels=[128, 256, 512],
    norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
    act_cfg=dict(type='SiLU', inplace=True)),
bbox_head=dict(
    type='YOLOv7Head',
    head_module=dict(
        type='YOLOv7HeadModule',
        num_classes=num_classes,
        in_channels=[256, 512, 1024],
        featmap_strides=strides,
        num_base_priors=3),
    prior_generator=dict(
        type='mmdet.YOLOAnchorGenerator',
        base_sizes=anchors,
        strides=strides),
    # scaled based on number of detection layers
    loss_cls=dict(
        type='mmdet.CrossEntropyLoss',
        use_sigmoid=True,
        reduction='mean',
        loss_weight=0.3 * (num_classes / 80 * 3 / num_det_layers)),
    loss_bbox=dict(
        type='IoULoss',
        iou_mode='ciou',
        bbox_format='xywh',
        reduction='mean',
        loss_weight=0.05 * (3 / num_det_layers),
        return_iou=True),
    loss_obj=dict(
        type='mmdet.CrossEntropyLoss',
        use_sigmoid=True,
        reduction='mean',
        loss_weight=0.7 * ((img_scale[0] / 640)**2 * 3 / num_det_layers)),
    obj_level_weights=[4., 1., 0.4],
    # BatchYOLOv7Assigner params
    prior_match_thr=4.,
    simota_candidate_topk=10,
    simota_iou_weight=3.0,
    simota_cls_weight=1.0),
test_cfg=dict(
    multi_label=True,
    nms_pre=30000,
    score_thr=0.001,
    nms=dict(type='nms', iou_threshold=0.65),
    max_per_img=300))

pre_transform = [ dict(type='LoadImageFromFile', file_client_args=base.file_client_args), dict(type='LoadAnnotations', with_bbox=True) ]

mosiac4_pipeline = [ dict( type='Mosaic', img_scale=img_scale, pad_val=114.0, pre_transform=pre_transform), dict( type='YOLOv5RandomAffine', max_rotate_degree=0.0, max_shear_degree=0.0, max_translate_ratio=0.2, # note scaling_ratio_range=(0.1, 2.0), # note border=(-img_scale[0] // 2, -img_scale[1] // 2), border_val=(114, 114, 114)), ]

mosiac9_pipeline = [ dict( type='Mosaic9', img_scale=img_scale, pad_val=114.0, pre_transform=pre_transform), dict( type='YOLOv5RandomAffine', max_rotate_degree=0.0, max_shear_degree=0.0, max_translate_ratio=0.2, # note scaling_ratio_range=(0.1, 2.0), # note border=(-img_scale[0] // 2, -img_scale[1] // 2), border_val=(114, 114, 114)), ]

randchoice_mosaic_pipeline = dict( type='RandomChoice', transforms=[mosiac4_pipeline, mosiac9_pipeline], prob=[0.8, 0.2])

train_pipeline = [ pre_transform, randchoice_mosaic_pipeline, dict( type='YOLOv5MixUp', alpha=8.0, # note beta=8.0, # note prob=0.15, pre_transform=[pre_transform, randchoice_mosaic_pipeline]), dict(type='YOLOv5HSVRandomAug'), dict(type='mmdet.RandomFlip', prob=0.5), dict( type='mmdet.PackDetInputs', meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip', 'flip_direction')) ]

train_dataloader = dict( batch_size=train_batch_size_per_gpu, num_workers=train_num_workers, persistent_workers=persistent_workers, pin_memory=True, sampler=dict(type='DefaultSampler', shuffle=True), collate_fn=dict(type='yolov5_collate'), # FASTER dataset=dict( type=dataset_type, data_root=data_root, ann_file='annotations/instances_train2017.json', data_prefix=dict(img='train2017/'), filter_cfg=dict(filter_empty_gt=False, min_size=32), pipeline=train_pipeline))

test_pipeline = [ dict(type='LoadImageFromFile', file_client_args=base.file_client_args), dict(type='YOLOv5KeepRatioResize', scale=img_scale), dict( type='LetterResize', scale=img_scale, allow_scale_up=False, pad_val=dict(img=114)), dict(type='LoadAnnotations', with_bbox=True, scope='mmdet'), dict( type='mmdet.PackDetInputs', meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'scale_factor', 'pad_param')) ]

val_dataloader = dict( batch_size=val_batch_size_per_gpu, num_workers=val_num_workers, persistent_workers=persistent_workers, pin_memory=True, drop_last=False, sampler=dict(type='DefaultSampler', shuffle=False), dataset=dict( type=dataset_type, data_root=data_root, test_mode=True, data_prefix=dict(img='val2017/'), ann_file='annotations/instances_val2017.json', pipeline=test_pipeline, batch_shapes_cfg=batch_shapes_cfg))

test_dataloader = val_dataloader base_lr = 0.01 / 4 param_scheduler = None optim_wrapper = dict( type='OptimWrapper', optimizer=dict( type='SGD',

lr=0.01,

    lr=base_lr,
    momentum=0.937,
    weight_decay=0.0005,
    nesterov=True,
    batch_size_per_gpu=train_batch_size_per_gpu),
constructor='YOLOv7OptimWrapperConstructor')

default_hooks = dict( param_scheduler=dict( type='YOLOv5ParamSchedulerHook', scheduler_type='cosine', lr_factor=0.1, # note max_epochs=max_epochs), checkpoint=dict( type='CheckpointHook', save_param_scheduler=False, interval=1, save_best='auto', max_keep_ckpts=3))

val_evaluator = dict( type='mmdet.CocoMetric', proposal_nums=(100, 1, 10), # Can be accelerated ann_file=data_root + 'annotations/instances_val2017.json', metric='bbox') test_evaluator = val_evaluator

train_cfg = dict( type='EpochBasedTrainLoop', max_epochs=max_epochs, val_interval=save_epoch_intervals, dynamic_intervals=[(270, 1)])

custom_hooks = [ dict( type='EMAHook', ema_type='ExpMomentumEMA', momentum=0.0001, update_buffers=True, strict_load=False, priority=49) ]

val_cfg = dict(type='ValLoop') test_cfg = dict(type='TestLoop')

randomness = dict(seed=1, deterministic=True)

Additional information

No response

52THANOS commented 1 year ago

already solved

yzbx commented 1 year ago

already solved

what's the problem? I train it on object365 without change the metainfo. but change num_classes from 80 to 365. I find my loss is 0.0074, loss_cls: 0.0000 loss_obj: 0.0074 loss_bbox: 0.0000.

after add the metainfo in both trainloader and valloader, loss_cls and loss_bbox become normal. thanks for https://github.com/open-mmlab/mmyolo/blob/main/docs/zh_cn/user_guides/yolov5_tutorial.md

I use the follow package version

mmcv: 2.0.0rc3
mmdet: 3.0.0rc5
mmengine: 0.5.0
mmyolo: 0.5.0  # latest version, but not release

TorchVision: 0.12.0    
OpenCV: 4.7.0
CuDNN: 8.2
Python: 3.8.12
PyTorch: 1.11.0
CUDA Runtime: 11.3
l-dawei commented 1 year ago

already solved Hello! I also encountered the same problem, and how did you solve it?

zhihuizhang628 commented 1 year ago

已经解决

I understand that your problem has been solved, I encountered the same problem, can you tell me the solution?

yzbx commented 1 year ago

已经解决

I understand that your problem has been solved, I encountered the same problem, can you tell me the solution?

add the metainfo in both trainloader and valloader

zhihuizhang628 commented 1 year ago

已经解决

I understand that your problem has been solved, I encountered the same problem, can you tell me the solution?

add the metainfo in both trainloader and valloader

感谢你的回答,但是我没找到trainloader 和 valloader在哪里,我在configs文件里找到是train_dataloader和val_dataloader,然后我添加信息如下:但是报错的是不能在这里添加metainfo :你能告诉我trainloader 和 valloader在哪个文件里吗? train_dataloader = dict( batch_size=train_batch_size_per_gpu, num_workers=train_num_workers, persistent_workers=persistent_workers, pin_memory=True, sampler=dict(type='DefaultSampler', shuffle=True), metainfo = dict(classes=class_name, palette=[(220, 20, 60)]), #############我添加的## dataset=dict( type=dataset_type, data_root=data_root, ann_file=train_ann_file, data_prefix=dict(img=train_data_prefix), filter_cfg=dict(filter_empty_gt=False, min_size=32), pipeline=train_pipeline))

zhihuizhang628 commented 1 year ago

已经解决

I understand that your problem has been solved, I encountered the same problem, can you tell me the solution?

already solved, thank you very much!

Penguin0321 commented 1 year ago

已经解决

I understand that your problem has been solved, I encountered the same problem, can you tell me the solution?

already solved, thank you very much!

请问你是在哪里添加的metainfo

rhett-ye commented 1 year ago

just modify the config file as follow:

...
class_name = ('Truck','Car', ) # your categories
metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
...
train_dataloader = dict(
    batch_size=train_batch_size_per_gpu,
    num_workers=train_num_workers,
    persistent_workers=persistent_workers,
    pin_memory=True,
    sampler=dict(type='DefaultSampler', shuffle=True),
    collate_fn=dict(type='yolov5_collate'),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        metainfo=metainfo,    # **there**
        ann_file=train_ann_file,
        data_prefix=dict(img=train_data_prefix),
        filter_cfg=dict(filter_empty_gt=False, min_size=32),
        pipeline=train_pipeline))
val_dataloader = dict(
    batch_size=val_batch_size_per_gpu,
    num_workers=val_num_workers,
    persistent_workers=persistent_workers,
    pin_memory=True,
    drop_last=False,
    sampler=dict(type='DefaultSampler', shuffle=False),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        metainfo=metainfo,    # **there**
        test_mode=True,
        data_prefix=dict(img=val_data_prefix),
        ann_file=val_ann_file,
        pipeline=test_pipeline,
        batch_shapes_cfg=batch_shapes_cfg))