我遵循tensorflow对象检测API指令并尝试使用 现有对象检测模型(" faster_rcnn_resnet101_coco") >我自己的数据集有50个类。
所以根据我自己的数据集,我创建了
接下来,我仅针对 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
... 但我不明白为什么......
答案 0 :(得分:8)
TaeWoo是正确的,您必须将batch_size
设置为1才能训练更快的RCNN 。
这是因为FRCNN使用keep_aspect_ratio_resizer
,这意味着如果你有不同大小的图像,它们在预处理后也会有不同的大小。这实际上使得批处理不可能,因为批量张量具有形状[num_batch, height, width, channels]
。当(height, width)
从一个示例到下一个示例不同时,您会发现这是一个问题。
这与使用“普通”缩放器的 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)的相同长度中具有一个角度列表来解决此问题。
希望对某人有帮助,我花了整整一天的时间才找出问题所在。
关于, 阿隆