【发布时间】: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