In MMClassification, the data process and the dataset is decomposed. The datasets only define how to get samples’ basic information from the file system. These basic information includes the ground-truth label and raw images data / the paths of images.The data process includes data transforms, data preprocessors and batch augmentations.
Data Transforms: Transforms includes loading, preprocessing, formatting and etc.
Data Preprocessors: Processes includes collate, normalization, stacking, channel fliping and etc.
Batch Augmentations: Batch augmentation involves multiple samples, such as Mixup and CutMix.
To prepare the inputs data, we need to do some transforms on these basic
information. These transforms includes loading, preprocessing and
formatting. And a series of data transforms makes up a data pipeline.
Therefore, you can find the a
pipeline argument in the configs of dataset,
train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='RandomResizedCrop', scale=224), dict(type='RandomFlip', prob=0.5, direction='horizontal'), dict(type='PackClsInputs'), ] train_dataloader = dict( .... dataset=dict( pipeline=train_pipeline, ....), .... )
Every item of a pipeline list is one of the following data transforms class. And if you want to add a custom data transformation class, the tutorial Custom Data Pipelines will help you.
Composed augmentation is a kind of methods which compose a series of data
augmentation transforms, such as
To specify the augmentation combination (The
policies argument), you can use string to specify
from some preset policies.
Policy for ImageNet, come from DeepVoltaire/AutoAugment
And you can also configure a group of policies manually by selecting from the below table.
We also provides many transforms in MMCV. You can use them directly in the config files. Here are some frequently used transforms, and the whole transforms list can be found in mmcv.transforms.
Load an image from file.
Resize images & bbox & seg & keypoints.
Random resize images & bbox & keypoints.
Flip the image & bbox & keypoints & segmentation map.
Randomly convert image to grayscale with a probability.
Crop the center of the image, segmentation masks, bounding boxes and key points. If the crop area exceeds the original image and
Normalize the image.
Compose multiple transforms sequentially.
The data preprocessor is also a component to process the data before feeding data to the neural network. Comparing with the data transforms, the data preprocessor is a module of the classifier, and it takes a batch of data to process, which means it can use GPU and batch to accelebrate the processing.
The default data preprocessor in MMClassification could do the pre-processing like following:
Move data to the target device.
Pad inputs to the maximum size of current batch.
Stack inputs to a batch.
Convert inputs from bgr to rgb if the shape of input is (3, H, W).
Normalize image with defined std and mean.
Do batch augmentations like Mixup and CutMix during training.
You can configure the data preprocessor by the
data_preprocessor field or
model.data_preprocessor field in the config file. Typical usages are as below:
data_preprocessor = dict( # RGB format normalization parameters mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True, # convert image from BGR to RGB )
Or define in
model.data_preprocessor as following:
model = dict( backbone = ..., neck = ..., head = ..., data_preprocessor = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) train_cfg=..., )
Note that the
model.data_preprocessor has higher priority than
The batch augmentation is a component of data preprocessors. It involves multiple samples and mix them in some way, such as Mixup and CutMix.
These augmentations are usually only used during training, therefore, we use the
model.train_cfg field to configure them in config files.
model = dict( backbone=..., neck=..., head=..., train_cfg=dict(augments=[ dict(type='Mixup', alpha=0.8), dict(type='CutMix', alpha=1.0), ]), )
You can also specify the probabilities of every batch augmentation by the
model = dict( backbone=..., neck=..., head=..., train_cfg=dict(augments=[ dict(type='Mixup', alpha=0.8), dict(type='CutMix', alpha=1.0), ], probs=[0.3, 0.7]) )
Here is a list of batch augmentations can be used in MMClassification.