【问题标题】:How can I run mobiledet model successfully with the pretrained model in TF1 model zoo from TensorFlow object detection api?如何使用 TensorFlow 对象检测 api 的 TF1 模型动物园中的预训练模型成功运行 mobiledet 模型?
【发布时间】:2020-08-19 13:18:02
【问题描述】:

我想通过 TensorFlow 对象检测 api 测试 TF1 模型动物园中提供的 mobiledet 模型。 tf1 object detection model zoo

因为预训练文件包含 pb 文件和 ckpt 文件the Screenshot of ckpt files。 所以,我尝试了两种方法来加载预训练模型进行推理。

首先尝试直接加载tflite_graph.pb,遇到如下问题,尝试更换tf版本,还是没有解决。

代码是这样的:

MODEL_DIR = '/tf_ckpts/ssdlite_mobiledet_cpu_320x320_coco_2020_05_19/'
MODEL_CHECK_FILE = os.path.join(MODEL_DIR, 'tflite_graph.pb')
graph = tf.Graph()
with graph.as_default():
    graph_def = tf.GraphDef()
    with tf.gfile.Open(MODEL_CHECK_FILE,'rb') as f:
        graph_def.ParseFromString(f.read())
    tf.import_graph_def(graph_def, name='')
Traceback (most recent call last):
  File "/home/zhaoxin/workspace/models-1.12.0/research/inference_demo.py", line 41, in <module>
    tf.import_graph_def(graph_def, name='')
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/util/deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/framework/importer.py", line 405, in import_graph_def
    producer_op_list=producer_op_list)
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/framework/importer.py", line 505, in _import_graph_def_internal
    raise ValueError(str(e))
ValueError: NodeDef mentions attr 'exponential_avg_factor' not in Op<name=FusedBatchNormV3; signature=x:T, scale:U, offset:U, mean:U, variance:U -> y:T, batch_mean:U, batch_variance:U, reserve_space_1:U, reserve_space_2:U, reserve_space_3:U; attr=T:type,allowed=[DT_HALF, DT_BFLOAT16, DT_FLOAT]; attr=U:type,allowed=[DT_FLOAT]; attr=epsilon:float,default=0.0001; attr=data_format:string,default="NHWC",allowed=["NHWC", "NCHW"]; attr=is_training:bool,default=true>; NodeDef: {{node FeatureExtractor/MobileDetCPU/Conv/BatchNorm/FusedBatchNormV3}}. (Check whether your GraphDef-interpreting binary is up to date with your GraphDef-generating binary.).

然后,我尝试加载 ckpt 文件来运行模型。

mobiledet = 'tf_ckpts/ssdlite_mobiledet_cpu_320x320_coco_2020_05_19/'
meta_path = mobiledet+'model.ckpt-400000.meta'
ckpt_path = mobiledet+'model.ckpt-400000'

with tf.Session() as sess:
    saver=tf.train.import_meta_graph(meta_path)
    saver.restore(sess, ckpt_path)
    graph = tf.get_default_graph()

这样的错误:

Traceback (most recent call last):
  File "/home/zhaoxin/workspace/models-1.12.0/research/tf_load.py", line 15, in <module>
    saver=tf.train.import_meta_graph(meta_path)
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/training/saver.py", line 1453, in import_meta_graph
    **kwargs)[0]
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/training/saver.py", line 1477, in _import_meta_graph_with_return_elements
    **kwargs))
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/framework/meta_graph.py", line 809, in import_scoped_meta_graph_with_return_elements
    return_elements=return_elements)
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/util/deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/framework/importer.py", line 405, in import_graph_def
    producer_op_list=producer_op_list)
  File "/home/zhaoxin/tools/miniconda3/envs/tf115/lib/python3.6/site-packages/tensorflow_core/python/framework/importer.py", line 501, in _import_graph_def_internal
    graph._c_graph, serialized, options)  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.NotFoundError: Op type not registered 'LegacyParallelInterleaveDatasetV2' in binary running on localhost.localdomain. Make sure the Op and Kernel are registered in the binary running in this process. Note that if you are loading a saved graph which used ops from tf.contrib, accessing (e.g.) `tf.contrib.resampler` should be done before importing the graph, as contrib ops are lazily registered when the module is first accessed.

上面两种方法的加载错误貌似是tf版本不一致造成的,但是我试过很多tf版本都没有解决。有人在TF1物体检测模型动物园成功运行mobiledet模型吗?

操作系统:linux

TF 版本:tf 1.15

【问题讨论】:

  • 关于第一条错误消息:我发现一个bug report 似乎与此处相关。

标签: tensorflow object-detection


【解决方案1】:

@Shane Zhao - 您打算使用自定义数据集进行训练,还是按原样使用预训练图?据我所知,Tensorflow 的版本只在训练期间很重要。无论如何,请在 Colab 中参考 Google 的这个演示 - https://colab.research.google.com/github/luxonis/depthai-ml-training/blob/master/colab-notebooks/Easy_Object_Detection_Demo_Training.ipynb#scrollTo=JDddx2rPfex9

【讨论】:

  • 不,我只是尝试进行推理。预训练模型的版本似乎与我的 TF 不匹配。
  • 请在推理中试试这个......saved_model_path = '&lt;saved model dir&gt;' model = tf.saved_model.load(saved_model_path) model = model.signatures['serving_default']`.....我试过这个在 TF 1.15 中训练模型和 TF 2.2 中的推理管道之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2017-11-26
  • 2019-04-05
  • 1970-01-01
  • 2019-06-21
相关资源
最近更新 更多