在计算机视觉领域,经常需要对整个数据集应用某种变换。Keras的ImageDataGenerator类提供了诸如翻转、归一化等多种变换。然而,当需要应用Keras中没有的自定义变换时,就会遇到困难。以例子为例,将对数据集应用去噪算法作为预处理变换。一种简单的方法是对数据集中的所有图像应用去噪函数,并将处理后的图像保存到另一个目录。然而,这既耗时又占用空间。另一种方法是使用preprocessing_function属性实时执行此变换。
为了加载训练图像,使用了Keras中实现的flow_from_directory()方法。使用OpenCV进行去噪相对简单,它提供了几种内置算法。在本文中,将展示如何定义自己的预处理函数,将其传递给训练生成器,并直接将图像输入模型,从而消除保存它们的需要。本教程将大致分为两部分:实现去噪算法和扩展预处理函数。让立即开始吧!
让准备一个函数,它接受一个图像作为输入,应用内置的去噪算法,并返回处理后的图像。
import cv2
import numpy as np
def preprocessing_fun(filename):
img = cv2.imread(filename)
dst = cv2.fastN1MeansDenoisingColored(img, None, 10, 10, 7, 21)
return dst
使用OpenCV中的fastN1MeansDenoisingColored算法,因为这个算法适用于彩色图像。OpenCV还提供了其他适用于单通道图像的算法。现在已经实现了算法,让在ImageDataGenerator类中使用它。
img_datagen = ImageDataGenerator(rescale=1./255,
preprocessing_function = preprocessing_fun)
training_gen = img_datagen.flow_from_directory(PATH, target_size=(224,224),
color_mode='rgb', batch_size=32, shuffle=True)
def transform1(img):
# 应用水平翻转变换并返回图像
return cv2.flip(img, 1)
def transform2(img):
# 应用垂直翻转变换并返回图像
return cv2.flip(img, 0)
def transform3(img):
# 应用180度旋转变换并返回图像
return cv2.rotate(img, cv2.ROTATE_180)
def our_preprocessing_function(filename):
# 组合所有变换
img = cv2.imread(filename)
img1 = transform1(img)
img2 = transform2(img1)
final_img = transform3(img2)
return final_img
img_datagen = ImageDataGenerator(rescale=1./255,
preprocessing_function = our_preprocessing_function)
training_generator = img_datagen.flow_from_directory(PATH,
target_size=(224,224), color_mode='rgb', batch_size=32,
class_mode='categorical', shuffle=True)