具有增强图像和其他功能的 Keras 迭代器

Posted

技术标签:

【中文标题】具有增强图像和其他功能的 Keras 迭代器【英文标题】:Keras iterator with augmented images and other features 【发布时间】:2020-06-16 04:24:12 【问题描述】:

假设您有一个数据集,其中包含图像和每个图像的 .csv 中的一些数据。 您的目标是创建一个具有卷积分支和另一个(在我的情况下为 MLP)分支的 NN。

现在,有很多关于如何创建网络的指南(one here、another one),这不是问题。

这里的问题是,当 convolution_input 来自添加增强图像的 Keras ImageDataGenerator flow 时,如何以 [[convolution_input, other_features], target] 的形式创建迭代器。

更具体地说,当第 n 个图像(可能是增强图像或不是增强图像)被馈送到 NN 时,我希望它的原始特征包含在 other_features 中。

我发现了一些尝试(here 和 here,第二个看起来很有希望,但我无法弄清楚如何处理增强图像),但他们似乎没有考虑到Keras 生成器可能进行的数据集操作。

【问题讨论】:

问题:您对flow 还满意还是需要flow_from_directory? (flow 表示您可以将所有图像加载到内存中) 好吧,我只想要一个自动处理图像转换的流程。就我而言,我使用的是flow_from_dataframe,因为我有文件名、特性和类 【参考方案1】:

假设您有一个 CSV,因此您的图像和其他功能都在文件中。

其中id代表图像名称,后面是特征,后面是你的目标,(分类的类别,回归的数字)

|         id          | feat1 | feat2 | feat3 | class |
|---------------------|-------|-------|-------|-------|
| 1_face_IMG_NAME.jpg |   1   |   0   |   1   |   A   |
| 3_face_IMG_NAME.jpg |   1   |   0   |   1   |   B   |
| 2_face_IMG_NAME.jpg |   1   |   0   |   1   |   A   |
|         ...         |  ...  |  ...  |  ...  |  ...  |

首先,让我们定义一个数据生成器,然后我们可以覆盖它。

让我们从熊猫数据框中的CSV读取数据,并使用keras的flow_from_dataframe从数据框中读取数据。

df = pandas.read_csv("dummycsv.csv")
datagen = ImageDataGenerator(rescale=1/255.)
generator = datagen.flow_from_dataframe(
                df,
                directory="out/",
                x_col="id",
                y_col=df.columns[1:],
                class_mode="raw",
                batch_size=1)

您可以随时在ImageDataGenerator 中添加您的增强功能。

上面flow_from_dataframe中的代码需要注意的是

x_col = 图片名称

y_col = 通常是带有类名的列,但是让我们稍后通过首先提供 CSV 中的所有其他列来覆盖它。即feat_1feat_2....直到class_label

class_mode = raw,建议生成器原样返回y中的所有值。

现在让我们覆盖/继承上述生成器并创建一个新生成器,使其返回 [img, otherfeatures], [target]

这里是用cmets作为解释的代码:

def my_custom_generator():
    # to keep track of complete epoch
    count = 0 
    while True:
        if count == len(df.index):
            # if the count is matching with the length of df, 
            # the one pass is completed, so reset the generator
            generator.reset()
            break
        count += 1
        # get the data from the generator
        data = generator.next()

        # the data looks like this [[img,img] , [other_cols,other_cols]]  based on the batch size        
        imgs = []
        cols = []
        targets = []

        # iterate the data and append the necessary columns in the corresponding arrays 
        for k in range(batch_size):
            # the first array contains all images
            imgs.append(data[0][k])
      
            # the second array contains all features with last column as class, so [:-1]
            cols.append(data[1][k][:-1])

            # the last column in the second array from data is the class
            targets.append(data[1][k][-1])

        # this will yield the result as you expect.
        yield [imgs,cols], targets  

为您的验证生成器创建一个类似的函数。如果需要,请使用 train_test_split 拆分数据框并创建 2 个生成器并覆盖它们。

像这样传递model.fit_generator中的函数

model.fit_generator(my_custom_generator(),.....other params)

【讨论】:

但是,如果增强数据集的数量远远超过原始数据集,if(count==len(df.index)) 如何跟踪时代? 增强通常应用于图像。它不会增加图像的数量,除非您将它们单独保存并将其用作训练集中的唯一实例。增强的作用是在每个时期随机应用不同的增强,从而使其看起来像不同的图像 我自己也想出来了,因为当我们在训练中提到每个 epoch 的步数时,我们通常将训练长度除以批量大小,这意味着在一个 epoch 中,它只传递所有图像一次。我希望我是对的.. @venkatakrishnan 我构建了类似的生成器,但它不适用于有关元组的错误。你能看看我的问题***.com/questions/62744659/…吗? @feeeper 确定。看看它。

以上是关于具有增强图像和其他功能的 Keras 迭代器的主要内容,如果未能解决你的问题,请参考以下文章

java之增强for和迭代器精选

《Python运维开发之路》 装饰器&生成器&迭代器

for循环增强for循环和迭代器的区别

迭代器和增强for循环

迭代器和增强for

Java——集合(Collection接口),迭代器,增强for循环,泛型