数据读取配置文件

# 每张GPU reader进程个数
worker_num: 2
# 训练数据
TrainReader:
  # 训练数据transforms
  sample_transforms:
  - Decode: {}
  - RandomResize: {target_size: [[640, 1333], [672, 1333], [704, 1333], [736, 1333], [768, 1333], [800, 1333]], interp: 2, keep_ratio: True}
  - RandomFlip: {prob: 0.5}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_transforms:
  # 由于模型存在FPN结构,输入图片需要padding为32的倍数
  - PadBatch: {pad_to_stride: 32}
  # 训练时batch_size
  batch_size: 1
  # 读取数据是是否乱序
  shuffle: true
  # 是否丢弃最后不能完整组成batch的数据
  drop_last: true
  # 表示reader是否对gt进行组batch的操作,在rcnn系列算法中设置为false,得到的gt格式为list[Tensor]
  collate_batch: false

# 评估数据
EvalReader:
  # 评估数据transforms
  sample_transforms:
  - Decode: {}
  - Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_transforms:
  # 由于模型存在FPN结构,输入图片需要padding为32的倍数
  - PadBatch: {pad_to_stride: 32}
  # 评估时batch_size
  batch_size: 1
  # 读取数据是是否乱序
  shuffle: false
  # 是否丢弃最后不能完整组成batch的数据
  drop_last: false
  # 是否丢弃没有标注的数据
  drop_empty: false

# 测试数据
TestReader:
  # 测试数据transforms
  sample_transforms:
  - Decode: {}
  - Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_transforms:
  # 由于模型存在FPN结构,输入图片需要padding为32的倍数
  - PadBatch: {pad_to_stride: 32}
  # 测试时batch_size
  batch_size: 1
  # 读取数据是是否乱序
  shuffle: false
  # 是否丢弃最后不能完整组成batch的数据
  drop_last: false

在线增强不会成倍增加数据集的大小,而是在训练的时候进行概率变换,只要训练的epoch数足够多,就可以实现与离线增强同样的效果。而离线数据增强由于成倍扩充数据集,所以不适合数据规模较大的情况。

常用的数据增强方法有颜色亮度对比度扰动、resize、裁剪、填充、翻转等。

数据增强具体实现的源码位置 PaddleDetection/ppdet/data/transform/operators.py

可以通过一个选项来将输入模型训练的图像保存到文件夹中查看,需要在配置文件中增加

- DebugVisibleImage: {}

除了单样本数据增强,还有一些多样本的数据增强,此处介绍mixup的使用方法,除了设置mixup的参数外,还需要设置这一策略的训练轮数。如果为-1表示不使用,大于训练epoch则为全程使用,小于训练epoch则为训练到指定轮数后停用这一策略。下面是ppyolo的数据读取配置文件,可以看到mixup的使用方法。

# 每张GPU reader进程个数
worker_num: 2
# 训练数据
TrainReader:
  inputs_def:
    num_max_boxes: 50
  # 训练数据transforms
  sample_transforms:
    - Decode: {}
    - Mixup: {alpha: 1.5, beta: 1.5}
    - RandomDistort: {}
    - RandomExpand: {fill_value: [123.675, 116.28, 103.53]}
    - RandomCrop: {}
    - RandomFlip: {}
  # batch_transforms
  batch_transforms:
    - BatchRandomResize: {target_size: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608], random_size: True, random_interp: True, keep_ratio: False}
    - NormalizeBox: {}
    - PadBox: {num_max_boxes: 50}
    - BboxXYXY2XYWH: {}
    - NormalizeImage: {mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], is_scale: True}
    - Permute: {}
    - Gt2YoloTarget: {anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]], anchors: [[10, 13], [16, 30], [33, 23], [30, 61], [62, 45], [59, 119], [116, 90], [156, 198], [373, 326]], downsample_ratios: [32, 16, 8]}
  # 训练时batch_size
  batch_size: 24
  # 读取数据是是否乱序
  shuffle: true
  # 是否丢弃最后不能完整组成batch的数据
  drop_last: true
  # mixup_epoch,大于最大epoch,表示训练过程一直使用mixup数据增广
  mixup_epoch: 25000
  # 是否通过共享内存进行数据读取加速,需要保证共享内存大小(如/dev/shm)满足大于1G
  use_shared_memory: true

更多推荐

PaddleDetection的配置文件以及数据增强