我正在使用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
答案 0 :(得分: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()
这里的主要部分是根据相同的键对连续项进行分组并返回该键以及与该键匹配的项生成器的分组依据。在我们的例子中,关键是图像的大小。
然后我们会缓存相同大小的项目,每当其中一个大小达到所需的批次大小时,我们就会为该批次生成一个生成器。
我们可以演示如何使用具有所需size参数的伪图片对象:
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)>]
...
如果没有足够的空间来填充批处理大小的块,我们不能保证生成所有图像,但是如果输入是无限生成器,那么这不是问题。
答案 1 :(得分:0)
通过在https://github.com/tensorflow/models/blob/master/research/object_detection/legacy/trainer.py的tf.image.resize_image_with_crop_or_pad(images, max_height, max_width)
中添加create_input_queue()
来解决