如何在 Keras 中生成比训练大小更多的增强图像?

问题描述

我知道图像的数据增强技术。但是,我对如何生成增强数据有疑问。

我将使用 Keras 和 Tensorflow 分享我的场景和代码,但任何库的概念都是相同的。

以下场景的图像增强技术:

在 Keras 中,我们有 ImageDataGenerator 可以在提取数据进行训练时增强图像。 例如,如果我们有 100 张图像开始。然后 ImageDataGenerator 将对这些图像应用上述转换,并且每个时期输出 100 个图像(ImageDataGenerator)。

但是,如果我们实现自己的 ImageDataGenerator,我们也可以实现它以返回 100 + 2*100 = 300 个用于训练的图像。

上述哪种情况总体上是好的?

解决方法

如果您在三个 epoch 中使用相同的 100 张图片并进行增强,您将获得 300 张独特的图片。每次加载图片时,Keras 都会应用随机变换。

往下看。这是一张图像数据集的 16 次重复。相同的图像永远不会以相同的方式转换。

import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.datasets import load_sample_image
import numpy as np

imgs = np.stack([load_sample_image('flower.jpg') for i in range(4*4)],axis=0)

data_gen = tf.keras.preprocessing.image.ImageDataGenerator(
    rotation_range = 90,width_shift_range = 0.1,height_shift_range = 0.1,horizontal_flip = True,preprocessing_function=lambda x: x[...,np.random.permutation([0,1,2])]
)

fig = plt.figure(figsize=(4,4))
for index,image in enumerate(next(data_gen.flow(imgs)).astype(int)):
    ax = plt.subplot(4,4,index + 1)
    ax.set_xticks([])
    ax.set_yticks([])
    ax.imshow(image)
plt.show()

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...