numpy旋转图片_在Numpy中的图像增强基础讲解。

本文将讨论使用NumPy库实现图像增强技术,以扩展数据集。我将讨论数据增强的目的、优缺点,并展示numpy中数据增强的基本示例。

为什么需要数据扩充?

我们首先想到的是扩充数据集的大小。但重要的是要理解我们正在解决的问题,这个问题很有名,也是ML中最流行的问题之一——过度拟合。如果我们没有几个值得构建分类器/回归器的数据示例,那么即使在构建模型之前,我们也会被过度拟合。众所周知,扩充数据集的大小可以减少过度拟合,这就是为什么我们从来没有满足于从外部给我们的数据量。现在,扩充我们的数据集意味着收集更多的样本,但几乎总是这样做会导致我们自己无法承担的开销:要么是钱的问题,要么是太耗时。因此,我们想要一种快速、廉价地扩充数据的方法——数据扩充。

想象一下,你必须建立一个模型,从图像数据中对一些稀有物种进行分类,而你并不满足于你能获得的照片数量。只需水平翻转图像的操作就可以两次扩充数据集的大小。如果你想分类的对象或多或少是对称的,再次垂直翻转数据,你会得到比最初多4倍的图像。考虑一下额外的转换,您可以将数据集的大小扩充10倍、100倍、1000倍。

什么时候可以尝试应用数据扩充?

我们有几个案例值得尝试数据扩充

  • 我们必须构建预测器,但数据量很少。扩充我们的数据集大小可以帮助我们的模型从数据中学习模式以更好地预测,尽管得到的人工数据集将是单调的。
  • 我们正在使用的模型不需要标签,因此我们唯一感兴趣的是 - 尽可能地将现有的样本作为最相似的样本。一个例子可以是Generative Adversarial Network系列,我们可以尝试扩充我们的数据集来稳定一些进行训练过程。
  • 我们预测的数据具有高度不平衡的性质。如果数据集的标签分布高度不平衡,即正样本的数量比负样本少十倍,则该模型肯定会偏向于将大多数看不见的样本预测为负样本。这种情况最著名的方法称为SMOTE算法。
  • 减少对抗性攻击问题。DNN模型的鲁棒性最近受到了对抗性攻击的挑战,在这种攻击中,输入样本上的小扰动可能导致分类错误。数据处理可以是快速和廉价的方法来减少问题。
  • 增加我们模型的正规化方面。我们可以尝试合并数据集中的几个样本,并故意将其错误标记,以使我们的模型不太容易过度拟合。

什么时候不应该使用数据扩充?

  • 我们的样本很少。数据扩充可以帮助提高预测器的稳健性,但在数据量非常小的情况下,我建议考虑不同的方式。
  • 训练过程在时间和计算方面过于昂贵,而我们已经有足够的数据。说实话,这种情况非常罕见,因为即使非常深的模型也能提供数百​​万个样本的最佳性能。但在某些应用中,我们已经拥有大量原始数据,我们希望我们的样本尽可能具有代表性。在这种情况下,数据扩充没有任何意义。相反,建议在我们的数据上构建“prototype”样本并在其上训练模型。

注意

数据扩充不应该被视为过度拟合的灵丹妙药。当然,将数据集的大小扩充一千倍的能力非常诱人。此外,如果对我们正在训练的相同的增强数据执行验证,即使在交叉验证设置中,度量也会不断上升。您应该始终记住,设计任何ML系统的最终目标都是擅长生产。考虑到这一点,过度使用数据增强可能会使优化环境与生产环境分离。如果您的数据集非常小,您应该首先考虑要使用的模型类型。将经典的重神经网络应用于少数样本是没有意义的,因为它的优化器不是为低数据设置而设计的。在这种情况下,我建议使用简单的模型(基于最近邻的模型)或专门用于解决低数据问题的现代神经网络方法(few-shot学习和meta学习模型)。

Numpy中的数据扩充

在下面的部分中,我将仅使用常规工具进行图像增强的简单用例。我们需要的三件事是NumPy库,用于图像可视化的matplotlib + seaborn和用于图像旋转的scipy(可以选择Pillow库作为替代)

作为样本图像,我将使用著名的Lenna图片 - 70年代图像处理论文中的经典图像。图片为RGB,在以下示例中大小为100x100。

0c881702befdbe495d03649659bb7ba8.png

Lenna原图

首先,让我们导入包并查看Lenna的颜色分布。

import numpy as npimport scipyimport matplotlib.pyplot as plt%matplotlib inlineimport seaborn as snsfrom scipy.ndimage import rotatesns.set(color_codes=True)img = np.array(plt.imread('lenna.png'))plt.figure(figsize=(5, 5), dpi=100)sns.distplot(img[:, :, 0].flatten(), color='maroon')sns.distplot(img[:, :, 1].flatten(), color='green')sns.distplot(img[:, :, 2].flatten(), color='blue').set_title('RGB Distribution') 
66d20863b478ce8104b6dd17ed833f54.png
6761ec9544a261ee5a8f8a3b62114825.png

注意,加载的图像有4个通道(3个用于颜色,1个用于透明度),每个通道中的值位于[0,1]范围内。接下来的几个函数是简单的图像显示在jupyter notebook中和显示图

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值