run_inference_for_single_image(image,graph) - Tensorflow,对象检测

时间:2018-04-10 09:49:51

标签: tensorflow object-detection

参考object_detection_tutorial.ipynb。我想知道是否可以运行目录中的所有图像。

而不是编写for循环并运行" run_inference_for_single_image(图像,图形)"。有没有办法在目录中的所有图像上运行推理或在多个图像上运行推理。 link

  for f in files:
    if f.lower().endswith(('.png', '.jpg', '.jpeg')):
      image_path = files_dir + '/' + f
       .... // Read image etc.
      output_dict = run_inference_for_single_image(image_np, detection_graph)

这将每次创建tf.session,我认为它的计算成本很高。如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:4)

您知道,每次都会创建“ run_inference_for_single_image”方法。 如果您想推断出多张图片,则应更改代码,例如

  • 方法调用

    images = []
    for f in files:
      if f.lower().endswith(('.png', '.jpg', '.jpeg')):
        image_path = files_dir + '/' + f
        image =  .... // Read image etc.
        images.append(image)
        output_dicts = run_inference_for_multiple_images(images, detection_graph)
    
  • run_inference_for_multiple_images

    def run_inference_for_multiple_images(images, grapg):
      with graph.as_default():
        with tf.Session() as sess:
          output_dicts = []
    
          for index, image in enumerate(images):
            ... same as inferencing for single image
    
             output_dicts.append(output_dict)
    
       return output_dicts
    

每次执行此代码时都不会创建tf.session。

答案 1 :(得分:2)

我从Google-creating-object-detection-application-tensorflow找到了本教程。在查看了github page-> object_detection_app-> app.py之后,我们只需要在每次要检测到一个 detect_objects(image_path)函数时运行对象。

答案 2 :(得分:0)

可以根据GPU的计算能力和图像大小对一批图像进行推断。

第1步:将所有测试图像堆叠在一个阵列中:

for image_path in glob.glob(PATH_TO_TEST_IMAGES_DIR + '/*.jpg'):
    image_np = io.imread(image_path)  #
    image_array.append(image_np)
image_array = np.array(image_array)

第2步:对批次进行推断:(较高的批次大小可能会导致内存不足的问题)

  BATCH_SIZE = 5
  for i in range(0, image_array.shape[0],BATCH_SIZE):
    output_dict = sess.run(tensor_dict, feed_dict={image_tensor: image_array[i:i+BATCH_SIZE]})


    print("number of images inferenced = ", i+BATCH_SIZE)
    output_dict_array.append(output_dict)

确保image_tensor和image_array的尺寸匹配。在此示例中,image_array为(?,height,width,3)

一些提示:

  1. 您只希望加载一次图形,因为它需要几秒钟的加载时间。
  2. 我观察到使用skimage.io.imread()或cv2.imread()可以非常快速地加载图像。这些函数直接将图像作为numpy数组加载。
  3. skimage或opencv用于保存图像的速度比matplotlib快。