对象检测API的{Tensorflow ConcatOp错误

时间:2017-09-08 03:22:15

标签: python tensorflow object-detection

我遵循tensorflow对象检测API指令并尝试使用 现有对象检测模型(" faster_rcnn_resnet101_coco") >我自己的数据集有50个类。

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

  1. TFRecord(单独进行培训,评估和测试)
  2. labelmap.pbtxt
  3. 接下来,我仅针对 model-faster_rcnn-num_classes (90 - > 50(类的数量)编辑 model.config 我自己的数据集),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:Dimensions   输入应匹配: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,   Preprocessor_4 / sub,Preprocessor_5 / sub,Preprocessor_6 / sub,   Preprocessor_7 / sub,Preprocessor_8 / sub,Preprocessor_9 / sub,   CONCAT_1 /轴)]]

    它似乎是输入图像的尺寸,因此可能是由于未调整原始图像数据的大小而引起的。

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

    然后我就遇到了这个问题。

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

    更新

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

3 个答案:

答案 0 :(得分:8)

TaeWoo是正确的,您必须将batch_size设置为1才能训练更快的RCNN

这是因为FRCNN使用keep_aspect_ratio_resizer,这意味着如果你有不同大小的图像,它们在预处理后也会有不同的大小。这实际上使得批处理不可能,因为批量张量具有形状[num_batch, height, width, channels]。当(height, width)从一个示例到下一个示例不同时,您会发现这是一个问题。

这与使用“普通”缩放器的 SSD 模型形成对比,即无论输入图像如何,所有预处理的示例最终都会具有相同的大小,这使得它们可以一起分手。

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

我也想分享一个类似的问题,也许其他情况类似的人也会遇到。我更改了SSD OD网络,以找到具有第五个变量(即角度)的bbox。问题是我们在边界框中的angle变量中插入了一个空列表,然后在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)的相同长度中具有一个角度列表来解决此问题。

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

关于, 阿隆