Tensorflow在循环中的'Label_image.py'越来越慢

时间:2017-12-12 15:25:39

标签: python python-3.x tensorflow raspberry-pi

我正在尝试使用TensorFlow和label_image.py的修改版本在Raspberry Pi 3上创建图像分类程序。

我正在使用我从MobileNet获得的here.模型一开始,分类大约需要3秒钟,但随着时间的推移会增加(10分钟后会超过7秒),并且我无法弄清楚为什么会这样。

以下是我的循环中的代码:

while True:

  startTime = datetime.now()

  t = read_tensor_from_image_file(file_name,
                              input_height=input_height,
                              input_width=input_width,
                              input_mean=input_mean,
                              input_std=input_std)

  input_name = "import/" + input_layer
  output_name = "import/" + output_layer
  input_operation = graph.get_operation_by_name(input_name);
  output_operation = graph.get_operation_by_name(output_name);

  results = sess.run(output_operation.outputs[0],
                  {input_operation.outputs[0]: t})
  results = np.squeeze(results)

  top_k = results.argsort()[-5:][::-1]
  labels = load_labels(label_file)
  for i in top_k:
    print(labels[i], results[i])

  print(datetime.now() - startTime)

TensorFlow会话在循环之前启动并加载图形。

我正在使用Python 3.4.2和TensorFlow 1.3.0。

我在StackOverflow上发现了另一个问题question。我尝试了在那里发布的解决方案,但是我收到错误声明“AttributeError:'Tensor'对象没有属性'endswith'”。

1 个答案:

答案 0 :(得分:1)

我找到了适用于我的解决方案here。通过在with tf.Graph().as_default():函数的主体周围添加read_tensor_from_image_file(),即使在30分钟后,我的分类现在大约需要1.20秒。

所以我的read_tensor_from_image_file()函数如下所示:

def read_tensor_from_image_file(file_name, input_height=192, input_width=192,
                            input_mean=0, input_std=255):
  with tf.Graph().as_default():
    input_name = "file_reader"
    output_name = "normalized"
    file_reader = tf.read_file(file_name, input_name)
    if file_name.endswith(".png"):
      image_reader = tf.image.decode_png(file_reader, channels = 3,
                                   name='png_reader')
    elif file_name.endswith(".gif"):
      image_reader = tf.squeeze(tf.image.decode_gif(file_reader,
                                              name='gif_reader'))
    elif file_name.endswith(".bmp"):
      image_reader = tf.image.decode_bmp(file_reader, name='bmp_reader')

    else:
      image_reader = tf.image.decode_jpeg(file_reader, channels = 3,
                                    name='jpeg_reader')
    float_caster = tf.cast(image_reader, tf.float32)
    dims_expander = tf.expand_dims(float_caster, 0);
    resized = tf.image.resize_bilinear(dims_expander, [input_height, 
    input_width])
    normalized = tf.divide(tf.subtract(resized, [input_mean]),[input_std])

    result = sess.run(normalized)

    return result