深度学习之:数据增强 (Data Augmentation)

深度学习之:数据增强 (Data Augmentation)

内容持续更新中,欢迎各位在评论区补充和讨论!


在当前AI这个数据驱动的时代,没有数据几乎是万万不能的。

你的数据太少?

别怕,我们有数据增强技术!

当前流行的数据增强技

1.翻转(Flip)

可以对图片进行水平和垂直翻转。一些框架不提供垂直翻转功能。但是,一个垂直反转的图片等同于图片的180度旋转,然后再执行水平翻转。下面是我们的图片翻转的例子。

数据增强:数据有限时如何使用深度学习 ? (续)

从左侧开始,原始图片,水平翻转的图片,垂直翻转的图片。

你可以使用你喜欢的工具包进行下面的任意命令进行翻转,数据增强因子=2或4

# NumPy.'img' = A single image.
flip_1 = np.fliplr(img)
# TensorFlow. 'x' = A placeholder for an image.
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
flip_2 = tf.image.flip_up_down(x)
flip_3 = tf.image.flip_left_right(x)
flip_4 = tf.image.random_flip_up_down(x)
flip_5 = tf.image.random_flip_left_right(x)

 

2.旋转(Rotation)

一个关键性的问题是当旋转之后图像的维数可能并不能保持跟原来一样。如果你的图片是正方形的,那么以直角旋转将会保持图像大小。如果它是长方形,那么180度的旋转将会保持原来的大小。以更精细的角度旋转图像也会改变最终的图像尺寸。我们将在下一节中看到我们如何处理这个问题。以下是以直角旋转的方形图像的示例。

数据增强:数据有限时如何使用深度学习 ? (续)

当我们从左向右移动时,图像相对于前一个图像顺时针旋转90度。

你可以使用你喜欢的工具包执行以下的旋转命令。数据增强因子= 2或4。

# Placeholders: 'x' = A single image, 'y' = A batch of images
# 'k' denotes the number of 90 degree anticlockwise rotations
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
rot_90 = tf.image.rot90(img, k=1)
rot_180 = tf.image.rot90(img, k=2)
# To rotate in any angle. In the example below, 'angles' is in radians
shape = [batch, height, width, 3]
y = tf.placeholder(dtype = tf.float32, shape = shape)
rot_tf_180 = tf.contrib.image.rotate(y, angles=3.1415)
# Scikit-Image. 'angle' = Degrees. 'img' = Input Image
# For details about 'mode', checkout the interpolation section below.
rot = skimage.transform.rotate(img, angle=45, mode='reflect')

 

3.缩放比例(Scale)

图像可以向外或向内缩放。向外缩放时,最终图像尺寸将大于原始图像尺寸。大多数图像框架从新图像中剪切出一个部分,其大小等于原始图像。我们将在下一节中处理向内缩放,因为它会缩小图像大小,迫使我们对超出边界的内容做出假设。以下是缩放的示例或图像。

数据增强:数据有限时如何使用深度学习 ? (续)

从左到右,原始图像,向外缩放10%,向外缩放20%

您可以使用scikit-image使用以下命令执行缩放。数据增强因子=任意。

# Scikit Image. 'img' = Input Image, 'scale' = Scale factor
# For details about 'mode', checkout the interpolation section below.
scale_out = skimage.transform.rescale(img, scale=2.0, mode='constant')
scale_in = skimage.transform.rescale(img, scale=0.5, mode='constant')
# Don't forget to crop the images back to the original size (for 
# scale_out)

 

4.裁剪(Crop)

与缩放不同,我们只是从原始图像中随机抽样一个部分。然后,我们将此部分的大小调整为原始图像大小。这种方法通常称为随机裁剪。以下是随机裁剪的示例。仔细观察,你会发现此方法与缩放之间的区别。

数据增强:数据有限时如何使用深度学习 ? (续)

从左至右,原始图像,左上角裁剪的图像,右下角裁剪的图像。裁剪的部分被缩放为原始图像大小。

你可以使用以下任何TensorFlow命令执行随机裁剪。数据增强因子=任意。

