【问题标题】:Tensorflow ConcatOp Error with Object Detection API带有对象检测 API 的 TensorFlow ConcatOp 错误
【发布时间】:2019-04-25 18:36:17
【问题描述】:

我正在遵循 tensorflow 对象检测 api 说明并尝试使用 我自己的具有 50 个类的数据集来训练 现有的对象检测模型(“faster_rcnn_resnet101_coco”) 。

所以根据我自己的数据集,我创建了

  1. TFRecord(分别用于训练、评估和测试)
  2. labelmap.pbtxt

接下来,我编辑 model.config 只为 model-faster_rcnn-num_classes(90 -> 50(我的类数自己的数据集),train_config-batch_size(1 -> 10),train_config-num_steps(200000 -> 100),train_input_reader-tf_record_input_reader-input_path(到TFRecord所在的路径)和train_input_reader-label_map_path(到labelmap.pbtxt所在的路径)。

最后,我运行命令

python train.py \
--logtostderr \
--pipeline_config_path="PATH WHERE CONFIG FILE RESIDES" \
--train_dir="PATH WHERE MODEL DIRECTORY RESIDES"

我遇到了以下错误:

InvalidArgumentError(参见上文的追溯):ConcatOp:维度 输入应该匹配:shape[0] = [1,890,600,3] vs. shape[1] = [1,766,600,3] [[节点:concat_1 = ConcatV2[N=10,T=DT_FLOAT, Tidx=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](预处理器/sub, Preprocessor_1/sub, Preprocessor_2/sub, Preprocessor_3/sub, 预处理器_4/sub、预处理器_5/sub、预处理器_6/sub、 预处理器_7/sub、预处理器_8/sub、预处理器_9/sub、 concat_1/axis)]]

看起来像输入图像的尺寸,所以可能是未调整原始图像数据的大小。

但据我所知,模型会自动调整输入图像的大小以进行训练(不是吗?)

然后我被这个问题困住了。

如果有解决方案,我会很感激你的回答。 谢谢。

更新

当我updated my batch_size field from 10 to one(original one)时,好像train without any problem... 但我不明白为什么...

【问题讨论】:

  • 查看 repo 的配置文件,根据更快的 rcnn 论文,批量大小为 1。更大的批大小会消耗过多的内存。
  • @Jie.Zhou 这是我的“model.config”文件:pastebin.com/4An9HsPK 正如我上面所说的,一些东西已经改变了
  • 我认为代码可能是为单个 one 图像作为输入编写的,因此如果将批量大小更改为大于 1 的 int,则会因某些内部错误而引发错误
  • 你的意思是说来自 tensorflow 的“代码”,而不是我自己写的,是为单个图像编写的,因为 Faster-R-CNN 的论文将批次处理为单个图像?
  • 这正是我的意思

标签: python tensorflow object-detection


【解决方案1】:

TaeWoo 是对的,您必须将batch_size 设置为 1 才能训练 Faster RCNN。

这是因为 FRCNN 使用了keep_aspect_ratio_resizer,这反过来意味着如果你有不同尺寸的图像,它们在预处理后也会有不同的尺寸。这实际上使批处理变得不可能,因为批处理张量的形状为[num_batch, height, width, channels]。当(height, width) 与一个示例不同时,您可以看到这是一个问题。

这与 SSD 模型形成对比,后者使用“普通”调整大小,即无论输入图像如何,所有预处理示例最终都将具有相同的大小,这允许它们一起批处理。

现在,如果您有不同尺寸的图像,您实际上有两种使用批处理的方法:

  • 使用 Faster RCNN 并在之前填充您的图像,或者在训练之前一次,或者作为预处理步骤连续使用。我建议使用前者,因为这种类型的预处理似乎会大大减慢学习速度
  • 使用 SSD,但请确保您的对象不会受到失真的太大影响。这应该不是什么大问题,它可以作为一种数据增强方式。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。设置 batch_size=1 似乎确实解决了这个问题,但我不确定这是否会对模型的准确性产生任何影响。很想得到 TF 团队对此的回答。

    【讨论】:

      【解决方案3】:

      我有一个类似的问题想分享,也许其他有类似情况的人会分享。我已经更改了 SSD OD net 以找到具有第五个变量(角度)的 bbox。问题是我们在边界框中的角度变量中插入了一个空列表,然后我在 tf.concat 操作中遇到了问题:

      Dimensions of inputs should match: shape[0] = [1,43] vs. shape[4] = [1,0]
      

      (如果我重新运行会话,shape[0] 会发生变化,但 shape[4] 保持不变 [1,0])

      我通过修复我的 tf 记录以在其他 bbox 变量(xmin、xmax、ymin、ymax)的相同长度中具有角度列表来解决问题。

      希望对某人有所帮助,我花了一整天的时间才发现问题。

      问候, 阿隆

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2020-03-04
        相关资源
        最近更新 更多