在Keras和TensorFlow中扩展ImageDataGenerator
在处理计算机视觉问题时,很多时候我们会遇到需要对整个数据集应用某种形式的转换的情况。Keras中的ImageDataGenerator类提供了多种转换,例如翻转,规范化等。
keras_tokenization
但是,应用Keras中不可用的自定义转换变得很困难。在我们的特定示例中,我们将对我们的数据集应用去噪算法作为预处理转换。一种简单的方法是对数据集中的所有图像应用降噪功能,并将处理后的图像保存在另一个目录中。但是,这浪费了我们的时间和空间。另一种方法是使用preprocessing_function属性即时执行此转换 。
为了加载图像进行训练,我使用在Keras中实现的.flow_from_directory()方法。使用OpenCV进行去噪非常简单,它提供了几种内置算法。在本文中,我将展示如何定义我们自己的预处理功能,将其传递给训练生成器,并将图像直接输入模型中,从而省去了保存它们的需要。
本教程大致分为两部分-
实现去噪算法
扩展预处理功能
让我们马上开始!
第1部分–实现去噪算法
让我们准备一个函数,将图像作为输入,应用内置的降噪算法,然后返回处理后的图像。
导入cv2
将numpy导入为np
def preprocessing_fun(文件名):
img = cv2.imread(文件名)
dst = cv2.fastN1MeansDenoisingColored(img,None,10,10,7,21)
返回dst
我们正在使用OpenCV的fastN1MeansDenoisingColored算法,因为该算法适用于彩色图像。OpenCV还提供了其他算法,可用于单通道图像。
现在我们已经实现了算法,让我们在ImageDataGenerator类中使用它。
第2部分–扩展预处理功能
在这里,我们使用训练生成器中上一节中定义的函数。
img_datagen = ImageDataGenerator(rescale = 1. / 255,
preprocessing_function = preprocessing_fun)
training_gen = img_datagen.flow_from_directory(PATH,target_size =(224
color_mode ='rgb',batch_size = 32,shuffle = True)
在定义ImageDataGenerator对象的前两行中,您会注意到我们已经将去噪功能传递给了preprocessing_function参数。通过这样做,我们指示数据生成器将此功能作为预处理步骤应用于每个图像,然后再将其提供给模型。这样,我们就无需处理所有图像并将它们写入单独的目录。
专家提示:如果需要执行在不同功能中定义的一系列转换,则可以通过以下方式在训练生成器中使用它。
def transform1(img):
#应用诸如水平翻转的转换并返回图像
返回cv2.flip(img,1)
def transform2(img):
#应用诸如垂直翻转之类的转换并返回图像
返回cv2.flip(img,0)
def transform3(img):
#应用180度旋转并返回图像
返回cv2.rotate(img,cv2.ROTATE_180)
def our_preprocessing_function(filename):
#组合所有转换
img = cv2.imread(文件名)
img1 = transform1(img)
img2 = transform2(img1)
final_img = transform3(img2)
返回final_img
img_datagen = ImageDataGenerator(rescale = 1. / 255,
preprocessing_function = our_preprocessing_function)
training_generator = img_datagen.flow_from_directory(PATH,
target_size =(224
class_mode ='categorical',shuffle = True)
这样,我们可以提供一系列自定义转换,将它们包装在一个函数中,然后将其应用于我们的数据集。该方法简单但功能强大,在资源受限的环境中工作时非常方便。
题库