# TensorFlow. 'x' = A placeholder for an image.
original_size = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = original_size)
# Use the following commands to perform random crops
crop_size = [new_height, new_width, channels]
seed = np.random.randint(1234)
x = tf.random_crop(x, size = crop_size, seed = seed)
output = tf.images.resize_images(x, size = original_size)

 

5.移位(Translation)

移位只涉及沿X或Y方向(或两者)移动图像。在下面的示例中,我们假设图像在其边界之外具有黑色背景,并且被适当地移位。这种增强方法非常有用,因为大多数对象几乎可以位于图像的任何位置。这迫使你的卷积神经网络看到所有角落。

数据增强:数据有限时如何使用深度学习 ? (续)

从左至右,原始图像,向右移位,向上移位

你可以使用以下命令在TensorFlow中执行转换。数据增强因子=任意。

# pad_left, pad_right, pad_top, pad_bottom denote the pixel 
# displacement. Set one of them to the desired value and rest to 0
shape = [batch, height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
# We use two functions to get our desired augmentation
x = tf.image.pad_to_bounding_box(x, pad_top, pad_left, height + pad_bottom + pad_top, width + pad_right + pad_left)
output = tf.image.crop_to_bounding_box(x, pad_bottom, pad_right, height, width)

 

6.高斯噪声(Gaussian Noise)

过拟合(Overfitting)经常会发生在神经网络试图学习高频特征(即非常频繁出现的无意义模式)的时候,而学习这些高频特征对模型提升没什么帮助。

那么如何处理这些高频特征呢?一种方法是采用具有零均值特性的高斯噪声,它实质上在所有频率上都能产生数据点,可以有效的使高频特征失真,减弱其对模型的影响。

但这也意味着低频的成分(通常是你关心的特征)同时也会受到影响,但是神经网络能够通过学习来忽略那些影响。事实证明,通过添加适量的噪声能够有效提升神经网络的学习能力。

一个“弱化”的版本是椒盐噪声,它以随机的白色和黑色像素点呈现并铺满整个图片。这种方式对图像产生的作用和添加高斯噪声产生的作用是一样的,只是效果相对较弱。

数据增强:数据有限时如何使用深度学习 ? (续)

从左至右,原始图形,加入高斯噪声图片,加入盐和胡椒噪声图片

您可以在TensorFlow上使用以下命令为图像添加高斯噪声。数据增强因子= 2。

#TensorFlow. 'x' = A placeholder for an image.
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
# Adding Gaussian noise
noise = tf.random_normal(shape=tf.shape(x), mean=0.0, stddev=1.0,
dtype=tf.float32)
output = tf.add(x, noise)

7.颜色增强

对颜色的数据增强,包括色彩的饱和度、亮度和对比度(contrast)等方面

 

高级增强技术

1.条件型生成对抗网络

并不用深入了解繁杂的细节,条件型生成对抗网络就能将一张图片从一个领域转换到另一个领域中去。假如你觉得这听上去太模棱两可了,它本身并不是这样;事实上这是一种强大的神经网络 ! 下面是一个应用条件型生成对抗网络(Conditional GANs)将夏日风光的图片转换为冬季风景的例子。

数据增强:数据有限时如何使用深度学习 ? (续)

                                                    用CycleGAN 改变季节

数据增强:数据有限时如何使用深度学习 ? (续)

                                                       深度照片风格转移

8

                                       MNIST数据集生成的一些图像

上述方法是鲁棒的,但是属于计算密集型,需要耗费大量的计算性能。一个更廉价的选择是所谓的神经风格迁移(Neural Style Transfer)。它抓住了一个图像的纹理/气氛/外观 (又名, "风格"), 并将其与其他内容混合在一起。使用这种强大的技术, 我们产生的效果类似于我们的条件型生成对抗网络所产生的效果(事实上, 这个方法是在 cGANs 发明之前就被提出来了!)。 

这种方法的缺点在于输出结果看起来太有艺术感了,以至于显得不那么真实。但是,在譬如深度学习的图像风格转换方面还是具有独特的优势,至少它的输出结果给人留下了深刻印象。

References

https://www.leiphone.com/news/201805/avOH5g1ZX3lAbmjp.html

https://zhuanlan.zhihu.com/p/31230067

猜你喜欢

转载自blog.csdn.net/Torres_10/article/details/86681547