TF 2.0预训练网络以在OpenCV中推理运行

  |   0 评论   |   0 浏览   |   给我丶鼓励

在本教程中,我将演示如何将使用 TF 2.0 编写的具有一些高级体系结构的预训练网络转换为适合推理的优化网络。我的目标是使用 C ++ 和 OpenCV 的 Dnn 模块运行推理中的预训练模型。但是,本指南将帮助您生成可在许多平台(包括 Python 和 TensorRT)中使用的优化模型。

在 TF 2.0 中训练了模型之后,我寻找了一种优化模型以进行推理的简单方法。但是,我没有找到一个地方,引导我如何在 TF 2.0 这样做,因为 TF 删除其冷冻优化的图形支持,可以在所有在 StackOverflow 上堆积起来的投诉中可以看出(例如,12)。

在不同的互联网论坛上有许多解决方案。我正在写关于我发现的最简单方法的指南。

系统规格

Anaconda3 4.4+,

Tensorflow 2.0,

OpenCV 4.1.2+,

入门

在网络实现中,我使用了:

  1. 数据集和迭代器(tf.data.dataset)。
  2. 占位符(tf.placeholder)。
  3. 卷积(tf.layers.conv2d)。
  4. 深度卷积(tf.nn.depthwise_conv2dtd.nn.bias_add)。
  5. Relu6(tf.nn.relu6)。
  6. 批量归一化(tf.layers.batch_normalization)。
  7. 展平(tf.layers.flatten)。
  8. Softmax(tf.nn.softmax)。
  9. 全球平均值(tf.layers.average_pooling2d)。

经过培训后,我们希望将模型导出到。pb 文件,以进行推断运行。Tensorflow 有一个简单的代码 API 来发布模型:

tf.saved_model.simple_save(sess,path,inputs,outputs)

但是,这会将完整模型导出到许多文件中,包括图形 def,变量,并且不会删除摘要,而这些摘要在推断时是不必要的。由于不必要的网络组件通常在 CPU 上运行,因此这限制了使用 GPU 的性能。

在 TF 2.0 之前,最佳做法是:

  • 冻结模型(将图形 def 与检查点结合在一起,然后仅在一个 pb 文件中将所有变量转换为 const)
  • 优化冻结图以进行推理,包括:
    • 删除未使用的节点。
    • 将算术和表达式折叠为常量。
    • 删除身份并且没有操作。
    • 将批处理归一化为简单的乘法。
    • 按执行顺序排序,这是在 OpenCV 中运行它所必需的。

该代码主要由 Graph Transform Tool 维护,并集成在 TensorFlow 工具库中。直到 TF2.0 为止,TF 在那里删除了他们的支持和图形 utils 代码,因为 tf.compact1.graph_util 它基本上是空的。相反,他们希望开发人员使用 SavedModels API。但是,其他库和推理模块不支持它,并且 TF 用户需要大胆地寻找一种优化模型的方法。

我将详细说明我为冻结模型所做的工作:

提前编写代码以适应推理

使用名为的标志 Inference

if not inference:
    X,y=iterator.get_next() 
    is_training=tf.placeholder(tf.bool, name=is_training)
else:
    X=tf.placeholder(tf.float32,shape=)
    y=tf.placeholder(tf.float32,shape=)
    is_training=tf.constant(tf.bool, name=is_training)

我建议使用此方法,而不是后期编辑图形。从开发开始就考虑推论是有帮助的。例如,我在培训期间将平均池的实现从使用修改 average_pooling2d 为仅使用 reduce_sum,这更简单并且可以在更多平台上运行。

您也可以在此标志下为摘要和文件编写器添加处理。除了在培训后删除它们之外,不要添加它们:)

在 TF 2.0 中训练模型

使用以下方法保存模型的检查点:

tf.train.Saver(tf.all_varibles()). save(sess,path)

使用以下命令保存模型的图形定义:

Tf.train.write_graph(sess.graph,path)

使用 tensorflow 1.15 创建一个新环境,并运行以下代码:

from tf.python,tools import freeze_graph,optimize_for_inference_lib
freeze_graph.freeze_graph(input_graph_path,input_saver_def_path=””, 
                          input binary =False,checkpoint_path=checkpoint_path,
                          output_nodes=[predictions],restore_op_name = “”, 
                          filename tensor_ name=””, clear_devices=False,””)
inputGraph = tf.GraphDef() 
with tf.gfile.Open(frozen graph path, rb) as f: 
    data2read = f.read() 
    inputGraph.ParseFromString(data2read) 
outputGraph = optimize_for_inference_lib.
                    optimize_for_inference(inputGraph, [input node name],
                                           [output node names], 
                                           tf.float32.as datatype enum)
with tf.gfile.FastGFile(optimized graph path, w) as f :
    f.write(outputGraph.SerializeToString())

标题:TF 2.0预训练网络以在OpenCV中推理运行
作者:给我丶鼓励
地址:https://blog.doiduoyi.com/articles/1592319375546.html

评论

发表评论