Files

180 lines
5.5 KiB
Python

# Author: T. S. Liang @ Rama Alpaca
# Emails: tsliang2001@gmail.com | shuangliang@ramaalpaca.com
# Date: Feb. 2025
# Description: The dataloader for the training and evaluation protocol.
# License: MIT License (see LICENSE for details)
from torch.utils.data import DataLoader
from mmengine.dataset import default_collate
from mmengine.registry import init_default_scope
from mmpose.registry import DATASETS
init_default_scope('mmpose')
def prepare_dataset(batch_size, dataset_name, dataset_root, mode = "val", num_workers = 4):
image_size = [768, 1024] ## width x height
sigma = 6 ## sigma is 2 for 256
scale = 4
codec = dict(
type='UDPHeatmap', input_size=(image_size[0], image_size[1]), heatmap_size=(int(image_size[0]/scale), int(image_size[1]/scale)), sigma=sigma)
train_pipeline = [
dict(type='LoadImage'),
dict(type='GetBBoxCenterScale'),
dict(type='RandomFlip', direction='horizontal'),
dict(type='RandomHalfBody'),
dict(type='RandomBBoxTransform'),
dict(type='TopdownAffine', input_size=codec['input_size'], use_udp=True),
dict(type='PhotometricDistortion'),
dict(type='CacheRGBTarget'),
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'),
dict(type='GetBBoxCenterScale'),
dict(type='TopdownAffine', input_size=codec['input_size'], use_udp=True),
dict(type='CacheRGBTarget'),
dict(type='PackPoseInputs'),
]
train_cfg = dict(
type='CocoDataset',
data_root=dataset_root,
data_mode='topdown',
ann_file='COCO/annotations/person_keypoints_train2017.json',
data_prefix=dict(img='COCO/train2017/'),
pipeline=train_pipeline,
)
if dataset_name == "COCO_OOD":
print("Running Validation on COCO_OOD.")
val_cfg = dict(
type='CocoDataset',
data_root=dataset_root,
data_mode='topdown',
ann_file='COCO/annotations/person_keypoints_val2017.json',
data_prefix=dict(img='COCO/val2017oil/'),
test_mode=True,
pipeline=val_pipeline,
bbox_file='COCO/person_detection_results/COCO_val2017_detections_AP_H_70_person.json',
)
elif dataset_name == "Humanart":
print("Running Validation on Humanart.")
val_cfg = dict(
type='HumanArtDataset',
data_root=dataset_root,
data_mode='topdown',
ann_file='HumanArt/annotations/validation_humanart.json',
test_mode=True,
pipeline=val_pipeline,
)
elif dataset_name == "COCO":
print("Running Validation on COCO.")
val_cfg = dict(
type='CocoDataset',
data_root=dataset_root,
data_mode='topdown',
ann_file='COCO/annotations/person_keypoints_val2017.json',
data_prefix=dict(img='COCO/val2017/'),
test_mode=True,
pipeline=val_pipeline,
bbox_file='COCO/person_detection_results/COCO_val2017_detections_AP_H_70_person.json',
)
elif dataset_name == "COCOWholebody":
print("Running Validation on COCO Wholebody.")
val_cfg = dict(
type='CocoWholeBodyDataset',
data_root=dataset_root,
data_mode='topdown',
ann_file='COCO/annotations/coco_wholebody_val_v1.0.json',
data_prefix=dict(img='COCO/val2017/'),
test_mode=True,
pipeline=val_pipeline,
bbox_file='COCO/person_detection_results/COCO_val2017_detections_AP_H_70_person.json',
)
elif dataset_name == "COCO-OOD_Wholebody":
print("Running Validation on COCO-OOD Wholebody.")
val_cfg = dict(
type='CocoWholeBodyDataset',
data_root=dataset_root,
data_mode='topdown',
ann_file='COCO/annotations/coco_wholebody_val_v1.0.json',
data_prefix=dict(img='COCO/val2017oil/'),
test_mode=True,
pipeline=val_pipeline,
bbox_file='COCO/person_detection_results/COCO_val2017_detections_AP_H_70_person.json',
)
if mode == "train":
train_ds = DATASETS.build(train_cfg)
val_ds = DATASETS.build(val_cfg)
train_loader = DataLoader(
train_ds,
batch_size=batch_size,
shuffle=True,
num_workers=num_workers,
collate_fn=default_collate,
pin_memory=True,
)
val_loader = DataLoader(
val_ds,
batch_size=batch_size,
shuffle=False,
num_workers=num_workers,
collate_fn=default_collate,
pin_memory=True,
)
return train_loader, val_loader
elif mode == "val":
val_ds = DATASETS.build(val_cfg)
val_loader = DataLoader(
val_ds,
batch_size=batch_size,
shuffle=False,
num_workers=num_workers,
collate_fn=default_collate,
pin_memory=True,
)
return val_loader