【问题标题】:Reading and Converting Series of images to Numpy Array With Python使用 Python 读取图像系列并将其转换为 Numpy 数组
【发布时间】:2020-04-23 01:31:42
【问题描述】:

我正在尝试从不同的子目录中读取图像并将它们转换为 Numpy 数组。我在文本文件的第一、第三和第四列中有每个目录的路径以及图像名称。一旦图像的子目录发生变化,数组的形状就会从 4D 变为 1D,例如从 (1316, 112, 112, 3) 变为 (1423,)。我不明白为什么会发生这种情况以及我的代码有什么问题。谁能告诉我怎么了?

img/doc/pic1 83 000001 0001276
img/doc/pic1 0  001277 001316
img/doc/pic2 83 000001 000107

所以读完第三行后,输出将是 (1423,)

import os
import numpy as np
import cv2
f = open("Subject.txt")
lines = f.readlines()
all_images = []
for item in lines:
    line_parts = item.strip().split()
    path = line_parts[0]
    start = int(line_parts[2])
    end =  int(line_parts[3])
    for image_path in sorted(os.listdir(path))[start-1:end]:
           print(image_path)
           im = cv2.imread(path + "/" + image_path)
           all_images.append(im)
    x = np.array(all_images)
    print(x.shape)

【问题讨论】:

  • 我猜正在发生的事情是 pic1 和 pic2 图像的大小不同,但您正试图将它们放在一个数组中。您不能为前 1k 值设置形状 (N, 112, 112, 3),然后为接下来的 1k 值设置形状 (N, 256, 256, 3),依此类推。它们的大小不同吗?为什么你需要一次将它们全部放在一个数组中?
  • 是的,你是对的。其他子目录的图片和前两个不一样!我想将它们全部存储在 keras 中的 x-train 数组中。我希望将第二列作为 y_train 的标签!你认为一次存储它们是错误的方法吗?
  • 好吧,你当然不能有不同维度的数组——两行长度不同的数组根本就不是数组。根据模型的不同,通常会将所有输入的大小调整为相同的大小,但这一切都取决于。如果模型支持任意大小,那么 Keras 很可能有办法读取图像列表或类似列表,其中每个图像可以是任意大小。

标签: python numpy opencv keras computer-vision


【解决方案1】:

我建议你使用flow_from_dataframe 方法,它使图像处理变得超级简单。简单地说:

  1. 创建一个包含两列的 pandas 数据框:image pathlabel。为避免出现问题,请放置绝对图像路径。
  2. 然后进行验证,只需使用from sklearn.model_selection import train_test_split 拆分数据帧
  3. 最后,flow_from_dataframe 使用.fit_generator 方法生成数组并训练模型。

【讨论】:

  • 感谢@YOLO 的建议...但是我的数据结构有点混乱和复杂!例如,在一条路径中,我有一系列带有三个不同标签的图像!所以我有一个案例,路径通过具有不同标签的 csv/txt 文件重复。你认为删除开始和结束帧可以吗?我有疑问,这就是为什么我将开始和结束帧放在每一行!
  • 对于第 2 步,我必须将图像转换为 numpy 数组并将其存储为 'x' 否则我如何使用sklearn split
  • 我看到你有图像,我认为对于你的案例集class_mode = multi_output,你不必将图像转换为数组,keras 会处理它,只要确保数据框制作正确,超级简单。请检查文档。
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 2016-11-25
  • 2015-12-26
  • 2018-09-05
  • 2014-05-15
  • 2012-09-22
  • 1970-01-01
  • 2016-03-17
相关资源
最近更新 更多