mmdetection2.6自定義數據集pipeline

1. data pipeline的基本使用

mmdetection的數據讀取方式分為兩部分,第一部分為數據集,第二部分為data pipeline,通常數據集定義如何處理標註信息,而pipeline定義處理數據字典的所有步驟,一個pipeline由一系列的操作組成,每一個操作都採用一個dict作為輸入,並且也輸出一個dict作為下一個操作的輸入。

下圖是一個經典的pipeline,藍色的方塊是piplline的基本操作,隨着pipeline的移動,每個操作都可以加入新的鍵(綠色的字)作為結果的dict。並且更新已經存在的鍵值(橘色的字)。

../_images/data_pipeline.png

這些操作被分為數據加載,預處理,格式化,測試時增強。

faster rcnn的pipeline的例子:

img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', with_bbox=True),
    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
    dict(type='RandomFlip', flip_ratio=0.5),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='Pad', size_divisor=32),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),
]
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(
        type='MultiScaleFlipAug',
        img_scale=(1333, 800),
        flip=False,
        transforms=[
            dict(type='Resize', keep_ratio=True),
            dict(type='RandomFlip'),
            dict(type='Normalize', **img_norm_cfg),
            dict(type='Pad', size_divisor=32),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='Collect', keys=['img']),
        ])
]

下邊列出了各種operation添加,更新與移除的dict行為。

1.1 數據加載

  • LoadImageFromFile

添加:img,img_shape,ori_shape

  • LoadAnnotations

添加:gt_bboxes,gt_bboxes_ignore,gt_labels,gt_masks,gt_semantic_seg,bbox_fields,mask_fields

  • LoadProposals

添加:proposals

1.2 預處理

  • Resize

添加:scale,scale_idx,pad_shape,scale_factor,keep_ratio
更新:img,img_shape,* bbox_fields,* mask_fields,* seg_fields

  • RandomFlip

添加:flip
更新:img,* bbox_fields,* mask_fields,* seg_fields

  • Pad

添加:pad_fixed_size,pad_size_divisor
更新:img,pad_shape,* mask_fields,* seg_fields

  • RandomCrop

更新:img,pad_shape,gt_bboxes,gt_labels,gt_masks,* bbox_fields

  • Normalize

添加:img_norm_cfg
更新:img

  • SegRescale

更新:gt_semantic_seg

  • PhotoMetricDistortion

更新:img

  • Expand

更新:img,gt_bboxes

  • MinIoURandomCrop

更新:img,gt_bboxes,gt_labels

  • Corrupt

更新:img

1.3 格式化

  • ToTensor

更新:specified by keys.

  • ImageToTensor

更新:specified by keys.

  • Transpose

更新:specified by keys.

  • ToDataContainer

更新:specified by fields.

  • DefaultFormatBundle

更新:img,proposals,gt_bboxes,gt_bboxes_ignore,gt_labels,gt_masks,gt_semantic_seg

  • Collect

添加:img_meta(img_meta的鍵由指定meta_keys
刪除:除由所指定的鍵外的所有其他鍵

1.4 測試時增強

  • MultiScaleFlipAug

2. 擴展並使用自定義的pipeline

  1. 新建一個python文件,例如: my_pipeline.py,輸入為一個dict輸出也為一個dict
from mmdet.datasets import PIPELINES

@PIPELINES.register_module()
class MyTransform:

    def __call__(self, results):
        results['dummy'] = True
        return results
  1. Import這個新類
from .my_pipeline import MyTransform
  1. 在config文件中使用這個pipeline
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', with_bbox=True),
    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
    dict(type='RandomFlip', flip_ratio=0.5),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='Pad', size_divisor=32),
    dict(type='MyTransform'),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),
]