算法集锦(6) |基于GPU框架的tensorflow数据增强算法
深度学习技术可以解决很多人类难以处理的问题,但也存在数据需求大和训练耗时长的缺点。
为了解决数据需求问题,常用的方法是数据增强(Data Augmentat)。当我们需要大量的增强数据时(如构建出上百万的新图片),增强处理也会消耗大量的计算资源,导致训练过程变慢。一个行之有效的解决方法是采用tensorflow.image函数来进行增强操作,该函数基于GPU计算,因此效率很高。
我们采用tensorflow的eager_execution,这样就可以不允许代码也可以看到数据增强的效果。
导入图像
Tensorflow的图像函数要求输入的图像是个指针,下面我们导入图像并将其转化为指针。
img = matplotlib.pyplot.imread(‘/img_path’)
tf_img = tf.convert_to_tensor(img)
图像来源:https://cdn-images-1.medium.com/max/1000/1*ULBhR9EVavi-HhpdbrjEzQ.jpeg
增强操作
下面我们介绍不同的增强算法对图像处理效果。
1.翻转图像
翻转图像是最常用的数据增强操作之一,可以很容易的对数据量进行翻倍。通常包括水平翻转、垂直翻转和随机翻转。
水平翻转
brght_img = tf.image.flip_left_right(tf_img)
垂直翻转
brght_img = tf.image.flip_up_down(tf_img)
随机翻转:随机翻转使你有1/2的可能进行水平翻转或垂直翻转,代码如下。
brght_img = tf.image.random_flip_left_right(tf_img)
brght_img = tf.image.random_flip_up_down(tf_img)
除了以上方法,你还可以使用tf.reverse来达到同样的效果。
tf.reverse可以控制图像沿X轴或Y轴来翻转图像。
brght_img = tf.reverse(tf_img, axis =[0]) #Verticle flipping
brght_img = tf.reverse(tf_img, axis =[1]) #Horizontal flipping
2.图像旋转
tensorflow提供了tf.image.rot90()函数来实现图像逆时针旋转90度。
brght_img = tf.image.rot90(tf_img, k = 1)
3.亮度调整
可以使用以下代码来调整图像亮度。
brght_img = tf.image.adjust_brightness(tf_img, delta= 0.2)
delta参数代表加到图像像素上的量值,数值越大则图像越亮。如果delta为负数,则图像相应的变暗。此外,还可以随机的调整图像的亮度值。
brght_img = tf.image.random_brightness(tf_img, max_delta=0.5)
此时,delat值在-max_delta和max_delta之间。
4.图像修剪
central_crop函数保留从中心到指定距离的图像,并剪切掉外围的像素。
brght_img = tf.image.central_crop(tf_img, 0.5)
crop_to_bounding_box 函数指定偏移量和图像的宽度、高度,从而准确控制剪切区域。
brght_img = tf.image.crop_to_bounding_box(tf_img,offset_height = 100, offset_width = 100, target_height = 400, target_width = 800)
-
4. 其他方法
tf.image.adjust_contrast
tf.image.random_contrast
tf.image.adjust_hue
tf.image.random_hue
tf.image.adjust_gamma
tf.image.adjust_saturation
tf.image.random_saturation
- Java多线程详解5【面试+工作】
- Java多线程详解6【面试+工作】
- MySQL备份恢复第二篇(r5笔记第6天)
- SpringMVC 中配置 Swagger 插件.
- MySQL和Oracle对比学习之事务(r5笔记第4天)
- 【面试宝典】Java如何打印数组
- MySQL数据导入导出牛刀小试(r5笔记第3天)
- SpringMVC 异常处理.
- 一条简单的sql在11g和12c中的不同(r5笔记第2天)
- 浅析 SpringMVC 原理和配置.
- 使用impdp不当导致的数据丢失问题(r5笔记第1天)
- MySQL数据库 Event 定时执行任务.
- Tomcat 日志分割.
- crontab导致的频繁发送邮件的问题(r5笔记第20天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 矩阵旋转的解决
- Python partial最通俗的理解
- Django Form的使用
- Python每日一题:装饰器(完整篇)
- Vue视图渲染原理解析,从构建VNode到生成真实节点树
- Vue你不得不知道的异步更新机制和nextTick原理
- 手摸手带你理解Vue的Watch原理
- rollup环境搭建(es6转es5、压缩、本地服务器、热更新)
- Vue - 解决路由过渡动画抖动问题
- TypeScript - 泛型
- TypeScript - 类型声明、枚举、函数、接口
- Vue - 简单实现一个命令式弹窗组件
- Vue - 组件通信之$attrs、$listeners
- 多线程系列(一)多线程基础
- Python自动化运维之iptables和安全概述