如何解决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 举报,一经查实,本站将立刻删除。