直接上代码:
- #encoding:utf-8
- '''''
- tf 参考链接 :https://tensorflow.google.cn/api_guides/python/image
- 增加数据量,减轻过拟合,增强模型的泛化能力
- 在预测时也可以使用
- '''
- import numpy as np
- import os
- import math
- import tensorflow as tf
- from skimage import io
- import random
- import matplotlib.pyplot as plt
- def read_image(image_path):
- image_raw_data = tf.gfile.FastGFile(image_path,'rb').read()
- image_data = tf.image.decode_png(image_raw_data)
- return image_data
- '''''
- #图像大小的调整,放大缩小
- 不同尺寸
- tf.image.resize_images(img,size,size,method), 0,默认 双线性插值;1,最近邻算法;
- 2, 双3次插值法;3,面积插值法
- '''
- def resize_image(image_data):
- res = []
- image_biliner = tf.image.resize_images(image_data,[256,256],method=0)
- image_nn = tf.image.resize_images(image_data,[256,256],method=1)
- image_bicubic = tf.image.resize_images(image_data,[256,256],method=2)
- image_area = tf.image.resize_images(image_data,[256,256],method=3)
- res.append(tf.to_int32(image_biliner))
- res.append(tf.to_int32(image_nn))
- res.append(tf.to_int32(image_bicubic))
- res.append(tf.to_int32(image_area))
- return res
- '''''
- #裁剪
- 识别不同位置的物体
- '''
- def crop_image(image_data):
- res = []
- #在中间位置进行裁剪或者周围填充0
- image_crop = tf.image.resize_image_with_crop_or_pad(image_data,256,256)
- image_pad = tf.image.resize_image_with_crop_or_pad(image_data,512,512)
- #按照比列 裁剪图像的中心区域
- image_center_crop = tf.image.central_crop(image_data,0.5)
- #随机裁剪(常用方法)
- image_random_crop0 = tf.random_crop(image_data,[300,300,3])
- image_random_crop1 = tf.random_crop(image_data,[300,300,3])
- res.append(tf.to_int32(image_crop))
- res.append(tf.to_int32(image_pad))
- res.append(tf.to_int32(image_center_crop))
- res.append(tf.to_int32(image_random_crop0))
- res.append(tf.to_int32(image_random_crop1))
- return res
- '''''
- #旋转(镜像)
- 图像旋转不会影响识别的结果,可以在多个角度进行旋转,使模型可以识别不同角度的物体
- 当旋转或平移的角度较小时,可以通过maxpooling来保证旋转和平移的不变性。
- '''
- def flip_image(image_data):
- #镜像
- res = []
- #上下翻转
- image_up_down_flip = tf.image.flip_up_down(image_data)
- #左右翻转
- image_left_right_filp = tf.image.flip_left_right(image_data)
- #对角线旋转
- image_transpose = tf.image.transpose_image(image_data)
- #旋转90度
- image_rot1 = tf.image.rot90(image_data,1)
- image_rot2 = tf.image.rot90(image_data,2)
- image_rot3 = tf.image.rot90(image_data,3)
- res.append(tf.to_int32(image_up_down_flip))
- res.append(tf.to_int32(image_left_right_filp))
- res.append(tf.to_int32(image_transpose))
- res.append(tf.to_int32(image_rot1))
- res.append(tf.to_int32(image_rot2))
- res.append(tf.to_int32(image_rot3))
- return res
- #图像色彩调整
- '''''
- 根据原始数据模拟出更多的不同场景下的图像
- brightness(亮度),适应不同光照下的物体
- constrast(对比度), hue(色彩), saturation(饱和度)
- 可自定义和随机
- '''
- def color_image(image_data):
- res = []
- image_random_brightness = tf.image.random_brightness(image_data,0.5)
- image_random_constrast = tf.image.random_contrast(image_data,0,1)
- image_random_hue = tf.image.random_hue(image_data,0.5)
- image_random_saturation = tf.image.random_saturation(image_data,0,1)
- #颜色空间变换
- images_data = tf.to_float(image_data)
- image_hsv_rgb = tf.image.rgb_to_hsv(images_data)
- # image_gray_rgb = tf.image.rgb_to_grayscale(image_data)
- # image_gray_rgb = tf.expand_dims(image_data[2],1)
- res.append(tf.to_int32(image_random_brightness))
- res.append(tf.to_int32(image_random_constrast))
- res.append(tf.to_int32(image_random_hue))
- res.append(tf.to_int32(image_random_saturation))
- res.append(tf.to_int32(image_hsv_rgb))
- return res
- #添加噪声
- def PCA_Jittering(img):
- img_size = img.size/3
- print(img.size,img_size)
- img1= img.reshape(int(img_size),3)
- img1 = np.transpose(img1)
- img_cov = np.cov([img1[0], img1[1], img1[2]])
- #计算矩阵特征向量
- lamda, p = np.linalg.eig(img_cov)
- p = np.transpose(p)
- #生成正态分布的随机数
- alpha1 = random.normalvariate(0,0.2)
- alpha2 = random.normalvariate(0,0.2)
- alpha3 = random.normalvariate(0,0.2)
- v = np.transpose((alpha1*lamda[0], alpha2*lamda[1], alpha3*lamda[2])) #加入扰动
- add_num = np.dot(p,v)
- img2 = np.array([img[:,:,0]+add_num[0], img[:,:,1]+add_num[1], img[:,:,2]+add_num[2]])
- img2 = np.swapaxes(img2,0,2)
- img2 = np.swapaxes(img2,0,1)
- return img2
- def main(_):
- image_path = 'dog.png'
- image_data = read_image(image_path)
- img = tf.image.per_image_standardization(image_data)
- resize = resize_image(image_data)
- crop = crop_image(image_data)
- flip = flip_image(image_data)
- color = color_image(image_data)
- init = tf.global_variables_initializer()
- with tf.Session() as sess:
- sess.run(init)
- img, resize_res, crop_res, flip_res, color_res = sess.run([img,
- resize,crop,flip,color])
- res = []
- res.append(resize_res)
- res.append(crop_res)
- res.append(flip_res)
- res.append(color_res)
- for cat in res:
- fig = plt.figure()
- num = 1
- for i in cat:
- x = math.ceil(len(cat)/2) #向上取整
- fig.add_subplot(2,x,num)
- plt.imshow(i)
- num = num+1
- plt.show()
- img = PCA_Jittering(img)
- plt.imshow(img)
- plt.show()
- if __name__ == '__main__':
- tf.app.run()