从Tensorflow-js中的预训练对象检测模型获取预测时遇到输入计数不匹配的错误

时间:2019-04-08 12:03:15

标签: tensorflow tensorflow.js tensorflowjs-converter

我正在尝试使用tensorflow.js来预测经过预训练的对象检测模型的输出,但是在model.predict(inputImage)中出现错误,即

  

未捕获(承诺)错误:输入张量计数不匹配,图形模型有425个占位符,而输入张量有1个。

我正在使用
-tensorflowjs版本-1.0.1
-张量流-2.0.0-dev20190404

HTML“ https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.4

我正在使用SSD_Mobilenet_V2模型并从'http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz'下载它

我使用此命令将tf模型转换为Web格式

tensorflowjs_converter --input_format tf_saved_model ./saved_model ./tfjs_saved_modelSSDMobilenetV2

在此行JavaScript代码中出现错误:

const boxes = await model.predict(processedImage);

处理后的图像的形状为tf.tensor3d(300,300,3)。

3 个答案:

答案 0 :(得分:0)

我们有相同的错误。目前,我们猜测:

  • 这与以下事实有关:模型最初是使用tensorflow 1.x训练的,而tensorflowjs现在使用其转换器tensorflow 2.0-alpha加载。
  • 对model.json进行内部检查,我们发现很多“ unused_control_flow_input_”可能与仅用于训练目的的输入张量有关。

但是,我们只是猜测而已,没有文档。 tensorflow平台的可互换性对于任何实际的生产部署都非常重要,但是在这里我们确实缺少许多信息。

答案 1 :(得分:0)

coco-ssd使用(1、300、300、3)来表示形状:https://github.com/tensorflow/tfjs-models/blob/master/coco-ssd/src/index.ts

也许是问题所在?

答案 2 :(得分:0)

这似乎与GitHub issue here有关-有关背景信息,另请参见GitHub issue here

幸运的是,解决方案很简单:您只需在进行调用时手动指定输入和输出节点即可。我在这里使用tensorflowjs 1.2.10.1和tfjs 1.2.10模型对此进行了测试。

    let outputs = await model.executeAsync(
        { 'image_tensor' : tf.zeros([1, 300, 300, 3]) },
        [ 'detection_boxes','detection_scores','detection_classes','num_detections']);
    tf.print(outputs);

这将产生以下内容且没有错误:

Tensor
    [[[0, 0, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 0],
      ...,
      [0, 0, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 0]]],Tensor
     [[0, 0, 0, ..., 0, 0, 0],],Tensor
     [[1, 1, 1, ..., 1, 1, 1],],Tensor
    [0]

祝你好运!