【问题标题】:ImageDataGenerator to get leveled dataset?ImageDataGenerator 获取水平数据集?
【发布时间】:2021-01-27 06:36:30
【问题描述】:

我有一个相当不均匀的数据集,每个标签的图像数量(最大的是 700,最小的是 30)。

所以我认为我可以使用 ImageDataGenerator 为图像数量最少的标签生成更多图像,并逐步使用其余标签生成更多图像,直到达到每个标签的图像数量水平。稍后他将进行培训。

我一直在考虑通过几个循环和使用 ImageDataGenerator 的转换来为每个标签获得大致相同数量的图像,但我不知道我是否做得对,因为我认为可能有更简单的方法,或者我获得良好培训的策略是错误的。

【问题讨论】:

  • 你为什么不做一个文件列表,应用你需要的转换/过采样,然后做一个可以遍历这些文件的加载器呢? Keras 是高级别的,如果您想要更大的灵活性,您需要降低级别。

标签: python-3.x tensorflow keras scikit-learn deep-learning


【解决方案1】:

创建增强图像是处理不平衡的一种方法。然而,还有另一种方法是在 model.fit 中使用参数 class_weight。此参数是一个字典,用于指定训练模型时每个单独的类在损失函数上应具有的权重。例如,假设您有 1000 张猫的图像和 100 张狗的图像。就损失而言,您可能希望狗样本的重量是猫样本的 10 倍。由于您使用的是 ImageDataGenerator,您可以使用以下代码获取所需的 class_weight 字典

from sklearn.utils import class_weight
import numpy as np

class_weights = class_weight.compute_class_weight(
               'balanced',
                np.unique(train_generator.classes), 
                train_generator.classes) 

【讨论】:

    【解决方案2】:

    ImageDataGenerator 不会创建新图像,它只是对您的图像进行批处理,并可以对其应用一些增强功能以​​创建稍微多样化的数据集。 你可以做的就是这个link。您可以遍历存储图像的目录,并使用 openCV 来扩充它们,然后再次保存它们。它可以轻松地增加您使用它的任何类的数量。

    这是一个示例,它让每个图像旋转任意数量的度数并保存

    from PIL import Image
    import os
    
    os.chdir('/path/to/image/directory')
    names = os.listdir()
    for i in names:
        os.chdir('/path/to/image/directory') #chdir to location of images
        img = Image.open(i).rotate(180) #90,180,270
        
        #Where you want to save to
        os.chdir('path/to/save/location')
        
        img.save(i)
        os.rename('%s' % i, '180_%s' % i)
    

    你可以复制上面的代码或者使用这个repo

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      相关资源
      最近更新 更多