如何批处理对象检测数据集?

How to batch an object detection dataset?

我正在致力于在更广泛的人脸数据集上实施人脸检测模型。我了解到它内置于 Tensorflow datasets 中,我正在使用它。 但是,我在批处理数据时遇到了问题。由于一个图像可以有多个面,因此每个图像输出的边界框数量不同。例如,一张有 2 个面孔的图像将有 2 个边界框,而有 4 个面孔的图像将有 4 个,依此类推。

但问题是,这些不等数量的边界框导致每个数据集对象张量具有不同的形状。在 TensorFlow afaik 中,我们无法批量处理形状不等的张量(来源 - Tensorflow Datasets: Make batches with different shaped data)。所以我无法批处理数据集。

所以在加载以下代码并进行批处理后 -

ds,info = tfds.load('wider_face', split='train', shuffle_files=True, with_info= True)
ds1 = ds.batch(12)
for step, (x,y,z) in enumerate(ds1) :
 print(step)
 break   

我在 运行 Link to Error Image

上遇到这种错误

一般来说,任何关于如何批处理 Tensorflow 对象检测数据集的帮助都会非常有帮助。

可能有点晚了,但我想我还是应该 post。 padded_batch 功能应该可以解决这个问题。它通过填充零匹配维度来解决这个问题

ds,info = tfds.load('wider_face', split='train', shuffle_files=True, with_info= True)
ds1 = ds.padded_batch(12)
for step, (x,y,z) in enumerate(ds1) :
 print(step)
 break

另一种解决方案是不使用批处理,而是使用带有 for 循环的自定义缓冲区进行处理,但这有悖于目的。只是为了 post诚实,我将在此处添加示例代码作为简单解决方法的示例。

ds,info = tfds.load('wider_face', split='train', shuffle_files=True, with_info= True)
batch_size = 12
image_annotations_pair = [x['image'], x['faces']['bbox'] for n, x in enumerate(ds) if n < batch_size]

然后使用为此修改的train_step。

详情可参考- https://www.kite.com/python/docs/tensorflow.contrib.autograph.operators.control_flow.dataset_ops.DatasetV2.padded_batch