Spaces:
Running
on
Zero
Running
on
Zero
# pylint: disable=duplicate-code | |
"""COCO data loading config for YOLOX object detection.""" | |
from __future__ import annotations | |
from collections.abc import Sequence | |
from ml_collections import ConfigDict | |
from vis4d.config import class_config | |
from vis4d.config.typing import DataConfig | |
from vis4d.data.const import CommonKeys as K | |
from vis4d.data.data_pipe import DataPipe, MultiSampleDataPipe | |
from vis4d.data.datasets.coco import COCO | |
from vis4d.data.io import DataBackend | |
from vis4d.data.loader import build_train_dataloader, default_collate | |
from vis4d.data.transforms.affine import ( | |
AffineBoxes2D, | |
AffineImages, | |
GenAffineParameters, | |
) | |
from vis4d.data.transforms.base import RandomApply, compose | |
from vis4d.data.transforms.flip import FlipBoxes2D, FlipImages | |
from vis4d.data.transforms.mixup import ( | |
GenMixupParameters, | |
MixupBoxes2D, | |
MixupImages, | |
) | |
from vis4d.data.transforms.mosaic import ( | |
GenMosaicParameters, | |
MosaicBoxes2D, | |
MosaicImages, | |
) | |
from vis4d.data.transforms.pad import PadImages | |
from vis4d.data.transforms.photometric import RandomHSV | |
from vis4d.data.transforms.post_process import PostProcessBoxes2D | |
from vis4d.data.transforms.resize import ( | |
GenResizeParameters, | |
ResizeBoxes2D, | |
ResizeImages, | |
) | |
from vis4d.data.transforms.to_tensor import ToTensor | |
from vis4d.engine.connectors import data_key, pred_key | |
from vis4d.zoo.base import get_inference_dataloaders_cfg | |
from vis4d.zoo.base.callable import get_callable_cfg | |
CONN_COCO_BBOX_EVAL = { | |
"coco_image_id": data_key(K.sample_names), | |
"pred_boxes": pred_key("boxes"), | |
"pred_scores": pred_key("scores"), | |
"pred_classes": pred_key("class_ids"), | |
} | |
CONN_COCO_MASK_EVAL = { | |
"coco_image_id": data_key(K.sample_names), | |
"pred_boxes": pred_key("boxes.boxes"), | |
"pred_scores": pred_key("boxes.scores"), | |
"pred_classes": pred_key("boxes.class_ids"), | |
"pred_masks": pred_key("masks"), | |
} | |
def get_train_dataloader( | |
data_root: str, | |
split: str, | |
keys_to_load: Sequence[str], | |
data_backend: None | DataBackend, | |
image_size: tuple[int, int], | |
scaling_ratio_range: tuple[float, float], | |
use_mixup: bool, | |
samples_per_gpu: int, | |
workers_per_gpu: int, | |
) -> ConfigDict: | |
"""Get the default train dataloader for COCO detection.""" | |
# Train Dataset | |
train_dataset_cfg = class_config( | |
COCO, | |
keys_to_load=keys_to_load, | |
data_root=data_root, | |
split=split, | |
remove_empty=False, | |
image_channel_mode="BGR", | |
data_backend=data_backend, | |
) | |
# Train Preprocessing | |
preprocess_transforms = [ | |
[ | |
class_config(GenMosaicParameters, out_shape=image_size), | |
class_config(MosaicImages, imresize_backend="cv2"), | |
class_config(MosaicBoxes2D), | |
] | |
] | |
preprocess_transforms += [ | |
[ | |
class_config( | |
GenAffineParameters, | |
scaling_ratio_range=scaling_ratio_range, | |
border=(-image_size[0] // 2, -image_size[1] // 2), | |
), | |
class_config(AffineImages, as_int=True), | |
class_config(AffineBoxes2D), | |
] | |
] | |
if use_mixup: | |
preprocess_transforms += [ | |
[ | |
class_config( | |
GenMixupParameters, | |
out_shape=image_size, | |
mixup_ratio_dist="const", | |
scale_range=(0.8, 1.6), | |
pad_value=114.0, | |
), | |
class_config(MixupImages, imresize_backend="cv2"), | |
class_config(MixupBoxes2D), | |
] | |
] | |
preprocess_transforms.append( | |
[class_config(PostProcessBoxes2D, min_area=1.0)] | |
) | |
train_batchprocess_cfg = class_config( | |
compose, | |
transforms=[ | |
class_config(RandomHSV, same_on_batch=False), | |
class_config( | |
RandomApply, | |
transforms=[ | |
class_config(FlipImages), | |
class_config(FlipBoxes2D), | |
], | |
probability=0.5, | |
same_on_batch=False, | |
), | |
class_config( | |
GenResizeParameters, | |
shape=image_size, | |
keep_ratio=True, | |
same_on_batch=False, | |
), | |
class_config(ResizeImages, imresize_backend="cv2"), | |
class_config(ResizeBoxes2D), | |
class_config(PadImages, value=114.0, pad2square=True), | |
class_config(ToTensor), | |
], | |
) | |
return class_config( | |
build_train_dataloader, | |
dataset=class_config( | |
MultiSampleDataPipe, | |
datasets=train_dataset_cfg, | |
preprocess_fn=preprocess_transforms, | |
), | |
samples_per_gpu=samples_per_gpu, | |
workers_per_gpu=workers_per_gpu, | |
batchprocess_fn=train_batchprocess_cfg, | |
collate_fn=get_callable_cfg(default_collate), | |
pin_memory=True, | |
shuffle=True, | |
) | |
def get_test_dataloader( | |
data_root: str, | |
split: str, | |
keys_to_load: Sequence[str], | |
data_backend: None | DataBackend, | |
image_size: tuple[int, int], | |
samples_per_gpu: int, | |
workers_per_gpu: int, | |
) -> ConfigDict: | |
"""Get the default test dataloader for COCO detection.""" | |
# Test Dataset | |
test_dataset = class_config( | |
COCO, | |
keys_to_load=keys_to_load, | |
data_root=data_root, | |
split=split, | |
image_channel_mode="BGR", | |
data_backend=data_backend, | |
) | |
# Test Preprocessing | |
preprocess_transforms = [ | |
class_config(GenResizeParameters, shape=image_size, keep_ratio=True), | |
class_config(ResizeImages, imresize_backend="cv2"), | |
] | |
test_preprocess_cfg = class_config( | |
compose, transforms=preprocess_transforms | |
) | |
test_batchprocess_cfg = class_config( | |
compose, | |
transforms=[ | |
class_config(PadImages, value=114.0, pad2square=True), | |
class_config(ToTensor), | |
], | |
) | |
# Test Dataset Config | |
test_dataset_cfg = class_config( | |
DataPipe, datasets=test_dataset, preprocess_fn=test_preprocess_cfg | |
) | |
return get_inference_dataloaders_cfg( | |
datasets_cfg=test_dataset_cfg, | |
batchprocess_cfg=test_batchprocess_cfg, | |
samples_per_gpu=samples_per_gpu, | |
workers_per_gpu=workers_per_gpu, | |
) | |
def get_coco_yolox_cfg( | |
data_root: str = "data/coco", | |
train_split: str = "train2017", | |
train_keys_to_load: Sequence[str] = ( | |
K.images, | |
K.boxes2d, | |
K.boxes2d_classes, | |
), | |
test_split: str = "val2017", | |
test_keys_to_load: Sequence[str] = (K.images, K.original_images), | |
data_backend: None | ConfigDict = None, | |
train_image_size: tuple[int, int] = (640, 640), | |
scaling_ratio_range: tuple[float, float] = (0.1, 2.0), | |
use_mixup: bool = True, | |
test_image_size: tuple[int, int] = (640, 640), | |
samples_per_gpu: int = 2, | |
workers_per_gpu: int = 2, | |
) -> DataConfig: | |
"""Get the default config for COCO detection.""" | |
data = DataConfig() | |
data.train_dataloader = get_train_dataloader( | |
data_root=data_root, | |
split=train_split, | |
keys_to_load=train_keys_to_load, | |
data_backend=data_backend, | |
image_size=train_image_size, | |
scaling_ratio_range=scaling_ratio_range, | |
use_mixup=use_mixup, | |
samples_per_gpu=samples_per_gpu, | |
workers_per_gpu=workers_per_gpu, | |
) | |
data.test_dataloader = get_test_dataloader( | |
data_root=data_root, | |
split=test_split, | |
keys_to_load=test_keys_to_load, | |
data_backend=data_backend, | |
image_size=test_image_size, | |
samples_per_gpu=1, | |
workers_per_gpu=workers_per_gpu, | |
) | |
return data | |