深度学习之图像的数据增强

   在图像的深度学习中,为了丰富图像训练集,更好的提取图像特征,泛化模型(防止模型过拟合),一般都会对数据图像进行数据增强,

数据增强,常用的方式,就是旋转图像,剪切图像,改变图像色差,扭曲图像特征,改变图像尺寸大小,增强图像噪音(一般使用高斯噪音,盐椒噪音)等.

但是需要注意,不要加入其他图像轮廓的噪音.

  对于常用的图像的数据增强的实现,如下:

  1 # -*- coding:utf-8 -*-
  2 """数据增强
  3    1. 翻转变换 flip
  4    2. 随机修剪 random crop
  5    3. 色彩抖动 color jittering
  6    4. 平移变换 shift
  7    5. 尺度变换 scale
  8    6. 对比度变换 contrast
  9    7. 噪声扰动 noise
 10    8. 旋转变换/反射变换 Rotation/reflection
 11    author: XiJun.Gong
 12    date:2016-11-29
 13 """
 14
 15 from PIL import Image, ImageEnhance, ImageOps, ImageFile
 16 import numpy as np
 17 import random
 18 import threading, os, time
 19 import logging
 20
 21 logger = logging.getLogger(__name__)
 22 ImageFile.LOAD_TRUNCATED_IMAGES = True
 23
 24
 25 class DataAugmentation:
 26     """
 27     包含数据增强的八种方式
 28     """
 29
 30
 31     def __init__(self):
 32         pass
 33
 34     @staticmethod
 35     def openImage(image):
 36         return Image.open(image, mode="r")
 37
 38     @staticmethod
 39     def randomRotation(image, mode=Image.BICUBIC):
 40         """
 41          对图像进行随机任意角度(0~360度)旋转
 42         :param mode 邻近插值,双线性插值,双三次B样条插值(default)
 43         :param image PIL的图像image
 44         :return: 旋转转之后的图像
 45         """
 46         random_angle = np.random.randint(1, 360)
 47         return image.rotate(random_angle, mode)
 48
 49     @staticmethod
 50     def randomCrop(image):
 51         """
 52         对图像随意剪切,考虑到图像大小范围(68,68),使用一个一个大于(36*36)的窗口进行截图
 53         :param image: PIL的图像image
 54         :return: 剪切之后的图像
 55
 56         """
 57         image_width = image.size[0]
 58         image_height = image.size[1]
 59         crop_win_size = np.random.randint(40, 68)
 60         random_region = (
 61             (image_width - crop_win_size) >> 1, (image_height - crop_win_size) >> 1, (image_width + crop_win_size) >> 1,
 62             (image_height + crop_win_size) >> 1)
 63         return image.crop(random_region)
 64
 65     @staticmethod
 66     def randomColor(image):
 67         """
 68         对图像进行颜色抖动
 69         :param image: PIL的图像image
 70         :return: 有颜色色差的图像image
 71         """
 72         random_factor = np.random.randint(0, 31) / 10.  # 随机因子
 73         color_image = ImageEnhance.Color(image).enhance(random_factor)  # 调整图像的饱和度
 74         random_factor = np.random.randint(10, 21) / 10.  # 随机因子
 75         brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor)  # 调整图像的亮度
 76         random_factor = np.random.randint(10, 21) / 10.  # 随机因1子
 77         contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor)  # 调整图像对比度
 78         random_factor = np.random.randint(0, 31) / 10.  # 随机因子
 79         return ImageEnhance.Sharpness(contrast_image).enhance(random_factor)  # 调整图像锐度
 80
 81     @staticmethod
 82     def randomGaussian(image, mean=0.2, sigma=0.3):
 83         """
 84          对图像进行高斯噪声处理
 85         :param image:
 86         :return:
 87         """
 88
 89         def gaussianNoisy(im, mean=0.2, sigma=0.3):
 90             """
 91             对图像做高斯噪音处理
 92             :param im: 单通道图像
 93             :param mean: 偏移量
 94             :param sigma: 标准差
 95             :return:
 96             """
 97             for _i in range(len(im)):
 98                 im[_i] += random.gauss(mean, sigma)
 99             return im
