dataset模块之图像数据处理
在开始之前,首先声明本篇文章参考官方文档,我基于官网的这篇文章加以自己的理解发表了这篇博客,希望大家能够更快更简单直观的体验MindSpore,如有不妥的地方欢迎大家指正。
概述
在计算机视觉任务中,数据量过小或是样本场景单一等问题都会影响模型的训练效果,用户可以通过数据增强操作对图像进行预处理,从而提升模型的泛化性。MindSpore提供了内置的c_transforms
模块用于对图像数据的处理和增强。它是基于C++的OpenCV实现,具有较高的性能,所以在处理图像数据集时,会优先考虑使用该模块的内置算子。
c_transforms模块中常见的数据增强算子如下表所示:
模块 | 算子 | 说明 |
---|---|---|
c_transforms | RandomCrop | 在图像随机位置裁剪指定大小子图像。 |
RandomHorizontalFlip | 按照指定概率对图像进行水平翻转。 | |
Resize | 将图像缩放到指定大小。 | |
Invert | 将图像进行反相。 |
接下来,我将给大家详细介绍这几个常用算子。
RandomCrop
1.功能
在随机位置裁剪输入图像。如果输入图像大小小于输出大小,则在剪切前将填充输入图像。该算子在数据集偏小的时候非常有用,它可以在有限的样本基础上,有效地扩充数据集。
2、参数
RandomCrop(size, padding=None, pad_if_needed=False, fill_value=0, padding_mode=Border.CONSTANT)
-
size:(int) 裁剪图像的输出大小。如果size是整数,则返回(size, size)的正方形状裁剪。如果大小是长度为2的序列,则应该是(高度,宽度)。
-
padding:填充图像的像素数(默认值为None),因为图像实际上就是以一个个像素点的形式存储在计算机中的。如果padding不是None,则首先使用padding值填充图像。如果提供了单个数字,请使用此值填充所有边框。如果提供了两个值的元组或列表,则用第一个值填充(左和上),用第二个值填充(右和下)。如果以列表或元组形式提供4个值,则分别填充左、上、右和下。
-
pad_if_needed:如果任一侧小于给定的输出大小(默认值=False),请填充图像。
-
fill_value:准备填充边框的像素强度,但仅对填充模式Border.CONSTANT有效。如果是三元组,则分别用于填充R、G、B通道。如果是整数,则用于所有RGB通道。填充值必须在[0255]范围内(默认值为0)。
-
padding_mode:填充方法(默认值=Border.CONSTANT)。它可以是[Border.CONSTANT、Border.EDGE、Border.REFLECT、Border.SYMMETRIC]中的任意一个(这些都是定义好的常量对象)。
Border.CONSTANT:表示用常量值填充边框。
Border.EDGE:表示它与边上的最后一个值填充。
Border.REFLECT:表示它反映边上的值,忽略边的最后一个值。
Border.SYMMETRIC:表示它反映了重复边的最后一个值的边上的值。
RandomHorizontalFlip
1.功能
以给定的概率水平随机翻转输入图像。c_transforms模块还提供了一个RandomHorizontalFlipWithBBox算子,该算子不仅可以以给定的概率水平随机翻转输入图像,还可以并相应调整边界框。它们同样是可以在有限的样本基础上,有效地扩充数据集。
2.参数
prob:(float)默认值为0.5,图像被翻转的概率。
Resize
1.功能
使用给定的插值模式以及相应形状将输入图像调整为给定大小。该算子在深度学习中起着非常重要的作用,因为很多经典的神经网路对于输入都有着特定的形状要求,而实际上数据集中的样本形状大小又不满足该网络。这个时候我们就需要使用Resize来讲数据集中的样本图像缩放到指定大小。就比如我们在手写数字识别初体验中使用到的LeNet-5网络,它要求图像的输入是32 x 32,而MNIST数据集中图像的大小又是28 x 28,这个时候我们就需要将Resize算子通过map算子映射到MNIST数据集上。
2.参数
-
size:调整后图像的输出大小,如果size为一个整数,则图像的较小边将以相同的图像纵横比调整为此值。如果大小是长度2的列表,则应为(高度、宽度)。size一般情况下都是长度为2的列表。
-
interpolation :图像的插值模式,默认值为Inter.LINEAR。它可以是[Inter.LINEAR、Inter.NEAREST、Inter.BICUBIC、Inter.PILCUBIC]中的任意一种。
- Border.CONSTANT, means it fills the border with constant values.
- Border.EDGE, means it pads with the last value on the edge.
- Border.REFLECT, means it reflects the values on the edge omitting the last value of edge.
- Border.SYMMETRIC, means it reflects the values on the edge repeating the last value of edge.
同理,一般情况下采样默认值即可。
Invert
1、功能
在RGB模式下对输入图像应用反转。这个操作符将重新分配每个像素到(255像素)。该算子是用来加强数据集的。
Rescale
1.功能
使用给定的重缩放(rescale)和移位重缩放(shift)输入图像。此运算符将使用以下命令重新缩放输入图像:输出(output)=图像(image)*重新缩放(rescale)+移位(shift)。
2.参数
- rescale:重缩放因子
- shift:位移因子
如果读者在本篇文章中没有看到自己想要使用的算子或者是觉得写的不够全面,读者可通过下面的链接https://www.mindspore.cn/docs/api/zh-CN/r1.5/api_python/mindspore.dataset.vision.html#mindspore-dataset-vision-c-transforms前往官方API查看更多算子的使用。