我在包含多种尺寸图像的数据集上训练/测试ML模型。我知道Keras允许我们使用target_size
参数提取固定大小的随机补丁:
gen = ImageDataGenerator(width_shift_range=.9, height_shift_range=.9)
data = gen.flow_from_directory('/path/to/dataset/train',
target_size=(224, 224),
classes=10,
batch_size=32,
seed=0)
for _ in range(data.N // data.batch_size):
X, y = next(data)
对于每次迭代,X
包含32个补丁(每个不同的样本一个)。在所有迭代中,我可以访问数据集中每个样本的一个补丁。
问题:提取同一样本的多个补丁的最佳方法是什么?
类似的东西:
data = gen.flow_from_directory(..., nb_patches=10)
X, y = next(data)
# X contains 320 rows (10 patches for each 32 sample in the batch)
我知道我可以编写第二个for循环并在数据集上多次迭代,但这看起来有点混乱。我还想更有力地保证我正在获取样本样本的补丁。
答案 0 :(得分:1)
我决定自己实施。它是如何结束的:
n_patches = 10
labels = ('class1', 'class2', ...)
for label in labels:
data_dir = os.path.join('path-to-dir', label)
for name in os.listdir(data_dir):
full_name = os.path.join(data_dir, name)
img = Image.open(full_name).convert('RGB')
patches = []
for patch in range(n_patches):
start = (np.random.rand(2) * (img.width - image_shape[1],
img.height -image_shape[0])).astype('int')
end = start + (image_shape[1], image_shape[0])
patches.append(img_to_array(img.crop((start[0], start[1],
end[0], end[1]))))
X.append(patches)
y.append(label)
X, y = np.array(X, dtype=np.float), np.array(y, dtype=np.float)
答案 1 :(得分:1)
skimage
有一个实用程序方法,允许您修补具有重叠或不重叠段的图像。
结帐view_as_windows
和view_as_blocks