随着深度学习的进步和硬件的更新迭代,计算机视觉技术也得到了更大的提升,在计算机视觉领域,经常要训练深度学习的模型,而训练模型的最终目的是为了更好的应用到实际当中去,那就要解决一个精度问题和泛化能力,对于泛化能力的提升,前面也做了很多的工作,这篇主要是讲解图像的增广,减小对训练数据集的某些属性的依赖,从而测试的时候可以得到更好的泛化能力。

图像增广(image augmentation)技术是通过对训练图像做一系列的改变,产生一些相似但不相同的训练样本,比如随机裁剪,使得目标出现在不同位置,减小模型对其位置的依赖;调整亮度、色彩等因素,减小模型对色彩的敏感度等,这些操作最终都是为了提高泛化能力。

我准备了一张宽500,高400像素的猫的图片,在画布中显示看下效果,注意坐标的表示:

import d2lzh as d2l
import mxnet as mx
from mxnet import autograd,gluon,image,init,nd
from mxnet.gluon import data as gdata,loss as gloss,utils as gutils
import sys
import timed2l.set_figsize()
img=image.imread('cat.jpg')
d2l.plt.imshow(img.asnumpy()) #img.shape:(400,500,3)
# 如果使用Jupter Notebook可以不写下面这个show
# 将会显示<matplotlib.image.AxesImage at 0x14248272808> 和一张画布图片,注意坐标的起始位置
d2l.plt.show()

为了后续便于观察这张猫的图像,做了增广之后的效果,我们在画布上定义一个显示多行多列的图片的函数:

d2l.set_figsize()
img=image.imread('cat.jpg')
#d2lzh包中已有
def show_images(imgs,num_rows,num_cols,scale=2):figsize=(num_cols*scale,num_rows*scale)_,axes=d2l.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].asnumpy())#隐藏X,Y轴axes[i][j].get_xaxis().set_visible(False)axes[i][j].get_yaxis().set_visible(False)return axes
#将每个图片做增广然后显示
def apply(img,aug,num_rows=2,num_cols=4,scale=1.5):Y=[aug(img) for _ in range(num_cols*num_rows)]show_images(Y,num_rows,num_cols,scale)

然后分别看下不同随机增广后的效果:

左右翻转

apply(img,gdata.vision.transforms.RandomFlipLeftRight())

上下翻转

apply(img,gdata.vision.transforms.RandomFlipTopBottom())

 随机位置裁剪(原面积的10%~100%,高宽比05~2),然后将宽高再缩放到200像素

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

亮度变化(1-0.5到1+0.5)

apply(img,gdata.vision.transforms.RandomBrightness(0.5))

色调变化

apply(img,gdata.vision.transforms.RandomHue(0.5))

创建RndomColorJitter实例同时设置亮度、对比度、饱和度、色调的变化

color_aug=gdata.vision.transforms.RandomColorJitter(brightness=0.5,contrast=0.5,saturation=0.5,hue=0.5)
apply(img,color_aug)

Compose组合叠加多个图像增广方法

augs=gdata.vision.transforms.Compose([gdata.vision.transforms.RandomFlipLeftRight(),color_aug,shape_aug])
apply(img,augs)d2l.plt.show()

训练CIFAR-10数据集
CIFAR-10也是一个常用的数据集,没有的情况,CIFAR10方法将会自动下载。我们来看下这个数据集的大小,以及显示前面32张图,这个训练数据集是由50000张,高宽是32,通道是3的图像组成,测试集是10000张,里面的类别还是蛮多的,动物、车、船、飞机等

show_images(gdata.vision.CIFAR10(train=True)[0:32][0], 4, 8, scale=0.8)
print(gdata.vision.CIFAR10(train=True)._data.shape)#(50000, 32, 32, 3)

一般都是在训练的时候进行图像的增广,而在预测时不应用。

