【项目05】数据规约与数据增广

作者:欧新宇(Xinyu OU)
开发平台:Paddle 2.1
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti

本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。

最后更新:2021年10月20日


【项目要点】

  1. 理解图像数据的基本预处理和数据增广的基本方法
  2. 学会基于Opencv(cv2)库的数据处理方法
  3. 学会基于paddle.vision库的数据处理方法
  4. 学会在深度学习任务中,实现对数据集的读取和基本预处理方法
  5. 学会对训练集和测试集使用不同的数据增广方法。

【思维导图】

Handout0601

一、面向深度学习的数据预处理简介

在深度学习的工程实践中,我们得到的数据通常都是脏数据,会存在缺失、重复、噪声、不一致、不可用等问题,同时也存在数据量小、多样性不足等问题。数据预处理(Data Preprocessing) 是指在使用数据进行训练或推理前对数据进行的一些基本处理,具体包括数据清洗数据标注数据集成数据列表生成数据规约数据增广六个部分,它们的功能如下:

  1. 数据清洗(Data Cleaning):通过光滑噪声数据、识别并删除坏数据(数据集中无法访问的数据)和脏数据(与任务无关的数据)、去除冗余等操作来实现数据的清洗。
  2. 数据标注(Data Annotations):按任务不同,对数据进行类别、区域的认知与识别,并生成标注数据。
  3. 数据集成(Data Intergration):当需要使用多个数据集进行混合训练时,就需要进行数据集成。数据集成涉及标签的兼容与覆盖、数据的去重、数据的二次标注等问题。
  4. 数据列表生成(List Generation):按照任务的要求,将数据集进行划分并生成数据路径列表文件和标签文件,用于训练、验证和测试。例如分类任务的每一条数据都是[路径,标签]的组合,检测任务常见的标准包括VOC格式(xml文件)和coco格式(json文件)。一般来说,数据集需要被划分为train, val, test, trainval四个子集, 其中trainval是train和val的集合。
  5. 数据规约(Data Reduction):数据规约又称为基本数据预处理,包括像素归一化、均值消除、维度规约、数量规约、通道转换、数据类型变换等。数据归一化实现将像素值从[0,255]归一化到[0,1];均值消除包括均值减除和方差归一化两部分;维度规约通过消除代表性不强的特征来实现特征数量的减少;数量规约主要是实现量纲的统一;通道转换实现将Numpy数据类型转换为Paddle规定的Tensor类型,也即从HWC转换为CHW;数据类型转换实现将任意类型的输入值转化为特定的数据类型,例如32位浮点型(float32)和8位整型(Int8)。
  6. 数据增广(Data Augumentation):数据增广是深度学习任务中非常常见的数据预处理步骤,它的主要作用是防止(缓解)过拟合问题,并增强模型的泛化能力。常见的数据增广方法包括水平/垂直翻转、2D旋转、缩放、随机裁剪、平移、对比度调整、色彩扰动、增加噪声(添加遮挡)、以及融合多种变换的混合变换等。

本项目主要聚焦于数据规约数据增广

二. 图像载入与显示

在python中,最常用的图像处理和操作库有两个,分别是Python图形库(Python Imaging Library, PIL)和开源计算机视觉库(OpenSource Computer Vision, OpenCV)。两个库通常都可以实现大多数图像的变换操作。

相较而言对于简单的图像操作PIL是不错的选择,因为其代码简单;而当需要同时处理图像、视频,或者更高级功能时,OpenCV是不二的选择。此外在大多数相同操作中,OpenCV的执行效率要更高一些,因此在批量处理时,OpenCV速度更快。

2.1 图像载入

  1. PIL库使用img=Image.open()方法打开图片时,图像类型为PIL Image,值为0-255,尺寸为W*H*C,图像使用的是RGB通道(这一点和matplotlib是一致的)更便于显示,但要进行操作需要转换为numpy数组,方法为:img=np.array(img),转换后的尺寸为H*W*C。
  2. OpenCV库使用img=cv2.imread()方法打开图片时,图像类型为numpy数据,图像使用的时BGR通道,值是0-255,但尺寸为H*W*C,这个格式便于后续处理。但是如果要使用matplotlib进行显示,就需要将颜色通道从BGR转换为RGB,方法为img=cv2.cvtColor(img, cv2.COLOR_BGR2RGB),转换后的尺寸不变,仍然为H*W*C。注意直接使用opencv显示不需要进行转换。

此外,PaddlePaddle提供了一个数据预处理的库,在使用Paddle进行编程的时候,可以直接调用paddle.vision.transforms数据预处理库进行处理,该库提供了简易的数据接口,可以大大提高变成的效率。在Paddle.vision视觉库中,同时提供了PILcv2两种数据接口。当设置set_image_backend('cv2')时,数据格式和cv2一致;不做设置时,数据格式和PIL一致。

2.2 图像显示

2.2.1 基于Notebook的内嵌式显示