【问题标题】:Loading images from a directory into a numpy array将目录中的图像加载到 numpy 数组中
【发布时间】:2020-08-23 16:41:39
【问题描述】:

我无法从文件夹中添加照片。在下载训练集时使用 tensorflow 文档,我们得到了 (60000, 28, 28) 形式的 ndarray.shape。从文件夹中拍照时,我不知道如何做到这一点。我还想提一下,这些照片的大小各不相同。我想为我的 ndarray 实现与时尚 mnist (x, y, z) 相同的形状。

def loadFiles(path):
  trainImages = []
  for r, d, f in os.walk(path):
    for file in f:
       img = cv2.imread(r + "\\" + file, cv2.IMREAD_GRAYSCALE)
       trainImages.append(img)

 trainImagesNumpy = np.ndarray(trainImages)
 return trainImagesNumpy

train = loadFiles(trainPath)

我使用 Tensorflow 2.1.0 和 python 3.x

提前感谢您的帮助。

【问题讨论】:

    标签: python-3.x numpy tensorflow


    【解决方案1】:

    既然你说你的图片有不同的尺寸,那么当你从目录中读取它们时调整它们的大小,然后将它们附加到trainImages

    我建议两个选项:

    选项 1: 修改loadFiles如下

    def loadFiles(path):
      trainImages = []
      for r, d, f in os.walk(path):
        for file in f:
           filepath = os.path.join(r, file)
           img = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
    
           # Resizing image to size (28, 28)
           img = cv2.resize(img, (28, 28), interpolation=cv2.INTER_CUBIC)
    
           trainImages.append(img)
    
     trainImagesNumpy = np.ndarray(trainImages)
     return trainImagesNumpy
    
    train = loadFiles(trainPath)
    

    您可以使用其他插值策略来调整大小。查看 OpenCV Python 文档。

    此外,使用os.path.join 是加入基本目录路径和文件路径的好习惯,因为它独立于操作系统。它会自动处理 Windows(反斜杠)或 Unix/Linux(正斜杠)中的文件路径分隔符。

    参考:cv2.resize

    选项 2:使用 ImageDataGenerator keras 中的类 使用它有两个好处:

    • 批量加载数据。
    • 您可以使用内置参数非常轻松地执行数据扩充。

    将您的数据组织到训练、验证和测试目录中。每个目录都必须包含 n 个类中每一个的子目录。

    目录树如下所示(假设您正在对猫与狗进行二元分类):

    . ├── 测试 │   ├── 猫 │   └── 狗 ├── 火车 │   ├── 猫 │   └── 狗 └── 验证 ├── 猫 └── 狗

    然后初始化数据生成器,根据需要将图像从 0-255 重新缩放到 0-1 范围。

    datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
    

    然后从flow_from_directory 方法中批量读取训练、验证和测试图像。

    train = datagen.flow_from_directory('data/train', target_size=(28, 28), batch_size=32)
    validation = datagen.flow_from_directory('data/validation', target_size=(28, 28), batch_size=32)
    test = datagen.flow_from_directory('data/test', target_size=(28, 28), batch_size=32)
    

    执行上述代码后,请确保它告诉您已找到正确数量的图像和正确的类数。

    然后您可以将trainvalidationtest 批次直接传递给您的keras 模型中的fit 方法。 确保在训练时指定 steps_per_epoch validation_steps 的数量。这是因为生成器永远运行,不断生成图像,所以fit 需要知道何时停止。出于同样的原因,请确保您也将 steps 参数提供给 predict 方法。

    参考: Keras docs

    【讨论】:

    • 请注意 - cv2 将图像读取为 BGR 而不是 RGB。您可以使用 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 将它们转换为 RGB。
    • @GerryP 记住一点。但是,似乎 OP 使用的是灰度图像(提到与 Fashion MNIST 中的图像相同的形状)。
    猜你喜欢
    • 2017-09-21
    • 2012-03-31
    • 2015-02-12
    • 2013-04-25
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多