图像增广

大规模数据集是成功应用深度神经网络的前提。图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模

图像增广的另一种解释是,随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。例如,我们可以对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,从而减轻模型对物体出现位置的依赖性。我们也可以调整亮度、色彩等因素来降低模型对色彩的敏感度。可以说,在当年AlexNet的成功中,图像增广技术功不可没。

导入实验所需的包或模块。

%matplotlib inline
import time
import torch
from torch import nn, optim
from torch.utils.data import Dataset, DataLoader
import torchvision
from PIL import Image
from matplotlib import pyplot as plt
from IPython import displaydevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

我们来读取一张形状为510×320510\times 320510×320(高和宽分别为500像素和320像素)的图像作为实验的样例。

def use_svg_display():"""Use svg format to display plot in jupyter"""display.set_matplotlib_formats('svg')def set_figsize(figsize=(3.5, 2.5)):use_svg_display()# 设置图的尺寸plt.rcParams['figure.figsize'] = figsizeset_figsize()
img = Image.open('small_cat.jpg')
plt.imshow(img)

定义绘图函数show_images。

def show_images(imgs, num_rows, num_cols, scale=2):figsize = (num_cols * scale, num_rows * scale)_, axes = plt.subplots(num_rows, num_cols, figsize=figsize)for i in range(num_rows):for j in range(num_cols):axes[i][j].imshow(imgs[i * num_cols + j])axes[i][j].axes.get_xaxis().set_visible(False)axes[i][j].axes.get_yaxis().set_visible(False)return axes

大部分图像增广方法都有一定的随机性。为了方便观察图像增广的效果,接下来我们定义一个辅助函数apply。这个函数对输入图像img多次运行图像增广方法aug并展示所有的结果。

def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):Y = [aug(img) for _ in range(num_rows * num_cols)]show_images(Y, num_rows, num_cols, scale)

翻转和裁剪

左右翻转图像通常不改变物体的类别。它是最早也是最广泛使用的一种图像增广方法。下面我们通过torchvision.transforms模块创建RandomHorizontalFlip实例来实现一半概率的图像水平(左右)翻转。

apply(img, torchvision.transforms.RandomHorizontalFlip())

上下翻转不如左右翻转通用。但是至少对于样例图像,上下翻转不会造成识别障碍。下面我们创建RandomVerticalFlip实例来实现一半概率的图像垂直(上下)翻转。

apply(img, torchvision.transforms.RandomVerticalFlip())

在我们使用的样例图像里,猫在图像正中间,但一般情况下可能不是这样。池化层能降低卷积层对目标位置的敏感度。除此之外,我们还可以通过对图像随机裁剪来让物体以不同的比例出现在图像的不同位置,这同样能够降低模型对目标位置的敏感性。

在下面的代码里,我们每次随机裁剪出一块面积为原面积1010% \sim 100%10的区域,且该区域的宽和高之比随机取自0.5∼20.5 \sim 20.5∼2,然后再将该区域的宽和高分别缩放到200像素。若无特殊说明,本节中aaa和bbb之间的随机数指的是从区间[a,b][a,b][a,b]中随机均匀采样所得到的连续值。

shape_aug = torchvision.transforms.RandomResizedCrop(200, scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)

### 变化颜色 另一类增广方法是变化颜色。我们可以从4个方面改变图像的颜色:亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)。在下面的例子里,我们将图像的亮度随机变化为原图亮度的$50%$($1-0.5$)$\sim 150%$($1+0.5$)。

apply(img, torchvision.transforms.ColorJitter(brightness=0.5))

我们也可以随机变化图像的色调。

apply(img, torchvision.transforms.ColorJitter(hue=0.5))

类似地,我们也可以随机变化图像的对比度。

apply(img, torchvision.transforms.ColorJitter(contrast=0.5))

我们也可以同时设置如何随机变化图像的亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)。

color_aug = torchvision.transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
apply(img, color_aug)

叠加多个图像

实际应用中我们会将多个图像增广方法叠加使用。我们可以通过Compose实例将上面定义的多个图像增广方法叠加起来,再应用到每张图像之上。

