深度学习之数据增强方案和TensorFlow操作

 一、数据增强的方法介绍

增加训练数据, 则能够提升算法的准确率, 因为这样可以避免过拟合, 而避免了过拟合你就可以增大你的网络结构了。 当训练数据有限的时候, 可以通过一些变换来从已有的训练数据集中生成一些新的数据, 来扩大训练数据。 数据增强的方法有:

1) 图片的水平翻转(主要包括对称处理, 度数旋转等)

2) 随机裁剪(可以裁剪成不同大小的数据)

如原始图像大小为256*256,随机裁剪出一些图像224*224的图像。如下图,红色方框内为随机裁剪出的224*224的图片。 AlexNet 训练时,对左上、右上、左下、右下、中间做了5次裁剪,然后翻转,得到一些剪切图片。防止大网络过拟合(under ubstantial overfitting)。

3) fancy PCA (就是从像素的角度变化, 形成新的图片)

在训练集像素值的RGB颜色空间进行PCA, 得到RGB空间的3个主方向向量,3个特征值, p1,p2, p3, λ1, λ2, λ3. 对每幅图像的每个像素加上如下的变化:

其中:α i 是满足均值为0,方差为0.1的随机变量.

4) 样本不均衡( 解决方案: 增加小众类别的图像数据)

样本数据的不均衡的问题是日常中较多遇到的问题, 在机器学习中我们对于数据不平衡有上采样和下采样等处理方法, 在这里我们一般使用的是小众类别增强的方法处理.

一般根据数据集中的图像最多的种类的数量进行随机采样, 使得每个样本的数量均相等.然后将这些样本图片混合打乱形成新的数据集.

5)其它方法

  • 如平移变换;
  • 旋转/仿射变换;
  • 高斯噪声、 模糊处理、 
  • 对颜色的数据增强: 图像亮度、 饱和度、 对比度变化.

6)训练和测试要协调

在训练的时候,我们通常都需要做数据增强,在测试的时候,我们通常很少去做数据增强。这其中似乎有些不协调,因为你训练和测试之间有些不一致。实验发现,训练的最后几个迭代,移除数据增强,和传统一样测试,可以提升一点性能。

如果训练的时候一直使用尺度和长宽比增强数据增强,在测试的时候也同样做这个变化,随机取32个裁剪图片来测试,也可以在最后的模型上提升一点性能。就是多尺度的训练,多尺度的测试。

二、数据增强的TensorFlow实现

