Tensorflow 如何从对象检测加载保存的模型进行推理?

Tensorflow 如何从对象检测加载保存的模型进行推理?,tensorflow,Tensorflow,我是Tensorflow的新手,一直在使用Tensorflow对象检测API对SSD进行实验。我可以成功地训练一个模型,但默认情况下,它只保存最后n个检查点。相反,我希望以最低的损失保存最后n个检查点(我假设这是最好的度量) 我找到了tf.estimator.BestExporter,它导出了一个保存的_model.pb以及变量。然而,我还没有弄清楚如何加载保存的模型并在其上运行推理。在checkpooint上运行models/research/object_detection/export_i

我是Tensorflow的新手,一直在使用Tensorflow对象检测API对SSD进行实验。我可以成功地训练一个模型,但默认情况下,它只保存最后n个检查点。相反,我希望以最低的损失保存最后n个检查点(我假设这是最好的度量)

我找到了tf.estimator.BestExporter,它导出了一个保存的_model.pb以及变量。然而,我还没有弄清楚如何加载保存的模型并在其上运行推理。在checkpooint上运行models/research/object_detection/export_inference_graph.py后,我可以轻松加载检查点并使用object detection jupyter笔记本在其上运行推断:

我找到了有关加载保存模型的文档,可以加载如下图形:

with tf.Session(graph=tf.Graph()) as sess:
        tags = [tag_constants.SERVING]
        meta_graph = tf.saved_model.loader.load(sess, tags, PATH_TO_SAVED_MODEL)
        detection_graph = tf.get_default_graph()
但是,当我在上面的jupyter笔记本上使用该图时,我会出现错误:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-17-9e48f0d04df2> in <module>
      7   image_np_expanded = np.expand_dims(image_np, axis=0)
      8   # Actual detection.
----> 9   output_dict = run_inference_for_single_image(image_np, detection_graph)
     10   # Visualization of the results of a detection.
     11   vis_util.visualize_boxes_and_labels_on_image_array(

<ipython-input-16-0df86999596e> in run_inference_for_single_image(image, graph)
     31             detection_masks_reframed, 0)
     32 
---> 33       image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0')
     34       # image_tensor = tf.get_default_graph().get_tensor_by_name('serialized_example')
     35 

~/anaconda3/envs/sb/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in get_tensor_by_name(self, name)
   3664       raise TypeError("Tensor names are strings (or similar), not %s." %
   3665                       type(name).__name__)
-> 3666     return self.as_graph_element(name, allow_tensor=True, allow_operation=False)
   3667 
   3668   def _get_tensor_by_tf_output(self, tf_output):

~/anaconda3/envs/sb/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in as_graph_element(self, obj, allow_tensor, allow_operation)
   3488 
   3489     with self._lock:
-> 3490       return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
   3491 
   3492   def _as_graph_element_locked(self, obj, allow_tensor, allow_operation):

~/anaconda3/envs/sb/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in _as_graph_element_locked(self, obj, allow_tensor, allow_operation)
   3530           raise KeyError("The name %s refers to a Tensor which does not "
   3531                          "exist. The operation, %s, does not exist in the "
-> 3532                          "graph." % (repr(name), repr(op_name)))
   3533         try:
   3534           return op.outputs[out_n]

KeyError: "The name 'image_tensor:0' refers to a Tensor which does not exist. The operation, 'image_tensor', does not exist in the graph."
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在里面
7图像\u np\u展开=np。展开\u dims(图像\u np,轴=0)
8#实际检测。
---->9输出\u dict=运行\u推断\u用于单个\u图像(图像\u np,检测\u图)
10#检测结果的可视化。
11 vis_util.visualize_box_和_标签_在_image_数组上(
单个图像(图像、图形)的运行中推理
31个检测遮罩(重新格式化,0)
32
--->33 image\u tensor=tf.get\u default\u graph().get\u tensor\u by\u name('image\u tensor:0'))
34#image_tensor=tf.get_default_graph().get_tensor_by_name('序列化的_示例')
35
通过名称(self,name)获取tensor中的~/anaconda3/envs/sb/lib/python3.6/site-packages/tensorflow/python/framework/ops.py
3664 raise TypeError(“张量名称是字符串(或类似名称),而不是%s”。%
3665类型(名称)。\u名称\u
->3666返回self.as\u graph\u元素(名称,allow\u tensor=True,allow\u operation=False)
3667
3668 def_通过tf_输出获得张量(自身,tf_输出):
as_graph_元素中的~/anaconda3/envs/sb/lib/python3.6/site-packages/tensorflow/python/framework/ops.py(self、obj、allow_tensor、allow_operation)
3488
3489带自锁:
->3490返回自。\作为\图形\元素\锁定(obj,允许\张量,允许\操作)
3491
3492定义为图形元素锁定(自、obj、允许张量、允许操作):
~/anaconda3/envs/sb/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in\u as\u graph\u element\u locked(self、obj、allow\u tensor、allow\u operation)
3530 raise KeyError(“名称%s指的张量不是”
3531“存在。操作%s不存在于”
->3532“图形”。%(repr(名称),repr(操作单元名称)))
3533尝试:
3534返回操作输出[输出]
KeyError:“名称'image\u tensor:0'引用的张量不存在。图形中不存在操作'image\u tensor'
是否有更好的方法加载保存的模型或将其转换为推理图


谢谢

Tensorflow检测API在导出过程中支持不同的输入格式,如文件文档中所述:

  • image\u张量
    :接受uint8形状的4-D张量[None,None,None,3]
  • 编码的\u图像\u字符串\u张量
    :接受形状为[None]的一维字符串张量 包含编码的PNG或JPEG图像。图像分辨率预计将提高 如果提供了多个图像,则相同
  • tf_示例
    :接受形状为[None]的一维字符串张量,其中包含 序列化的TFS示例protos。图像分辨率应相同 如果提供了多个图像
因此,您应该检查是否使用了
image\u tensor
input\u type。所选输入节点将在导出模型中命名为“输入”。因此,我认为用
输入替换
图像张量:0
(或者
输入:0
)将解决您的问题

另外,我想推荐一个有用的工具来运行带有几行代码的导出模型:
tf.contrib.predictor.from\u saved\u model
。下面是如何使用它的示例:

import tensorflow as tf
import cv2

img = cv2.imread("test.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_rgb = np.expand_dims(img, 0)

predict_fn = tf.contrib.predictor.from_saved_model("./saved_model")
output_data = predict_fn({"inputs": img_rgb})
print(output_data)  # detector output dictionary

您好,
saved_model_cli
for my object detection model用
dtype:DT_STRING
shape:()
显示输入,这是问题吗?“我不知道我应该如何为此形成有效载荷。@Austin似乎您有1D字符串作为保存模型的输入。”。在使用
export\u expression\u graph.py
导出保存的\u模型时,您可能使用了
encoded\u image\u string\u张量
tf\u示例
作为
输入类型
。要解决此问题,您可以使用
image\u tensor
重新导出您的模型,或者使用编码的PNG或JPEG图像作为输入(或者在
tf\u example
的情况下使用序列化的TFExample protos)啊,好的,谢谢。我想知道为什么对象检测API的默认输入类型是tf_示例。碰巧知道这在任何方面是否比图像张量更有用?显然(per),
export\u expression\u graph.py
仅适用于TF1模型。对于TF2模型,建议使用
exporter\u main\u v2.py