相信大家都听说过数据增强(Data Augmentation),这是在做神经网络时非常极其重要的trick, 因为数据是宝贵的,稀有的,通过数据增强我们能让我们的数据量迅速增大,并且能使训练的模型具有一定抗噪能力。这篇文章主要探讨一下 tensorflow 关于数据增强的API.
先读取图片数据, 并输出我们的图片信息
import numpy as np
from PIL import Image# #***************案例1*numpy读取图片数据**********************#
img = Image.open("5.jpg", 'r')
img.show()
a = np.asarray(img, dtype=float)
print(img.mode)
# output RGB (1601, 1002)
没错,就是一个漂亮的小姐姐,hh

再先来个题外话,叫做 图片数据的编码, tensorflow能支持的格式不多, jpg,png,gif,bmp这些常用格式倒是可以的,如果你的图片格式是很特殊的格式的话, 恐怕你就需要用其他处理方式先进行预处理了, 比如常用的医学图像 .nii格式 你就需要用nibable, 一些tiff,DICOM,等你可能可以用 PIL,cv2,openslide , libvips等等。
# ***# 读取图片,进行图片解码
# 读取图像的原始数据 返回值:<class 'bytes'>
# 也就是读取图片,将其转换成一串二进制串
image_raw_data = tf.gfile.FastGFile("5.jpg", 'rb').read()with tf.Session() as sess:# img_data--> <class 'tensorflow.python.framework.ops.Tensor'>
    img_data = tf.image.decode_jpeg(image_raw_data)print(img_data.eval())  # RGB模式输出一个三维数组
    # 用py_plot展示图片
  plt.imshow(img_data.eval())plt.show()# 将数据类型转化为uint8
    img_data = tf.image.convert_image_dtype(img_data, dtype=tf.uint8)# ***# 读取数据,进行图片编码
  encoded_image = tf.image.encode_png(img_data)with tf.gfile.GFile("6.png", 'wb') as f:f.write(encoded_image.eval())

接下来我们就一个个来看看,首先读取图片数据,并转化成float32

image_raw_data = tf.gfile.FastGFile("5.jpg", 'rb').read()  # 500x500
with tf.Session() as sess:# img_data--> <class 'tensorflow.python.framework.ops.Tensor'>
    img_data = tf.image.decode_jpeg(image_raw_data)img_data = tf.image.convert_image_dtype(img_data, dtype=tf.float32)
