图像预处理是一个非常简单,通过提高训练数据的多样性,进而对训练模型的召回率,适应性有着非常大的提升作用。
另外在训练时,需要更多的训练次数,比如说我对每张图片进行了一次旋转,那么训练次数就要提高一倍。也就是说训练集多样性增加,同时训练次数也要增加。
代码:
import tensorflow as tf
from scipy import misc
import numpy as np
from skimage import transform,data
#随机旋转图片
def random_rotate_image(image_file, num):
with tf.Graph().as_default():
tf.set_random_seed(666)
file_contents = tf.read_file(image_file)
image = tf.image.decode_image(file_contents, channels=3)
image_rotate_en_list = []
def random_rotate_image_func(image):
#旋转角度范围
angle = np.random.uniform(low=-30.0, high=30.0)
#return misc.imrotate(image, angle, 'bicubic')
return transform.rotate(image, angle, resize=True)
for i in range(num):
image_rotate = tf.py_func(random_rotate_image_func, [image], tf.uint8)
image_rotate_en_list.append(tf.image.encode_png(image_rotate))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
results = sess.run(image_rotate_en_list)
for idx,re in enumerate(results):
with open('data2/'+str(idx)+'.png','wb') as f:
f.write(re)
#随机左右翻转图片
def random_flip_image(image_file, num):
with tf.Graph().as_default():
tf.set_random_seed(666)
file_contents = tf.read_file(image_file)
image = tf.image.decode_image(file_contents, channels=3)
image_flip_en_list = []
for i in range(num):
image_flip = tf.image.random_flip_left_right(image)
image_flip_en_list.append(tf.image.encode_png(image_flip))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
results = sess.run(image_flip_en_list)
for idx,re in enumerate(results):
with open('data1/'+str(idx)+'.png','wb') as f:
f.write(re)
#随机变化图片亮度
def random_brightness_image(image_file, num):
with tf.Graph().as_default():
tf.set_random_seed(666)
file_contents = tf.read_file(image_file)
image = tf.image.decode_image(file_contents, channels=3)
image_bright_en_list = []
for i in range(num):
image_bright = tf.image.random_brightness(image, max_delta=0.8)
image_bright_en_list.append(tf.image.encode_png(image_bright))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
results = sess.run(image_bright_en_list)
for idx,re in enumerate(results):
with open('data/'+str(idx)+'.png','wb') as f:
f.write(re)
#随机裁剪图片
def random_crop_image(image_file, num):
with tf.Graph().as_default():
tf.set_random_seed(666)
file_contents = tf.read_file(image_file)
image = tf.image.decode_image(file_contents, channels=3)
image_crop_en_list = []
for i in range(num):
#裁剪后图片分辨率保持160x160,3通道
image_crop = tf.random_crop(image, [300, 400, 3])
image_crop_en_list.append(tf.image.encode_png(image_crop))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
results = sess.run(image_crop_en_list)
for idx,re in enumerate(results):
with open('data/'+str(idx)+'.png','wb') as f:
f.write(re)
if __name__ == '__main__':
#处理图片,进行20次随机处理,并将处理后的图片保存到输入图片相同的路径下
#random_brightness_image('data/test.jpeg', 20)
random_crop_image('test.jpeg', 20)
random_flip_image('test.jpeg', 30)
random_rotate_image('test.jpeg', 30)
随机旋转不行,查了下,有的说要在python环境中安装Pillow即可,安装了不行,有的说要降低scipy版本,
中提到:imrotate
is deprecated! imrotate
is deprecated in SciPy 1.0.0, and will be removed in 1.2.0. Use skimage.transform.rotate
instead.
发现不行,搜索tensorflow旋转图片。
https://codeday.me/bug/20180831/241170.html中提到:
Image.Image.rotate
这样下面是代码:
import tensorflow as tf
from scipy import misc
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
#随机旋转图片
def random_rotate_image(image_file, num):
with tf.Graph().as_default():
tf.set_random_seed(666)
file_contents = tf.read_file(image_file)
image = tf.image.decode_image(file_contents, channels=3)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
image = Image.fromarray(image.eval())
j=0
for i in range(num):
angle = np.random.uniform(low=-80.0, high=90.0)
h=Image.Image.rotate(image, angle)
# plt.imshow(h)
# plt.show()
# 使用matplotlib写入图像
j=j+1
h.save('data2/%s.png'%j)
if __name__ == '__main__':
#处理图片,进行20次随机处理,并将处理后的图片保存到输入图片相同的路径下
random_rotate_image('test.jpeg', 20)