mmpose icon indicating copy to clipboard operation
mmpose copied to clipboard

无法训练自定义数据集,报错 ValueError: Annotation must have data_list and metainfo keys

Open 690696306 opened this issue 1 year ago • 1 comments

Prerequisite

  • [X] I have searched Issues and Discussions but cannot get the expected help.
  • [X] The bug has not been fixed in the latest version(https://github.com/open-mmlab/mmpose).

Environment

py10_cuda118_torch200

Reproduces the problem - code sample

Body下的自定义数据集文件

from mmengine.dataset import BaseDataset from mmpose.registry import DATASETS

import copy import os.path as osp from typing import Optional from mmengine.fileio import exists, get_local_path from typing import List, Tuple from xtcocotools.coco import COCO

import numpy as np

@DATASETS.register_module(name='customdataset') class customdataset(BaseDataset):

METAINFO: dict = dict(from_file='/home/lab/Anaconda_project/RTMPose/config/coco_double_arm.py')

init.py 文件

from .aic_dataset import AicDataset from .coco_dataset import CocoDataset from .crowdpose_dataset import CrowdPoseDataset from .exlpose_dataset import ExlposeDataset from .humanart21_dataset import HumanArt21Dataset from .humanart_dataset import HumanArtDataset from .jhmdb_dataset import JhmdbDataset from .mhp_dataset import MhpDataset from .mpii_dataset import MpiiDataset from .mpii_trb_dataset import MpiiTrbDataset from .ochuman_dataset import OCHumanDataset from .posetrack18_dataset import PoseTrack18Dataset from .posetrack18_video_dataset import PoseTrack18VideoDataset from .double_arm_dataset import customdataset

all = [ 'CocoDataset', 'MpiiDataset', 'MpiiTrbDataset', 'AicDataset', 'CrowdPoseDataset', 'OCHumanDataset', 'MhpDataset', 'PoseTrack18Dataset', 'JhmdbDataset', 'PoseTrack18VideoDataset', 'HumanArtDataset', 'HumanArt21Dataset', 'ExlposeDataset','customdataset' ]

trian_config文件

base = ['/home/lab/Anaconda_project/mmpose/configs/base/default_runtime.py']

runtime

max_epochs = 10 stage2_num_epochs = 30 base_lr = 4e-3

train_cfg = dict(max_epochs=max_epochs, val_interval=10) randomness = dict(seed=21)

optimizer

optim_wrapper = dict( type='OptimWrapper', optimizer=dict(type='AdamW', lr=base_lr, weight_decay=0.05), paramwise_cfg=dict( norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True))

learning rate

param_scheduler = [ dict( type='LinearLR', start_factor=1.0e-5, by_epoch=False, begin=0, end=1000), dict( type='CosineAnnealingLR', eta_min=base_lr * 0.05, begin=max_epochs // 2, end=max_epochs, T_max=max_epochs // 2, by_epoch=True, convert_to_iter_based=True), ]

automatically scaling LR based on the actual training batch size

auto_scale_lr = dict(base_batch_size=512)

codec settings

codec = dict( type='SimCCLabel', input_size=(288, 384), sigma=(6., 6.93), simcc_split_ratio=2.0, normalize=False, use_dark=False)

model settings

model = dict( type='TopdownPoseEstimator', data_preprocessor=dict( type='PoseDataPreprocessor', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], bgr_to_rgb=True), backbone=dict( scope='mmdet', type='CSPNeXt', arch='P5', expand_ratio=0.5, deepen_factor=1., widen_factor=1., out_indices=(4, ), channel_attention=True, norm_cfg=dict(type='SyncBN'), act_cfg=dict(type='SiLU'), init_cfg=dict( type='Pretrained', prefix='backbone.', #checkpoint='https://download.openmmlab.com/mmpose/v1/projects/' #'rtmposev1/cspnext-l_udp-aic-coco_210e-256x192-273b7631_20230130.pth' checkpoint='/home/lab/Anaconda_project/RTMPose/pre_trained_weights/rtmpose-l_simcc-coco-wholebody_pt-aic-coco_270e-384x288-eaeb96c8_20230125.pth' # noqa: E501 )), head=dict( type='RTMCCHead', in_channels=1024, out_channels=46, input_size=codec['input_size'], in_featuremap_size=tuple([s // 32 for s in codec['input_size']]), simcc_split_ratio=codec['simcc_split_ratio'], final_layer_kernel_size=7, gau_cfg=dict( hidden_dims=256, s=128, expansion_factor=2, dropout_rate=0., drop_path=0., act_fn='SiLU', use_rel_bias=False, pos_enc=False), loss=dict( type='KLDiscretLoss', use_target_weight=True, beta=10., label_softmax=True), decoder=codec), test_cfg=dict(flip_test=True, ))

base dataset settings

dataset_type = 'customdataset' #data_mode = 'topdown' data_root = '/home/lab/coco-annotator/datasets/'

backend_args = dict(backend='local')

backend_args = dict(

backend='petrel',

path_mapping=dict({

f'{data_root}': 's3://openmmlab/datasets/detection/coco/',

f'{data_root}': 's3://openmmlab/datasets/detection/coco/'

}))

pipelines

train_pipeline = [ dict(type='LoadImage', backend_args=backend_args), dict(type='GetBBoxCenterScale'), dict(type='RandomFlip', direction='horizontal'), dict(type='RandomHalfBody'), dict( type='RandomBBoxTransform', scale_factor=[0.6, 1.4], rotate_factor=80), dict(type='TopdownAffine', input_size=codec['input_size']), dict(type='mmdet.YOLOXHSVRandomAug'), dict( type='Albumentation', transforms=[ dict(type='Blur', p=0.1), dict(type='MedianBlur', p=0.1), dict( type='CoarseDropout', max_holes=1, max_height=0.4, max_width=0.4, min_holes=1, min_height=0.2, min_width=0.2, p=1.0), ]), dict(type='GenerateTarget', encoder=codec), dict(type='PackPoseInputs') ] val_pipeline = [ dict(type='LoadImage', backend_args=backend_args), dict(type='GetBBoxCenterScale'), dict(type='TopdownAffine', input_size=codec['input_size']), dict(type='PackPoseInputs') ]

train_pipeline_stage2 = [ dict(type='LoadImage', backend_args=backend_args), dict(type='GetBBoxCenterScale'), dict(type='RandomFlip', direction='horizontal'), dict(type='RandomHalfBody'), dict( type='RandomBBoxTransform', shift_factor=0., scale_factor=[0.75, 1.25], rotate_factor=60), dict(type='TopdownAffine', input_size=codec['input_size']), dict(type='mmdet.YOLOXHSVRandomAug'), dict( type='Albumentation', transforms=[ dict(type='Blur', p=0.1), dict(type='MedianBlur', p=0.1), dict( type='CoarseDropout', max_holes=1, max_height=0.4, max_width=0.4, min_holes=1, min_height=0.2, min_width=0.2, p=0.5), ]), dict(type='GenerateTarget', encoder=codec), dict(type='PackPoseInputs') ]

data loaders

train_dataloader = dict( batch_size=16, num_workers=10, persistent_workers=True, sampler=dict(type='DefaultSampler', shuffle=True), dataset=dict( type=dataset_type, data_root=data_root, #data_mode=data_mode, ann_file='annotation/test_train.json', data_prefix=dict(img='double_arm_keypoints/'), pipeline=train_pipeline, metainfo=dict(from_file='/home/lab/Anaconda_project/RTMPose/config/coco_double_arm.py'), )) val_dataloader = dict( batch_size=16, num_workers=10, persistent_workers=True, drop_last=False, sampler=dict(type='DefaultSampler', shuffle=False, round_up=False), dataset=dict( type=dataset_type, data_root=data_root, #data_mode=data_mode, ann_file='annotation/test_val.json', data_prefix=dict(img='double_arm_keypoints_val/'), test_mode=False, #bbox_file='/home/lab/Anaconda_project/RTMPose/data/person_detection_results/' #'COCO_val2017_detections_AP_H_56_person.json', pipeline=val_pipeline, metainfo=dict(from_file='/home/lab/Anaconda_project/RTMPose/config/coco_double_arm.py'), ))

test_dataloader = val_dataloader

hooks

#default_hooks = dict( #checkpoint=dict( #save_best='coco-body27/AP', rule='greater', max_keep_ckpts=1))

custom_hooks = [ dict( type='EMAHook', ema_type='ExpMomentumEMA', momentum=0.0002, update_buffers=True, priority=49), dict( type='mmdet.PipelineSwitchHook', switch_epoch=max_epochs - stage2_num_epochs, switch_pipeline=train_pipeline_stage2) ]

evaluators

#val_evaluator = dict( #type='CocoMetric', #ann_file=data_root + 'double_arm_anotation/double_arm_keypoints_val.json' #)

val_evaluator = [ dict(type='PCKAccuracy', thr=0.2), dict(type='AUC'), dict(type='EPE'), ]

test_evaluator = val_evaluator

metainfo文件

dataset_info = dict( dataset_name='customdataset', paper_info=dict( author='Lin, Tsung-Yi and Maire, Michael and ' 'Belongie, Serge and Hays, James and ' 'Perona, Pietro and Ramanan, Deva and ' r'Doll{'a}r, Piotr and Zitnick, C Lawrence', title='Microsoft coco: Common objects in context', container='European conference on computer vision', year='2014', homepage='http://cocodataset.org/', ), keypoint_info={

    0:
    dict(name='left_shoulder', id=0, color=[0, 255, 0], type='', swap='right_shoulder'),
    1:
    dict(name='right_shoulder', id=1, color=[0, 255, 0], type='', swap='left_shoulder'),

    2:
    dict(name='left_elbow', id=2, color=[255, 128, 0], type='', swap='right_elbow'),
    3:
    dict(name='right_elbow', id=3, color=[255, 128, 0], type='', swap='left_elbow'),

    4:
    dict(name='left_wrist', id=4, color=[0, 255, 0], type='', swap='right_wrist'),
    5:
    dict(name='right_wrist', id=5, color=[0, 255, 0], type='', swap='left_wrist'),

    6:
    dict(name='left_thumb1',id=6, color=[255, 255, 255], type='', swap='right_thumb1'),
    7:
    dict(name='left_thumb2',id=7, color=[255, 255, 255], type='', swap='right_thumb2'),
    8:
    dict(name='left_thumb3',id=8, color=[255, 255, 255], type='', swap='right_thumb3'),
    9:
    dict(name='left_thumb4',id=9, color=[255, 255, 255], type='', swap='right_thumb4'),

    10:
    dict(name='left_forefinger1',id=10, color=[255, 153, 255], type='', swap='right_forefinger1'),
    11:
    dict(name='left_forefinger2',id=11, color=[255, 153, 255], type='', swap='right_forefinger2'),
    12:
    dict(name='left_forefinger3',id=12, color=[255, 153, 255], type='', swap='right_forefinger3'),
    13:
    dict(name='left_forefinger4',id=13, color=[255, 153, 255], type='', swap='right_forefinger4'),

    14:
    dict(name='left_middle_finger1',id=14, color=[102, 178, 255], type='', swap='right_middle_finger1'),
    15:
    dict(name='left_middle_finger2',id=15, color=[102, 178, 255], type='', swap='right_middle_finger2'),
    16:
    dict(name='left_middle_finger3',id=16, color=[102, 178, 255], type='', swap='right_middle_finger3'),
    17:
    dict(name='left_middle_finger4',id=17, color=[102, 178, 255], type='', swap='right_middle_finger4'),

    18:
    dict(name='left_ring_finger1',id=18, color=[255, 51, 51], type='', swap='right_ring_finger1'),        
    19:
    dict(name='left_ring_finger2',id=19, color=[255, 51, 51], type='', swap='right_ring_finger2'),      
    20:
    dict(name='left_ring_finger3',id=20, color=[255, 51, 51], type='', swap='right_ring_finger3'),      
    21:
    dict(name='left_ring_finger4',id=21, color=[255, 51, 51], type='', swap='right_ring_finger4'),      

    22:
    dict(name='left_pinky_finger1',id=22, color=[0, 255, 0], type='', swap='right_pinky_finger1'),    
    23:
    dict(name='left_pinky_finger2',id=23, color=[0, 255, 0], type='', swap='right_pinky_finger2'),    
    24:
    dict(name='left_pinky_finger3',id=24, color=[0, 255, 0], type='', swap='right_pinky_finger3'),    
    25:
    dict(name='left_pinky_finger4',id=25, color=[0, 255, 0], type='', swap='right_pinky_finger4'),    

    26:
    dict(name='right_thumb1',id=26, color=[255, 128, 0], type='', swap='left_thumb1'),
    27:
    dict(name='right_thumb2',id=27, color=[255, 128, 0], type='', swap='left_thumb2'),
    28:
    dict(name='right_thumb3',id=28, color=[255, 128, 0], type='', swap='left_thumb3'),
    29:
    dict(name='right_thumb4',id=29, color=[255, 128, 0], type='', swap='left_thumb4'),

    30:
    dict(name='right_forefinger1',id=30, color=[255, 153, 255], type='', swap='left_forefinger1'),
    31:
    dict(name='right_forefinger2',id=31, color=[255, 153, 255], type='', swap='left_forefinger2'),
    32:
    dict(name='right_forefinger3',id=32, color=[255, 153, 255], type='', swap='left_forefinger3'),
    33:
    dict(name='right_forefinger4',id=33, color=[255, 153, 255], type='', swap='left_forefinger4'),

    34:
    dict(name='right_middle_finger1',id=34, color=[102, 178, 255], type='', swap='left_middle_finger1'),
    35:
    dict(name='right_middle_finger2',id=35, color=[102, 178, 255], type='', swap='left_middle_finger2'),
    36:
    dict(name='right_middle_finger3',id=36, color=[102, 178, 255], type='', swap='left_middle_finger3'),
    37:
    dict(name='right_middle_finger4',id=37, color=[102, 178, 255], type='', swap='left_middle_finger4'),

    38:
    dict(name='right_ring_finger1',id=38, color=[255, 51, 51], type='', swap='left_ring_finger1'),
    39:
    dict(name='right_ring_finger2',id=39, color=[255, 51, 51], type='', swap='left_ring_finger2'),
    40:
    dict(name='right_ring_finger3',id=40, color=[255, 51, 51], type='', swap='left_ring_finger3'),
    41:
    dict(name='right_ring_finger4',id=41, color=[255, 51, 51], type='', swap='left_ring_finger4'),

    42:
    dict(name='right_pinky_finger1',id=42, color=[0, 255, 0], type='', swap='left_pinky_finger1'),
    43:
    dict(name='right_pinky_finger2',id=43, color=[0, 255, 0], type='', swap='left_pinky_finger2'),
    44:
    dict(name='right_pinky_finger3',id=44, color=[0, 255, 0], type='', swap='left_pinky_finger3'),
    45:
    dict(name='right_pinky_finger4',id=45, color=[0, 255, 0], type='', swap='left_pinky_finger4'),
    },

skeleton_info={

    0:
    dict(link=('left_shoulder', 'right_shoulder'), id=0, color=[51, 153, 255]),
    1:
    dict(link=('left_shoulder', 'left_elbow'), id=1, color=[0, 255, 0]),
    2:
    dict(link=('left_elbow', 'left_wrist'), id=2, color=[0, 255, 0]),

    3:
    dict(link=('left_wrist', 'left_thumb1'), id=3, color=[255, 128,0]),
    4:
    dict(link=('left_thumb1', 'left_thumb2'), id=4, color=[255, 128, 0]),
    5:
    dict(link=('left_thumb2', 'left_thumb3'), id=5, color=[255, 128, 0]),
    6:
    dict(link=('left_thumb3', 'left_thumb4'), id=6, color=[255, 128, 0]),

    7:
    dict(link=('left_wrist', 'left_forefinger1'), id=7, color=[255, 153, 255]),
    8:
    dict(link=('left_forefinger1', 'left_forefinger2'), id=8, color=[255, 153, 255]),
    9:
    dict(link=('left_forefinger2', 'left_forefinger3'), id=9, color=[255, 153, 255]),
    10:
    dict(link=('left_forefinger3', 'left_forefinger4'), id=10, color=[255, 153, 255]),

    11:
    dict(link=('left_wrist', 'left_middle_finger1'), id=11, color=[102, 178, 255]),
    12:
    dict(link=('left_middle_finger1', 'left_middle_finger2'), id=12, color=[102, 178, 255]),
    13:
    dict(link=('left_middle_finger2', 'left_middle_finger3'), id=13, color=[102, 178, 255]),
    14:
    dict(link=('left_middle_finger3', 'left_middle_finger4'), id=14, color=[102, 178, 255]),

    15:
    dict(link=('left_wrist', 'left_ring_finger1'), id=15, color=[255, 51, 51]),
    16:
    dict(link=('left_ring_finger1', 'left_ring_finger2'), id=16, color=[255, 51, 51]),
    17:
    dict(link=('left_ring_finger2', 'left_ring_finger3'), id=17, color=[255, 51, 51]),
    18:
    dict(link=('left_ring_finger3', 'left_ring_finger4'), id=18, color=[255, 51, 51]),

    19:
    dict(link=('left_wrist', 'left_pinky_finger1'), id=19, color=[0, 255, 0]),
    20:
    dict(link=('left_pinky_finger1', 'left_pinky_finger2'), id=20, color=[0, 255, 0]),
    21:
    dict(link=('left_pinky_finger2', 'left_pinky_finger3'), id=21, color=[0, 255, 0]),
    22:
    dict(link=('left_pinky_finger3', 'left_pinky_finger4'), id=22, color=[0, 255, 0]),

    23:
    dict(link=('right_wrist', 'right_thumb1'), id=23, color=[255, 128, 0]),
    24:
    dict(link=('right_thumb1', 'right_thumb2'), id=24, color=[255, 128, 0]),
    25:
    dict(link=('right_thumb2', 'right_thumb3'), id=25, color=[255, 128, 0]),
    26:
    dict(link=('right_thumb3', 'right_thumb4'), id=26, color=[255, 128, 0]),

    27:
    dict(link=('right_wrist', 'right_forefinger1'), id=27, color=[255, 153, 255]),
    28:
    dict(link=('right_forefinger1', 'right_forefinger2'), id=28, color=[255, 153, 255]),
    29:
    dict(link=('right_forefinger2', 'right_forefinger3'), id=29, color=[255, 153, 255]),
    30:
    dict(link=('right_forefinger3', 'right_forefinger4'), id=30, color=[255, 153, 255]),

    31:
    dict(link=('right_wrist', 'right_middle_finger1'), id=31, color=[102, 178, 255]),
    32:
    dict(link=('right_middle_finger1', 'right_middle_finger2'), id=32, color=[102, 178, 255]),
    33:
    dict(link=('right_middle_finger2', 'right_middle_finger3'), id=33, color=[102, 178, 255]),
    34:
    dict(link=('right_middle_finger3', 'right_middle_finger4'), id=34, color=[102, 178, 255]),

    35:
    dict(link=('right_wrist', 'right_ring_finger1'), id=35, color=[255, 51, 51]),
    36:
    dict(link=('right_ring_finger1', 'right_ring_finger2'), id=36, color=[255, 51, 51]),
    37:
    dict(link=('right_ring_finger2', 'right_ring_finger3'), id=37, color=[255, 51, 51]),
    38:
    dict(link=('right_ring_finger3', 'right_ring_finger4'), id=38, color=[255, 51, 51]),

    39:
    dict(link=('right_wrist', 'right_pinky_finger1'), id=39, color=[0, 255, 0]),
    40:
    dict(link=('right_pinky_finger1', 'right_pinky_finger2'), id=40, color=[0, 255, 0]),
    41:
    dict(link=('right_pinky_finger2', 'right_pinky_finger3'), id=41, color=[0, 255, 0]),
    42:
    dict(link=('right_pinky_finger3', 'right_pinky_finger4'), id=42, color=[0, 255, 0]),
},

joint_weights=[1.] * 46,

sigmas=[
    0.079, 0.079, 0.072, 0.072, 0.062, 0.062, 0.007, 0.007, 0.008, 0.011, 
    0.008, 0.008, 0.008, 0.01, 0.008, 0.029, 0.022, 0.035, 0.018, 0.024, 
    0.022, 0.026, 0.017, 0.021, 0.021, 0.032,0.022, 0.035, 0.037, 0.047, 
    0.026, 0.025, 0.024, 0.035, 0.018, 0.024, 0.022, 0.026,0.017, 0.021, 
    0.021, 0.032, 0.02, 0.019, 0.022, 0.031]

)

Reproduces the problem - command or script

python tools/train.py /home/lab/Anaconda_project/RTMPose/train_config/double_arm_train_config.py --work-dir /home/lab/Anaconda_project/RTMPose/checkpoint

Reproduces the problem - error message

/home/lab/Anaconda_project/mmpose/mmpose/datasets/transforms/common_transforms.py:656: UserWarning: Blur is not pixel-level transformations. Please use with caution. warnings.warn( /home/lab/Anaconda_project/mmpose/mmpose/datasets/transforms/common_transforms.py:656: UserWarning: MedianBlur is not pixel-level transformations. Please use with caution. warnings.warn( /home/lab/Anaconda_project/mmpose/mmpose/datasets/transforms/common_transforms.py:656: UserWarning: CoarseDropout is not pixel-level transformations. Please use with caution. warnings.warn( Traceback (most recent call last): File "/home/lab/Anaconda_project/mmpose/tools/train.py", line 162, in main() File "/home/lab/Anaconda_project/mmpose/tools/train.py", line 158, in main runner.train() File "/home/lab/.local/lib/python3.10/site-packages/mmengine/runner/runner.py", line 1728, in train self._train_loop = self.build_train_loop( File "/home/lab/.local/lib/python3.10/site-packages/mmengine/runner/runner.py", line 1527, in build_train_loop loop = EpochBasedTrainLoop( File "/home/lab/.local/lib/python3.10/site-packages/mmengine/runner/loops.py", line 44, in init super().init(runner, dataloader) File "/home/lab/.local/lib/python3.10/site-packages/mmengine/runner/base_loop.py", line 26, in init self.dataloader = runner.build_dataloader( File "/home/lab/.local/lib/python3.10/site-packages/mmengine/runner/runner.py", line 1370, in build_dataloader dataset = DATASETS.build(dataset_cfg) File "/home/lab/.local/lib/python3.10/site-packages/mmengine/registry/registry.py", line 570, in build return self.build_func(cfg, *args, **kwargs, registry=self) File "/home/lab/.local/lib/python3.10/site-packages/mmengine/registry/build_functions.py", line 121, in build_from_cfg obj = obj_cls(**args) # type: ignore File "/home/lab/.local/lib/python3.10/site-packages/mmengine/dataset/base_dataset.py", line 247, in init self.full_init() File "/home/lab/.local/lib/python3.10/site-packages/mmengine/dataset/base_dataset.py", line 298, in full_init self.data_list = self.load_data_list() File "/home/lab/.local/lib/python3.10/site-packages/mmengine/dataset/base_dataset.py", line 440, in load_data_list raise ValueError('Annotation must have data_list and metainfo ' ValueError: Annotation must have data_list and metainfo keys

Additional information

我按照Customize Datasets进行配置,但是在训练自定义数据集时,报错ValueError: Annotation must have data_list and metainfo keys,目前不太清除是什么原因导致的,数据集路径都就检查国应该没有问题。

690696306 avatar May 22 '24 04:05 690696306

将dataset_type = 'customdataset' 替换为 dataset_type = 'CocoDataset' 就能够正常训练

690696306 avatar May 22 '24 04:05 690696306