augs = torchvision.transforms.Compose([torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)

深度学习-计算机视觉--图像增广相关推荐

  1. 【深度学习】基于深度学习的数据增广技术一览

    ◎作者系极市原创作者计划特约作者Happy 周末在家无聊,偶然兴心想对CV领域常用的数据增广方法做个简单的调研与总结,重点是AI时代新兴的几种反响还不错的方法.各种第三方与官方实现代码等.那么今天由H ...

  2. 基于深度学习的数据增广技术一览

    周末在家无聊,偶然兴心想对CV领域常用的数据增广方法做个简单的调研与总结,重点是AI时代新兴的几种反响还不错的方法.各种第三方与官方实现代码等.那么今天由Happy来跟大家聊一聊深度学习中那些常用的数 ...

  3. 李沐动手学深度学习V2-图像增广和代码实现

    图像增广 大型数据集是成功应用深度神经网络的先决条件,因为解决了大型复杂网络的过拟合性. 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模. 此外,应用图 ...

  4. 深度学习笔记 —— 数据增广

    固定形状?卷积神经网络通常是一个固定的输入. 作用好不好是不一定的.很多时候觉得它有用是因为觉得测试集里会有图片跟这个效果是差不多的. 所以如何选择数据增强?可以从后往前推,想一下部署和测试集里面的图 ...

  5. 深度学习 之 数据增广(包含源码及注释文件更改)

    数据增广:平移,水平/垂直翻转,旋转,缩放,剪切,对比度,色彩抖动,噪声  #coding=utf-8 ################################################ ...

  6. 深度学习-MATLAB数据增广

    图片数据增广 对文件夹及其子文件夹下的图片数据进行简单的增广,四个方面,翻转,平移,增加高斯噪声,对比度增强,保存在当前文件夹中,命名为图片原名+ -1.-2.-3.-4,代表四个类. p=genpa ...

  7. 《动手学深度学习》(六) -- 图像增广与微调

    1 图像增广 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模.此外,应用图像增广的原因是,随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛 ...

  8. 图像增广:强化深度学习的视觉表现力

    目录 摘要: 1. 图像增广简介 2. 图像增广的原理 3. 常见的图像增广技术 4. 如何在实际项目中应用图像增广 5.实际应用 摘要: 当今,深度学习已经在计算机视觉领域取得了令人瞩目的成就.图像 ...

  9. 动手学深度学习(二十六)——图像增广(一生二,二生三,三生万物?)

    文章目录 一.图像增广 二.常用的图像增广方法 1. 翻转和裁减 2. 颜色改变 3. 叠加使用多种数据增广方法 三.使用图像增广进行训练 四.总结(干活分享) 一.图像增广 定义&解释: 通 ...

最新文章

  1. Xamarin.FormsShell基础教程(8)Shell的模版构成
  2. java 8 string_String.join() --Java8中String类新增方法
  3. 见识决定眼界,关注这些让你变得博学且有趣
  4. 动态规划训练15 [Monkey and Banana HDU - 1069 ]
  5. 五步法”判断自媒体创作好与坏的标准
  6. Replication Backlog
  7. fscache 调研
  8. linux安装mvn及nexus远程仓库
  9. ELK日志搜索平台搭建
  10. 计算机病毒有几个阶段,计算机病毒发展9阶段
  11. Excel对于筛选后单元格进行“复制”与“粘贴”
  12. st计算机编程语言,ST语法编程基础-ST语言简介
  13. 集成Ueditor秀米
  14. C语言用随机函数做猜拳游戏,c语言猜拳游戏
  15. 如何将JPG免费转化成PDF
  16. Nginx-动静分离与 URLRwrite
  17. FPGA学习教程-黑金AX301B
  18. Chrome浏览器各版本对应的驱动
  19. 【转】关于测试工程师的几个笑话
  20. 怎样让你的软文更有说服力?四个办法帮你赢得用户信任

热门文章

  1. mysql sayhello的函数_Euphoria 函数
  2. ios 代码设置控件宽高比_ios-自动布局以保持视图大小比例
  3. python统计excel文本单元格_python xlrd从excel文本单元格接收浮点数
  4. 依赖第三方库时出现的问题:Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 16
  5. JAVAWEB入门之Servlet_体系结构
  6. php如何获取服务器时间_php如何获取当前日期
  7. linux安装python3.6 setuptools_linux下安装Python3.6.1
  8. unique函数_unique函数使用场景(一)
  9. 泰森怎么会输给道格拉斯_泰森24岁就被击败,如果能像他学习巅峰时期至少能延长三年...
  10. 对飞行前请求的响应未通过访问控制检查:它没有http ok状态。_对不起,看完这篇HTTP,真的可以吊打面试官...