【问题标题】:How to batch an object detection dataset?如何批处理对象检测数据集?
【发布时间】:2021-09-21 04:45:45
【问题描述】:

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

但问题是,这些不相等数量的边界框导致每个 Dataset 对象张量具有不同的形状。在 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 对象检测数据集的任何帮助都会非常有帮助。

【问题讨论】:

    标签: tensorflow deep-learning computer-vision conv-neural-network object-detection


    【解决方案1】:

    可能有点晚了,但我想我还是应该发布这个。 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 循环的自定义缓冲区进行处理,但这违背了目的。只是为了后代,我将在此处添加示例代码作为简单解决方法的示例。

    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

    【讨论】:

    • 是的,我用过类似的东西,谢谢你的回答。
    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 2023-03-25
    • 2018-03-19
    • 2020-10-29
    • 2022-07-28
    • 2017-10-28
    • 2020-07-13
    • 2019-01-25
    相关资源
    最近更新 更多