Я пытаюсь обрезать центр изображений в генераторе данных изображений, используя керасы.У меня есть изображения размером 192x192
, и я хочу обрезать их по центру, чтобы выходные пакеты были 150x150
или что-то подобное.
Могу ли я сделать это немедленно в Keras ImageDataGenerator
?Наверное, нет, так как я видел аргумент target_size
в генераторе данных, который разбивает изображения.
Я нашел эту ссылку для случайной обрезки: https://jkjung -avt.github.io / keras-image-cropping /
Я уже изменил обрезку следующим образом:
def my_crop(img, random_crop_size):
if K.image_data_format() == 'channels_last':
# Note: image_data_format is 'channel_last'
assert img.shape[2] == 3
height, width = img.shape[0], img.shape[1]
dy, dx = random_crop_size #input desired output size
start_y = (height-dy)//2
start_x = (width-dx)//2
return img[start_y:start_y+dy, start_x:(dx+start_x), :]
else:
assert img.shape[0] == 3
height, width = img.shape[1], img.shape[2]
dy, dx = random_crop_size # input desired output size
start_y = (height - dy) // 2
start_x = (width - dx) // 2
return img[:,start_y:start_y + dy, start_x:(dx + start_x)]
def crop_generator(batches, crop_length):
'''
Take as input a Keras ImageGen (Iterator) and generate
crops from the image batches generated by the original iterator
'''
while True:
batch_x, batch_y = next(batches)
#print('the shape of tensor batch_x is:', batch_x.shape)
#print('the shape of tensor batch_y is:', batch_y.shape)
if K.image_data_format() == 'channels_last':
batch_crops = np.zeros((batch_x.shape[0], crop_length, crop_length, 3))
else:
batch_crops = np.zeros((batch_x.shape[0], 3, crop_length, crop_length))
for i in range(batch_x.shape[0]):
batch_crops[i] = my_crop(batch_x[i], (crop_length, crop_length))
yield (batch_crops, batch_y)
Это решение кажется мне очень медленным, пожалуйста, есть ли другой, более эффективный способ?что бы вы предложили?
Заранее спасибо