Dynamic batch
date
May 12, 2021
slug
dynamic batch
status
Published
tags
Deep Learning
OCR
summary
type
Post
CNN 在训练时一个 batch 中的图片尺寸必须一致,通常的做法有:
- resize 到统一尺寸
- crop 统一尺寸的切片
- resize + padding 到固定尺寸,例如 yolov3 中的 letterbox
- padding 到 batch 中最大的宽/高尺寸
不同处理方式适用于不同的训练任务,其中第四种方法存在的问题是,当训练集中图片的宽高比方差较大时,会浪费很多计算量在 padding 的像素上,最坏的情况可能会 GPU OOM。
目标检测领域常用的两个开源项目 detectron2 和 mmdetection 都默认采用了 Aspect Ratio Group 的 batch 策略,即在训练时确保一个 batch 中仅包含长宽比大于 1 的图或小于 1 的图。其中 detectron2 的实现方法如下:
创建一个可以无限取数据索引的 sampler,用其实例化一个每次只返回一个样本的 dataloader(也可以无限取),group 的操作在 AspectRatioGroupedDataset 中完成,
__iter__
中无限取相同宽高比的图,直到等于 batch_size 再 yield 返回。在 OCR 领域,训练文本识别模型,如 CRNN 时,输入是裁切好的文本行图片,图片长宽比分布范围较大是一个比较常见的问题(长宽比可能从 1 到十几)
除了参考 Aspect Ratio Group 的做法,多分几个大于 1 长宽比的 bin 外,还有个思路是在训练过程中动态地合并训练图片,即把长宽比较小的图片合并成一行,这样既可以提高显卡算力的利用率(更少地算力用在 padding 上),也可以丰富数据的多样性。