# 训练数据集做增广
# ToTensor转换成MXNet需要的格式(批处理大小,通道,高,宽)(N,C,H,W)
flip_aug=gdata.vision.transforms.Compose([gdata.vision.transforms.RandomFlipLeftRight(),gdata.vision.transforms.ToTensor()])# 预测时不做增广
no_aug=gdata.vision.transforms.Compose([gdata.vision.transforms.ToTensor()])# 加载数据集并应用图像增广
num_works = 0 if sys.platform.startswith('win32') else 4
def load_cifar10(is_train, augs, batch_size):return gdata.DataLoader(gdata.vision.CIFAR10(train=is_train).transform_first(augs), batch_size=batch_size, shuffle=is_train, num_workers=num_works)

使用ResNet-18模型与Adam优化算法来训练

def train_with_data_aug(train_augs, test_augs, lr=0.001):batch_size, ctx, net = 256, d2l.try_all_gpus(), d2l.resnet18(10)net.initialize(ctx=ctx, init=init.Xavier())trainer = gluon.Trainer(net.collect_params(),'adam', {'learning_rate': lr})loss = gloss.SoftmaxCrossEntropyLoss()train_iter = load_cifar10(True, train_augs, batch_size)test_iter = load_cifar10(False, test_augs, batch_size)d2l.train(train_iter, test_iter, net, loss, trainer, ctx, num_epochs=10)train_with_data_aug(flip_aug, no_aug)

本人电脑配置低了,训练时很容易内存溢出:

mxnet.base.MXNetError: [10:20:10] c:\jenkins\workspace\mxnet-tag\mxnet\src\storage\./pooled_storage_manager.h:157: cudaMalloc failed: out of memory

于是将批量大小从256修改成64,然后就可以训练了,也只有一个gpu的情况,效果还是可以的,如下:

training on [gpu(0)]
epoch 1, loss 1.3235, train acc 0.526, test acc 0.659, time 124.6 sec
epoch 2, loss 0.7716, train acc 0.729, test acc 0.738, time 122.7 sec
epoch 3, loss 0.5864, train acc 0.797, test acc 0.801, time 122.8 sec
epoch 4, loss 0.4848, train acc 0.833, test acc 0.782, time 123.5 sec
epoch 5, loss 0.4053, train acc 0.861, test acc 0.808, time 123.7 sec
epoch 6, loss 0.3367, train acc 0.883, test acc 0.820, time 122.7 sec
epoch 7, loss 0.2883, train acc 0.900, test acc 0.828, time 124.3 sec
epoch 8, loss 0.2420, train acc 0.917, test acc 0.850, time 124.3 sec
epoch 9, loss 0.2026, train acc 0.930, test acc 0.840, time 124.9 sec
epoch 10, loss 0.1671, train acc 0.943, test acc 0.846, time 125.1 sec

其实对于组合叠加增广,在前面的WGAN(Wasserstein生成对抗网络)源码的讲解 已有使用,如下:

import torchvision.transforms as transforms
import torchvision.datasets as dsetdataset = dset.CIFAR10(root=opt.dataroot, download=True,transform=transforms.Compose([transforms.Resize(opt.imageSize),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),]))

可以看出PyTorch框架的写法与MXNet框架的方法差不多,一般也是一些语法细节的区别。PyTorch是来自import torchvision.transforms as transforms这个模块,而MXNet是来自from mxnet.gluon import data as gdata里面的gdata.vision.transforms这个模块。

关于ToTensor()转换形状的函数,做个示例:

transformer = gdata.vision.transforms.ToTensor()
imgs = nd.random.uniform(0, 255, (4, 2, 3)).astype(dtype=np.uint8)
print(transformer(imgs))#会将(4,2,3)形状转换成(3,4,2)的[0,1)的浮点数

