Tensorflow Lite错误未定义对`tflite :: DefaultErrorReporter'的引用

如何解决Tensorflow Lite错误未定义对`tflite :: DefaultErrorReporter'的引用

我想在ARM Linux板上运行tflite模型。这是我遵循的步骤:

1-使用python API使用select ops将我的Tensorflow 2线性估计器模型转换为tflite:

import tensorflow as tf
loaded = tf.saved_model.load(saved_model_path,tags = None)
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir = saved_model_dir,signature_keys=['serving_default'])
converter.experimental_new_converter = True
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,tf.lite.OpsSet.SELECT_TF_OPS]
tflite_model = converter.convert()
with open('model.tflite','wb') as f:
  f.write(tflite_model)

2-在/ tensorflow / lite / Build中的tensorflowlite的deps []中添加了“ // tensorflow / lite / delegates / flex:delegate”,用于依赖关系,如here所述。

3-使用以下命令在我的电脑上构建tflite共享库:

bazel-3.1.0 build --config=elinux_armhf --config=monolithic -c opt --config=v2 //tensorflow/lite/c:libtensorflowlite_c.so

4-将位于bazel-bin / tensorflow / lite / libtensorflowlite_c.so输出共享库重命名为libtensorflow-lite.so

将5.model.tflite,demo.cc和libtensorflow-lite.so复制到我的设备上的/opt/demo,demo.cc的内容为:

#include <stdio.h>
#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/kernels/register.h"
#include "tensorflow/lite/model.h"
#include "tensorflow/lite/tools/gen_op_registration.h"

int main(){

    std::unique_ptr<tflite::FlatBufferModel> model = tflite::FlatBufferModel::BuildFromFile("model.tflite");

    if(!model){
        printf("Failed to mmap model\n");
        exit(0);
    }

    tflite::ops::builtin::BuiltinopResolver resolver;
    std::unique_ptr<tflite::Interpreter> interpreter;
    tflite::InterpreterBuilder(*model.get(),resolver)(&interpreter);

    // Resize input tensors,if desired.
    interpreter->AllocateTensors();

    float* input = interpreter->typed_input_tensor<float>(0);
    // Dummy input for testing
    *input = 2.0;

    interpreter->Invoke();

    float* output = interpreter->typed_output_tensor<float>(0);

    printf("Result is: %f\n",*output);

    return 0;
}

6将Tensorflow源复制到我的ARM板的/ opt。

7-通过在我的设备上运行以下命令来创建目标文件

/opt/demo# g++ demo.cc -c -I /opt/tensorflow_src -I /opt/tensorflow_src/flatbuffers/

8-当我运行g++ -L/opt/demo/ -o exec demo.o -ltensorflow-lite命令生成二进制文件时,出现以下错误

/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.o: in function `main':
demo.cc:(.text+0xc): undefined reference to `tflite::DefaultErrorReporter()'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.cc:(.text+0x24): undefined reference to `tflite::FlatBufferModel::BuildFromFile(char const*,tflite::ErrorReporter*)'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.cc:(.text+0x68): undefined reference to `tflite::ops::builtin::BuiltinopResolver::BuiltinopResolver()'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.cc:(.text+0x90): undefined reference to `tflite::InterpreterBuilder::InterpreterBuilder(tflite::FlatBufferModel const&,tflite::OpResolver const&)'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.cc:(.text+0xa4): undefined reference to `tflite::InterpreterBuilder::operator()(std::unique_ptr<tflite::Interpreter,std::default_delete<tflite::Interpreter> >*)'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.cc:(.text+0xb0): undefined reference to `tflite::InterpreterBuilder::~InterpreterBuilder()'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.cc:(.text+0xc8): undefined reference to `tflite::Interpreter::AllocateTensors()'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.cc:(.text+0x110): undefined reference to `tflite::Interpreter::Invoke()'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.cc:(.text+0x190): undefined reference to `tflite::InterpreterBuilder::~InterpreterBuilder()'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.o: in function `tflite::MutableOpResolver::~MutableOpResolver()':
demo.cc:(.text._ZN6tflite17MutableOpResolverD2Ev[_ZN6tflite17MutableOpResolverD5Ev]+0x6c): undefined reference to `vtable for tflite::MutableOpResolver'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.o: in function `tflite::ops::builtin::BuiltinopResolver::~BuiltinopResolver()':
demo.cc:(.text._ZN6tflite3ops7builtin17BuiltinopResolverD2Ev[_ZN6tflite3ops7builtin17BuiltinopResolverD5Ev]+0x4c): undefined reference to `vtable for tflite::ops::builtin::BuiltinopResolver'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.o: in function `std::default_delete<tflite::FlatBufferModel>::operator()(tflite::FlatBufferModel*) const':
demo.cc:(.text._ZNKSt14default_deleteIN6tflite15FlatBufferModelEEclEPS1_[_ZNKSt14default_deleteIN6tflite15FlatBufferModelEEclEPS1_]+0x24): undefined reference to `tflite::FlatBufferModel::~FlatBufferModel()'
/usr/lib/gcc/arm-poky-linux-gnueabi/9.3.0/../../../../arm-poky-linux-gnueabi/bin/ld: demo.o: in function `std::default_delete<tflite::Interpreter>::operator()(tflite::Interpreter*) const':
demo.cc:(.text._ZNKSt14default_deleteIN6tflite11InterpreterEEclEPS1_[_ZNKSt14default_deleteIN6tflite11InterpreterEEclEPS1_]+0x24): undefined reference to `tflite::Interpreter::~Interpreter()'
collect2: error: ld returned 1 exit status

如何解决此问题并编译我的解释器二进制文件

解决方法

我重新检查了步骤,发现bazel build命令出现问题,我正在为C而不是C ++构建.so库。我可以通过使用以下命令为C ++构建libtensorflow来解决该问题:

bazel-3.1.0 build --config=elinux_armhf --config=monolithic -c opt //tensorflow/lite:libtensorflowlite.so --local_ram_resources=10240 --config=noaws

起初,我尝试构建时没有noaws标志,但是由于在bazel的依赖项下载阶段,aws相关的软件包链接被破坏,因此构建失败,但是我通过添加noaws标志解决了该问题。

对于试图将Tensorflow2线性估计器模型转换为TensorFlow精简模型并希望使用Bazel为ARM体系结构使用选定的TensorFlow ops构建C ++库的人来说,这篇文章可能会有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?