# -- encoding:utf-8 --
"""
图像处理的Python库:OpenCV、PIL、matplotlib、tensorflow等
"""import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf# 打印numpy的数组对象的时候,中间不省略
np.set_printoptions(threshold=np.inf)def show_image_tensor(image_tensor):# 要求:使用交互式会话# 获取图像tensor对象对应的image对象,image对象时一个[h,w,c]# print(image_tensor)image = image_tensor.eval()# print(image)print("图像大小为:{}".format(image.shape))if len(image.shape) == 3 and image.shape[2] == 1:# 黑白图像plt.imshow(image[:, :, 0], cmap='Greys_r')plt.show()elif len(image.shape) == 3:# 彩色图像plt.imshow(image)plt.show()# 1. 交互式会话启动
sess = tf.InteractiveSession()image_path = 'data/xiaoren.png'
# image_path = 'data/gray.png'
# image_path = 'data/black_white.jpg'# 一、图像格式的转换
# 读取数据
file_contents = tf.read_file(image_path)
# 将图像数据转换为像素点的数据格式,返回对象为: [height, width, num_channels], 如果是gif的图像返回[num_frames, height, width, num_channels]
# height: 图片的高度的像素大小
# width: 图片的水平宽度的像素大小
# num_channels: 图像的通道数,也就是API中的channels的值
# num_frames: 因为gif的图像是一个动态图像,可以将每一个动的画面看成一个静态图像,num_frames相当于在这个gif图像中有多少个静态图像
# 参数channels:可选值:0 1 3 4,默认为0, 一般使用0 1 3,不建议使用4
# 0:使用图像的默认通道,也就是图像是几通道的就使用几通道
# 1:使用灰度级别的图像数据作为返回值(只有一个通道:黑白)
# 3:使用RGB三通道读取数据
# 4:使用RGBA四通道读取数据(R:红色,G:绿色,B:蓝色,A:透明度)
image_tensor = tf.image.decode_png(contents=file_contents, channels=3)
# show_image_tensor(image_tensor)# 二、图像大小重置
"""
BILINEAR = 0 线性插值,默认
NEAREST_NEIGHBOR = 1 最近邻插值,失真最小
BICUBIC = 2 三次插值
AREA = 3 面积插值
"""
# images: 给定需要进行大小转换的图像对应的tensor对象,格式为:[height, width, num_channels]或者[batch, height, width, num_channels]
# API返回值和images格式一样,唯一区别是height和width变化为给定的值
resize_image_tensor = tf.image.resize_images(images=image_tensor, size=(200, 200),method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
# show_image_tensor(resize_image_tensor)# 三、图片的剪切&填充
# 图片重置大小,通过图片的剪切或者填充(从中间开始计算新图片的大小)
crop_or_pad_image_tensor = tf.image.resize_image_with_crop_or_pad(image_tensor, 200, 200)
# show_image_tensor(crop_or_pad_image_tensor)# 中间等比例剪切
central_crop_image_tensor = tf.image.central_crop(image_tensor, central_fraction=0.2)
# show_image_tensor(central_crop_image_tensor)# 填充数据(给定位置开始填充)
pad_to_bounding_box_image_tensor = tf.image.pad_to_bounding_box(image_tensor, offset_height=400, offset_width=490,target_height=1000,target_width=1000)
# show_image_tensor(pad_to_bounding_box_image_tensor)# 剪切数据(给定位置开始剪切)
crop_to_bounding_box_image_tensor = tf.image.crop_to_bounding_box(image_tensor, offset_height=10, offset_width=40,target_height=200, target_width=300)
# show_image_tensor(crop_to_bounding_box_image_tensor)# 四、旋转
# 上下交换
flip_up_down_image_tensor = tf.image.flip_up_down(image_tensor)
# show_image_tensor(flip_up_down_image_tensor)# 左右交换
flip_left_right_image_tensor = tf.image.flip_left_right(image_tensor)
# show_image_tensor(flip_left_right_image_tensor)# 转置
transpose_image_tensor = tf.image.transpose_image(image_tensor)
# show_image_tensor(transpose_image_tensor)# 旋转(90度、180度、270度....)
# k*90度旋转,逆时针旋转
k_rot90_image_tensor = tf.image.rot90(image_tensor, k=4)
# show_image_tensor(k_rot90_image_tensor)#  五、颜色空间的转换(rgb、hsv、gray)
# 颜色空间的转换必须讲image的值转换为float32类型,不能使用unit8类型
float32_image_tensor = tf.image.convert_image_dtype(image_tensor, dtype=tf.float32)
# show_image_tensor(float32_image_tensor)# rgb -> hsv(h: 图像的色彩/色度,s:图像的饱和度,v:图像的亮度)
hsv_image_tensor = tf.image.rgb_to_hsv(float32_image_tensor)
# show_image_tensor(hsv_image_tensor)# hsv -> rgb
rgb_image_tensor = tf.image.hsv_to_rgb(hsv_image_tensor)
# show_image_tensor(rgb_image_tensor)# rgb -> gray
gray_image_tensor = tf.image.rgb_to_grayscale(rgb_image_tensor)
# show_image_tensor(gray_image_tensor)# 可以从颜色空间中提取图像的轮廓信息(图像的二值化)
a = gray_image_tensor
b = tf.less_equal(a, 0.9)
# 0是黑,1是白
# condition?true:false
# condition、x、y格式必须一模一样,当condition中的值为true的之后,返回x对应位置的值,否则返回y对应位置的值
# 对于a中所有大于0.9的像素值,设置为0
c = tf.where(condition=b, x=a, y=a - a)
# 对于a中所有小于等于0.9的像素值,设置为1
d = tf.where(condition=b, x=c - c + 1, y=c)
# show_image_tensor(d)# 六、图像的调整
# 亮度调整
# image: RGB图像信息,设置为float类型和unit8类型的效果不一样,一般建议设置为float类型
# delta: 取值范围(-1,1)之间的float类型的值,表示对于亮度的减弱或者增强的系数值
# 底层执行:rgb -> hsv -> h,s,v*delta -> rgb
adjust_brightness_image_tensor = tf.image.adjust_brightness(image=image_tensor, delta=0.8)
# show_image_tensor(adjust_brightness_image_tensor)# 色调调整
# image: RGB图像信息,设置为float类型和unit8类型的效果不一样,一般建议设置为float类型
# delta: 取值范围(-1,1)之间的float类型的值,表示对于色调的减弱或者增强的系数值
# 底层执行:rgb -> hsv -> h*delta,s,v -> rgb
adjust_hue_image_tensor = tf.image.adjust_hue(image_tensor, delta=-0.8)
# show_image_tensor(adjust_hue_image_tensor)# 饱和度调整
# image: RGB图像信息,设置为float类型和unit8类型的效果不一样,一般建议设置为float类型
# saturation_factor: 一个float类型的值,表示对于饱和度的减弱或者增强的系数值,饱和因子
# 底层执行:rgb -> hsv -> h,s*saturation_factor,v -> rgb
adjust_saturation_image_tensor = tf.image.adjust_saturation(image_tensor, saturation_factor=20)
# show_image_tensor(adjust_saturation_image_tensor)# 对比度调整,公式:(x-mean) * contrast_factor + mean
adjust_contrast_image_tensor = tf.image.adjust_contrast(image_tensor, contrast_factor=10)
# show_image_tensor(adjust_contrast_image_tensor)# 图像的gamma校正
# images: 要求必须是float类型的数据
# gamma:任意值,Oup = In * Gamma
adjust_gamma_image_tensor = tf.image.adjust_gamma(float32_image_tensor, gamma=100)
# show_image_tensor(adjust_gamma_image_tensor)# 图像的归一化(x-mean)/adjusted_sttdev, adjusted_sttdev=max(stddev, 1.0/sqrt(image.NumElements()))
per_image_standardization_image_tensor = tf.image.per_image_standardization(image_tensor)
# show_image_tensor(per_image_standardization_image_tensor)# 七、噪音数据的加入
noisy_image_tensor = image_tensor + tf.cast(5 * tf.random_normal(shape=[600, 510, 3], mean=0, stddev=0.1), tf.uint8)
show_image_tensor(noisy_image_tensor)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动前端头部标签(HTML5 head meta)

<!DOCTYPE html> <!-- 使用 HTML5 doctype&#xff0c;不区分大小写 --> <html lang"zh-cmn-Hans"> <!-- 更加标准的 lang 属性写法 http://zhi.hu/XyIa --> <head><!-- 声明文档使用的字符编码 --><meta charsetutf-8>&l…

python新建文件夹口令_python编程快速上手—口令保管箱

之前小编为大家整理了如何成为一个优秀的程序员应该具备的品质&#xff0c;接下来为大家展示一个简单有趣的python小项目&#xff0c;从中体会编程的乐趣。小编了解这个小项目之后&#xff0c;很是惊奇&#xff0c;觉得python竟然还可以做这样的事情。为什么要建立口令保管箱&a…

django+nginx+uwsgi部署web站点

环境&#xff1a; django&#xff1a;1.8.16 python&#xff1a;2.7.13 pip&#xff1a;2.7 uwsgi&#xff1a;2.0.15 project路径&#xff1a; /opt/cmdb/ Uwsgi的安装配置 1、安装python2.7 &#xff08;省略安装过程&#xff09; 2、安装pip2.7 &#xff08;省略安装过程&…

GCC源代码阅读

获取GCC源代码 阅读源代码的第一步是获取源代码&#xff0c;巧妇难为无米之炊嘛&#xff01; 使用以下任意方法均可获得gcc源代码&#xff1a; svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir &#xff08;摘自http://gcc.gnu.org/svn.html&#xff09;git clone …

Nginx 动静分离

页面动静分离 后端 调用tomcat 集群 示例&#xff1a; server { listen 80; server_name www.www2.com ; root /web/www2/htmlloation /img/ {alias /web/www2/html/img/;}location ~ (\.jsp)|(\.do)$ {proxy_pass http:## //serverip:port;proxy_redirect off;// 重定向 指…

Linux 状态命令之内存状态 vmstat

语法 vmstat 常见命令格式如下&#xff1a; vmstat [-a] [-n] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat [-f] vmstat [-V]命…

使用OpenSSL实现CA证书的搭建过程

个人博客地址&#xff1a;http://www.pojun.tech/ 欢迎访问 什么是CA CA,Catificate Authority,通俗的理解就是一种认证机制。它的作用就是提供证书&#xff08;也就是服务端证书&#xff0c;由域名&#xff0c;公司信息&#xff0c;序列号&#xff0c;签名信息等等组成&#…

最近公共祖先 python_求二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”…

gdb使用实例

第一篇 概论我们将学习使用gdb来调试通过一个通过串行线同PC相连的嵌入式系统。Gdb可以调试各种程序&#xff0c;包括C、C、JAVA、PASCAL、FORAN和一些其它的语言。包括GNU所支持的所有微处理器的汇编语言。在gdb的所有可圈可点的特性中&#xff0c;有一点值得注意&#xff0c;…

Linux 监控命令之 netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听&#xff0c;进程内存管理的相关报告。 语法 netstat [-acC…

C#递归搜索指定目录下的文件或目录

来源&#xff1a;https://www.cnblogs.com/huhangfei/p/5012978.html诚然可以使用现成的Directory类下的GetFiles、GetDirectories、GetFileSystemEntries这几个方法实现同样的功能&#xff0c;但请相信我不是蛋疼&#xff0c;原因是这几个方法在遇上【System Volume Informati…

solr 配置

创建 SolrHome(solrCore) 1.解压 solr-4.10.4.tgz 到 /usr/local/solr 2.将 solr-4.10.4/example/solr 下所有文件拷贝到 /usr/local/solrhome (此 solrhome 为自己创建的) solrhome 是 solr 运行主目录&#xff0c;可包含多个 SolrCore 目录SolrCore 目录中包含运行 Solr 实例…

mfc程序转化为qt_10年程序员:我都学过这些语言,2019年开始我再也不是程序员......

为什么学编程2008年&#xff0c;高中毕业的我问一个已经工作两年的亲戚&#xff1a;什么专业工资高&#xff1f;他告诉我&#xff1a;程序员。2008年成都最低工资好像是800元&#xff0c;我的生活费也是800元&#xff0c;据他所说程序员出来的工资是2000&#xff0c;于是开始了…

day 7 引用

1.ba在c语言和python中的区别 c语言&#xff1a;a100 a变量里面放的100 b a b变量里面也放的100 python &#xff1a; a100 内存中有个100 a放的100的内存地址 b a b也放的100的内存地址 相当于给100那一块内存&#xff0c;贴个便利签 2.type查看数据类型&…

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...

Dapper的牛逼就不扯蛋了&#xff0c;答应群友做个入门Demo的&#xff0c;现有园友需要&#xff0c;那么公开分享一下&#xff1a; 完整Demo&#xff1a;http://pan.baidu.com/s/1i3TcEzj 注 意 事 项&#xff1a;http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人…

Linux 状态命令之磁盘状态 iostat

Linux系统中的iostat是I/O statistics&#xff08;输入/输出统计&#xff09;的缩写&#xff0c;iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况&#xff0c;同时也会汇报出CPU使用情况。同vmstat一样&#xff0c;iostat也有一个弱点&#xff0c;就…

GDB十分钟教程

GDB十分钟教程 作者: liigo 原文链接: http://blog.csdn.net/liigo/archive/2006/01/17/582231.aspx 日期: 2006年1月16日 本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友&#xff0c;以及程序爱好者。 GDB是一个由GNU开源组织发布的、UNIX/LI…

课后作业-阅读任务-阅读提问-3

1.如果两个人合作的始终达不到规范阶段该怎如何处理&#xff1f; 2. 逻辑和界面设计要注意哪些因素&#xff1f;转载于:https://www.cnblogs.com/fhycm/p/7866548.html

ride上点击用例不能显示edit信息_接口测试平台代码实现61: 多接口用例1

终于又序更上了&#xff0c;原谅最近作者几天事情不断。按照我们之前的计划&#xff0c;需要迅速开启很重要的核心多用例接口。首先&#xff0c;我们要确定&#xff0c;这个功能的大体设计。就放在在我们的页面 用例库 中&#xff1a;所以也就是我们很久之前就创建好的P_cases.…

黑客攻防专题八:21种RING的提权方法

好多都没有成功&#xff0c;还是发来看看&#xff0c;看看思路&#xff0c;呵呵 以下全部是本人提权时候的总结 很多方法至今没有机会试验也没有成功&#xff0c;但是我是的确看见别人成功过的。本人不才&#xff0c;除了第一种方法自己研究的&#xff0c;其他的都是别人的经验…