Вы можете изменить размер изображений самостоятельно, чтобы обойти ошибку округления здесь или, вы можете попытаться сгруппировать элементы одинакового размера вместе в партии.
Предполагая, что у вас есть генератор изображений и что изображения имеют атрибут размера, вы можете создать генератор, который будет выдавать пакеты изображений одного размера, как показано ниже:
from itertools import groupby
from collections import deque, defaultdict
def same_size_batches(images, batch_size=5):
image_cache = defaultdict(deque)
# We assume the image object has a size parameter we can group by
for size, images in groupby(images, key=lambda image: image.size):
for image in images:
image_cache[size].append(image)
# Everytime our batch gets big enough, yield it and reset
if len(image_cache[size]) == batch_size:
yield iter(image_cache[size])
image_cache[size].clear()
Основная часть здесь - это группа, которая группирует последовательные элементы по одному и тому же ключу и возвращает этот ключ и генератор элементов, соответствующих этому ключу. В нашем случае ключевым является размер изображения.
Затем мы сохраняем кеш элементов одного и того же размера, и каждый раз, когда один из размеров достигает желаемого размера пакета, мы генерируем генератор для этого пакета.
Мы можем продемонстрировать эту работу с фальшивым объектом изображения, у которого есть требуемый параметр размера:
import random
class FakeImage(object):
def __init__(self, _id):
self.id = _id
self.size = (370, 1224) if random.random() < 0.25 else (375, 1242)
def __repr__(self):
return "<Image {} {}>".format(self.id, self.size)
images = (FakeImage(_id) for _id in range(100))
for batch in same_size_batches(images, batch_size=5):
print(list(batch))
В результате получается что-то вроде:
[<Image 0 (375, 1242)>, <Image 2 (375, 1242)>, <Image 3 (375, 1242)>, <Image 4 (375, 1242)>, <Image 6 (375, 1242)>]
[<Image 7 (375, 1242)>, <Image 8 (375, 1242)>, <Image 9 (375, 1242)>, <Image 10 (375, 1242)>, <Image 12 (375, 1242)>]
[<Image 1 (370, 1224)>, <Image 5 (370, 1224)>, <Image 11 (370, 1224)>, <Image 14 (370, 1224)>, <Image 16 (370, 1224)>]
[<Image 13 (375, 1242)>, <Image 15 (375, 1242)>, <Image 18 (375, 1242)>, <Image 19 (375, 1242)>, <Image 20 (375, 1242)>]
[<Image 21 (375, 1242)>, <Image 23 (375, 1242)>, <Image 24 (375, 1242)>, <Image 25 (375, 1242)>, <Image 26 (375, 1242)>]
...
У нас нет гарантии, что мы создадим все изображения, если мы не получим достаточно, чтобы заполнить блок размера пакета, но если входом является бесконечный генератор, это не проблема.
person
Jon Betts
schedule
14.03.2019
tf.image.crop_and_resize
? Как устроен входной конвейер? - person Sharky   schedule 14.03.2019tf.image.crop_and_resize
... Я пробовал поставитьfixed_shape_resizer
передkeep_aspect_ratio_resizer
в файле конфигурации, но это не сработало - person kneazle   schedule 14.03.2019tf.image.resize_image_with_crop_or_pad
. выглядел как лучший вариант для моего случая. Большое спасибо за совет! - person kneazle   schedule 14.03.2019