计算机视觉之图像增广(翻转、随机裁剪、颜色变化[亮度、对比度、饱和度、色调])相关推荐

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

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

  2. 深度学习——图像增广

    图像增广 图像增广是对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模.我们深知大型数据集是成功应用深度神经网络的先决条件.应用图像增广能够随机改变训练样本可以减小模型 ...

  3. 计算机视觉:数据预处理-图像增广方法

    计算机视觉:数据预处理-图像增广方法 数据预处理 随机改变亮暗.对比度和颜色等 随机填充 随机裁剪 随机缩放 随机翻转 随机打乱真实框排列顺序 图像增广方法汇总 批量数据读取与加速 数据预处理 在计算 ...

  4. 图像处理:手写实现图像增广算法(旋转、亮度调整、裁剪与拼接)

    目录 前言 算法理论 基础实现 a.旋转 b.亮度调整 c.裁剪及拼接 随机调整参数 d.随机翻转算法 e.随机颜色明暗调整算法 f.随机裁剪算法 实验分析 本章小结 参考文章 前言 图像增广算法在计 ...

  5. 深度学习-计算机视觉--图像增广

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

  6. 计算机视觉的数据增广技术大盘点!附涨点神器,已开源!

    如果要把深度学习开发过程中几个环节按重要程度排个序的话,相信准备训练数据肯定能排在前几位.要知道一个模型网络被编写出来后,也只是一坨代码而已,和智能基本不沾边,它只有通过学习大量的数据,才能学会如何作 ...

  7. 动手深度学习13——计算机视觉:数据增广、图片分类

    文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...

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

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

  9. 目标检测:数据预处理——图像增广

    文章目录 一.数据增多(图像增广) 主要作用: 数据预处理 **随机改变亮暗.对比度和颜色等** **随机填充** **随机裁剪** **随机缩放** **随机翻转** **随机打乱真实框排列顺序** ...

最新文章

  1. springboot配置Redis哨兵主从服务 以及 Redis 集群
  2. Spring学习7之自动装配Bean03
  3. python为text添加滚动条_Python GUI编程(Tkinter)7、带滚动条的Text
  4. 使用 NetCoreBeauty 优化 .NET CORE 独立部署目录结构
  5. VxWorks任务调度
  6. “云计算和大数据”重点专项2017年度项目安排公示
  7. 多线程reactor模型
  8. 永宏plc和台达vfd-m变頻器modbs rtu通讯程序史上最好用的plc和变頻器rtu通讯程序
  9. 矿大开学计算机考试,矿大计算机基础考试题库.pdf
  10. 树莓派部署yolov3
  11. 如何自定义python语法.
  12. cesium 实现指南针及比例尺效果
  13. 手机测试内存速度的软件,如何查看手机内存速度?手机内存读取速度测试_手机内存速度多少算正常...
  14. python实用30个小技巧
  15. 腾讯帝国的2018年,本命年过得不是很顺利
  16. 【实践案例分享】阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践
  17. HRZ学英语(类似尺取)
  18. 北斗系统基础知识2(北斗一代定位原理详述)
  19. FastReport 金额大小写转换自定义函数
  20. 程序员初入职场,如何规划好自己的职业生涯?

热门文章

  1. Unity3d 屏幕特效实现类似死亡之后的全屏黑白效果
  2. cpu插槽类型 产品参数解释
  3. p39 8.由以下三个集合,集合成员分别是会Python、C、Java的人员。
  4. 关于love2d引擎require导入C/C++编写的.dll/.so扩展库问题
  5. 三线压力传感器原理_三线机油压力传感器作用是什么?工作原理是什么?
  6. 网络安全学习第4篇-使用特征码和MD5对勒索病毒进行专杀,并对加密文件进行解密
  7. rca接口_常用的音频接口及焊接方法
  8. java在线api中文_JAVA中英文API(在线版)
  9. ECharts(三):柱状图柱体颜色渐变(每个柱体不同渐变色)
  10. vb.net 教程 3-4 窗体编程 公共控件2 radiobutton ComboBox