首页 > 解决方案 > 如何找到将 .PB 文件(Faster RCNN 模型)转换为 TFlite 文件的输入和输出张量?

问题描述

我使用 Faster RCNN 构建了一个对象检测模型,并能够生成 Frozen_Graph.pb 文件。现在我正在尝试将 .pb 文件转换为 TFlite 文件以便在 Android 上使用它。但是我在转换时遇到了问题。因为它需要输入张量和输出传感器进行转换。

我无法找出要传递的正确输入和输出数组。即使我通过输入张量,因为Image_tensor它会引发错误说明

 ValueError: None is only supported in the 1st dimension. Tensor 'image_tensor:0' has invalid shape '[None, None, None, 3]

以下是我用于转换的代码:

graph_def_file = "/models/mobilenet_thin_model.pb"
input_arrays = ["image_tensor"]
output_arrays = ["Softmax"]

converter = tf.lite.TFLiteConverter.from_frozen_graph(graph_def_file,input_arrays, output_arrays)

tflite_model = converter.convert()
open("/models/converted_model.tflite", "wb").write(tflite_model)

标签: python-3.xtensorflowobject-detection

解决方案


您必须打开图表并解析它。然后打印每个节点。

import tensorflow as tf
Graph = tf.GraphDef()   
File = open("Model.pb","rb")
Graph.ParseFromString(File.read())

for Layer in Graph.node:
    print(Layer.name)

或者直接获取最后一个

print(Graph.node[-1].name)

顺便提一句。你是如何在你的应用程序中实现 TensorFlow 的?使用时不需要名称import org.tensorflow.lite.Interpreter。您只需要run使用输入和输出缓冲区进行调用。

我的一个示例,基于 TensorFlow 示例实现:

private ByteBuffer _mInput;
private float[][] _mOutput;

Interpreter.Options _mTfliteOptions = new Interpreter.Options();
_mTfliteOptions.setNumThreads(1);
_mTfliteOptions.setUseNNAPI(true);

_mInput = ByteBuffer.allocateDirect(4 * 1 * Width * Height * Channels);
_mInput.order(ByteOrder.nativeOrder());

_mOutput = new float[1][_mClassLabels.size()];

_mTfLite = new Interpreter(loadModelFile(getActivity().getAssets(),"Model.tflite"), _mTfliteOptions);
_mTfLite.run(_mInput, _mOutput);

private MappedByteBuffer loadModelFile(AssetManager Manager, String Path) throws IOException
{
    AssetFileDescriptor fileDescriptor = Manager.openFd(Path);
    FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
    FileChannel fileChannel = inputStream.getChannel();
    long startOffset = fileDescriptor.getStartOffset();
    long declaredLength = fileDescriptor.getDeclaredLength();
    return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}

推荐阅读