使用TF-slim训练的模型与python推理完美配合,但使用C ++

时间:2018-05-21 11:14:05

标签: python c++ tensorflow

我在自己的自定义数据上使用TF-slim训练了一个两级MobileNet_v1。使用eval_image_classifier.py代码this command测试模型,可获得0.936的准确度。由于我的实际目标是使用c ++代码部署模型,因此我使用freeze_graph.py使用以下命令冻结模型:

python3 freeze_graph.py --input_graph=/path/to/graph.pbtxt \
      --input_checkpoint=/path/to/model.ckpt-CHECKPOINTNUMBER \
      --output_graph=frozen_inference_graph.pb \
      --output_node_names=MobilenetV1/Predictions/Reshape_1

graph.pbtxt与培训过程一起创建。我通过在预先训练的MobileNet模型上发出summarize_graph代码来获得输出节点名称。现在,为了在c ++中测试我的模型,我使用label_image(实际上我有自己的代码,但为了确保代码本身我使用它),使用以下命令:

bazel-bin/tensorflow/examples/label_image/label_image \
    --image=/path/to/image.jpg --input_layer=fifo_queue_Dequeue \
    --output_layer=MobilenetV1/Predictions/Reshape_1 \
    --graph=frozen_inference_graph.pb --input_width=192 \
    --input_height=42 --labels=Labels.txt --input_mean=0 \
    --input_std=255

为了获得input_layer,我首先使用了summarize_graph:

bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \
  --in_graph=frozen_inference_graph.pb

但是,它没有给出任何意见:

--input_layer= --input_layer_type= --input_layer_shape= --output_layer=MobilenetV1/Predictions/Reshape_1

然后,我尝试通过首先导入冻结模型来使用tensorboard。这是我在那里看到的输入:

enter image description here

使用上面的label_image代码命令,无论输入图像是什么,模型只输出一个类。我和我自己的代码有相同的情况,我试图尽可能地复制eval_image_classifier.py执行的预处理步骤。但是,由于结果如此截然不同,我认为这不是预处理问题。

我查了一些像this one这样的问题。在这里,提问的人已经对重量进行了量化,他说没有这个结果是相同的,这不是我的情况。还有this one,问题似乎在于指定错误的输入层。我想我自己的问题可能是因为输入层也是因为我不知道如何确定输入层名称?我也试过“prefetch_queue / fifo_queue”,但它给了我这个错误:

Running model failed: Invalid argument: Expects arg[0] to be resource but float is provided

我应该说我对Tensorflow相对较新,到目前为止几乎只使用高级API而不是详细的源代码。所以,我会批评任何不太专业的帮助,并为新手提供足够的细节!谢谢!

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题。事实证明,您不应该使用graph.pbtxt来冻结模型。为了以正确的方式进行冻结,我们首先需要导出推理图:

python3 export_inference_graph.py --alsologtostderr \
   --model_name=mobilenet_v1 --output_file=unfrozen_graph.pb \
   --dataset_name=custom --dataset_dir=/path/to/data_dir

之前我曾尝试过这个,但是使用创建的unfrozen_graph和freeze_graph.py给了我错误,所以我放手让它完全忘记了。出现这些错误的原因是错误的输入大小在export_inference_graph.py代码中用作默认输入大小,以及我使用自定义大小训练模型的事实。

长话短说,我用这个命令冻结了图表:

python3 freeze_graph.py --input_graph=/path/to/unfrozen_graph.pb \
  --input_binary=true --input_checkpoint=/path/to/model.ckpt-CHECKPOINTNUMBER \
  --output_graph=frozen_inference_graph.pb \
  --output_node_names=MobilenetV1/Predictions/Reshape_1

这一次,冻结的图形没有问题,输入图层名称为“输入”(操作:占位符)。