0

我正在使用 KITTI 的对象检测数据集来训练带有 ResNet 101 的 Faster R-CNN,并在 MS COCO 上进行了预训练。KITTI 图像“大部分”尺寸为 375x1242

当我有的时候batch_size: 1,一切都很完美。我keep_aspect_ratio_resizer的就像下面一样,因为它是由 TensorFlow 本身提出的。

min_dimension: 600
max_dimension: 1987

但现在我想使用 batch_size: 5,但我不断收到尺寸不匹配错误。因为有些图像的尺寸略小,如 370x1224 等。

我找不到通用keep_aspect_ratio_resizer值。我根据我在错误消息中看到的值尝试了以下值,但我不能使所有图像的大小都相同

min_dimension: 600
max_dimension: 1985

min_dimension: 599
max_dimension: 1985
4

2 回答 2

0

您可以自己调整图像大小以解决此处的舍入错误,或者您可以尝试将相同大小的项目组合成批次。

假设您有一个图像生成器,并且图像具有 size 属性,您可以创建一个生成器,该生成器将生成大小相同的批量图像,如下所示:

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()

这里的主要部分是 group by,它按相同的键对连续的项目进行分组,并返回该键和与该键匹配的项目的生成器。在我们的例子中,关键是图像的大小。

然后,我们保留相同大小的项目的缓存,每次其中一个大小达到我们所需的批量大小时,我们为该批量生成一个生成器。

我们可以使用具有所需尺寸参数的假图像对象来演示此操作:

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)>]
...

如果我们没有足够的数量来填充批量大小的块,我们不能保证生成所有图像,但如果输入是无限生成器,这不是问题。

于 2019-03-14T18:12:27.487 回答
0

tf.image.resize_image_with_crop_or_pad(images, max_height, max_width)通过添加到https://github.com/tensorflow/models/blob/master/research/object_detection/legacy/trainer.pycreate_input_queue()来修复

于 2019-03-14T20:18:12.090 回答