【问题标题】:How do I print sample images (preferably with class) after using Keras ImageDataGenerator?使用 Keras ImageDataGenerator 后如何打印示例图像(最好是类)?
【发布时间】:2021-11-10 21:16:45
【问题描述】:

我想打印我使用 Keras 创建的训练批次中的示例图片,如下所示:

train_batches = ImageDataGenerator(rescale=1/255, horizontal_flip=True, 
                rotation_range=5).flow_from_directory('train', target_size=(256, 256), classes=[
                'bike', 'car', 'motorcycle', 'other', 'truck', 'van'], batch_size=12)

理想情况下,我希望课程也能展示,但现在我很高兴能够展示示例图片。我找到了this thread,但是当我像这样用我的 train_batch 尝试该代码时:

def plots(ims, figsize=(12,6), rows=3, interp=False, titles=None):
    if type(ims[0]) is np.ndarray:
        ims = np.array(ims).astype(np.uint8)
        if (ims.shape[-1] != 3):
            ims = ims.transpose((0,2,3,1))
    f = plt.figure(figsize=figsize)
    cols = len(ims)//rows if len(ims) % 2 == 0 else len(ims)//rows + 1
    for i in range(len(ims)):
        sp = f.add_subplot(rows, cols, i+1)
        sp.axis('Off')
        if titles is not None:
            sp.set_title(titles[i], fontsize=16)
        plt.imshow(ims[i], interpolation=None if interp else 'none')

imgs, labels = next(train_batches)

plots(imgs, titles=labels)

它按应有的方式绘制类,但只有黑色方块,而不是这样的图片: 正如我之前所说,现在我很高兴能够打印示例图片,并且不必是一整批。 (但如果您知道如何更正我的代码以便上面的代码真正有效,我将不胜感激。)

编辑: 如果我删除了 ImageDataGenerator 括号中的所有内容,则会按原样绘制图片。我尝试先删除重新缩放,但它什么也没做。所以现在我的问题是;如何创建具有所有这些差异(翻转、重新缩放、旋转)的图像,以便我可以训练一个实体(或至少尝试成为)模型?

【问题讨论】:

  • 可能是组合rescale=1/255 + .astype(np.uint8) 基本上将所有像素设置为零? (这取决于输入图像,所以我不能确定)
  • 谢谢,我删除了重新缩放但得到了相同的结果,我应该用 astype 尝试什么?(输入图像是 .PNG 256x256 和 RGB)
  • 您可以尝试删除它。如果它不起作用,您可以在函数内的某处放置print(ims),以了解您是否只有零,或者是否是可视化问题
  • 正如你所说,它充满了零,所以有些东西是错误的。那么它必须在第一位 - ImageDataGenerator - 位? (因为我可以毫不费力地查看 png.files ......)
  • 是的,问题也可能出在生成器上。我会尝试调试它删除参数,并使用不同的图像进行测试

标签: python matplotlib keras


【解决方案1】:

我发现了问题。问题是设置“ims”时的astype。我知道这与重新缩放有关,并尝试了不同的方法来处理 ims[i] 和 vmin/vmax。但是当删除 astype 时,我可以使用上面的 ImageDataGenerator 参数。

def plots(ims, figsize=(12,6), rows=3, interp=False, titles=None):
    if type(ims[0]) is np.ndarray:
        ims = np.array(ims)
        if (ims.shape[-1] != 3):
            ims = ims.transpose((0,2,3,1))
    f = plt.figure(figsize=figsize)
    cols = len(ims)//rows if len(ims) % 2 == 0 else len(ims)//rows + 1
    for i in range(len(ims)):
        sp = f.add_subplot(rows, cols, i+1)
        sp.axis('Off')
        if titles is not None:
            sp.set_title(titles[i], fontsize=16)
        plt.imshow(ims[i], interpolation=None if interp else 'none')

plots(imgs, titles=labels)

给我这样的期望输出: 特别感谢@Andrea

【讨论】:

    【解决方案2】:

    我还不能发表评论,所以从我这边快速更新。

    使用 matplotlib 3.4.3 我收到一个 ValueError。 要修复它,只需更新 for 循环定义:

    for i in range(rows*cols):
       ...
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      相关资源
      最近更新 更多