代码之家  ›  专栏  ›  技术社区  ›  serv-inc

用MobileNet重新训练图像检测

  •  0
  • serv-inc  · 技术社区  · 5 年前

    几种重新培训MobileNet与Tensorflow一起使用的方法。我失败了。有没有办法使用Tensorflow的再培训模型。js?

    既可以使用基于中心的现代教程,也可以使用 retrain.py 似乎失败了。

    以及其他一些悬而未决的问题

    前两个问题显示了在这两种情况下都失败的代码,这两个问题都没有解决。

    目的是加载mobilenet,使用自定义数据重新训练,并在Tensorflow中使用它。js。遵循这两个教程似乎都失败了。这可以在节点内部完成吗。js?还有别的办法吗?我在哪里犯了错误(或者软件无法使用经过再培训的模型)?这怎么行?

    编辑: latest github issue 还有一个问题

    0 回复  |  直到 5 年前
        1
  •  5
  •   Mahalov Ivan    5 年前

    我遇到了同样的问题,似乎我们使用了错误的方法。 TF转换模型有loadGraphModel,Keras模型有LoadLayerModel my comment about the issue

        2
  •  2
  •   serv-inc    5 年前

    这个 retrain.py python脚本不会生成保存的模型,它实际上会生成一个冻结的图形模型。这就是为什么不能使用tfjs 1转换它。x转换器。您需要使用tfjs 0.8.5 pip进行转换。 此外,输出节点名称与mobilenet模型图不同,它是重新训练图的“最终结果”。

    要转换它,需要使用tensorflowjs 0.8.5 pip:

    • 使用virtualenv创建一个空环境。
    • pip安装tensorflowjs==0.8.5
    • 运行转换器
    tensorflowjs_converter \
      --input_format=tf_frozen_model \
      --output_node_names='final_result' \
      --output_json=true /tmp/output_graph.pb \ /tmp/web_model
    

    这应该会给你提供如下信息:

    ls /tmp/web_model/
    group1-shard10of21  group1-shard14of21  group1-shard18of21  group1-shard21of21  group1-shard5of21  group1-shard9of21
    group1-shard11of21  group1-shard15of21  group1-shard19of21  group1-shard2of21   group1-shard6of21  model.json
    group1-shard12of21  group1-shard16of21  group1-shard1of21   group1-shard3of21   group1-shard7of21
    group1-shard13of21  group1-shard17of21  group1-shard20of21  group1-shard4of21   group1-shard8of21
    
        3
  •  1
  •   serv-inc    5 年前

    要使用最新的TFjs:

    python retrain.py --tfhub_module https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/2 \
        --image_dir /tmp/flower_photos --saved_model_dir /tmp/saved_retrained_model
    tensorflowjs_converter --input_format=tf_saved_model \
        --output_format=tfjs_graph_model \
        --saved_model_tags=serve \
        /tmp/saved_retrained_model/ /tmp/converted_model/
    

    创造一个 model.json 文件中描述的命令 https://github.com/tensorflow/tfjs-converter#step-1-converting-a-savedmodel-keras-h5-tfkeras-savedmodel-or-tensorflow-hub-module-to-a-web-friendly-format .

    然而,在模型中加载 tf.loadLayersModel("file:///tmp/web_model/model.json") 失败于

    必须设置“className”和“config”。

        4
  •  1
  •   Yucheng Wang    5 年前

    也许有人可以修改。用我的方式支持mobileV2。 最初的再培训。py link .这个链接是谷歌的GitHub代码,不是我的链接。

    我换了再培训。下面是我的git diff:

    diff --git a/scripts/retrain.py b/scripts/retrain.py
    index 5fa9b0f..02a4f9a 100644
    --- a/scripts/retrain.py
    +++ b/scripts/retrain.py
    @@ -1,3 +1,5 @@
    +# -*- coding: utf-8 -*-
    +
     # Copyright 2015 The TensorFlow Authors. All Rights Reserved.
     #
     # Licensed under the Apache License, Version 2.0 (the "License");
    @@ -112,6 +114,13 @@ from tensorflow.python.framework import graph_util
     from tensorflow.python.framework import tensor_shape
     from tensorflow.python.platform import gfile
     from tensorflow.python.util import compat
    +from tensorflow import saved_model as sm
    +from tensorflow.python.saved_model import builder as saved_model_builder
    +from tensorflow.python.saved_model import signature_constants
    +from tensorflow.python.saved_model import signature_def_utils
    +from tensorflow.python.saved_model import tag_constants
    +from tensorflow.python.saved_model import utils as saved_model_utils
    +
    
     FLAGS = None
    
    @@ -319,6 +328,7 @@ def maybe_download_and_extract(data_url):
       Args:
         data_url: Web location of the tar file containing the pretrained model.
       """
    +  print(FLAGS.model_dir)
       dest_directory = FLAGS.model_dir
       if not os.path.exists(dest_directory):
         os.makedirs(dest_directory)
    @@ -827,6 +837,7 @@ def save_graph_to_file(sess, graph, graph_file_name):
           sess, graph.as_graph_def(), [FLAGS.final_tensor_name])
       with gfile.FastGFile(graph_file_name, 'wb') as f:
         f.write(output_graph_def.SerializeToString())
    +
       return
    
    
    @@ -971,6 +982,7 @@ def main(_):
    
       # Prepare necessary directories  that can be used during training
       prepare_file_system()
    +  sigs = {}
    
       # Gather information about the model architecture we'll be using.
       model_info = create_model_info(FLAGS.architecture)
    @@ -1002,6 +1014,9 @@ def main(_):
           FLAGS.random_brightness)
    
       with tf.Session(graph=graph) as sess:
    +    serialized_tf_example = tf.placeholder(tf.string, name='tf_example')
    +    feature_configs = {'x': tf.FixedLenFeature(shape=[784], dtype=tf.float32),}
    +    tf_example = tf.parse_example(serialized_tf_example, feature_configs)
         # Set up the image decoding sub-graph.
         jpeg_data_tensor, decoded_image_tensor = add_jpeg_decoding(
             model_info['input_width'], model_info['input_height'],
    @@ -1133,6 +1148,73 @@ def main(_):
                               (test_filename,
                                list(image_lists.keys())[predictions[i]]))
    
    +    """
    +    # analyze SignatureDef protobuf
    +    SignatureDef_d = graph.signature_def
    +    SignatureDef = SignatureDef_d[sm.signature_constants.CLASSIFY_INPUTS]
    +
    +    # three TensorInfo protobuf
    +    X_TensorInfo = SignatureDef.inputs['input_1']
    +    scale_TensorInfo = SignatureDef.inputs['input_2']
    +    y_TensorInfo = SignatureDef.outputs['output']
    +
    +    # Tensor details
    +    # .get_tensor_from_tensor_info() to get default graph 
    +    X = sm.utils.get_tensor_from_tensor_info(X_TensorInfo, sess.graph)
    +    scale = sm.utils.get_tensor_from_tensor_info(scale_TensorInfo, sess.graph)
    +    y = sm.utils.get_tensor_from_tensor_info(y_TensorInfo, sess.graph)
    +    """
    +
    +    """
    +    output_graph_def = graph_util.convert_variables_to_constants(
    +      sess, graph.as_graph_def(), [FLAGS.final_tensor_name])
    +
    +    X_TensorInfo = sm.utils.build_tensor_info(bottleneck_input)
    +    scale_TensorInfo = sm.utils.build_tensor_info(ground_truth_input)
    +    y_TensorInfo = sm.utils.build_tensor_info(output_graph_def)
    +
    +    # build SignatureDef protobuf
    +    SignatureDef = sm.signature_def_utils.build_signature_def(
    +                                inputs={'input_1': X_TensorInfo, 'input_2': scale_TensorInfo},
    +                                outputs={'output': y_TensorInfo},
    +                                method_name='what'
    +    )
    +    """
    +
    +    #graph = tf.get_default_graph()
    +    tensors_per_node = [node.values() for node in graph.get_operations()]
    +    tensor_names = [tensor.name for tensors in tensors_per_node for tensor in tensors]
    +    print(tensor_names)
    +
    +    export_dir = './tf_files/savemode'
    +    builder = saved_model_builder.SavedModelBuilder(export_dir)
    +
    +    # name="" is important to ensure we don't get spurious prefixing
    +    graph_def = tf.GraphDef()
    +    tf.import_graph_def(graph_def, name="")
    +    g = tf.get_default_graph()
    +    inp1 = g.get_tensor_by_name("input:0")
    +    inp2 = g.get_tensor_by_name("input_1/BottleneckInputPlaceholder:0")
    +    inp3 = g.get_tensor_by_name("input_1/GroundTruthInput:0")
    +    out = g.get_tensor_by_name("accuracy_1:0")
    +
    +    sigs[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY] = \
    +        tf.saved_model.signature_def_utils.predict_signature_def(
    +            {'input_1': inp1, 'input_2': inp3}, {"output": out})
    +
    +    builder.add_meta_graph_and_variables(sess,
    +                                         tags=[tag_constants.SERVING],
    +                                         signature_def_map=sigs)
    +
    +    """
    +    builder.add_meta_graph_and_variables(
    +            sess=sess,
    +            tags=[tag_constants.SERVING],
    +            signature_def_map={sm.signature_constants.CLASSIFY_INPUTS: SignatureDef})
    +    """
    +
    +    builder.save()
    +
         # Write out the trained graph and labels with the weights stored as
         # constants.
         save_graph_to_file(sess, graph, FLAGS.output_graph)
    

    使用我的diff,我可以生成Tensorflow模型。 然后我使用命令将TensorFlow服务模型转换为Tfjs模型。

    tensorflowjs_converter \
        --input_format=tf_saved_model \
        --output_format=tfjs_graph_model \
        ./tf_files/savemode \
        ./tf_files/js_model
    

    仍然不支持Tensorflow JS版本的Ops。

    我只是做个视频 here 为了解释为什么我们不能将Tensorflow冻结模型转换为Tensorflow JS模型,我们将介绍如何找到输入张量和输出张量。最后,运行步骤和结果给出了不支持的操作 鳞片摘要 以及原因。

    现在我无法将Mobilenet模型更改为Tensorflow JS模型,所以我的解决方法是在服务器端使用Python Tensorflow和flask库,用户将图像上传到服务器,然后返回结果。

    推荐文章