print(type(img_data) # class 'tensorflow.python.framework.ops.Tensor'>

(一)调整图片大小resize

一般来说网络上的图像大小不确定,但是神经网络的输入节点的个数是固定的。所以与处理是需要统一图片大小

调整大小方法有以下几个:
    # 1、双线性插值法
    # 2、最近邻居法
    # 3、双三次插值法
    # 4、面积插值法

resize_img = tf.image.resize_images(img_data, [300, 300], method=0)  # 一共提供了四种方法
# <class 'tensorflow.python.framework.ops.Tensor'>
plt.imshow(resize_img.eval())
plt.show()# 0代表ResizeMethod.BILINEAR,依次类推

输出结果:

(二)图片剪切填充

 

# 放大图片就自动周围填充黑色;缩小图片就自动从图片中间剪切
resize_img = tf.image.resize_image_with_crop_or_pad(img_data, 600, 600)
plt.imshow(resize_img.eval())
plt.show()

输出结果:

(三)图片按比例大小缩小图片(也是一种剪切,类似上一种方式)

central_cropped = tf.image.central_crop(img_data, 0.5)  
plt.imshow(central_cropped.eval())
plt.show()

输出结果:

(四)方框剪切

# # bounding_box_crop
# # similar func:tf.image.pad_to_bounding_box
# 图片(0, 0)位置在左上角, (50,50)指height,width在图片左上角的偏移量
resize_img = tf.image.crop_to_bounding_box(img_data, 50, 50, 300, 300)

(五)翻转以及随机翻转

# #图像翻转# 数据增强
    # 上下翻转、左右翻转、对角线翻转
    # tf.image.transpose_image(img_data)
    # tf.image.flip_left_right(img_data)
    flip_img = tf.image.flip_up_down(img_data)plt.imshow(flip_img.eval())plt.show()# 随机翻转 推荐应用这个方法
    # 随机上下左右、亮度、对比度、色相、饱和度
    # tf.image.random_flip_up_down(img_data)
    # tf.image.random_brightness()
    # tf.image.random_contrast()
    # tf.image.random_hue()
    # tf.image.random_saturation()
    rand_flip_img = tf.image.random_flip_left_right(img_data, seed=1)plt.imshow(rand_flip_img.eval())plt.show()

(六)图像色彩调整(五 中包含了一些色彩调整函数,不过是随机的就直接列在上面了,方便大家总结理解)

# 调整图片亮度、对比度、gamma、色相、饱和度
# tf.image.adjust_contrast()
# tf.image.adjust_gamma()
# tf.image.adjust_hue()
# tf.image.adjust_saturation()
adjust_img = tf.image.adjust_brightness(img_data, -0.5)
# 将图片亮度变为均值为0,方差为1
adjust_img = tf.image.per_image_standardization(img_data)
print(img_data.eval())

(七)图像标注

# # tf.image.draw_bounding_boxes函数的输入是一个batch的数据,也就是
#   多张图像组成的四维矩阵
#   第一个输入参数img_data中数据类型应该是实数,前面最初已经转换成了tf.float32
batched = tf.expand_dims(img_data, 0)
#  [0.2, 0.3, 0.5, 0.8]给出的是图像中的相对位置 [y_min, x_min, y_max, x_max]
boxes = tf.constant([[[0.2, 0.3, 0.48, 0.65]]])
res = tf.image.draw_bounding_boxes(batched, boxes, name='bounding_box')
plt.subplot(121), plt.imshow(img_data.eval()), plt.title('original')
plt.subplot(122), plt.imshow(np.asarray(res.eval())[0]), plt.title('result')
# plt.imsave(fname="save.jpg", arr=np.asarray(res.eval())[0])  # 保存图片
plt.show()

上面图片做标注不是很明显,换张女神图片来码代码~

(八)截取标记部分

# 随机截取图像上有信息含量的部分,也可以提高模型健壮性
# 此函数为图像生成单个随机变形的边界框。函数输出的是可用于裁剪原始图像的单个边框。
# 返回值为3个张量:begin,size和 bboxes。前2个张量用于 tf.slice 剪裁图像。
# 后者可以用于 tf.image.draw_bounding_boxes 函数来画出边界框。
boxes = tf.constant([[[0.2, 0.3, 0.48, 0.65]]])
print(np.asarray(img_data).shape)
begin, size, bbox_for_draw = tf.image.sample_distorted_bounding_box(tf.shape(img_data),
                                                                    bounding_boxes=boxes,
                                                                    min_object_covered=0.1)
# batched = tf.expand_dims(tf.image.convert_image_dtype(img_data, tf.float32), 0)
# image_with_box = tf.image.draw_bounding_boxes(batched, bbox_for_draw)
distorted_image = tf.slice(img_data, begin, size)
plt.imshow(distorted_image.eval())
plt.show()

tensorflow 数据增强处理基本上就这些啦~用起来,训练神经网络才是关键。

tensorflow数据增强相关推荐

  1. 深度学习--TensorFlow(7)拟合(过拟合处理)(数据增强、提前停止训练、dropout、正则化、标签平滑)

    目录 拟合 1.拟合情况 2.抵抗过拟合方法 过拟合处理(防止过拟合): 一.数据增强 1.设置图像生成器 2.载入图片 3.图像转三维数据 4.三维转四维 5.生成图片(用图像生成器) 代码 二.提 ...

  2. 【tensorFlow】——图像数据增强、读取图像、保存图像

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/4/13 10:54 # @Author : @linlianqin # @S ...

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

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

  4. tensorflow中的正则化函数在_tensorflow中的正则化及数据增强

    正则化: 一般可以通过减少特征或者惩罚不重要特征的权重来缓解过拟合,但是我们通常不知道该惩罚那些特征的权重,而正则化就是帮助我们惩罚特征权重的,即特征的权重也会成为模型的损失函数一部分.可以理解为, ...

  5. tensorflow实现数据增强(随机裁剪、翻转、对比度设置、亮度设置)

    数据增强(Data Augmentation):是指对图片进行随机的旋转.翻转.裁剪.随机设置图片的亮度和对比度以及对数据进行标准化(数据的均值为0,方差为1).通过这些操作,我们可以获得更多的图片样 ...

  6. 用tensorflow进行数据增强

    深度学习数据增强@TOC 用tensorflow进行数据增强 这几天跑代码,数据量不多,为了防止过拟合和加强训练准确度,就想着做一些图片的数据增强,在网上找了一些代码,能实现功能但是巨慢,甚至比我深度 ...

  7. tensorflow 猫狗识别 数据增强

    文章目录 卷积网络参数 网络配置 模型训练和效果展示 完整代码 数据增强 角度旋转 平移变换 缩放 channel_shift 翻转 rescale变化 图像填充 任务介绍: 有猫和狗的图片,需要对这 ...

  8. 是你的数据还不够强!谷歌大脑「数据增强」开源,大神QuocLe出品

    你的数据还不够强. 玩深度学习的人都知道,AI算法大部分是数据驱动.数据的质量一定程度上决定了模型的好坏. 这就有了深度学习天生的一个短板:数据不够多.不够好. 而数据增强就是解决这一问题的有效办法. ...

  9. 谷歌大脑开源「数据增强」新招数:ImageNet准确率达85%,大神Quoc Le出品

    十三 发自 凹非寺  量子位 报道 | 公众号 QbitAI 你的数据还不够强. 玩深度学习的人都知道,AI算法大部分是数据驱动.数据的质量一定程度上决定了模型的好坏. 这就有了深度学习天生的一个短板 ...

最新文章

  1. ADO.NET Entity Framework -Code Fisrt (二)
  2. 转发与重定向的区别,特点
  3. 关于选择博客网站的一点看法
  4. c语言 题目 猜算式,蓝桥杯竞赛题目(猜算式)
  5. 阿里云帮助江苏省财政厅力推统一公共支付平台
  6. sle linux lftp禁止匿名登陆_软件测试常用linux命令整理
  7. 您能解决这3个(看似)简单的Python问题吗?
  8. 数据库:跨数据库,服务器数据迁移
  9. jmeter参数化之配置元件CSV控件
  10. Python 数据结构与算法——拓扑排序
  11. 【单机实现系列】SharePoint2010与Exchange Server2010 结合
  12. 排队论模型的monteCarlo法仿真
  13. android多线程中更新ui,Android 在子线程中更新UI
  14. YAML文件格式详解
  15. Visual Studio安装教程
  16. 品致教您如何选择合适的电流探头
  17. PS_1_认识主界面_新建文档(分辨率)_打开保存(序列动画)
  18. Nice Songs
  19. 计算机网络 - 网络层
  20. 北大计算机陈鹏,2021届毕业颁证仪式 | 特邀嘉宾北京大学陈鹏教授主旨演讲

热门文章

  1. 什么是 MultiRaft ?
  2. 05.global_index_setting_index相关全局设置
  3. PAT甲级 -- 1079 Total Sales of Supply Chain (25 分)
  4. 社交搜索Graph Search技术解析
  5. 12行代码AC_Leecode 495. 提莫攻击——Leecode每日一题系列
  6. 单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
  7. c语言 输入若干字符串 用指针和一位数组 冒泡排序,C 语言作业 - 1 - 指针使用与冒泡排序...
  8. 2d的公式_西师大版六年级数学上册全册必背公式+高清版电子课文,收藏预习
  9. C语言中const的用法
  10. oracle数据库开多线程,学习笔记:Oracle表数据导入 DBA常用单线程插入 多线程插入 sql loader三种表数据导入案例...