神经网络学习小记录27——数据预处理 学习前言处理长宽不同的图片数据增强1、在数据集内进行数据增强2、在读取图片的时候数据增强3、目标检测中的数据增强
学习前言
进行训练的话,如果直接用原图进行训练,也是可以的(就如我们最喜欢Mnist手写体),但是大部分图片长和宽不一样,直接resize的话容易出问题。
除去resize的问题外,有些时候数据不足该怎么办呢,当然要用到数据增强啦。
这篇文章就是记录我最近收集的一些数据预处理的方式。
对于很多分类、目标检测算法,输入的图片长宽是一样的,如224,224、416,416等。
直接resize的话,图片就会失真。
但是我们可以采用如下的代码,使其用padding的方式不失真。
得到图片为:
这个的意思就是可以直接增加图片的方式进行数据增强。
其主要用到的函数是:
对于我而言,常用的方法如下:
datagen = ImageDataGenerator( rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.2, xhdsb_range=0.1, horizontal_flip=False, brightness_range=[0.1, 2], fill_mode='nearest')其中,参数的意义为:
1、rotation_range:旋转范围
2、width_shift_range:水平平移范围
3、height_shift_range:垂直平移范围
4、shear_range:float, 透视变换的范围
5、xhdsb_range:缩放范围
6、horizontal_flip:水平反转
7、brightness_range:图像随机亮度增强,给定一个含两个float值的list,亮度值取自上下限值间
8、fill_mode:‘constant’,‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理。
实际使用时可以利用如下函数生成图像:
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_imgimport os datagen = ImageDataGenerator( rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.2, xhdsb_range=0.1, horizontal_flip=False, brightness_range=[0.1, 2], fill_mode='nearest')trains = os.listdir("./train/")for index,train in enumerate(trains): img = load_img("./train/" + train) x = img_to_array(img) x = x.reshape((1,) + x.shape) i = 0 for batch in datagen.flow(x, batch_size=1, save_to_dir='./train_out', save_prefix=str(index), save_format='jpg'): i += 1 if i > 20: break生成效果为:
ImageDataGenerator是一个非常nice的增强方式,不过如果不想生成太多的图片,然后想要直接在读图的时候处理,也是可以的。
我们用到PIL中的ImageEnhance库。
1、亮度增强ImageEnhance.Brightness(image)
2、色度增强ImageEnhance.Color(image)
3、对比度增强ImageEnhance.Contrast(image)
4、锐度增强ImageEnhance.Sharpness(image)
在如下的函数中,可以通过改变Ehance函数中的参数实现不同的增强方式。
import osimport numpy as npfrom PIL import Imagefrom PIL import ImageEnhancedef Enhance_Brightness(image): # 变亮,增强因子为0.0将产生黑色图像,为1.0将保持原始图像。 # 亮度增强 enh_bri = ImageEnhance.Brightness(image) brightness = np.random.uniform(0.6,1.6) image_brightened = enh_bri.enhance(brightness) return image_brighteneddef Enhance_Color(image): # 色度,增强因子为1.0是原始图像 # 色度增强 enh_col = ImageEnhance.Color(image) color = np.random.uniform(0.4,2.6) image_colored = enh_col.enhance(color) return image_coloreddef Enhance_contrasted(image): # 对比度,增强因子为1.0是原始图片 # 对比度增强 enh_con = ImageEnhance.Contrast(image) contrast = np.random.uniform(0.6,1.6) image_contrasted = enh_con.enhance(contrast) return image_contrasteddef Enhance_sharped(image): # 锐度,增强因子为1.0是原始图片 # 锐度增强 enh_sha = ImageEnhance.Sharpness(image) sharpness = np.random.uniform(0.4,4) image_sharped = enh_sha.enhance(sharpness) return image_sharpeddef Add_pepper_salt(image): # 增加椒盐噪声 img = np.array(image) rows,cols,_=img.shape random_int = np.random.randint(500,1000) for _ in range(random_int): x=np.random.randint(0,rows) y=np.random.randint(0,cols) if np.random.randint(0,2): img[x,y,:]=255 else: img[x,y,:]=0 img = Image.fromarray(img) return imgdef Enhance(image_path, change_bri=1, change_color=1, change_contras=1, change_sha=1, add_noise=1): #读取图片 image = Image.open(image_path) if change_bri==1: image = Enhance_Brightness(image) if change_color==1: image = Enhance_Color(image) if change_contras==1: image = Enhance_contrasted(image) if change_sha==1: image = Enhance_sharped(image) if add_noise==1: image = Add_pepper_salt(image) image.save("0.jpg")Enhance("2007_000039.jpg")原图:
效果如下:
在目标检测中如果要增强数据,并不是直接增强图片就好了,还要考虑到图片扭曲后框的位置。
也就是框的位置要跟着图片的位置进行改变。
原图:
增强后: