原文地址:https://finthon.com/learn-cnn-one-preprocess/
-- 全文阅读5分钟 --
在本文中,你将学习到以下内容:
- 通过数据增强增加样本量
- 调整图片大小便于网络训练
前言
图像识别的准备工作就是要对我们拿到手的样本图片进行预处理,具体就是数据增强和调整图片大小,这些准备工作都是为训练网络做准备。图片预处理一定要合理有效,符合机器学习的要求。
数据增强(data augmentation)
当我们拿到一套图片数据准备进行机器学习的时候,样本量往往不够多,因此需要对现有的图片进行数据增强。一方面是为了增加样本量,另一方面能够提高模型的泛化能力。
假设我们有一组商标图片,如下:
当我们进行100类的机器学习时,显然这一类的样本量不够多,在这里我们通过keras库进行数据增强。以商标图片中的第一张图片为例:
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
pic_path = r'./3ac79f3df8dcd100755525327e8b4710b8122fdc.jpg'
augmentation_path = r'./data_augmentation'
首先导入keras库,建立图片路径和数据增强保存路径,接下来定义ImageDataGenerator,告诉他通过哪些操作产生新的图片。
data_gen = ImageDataGenerator(
rotation_range=30,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=0.2,
fill_mode='nearest')
在这里根据当前的图片需求,选择了旋转、平移、缩放、边缘填充的操作,其他操作详见。有些操作的设置要符合实际情况,比如旋转操作,不能把图片完全倒立了,这样的数据增强反而不利机器学习。
img = load_img(pic_path)
x = img_to_array(img)
x = x.reshape((1,) + x.shape)
n = 1
for batch in data_gen.flow(x, batch_size=1, save_to_dir=augmentation_path, save_prefix='train', save_format='jpeg'):
n += 1
if n > 6: # 6表示生成6张新的图片
break
加载图片的地址,转变成array格式给ImageDataGenerator,save_prefix表示新图片的名字前缀,save_format表示新图片保存的格式。需要注意的是,在这里根据我们定义的操作,从这些操作中随机选择几种生成6张图片。
最终在data_augmentation文件夹中生成6张新的商标图片:
在实际操作中,应该多去尝试数据增强的各种操作。好的样本扩充能够增加模型的泛化能力,提高准确率。数据增强完整代码如下:
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
pic_path = r'./3ac79f3df8dcd100755525327e8b4710b8122fdc.jpg'
augmentation_path = r'./data_augmentation'
data_gen = ImageDataGenerator(
rotation_range=30,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=0.2,
fill_mode='nearest')
img = load_img(pic_path)
x = img_to_array(img)
x = x.reshape((1,) + x.shape)
n = 1
for batch in data_gen.flow(x, batch_size=1, save_to_dir=augmentation_path, save_prefix='train', save_format='jpeg'):
n += 1
if n > 6:
break
图片大小调整(resize)
统一调整图片的大小,便于后面进行机器学习。我们以调整data_augmentation文件夹生成的新图片为例:
from PIL import Image
import os
img_path = r'./data_augmentation'
resize_path = r'./resize_image'
for i in os.listdir(img_path):
im = Image.open(os.path.join(img_path,i))
out = im.resize((224, 224))
if not os.path.exists(resize_path):
os.makedirs(resize_path)
out.save(os.path.join(resize_path, i))
使用PIL库改变图片大小,使用os库读取文件路径,将resize后的图片放到resize_image文件夹中。resize后的大小为224*224(这个大小是为了后面ResNet使用)。resize后的图片效果如下:
当你完成这一步的时候,图像识别的准备工作就完成一半了,剩下的就是将这些图片制成tfrecord格式,方便训练网络读取。
可能感兴趣
"笨方法"学习CNN图像识别(一)—— 图片预处理
"笨方法"学习CNN图像识别(二)—— tfrecord格式高效读取数据
"笨方法"学习CNN图像识别(三)—— ResNet网络训练及预测
使用Python+Tensorflow的CNN技术快速识别验证码