100
101         # 将图像转化成数组
102         img = np.asarray(image)
103         img.flags.writeable = True  # 将数组改为读写模式
104         width, height = img.shape[:2]
105         img_r = gaussianNoisy(img[:, :, 0].flatten(), mean, sigma)
106         img_g = gaussianNoisy(img[:, :, 1].flatten(), mean, sigma)
107         img_b = gaussianNoisy(img[:, :, 2].flatten(), mean, sigma)
108         img[:, :, 0] = img_r.reshape([width, height])
109         img[:, :, 1] = img_g.reshape([width, height])
110         img[:, :, 2] = img_b.reshape([width, height])
111         return Image.fromarray(np.uint8(img))
112
113     @staticmethod
114     def saveImage(image, path):
115         image.save(path)
116
117
118 def makeDir(path):
119     try:
120         if not os.path.exists(path):
121             if not os.path.isfile(path):
122                 # os.mkdir(path)
123                 os.makedirs(path)
124             return 0
125         else:
126             return 1
127     except Exception, e:
128         print str(e)
129         return -2
130
131
132 def imageOps(func_name, image, des_path, file_name, times=5):
133     funcMap = {"randomRotation": DataAugmentation.randomRotation,
134                "randomCrop": DataAugmentation.randomCrop,
135                "randomColor": DataAugmentation.randomColor,
136                "randomGaussian": DataAugmentation.randomGaussian
137                }
138     if funcMap.get(func_name) is None:
139         logger.error("%s is not exist", func_name)
140         return -1
141
142     for _i in range(0, times, 1):
143         new_image = funcMap[func_name](image)
144         DataAugmentation.saveImage(new_image, os.path.join(des_path, func_name + str(_i) + file_name))
145
146
147 opsList = {"randomRotation", "randomCrop", "randomColor", "randomGaussian"}
148
149
150 def threadOPS(path, new_path):
151     """
152     多线程处理事务
153     :param src_path: 资源文件
154     :param des_path: 目的地文件
155     :return:
156     """
157     if os.path.isdir(path):
158         img_names = os.listdir(path)
159     else:
160         img_names = [path]
161     for img_name in img_names:
162         print img_name
163         tmp_img_name = os.path.join(path, img_name)
164         if os.path.isdir(tmp_img_name):
165             if makeDir(os.path.join(new_path, img_name)) != -1:
166                 threadOPS(tmp_img_name, os.path.join(new_path, img_name))
167             else:
168                 print ‘create new dir failure‘
169                 return -1
170                 # os.removedirs(tmp_img_name)
171         elif tmp_img_name.split(‘.‘)[1] != "DS_Store":
172             # 读取文件并进行操作
173             image = DataAugmentation.openImage(tmp_img_name)
174             threadImage = [0] * 5
175             _index = 0
176             for ops_name in opsList:
177                 threadImage[_index] = threading.Thread(target=imageOps,
178                                                        args=(ops_name, image, new_path, img_name,))
179                 threadImage[_index].start()
180                 _index += 1
181                 time.sleep(0.2)
182
183
184 if __name__ == ‘__main__‘:
185     threadOPS("/home/pic-image/train/12306train",
186               "/home/pic-image/train/12306train3")

时间: 2024-11-05 02:13:01

深度学习之图像的数据增强的相关文章

【超分辨率专题】—基于深度学习的图像超分辨率最新进展与趋势

1.简介 图像超分辨率是计算机视觉和图像处理领域一个非常重要的研究问题,在医疗图像分析.生物特征识别.视频监控与安全等实际场景中有着广泛的应用.随着深度学习技术的发展,基于深度学习的图像超分方法在多个测试任务上,取得了目前最优的性能和效果.本文介绍的一篇综述(Deep Learning for Image Super-resolution:A Survey)给出了一个统一的深度学习视角,来回顾最近的超分技术进展,主要包括三个方面: 给出了综合性的基于深度学习的图像超分技术综述,包括问题设置.数据

基于深度学习的图像语义编辑

深度学习在图像分类.物体检测.图像分割等计算机视觉问题上都取得了很大的进展,被认为可以提取图像高层语义特征.基于此,衍生出了很多有意思的图像应用. 为了提升本文的可读性,我们先来看几个效果图. 图1. 图像风格转换 图2. 图像修复,左上图为原始图,右下图为基于深度学习的图像 图3. 换脸,左图为原图,中图为基于深度学习的算法,右图为使用普通图像编辑软件的效果 图4. 图像超清化效果图,从左到右,第一张为低清图像三次插值结果,第二张残差网络的效果,第三张为使用对抗神经网络后的结果,第四张为原图.

基于深度学习的图像语义分割方法综述

