本文讨论的是MMSeg 1.x的实现。
虽然data_preprocessor名字里面有个pre,但实际上,数据是先通过train_pipeline/test_pipeline中的各项数据增强后,然后再交由SegDataPreProcessor打包成偏tensor的形式,最终输入网络进行训练/测试。从更加容易理解的角度出发,data_preprocessor实质上更像是data_augmentation的最后一步。
那么这个preprocessor主要完成这么几项功能:
- 将数据移到cuda(如果有)。这是因为一些数据增强操作可能会生成较多中间特征图占用显存空间,因此改为了先在内存中处理,处理完毕后再放入显存。
- 对图像进行padding,将尺寸统一调整至网络最终的输入分辨率。这主要考虑MMSeg中RandomCrop之类的数据增强并不保证返回的图像尺寸为指定的crop尺寸(可能更小)。
- 将图像打包为batch。MMSeg数据增强流水线(也就是pipeline)返回的是各个独立的图像对象,preprocessor通过类似于torch.stack的流程将每个batch中的所有图像打包至一个tensor中。
- 进行normalize操作。一般就是按imagenet的mean与std进行标准化。