近年来,深度学习技术已经广泛应用到图像语义分割领域.主要对基于深度学习的图像语义分割的经典方法与研究现状进行分类.梳理和总结.根据分割特点和处理粒度的不同,将基于深度学习的图像语义分割方法分为基于区域分类的图像语义分割方法和基于像素分类的图像语义分割方法.把基于像素分类的图像语义分割方法进一步细分为全监督学习图像语义分割方法和弱监督学习图像语义分割方法.对每类方法的代表性算法进行了分析介绍,并详细总结了每类方法的基本思想和优缺点,系统地阐述了深度学习对图像语义分割领域的贡献.对图像语义分割相关实

TensorFlow实现基于深度学习的图像补全

目录 ■ 简介 ■ 第一步:将图像理解为一个概率分布的样本 你是怎样补全缺失信息的呢? 但是怎样着手统计呢?这些都是图像啊. 那么我们怎样补全图像?  ■ 第二步:快速生成假图像 在未知概率分布情况下,学习生成新样本 [ML-Heavy] 生成对抗网络(Generative Adversarial Net, GAN) 的架构 使用G(z)生成伪图像 [ML-Heavy] 训练DCGAN 现有的GAN和DCGAN实现 [ML-Heavy] 在Tensorflow上构建DCGANs 在图片集上跑DC

深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全

原文地址:Image Completion with Deep Learning in TensorFlow by Brandon Amos 原文翻译与校对:@MOLLY && 寒小阳 ([email protected]) 时间:2017年4月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/52665396 声明:版权所有,转载请联系作者并注明出 简介 第一步:将图像理解为一个概率分布的样本 你是怎样补全缺失信息的呢? 但是怎

看得“深”、看得“清” —— 深度学习在图像超清化的应用

日复一日的人像临摹练习使得画家能够仅凭几个关键特征画出完整的人脸.同样地,我们希望机器能够通过低清图像有限的图像信息,推断出图像对应的高清细节,这就需要算法能够像画家一样"理解"图像内容.至此,传统的规则算法不堪重负,新兴的深度学习照耀着图像超清化的星空. 本文首发于<程序员>杂志 图1. 最新的Pixel递归网络在图像超清化上的应用.左图为低清图像,右图为其对应的高清图像,中间为算法生成结果.这是4倍超清问题,即将边长扩大为原来的4倍. 得益于硬件的迅猛发展,短短几年间,

Deep Learning 十一_深度学习UFLDL教程:数据预处理(斯坦福大学深度学习教程)

理论知识:UFLDL数据预处理和http://www.cnblogs.com/tornadomeet/archive/2013/04/20/3033149.html 数据预处理是深度学习中非常重要的一步!如果说原始数据的获得,是深度学习中最重要的一步,那么获得原始数据之后对它的预处理更是重要的一部分. 1.数据预处理的方法: ①数据归一化: 简单缩放:对数据的每一个维度的值进行重新调节,使其在 [0,1]或[ − 1,1] 的区间内 逐样本均值消减:在每个样本上减去数据的统计平均值,用于平稳的数

基于深度学习的图像语义分割技术概述之背景与深度网络架构

图像语义分割正在逐渐成为计算机视觉及机器学习研究人员的研究热点.大量应用需要精确.高效的分割机制,如:自动驾驶.室内导航.及虚拟/增强现实系统.这种需求与机器视觉方面的深度学习领域的目标一致,包括语义分割或场景理解.本文对多种应用领域语义分割的深度学习方法进行概述.首先,我们给出本领域的术语及主要背景知识.其次,介绍主要的数据集及难点,以帮助研究人员找到合适的数据集和研究目标.之后,概述现有方法,及其贡献.最后,给出提及方法的量化标准及其基于的数据集,接着是对于结果的讨论.最终,对于基于深度学习

深度学习之图像修复

图像修复问题就是还原图像中缺失的部分.基于图像中已有信息,去还原图像中的缺失部分. 从直观上看,这个问题能否解决是看情况的,还原的关键在于剩余信息的使用,剩余信息中如果存在有缺失部分信息的patch,那么剩下的问题就是从剩余信息中判断缺失部分与哪一部分相似.而这,就是现在比较流行的PatchMatch的基本思想. CNN出现以来,有若干比较重要的进展: 被证明有能力在CNN的高层捕捉到图像的抽象信息. Perceptual Loss的出现证明了一个训练好的CNN网络的feature map可以很