Как собрать TensorFlow Lite и использовать в Qt

Есть ли годный пример как собрать и подключить к проекту Qt библиотеку TensorFlow Lite?

Я скачал саму библиотеку:

git clone https://github.com/tensorflow/tensorflow.git

подтянул зависимости:

tensorflow/lite/tools/make/download_dependencies.sh

собрал:

bazel build --cxxopt='--std=c++11' -c opt --config=android_arm tensorflow/lite/java:libtensorflowlite_jni

Библиотке нормально собралась. в корне либы перед сборкой в файлк WORKSPACE прописал версии SDK и NDK:

android_sdk_repository(
    name = "androidsdk",
    path = "/home/user/Android/SDK"
)
android_ndk_repository(
    name = "androidndk",
    path = "/home/user/android-ndk-r21b",
    api_level = 21,
)

либа собралась успешно. Затем я скачал проект, в качестве примера отсюда: https://mechatronicsblog.com/tensorflow-lite-integration-with-qt-and-v-play-for-multi-platform-machine-learning-apps-on-ios-and-android/

По образу и подобию из примера подключил либу к проекту, вот .pro (у меня несколько отличаются либы от примера):

# TensorFlow Lite - Global
TENSORFLOW_PATH = $$PWD/tensorflow/
TFLITE_MAKE_PATH = $$TENSORFLOW_PATH/tensorflow/lite/tools/make
INCLUDEPATH += $$TENSORFLOW_PATH \
               $$TFLITE_MAKE_PATH/downloads/ \
               $$TFLITE_MAKE_PATH/downloads/eigen \
               $$TFLITE_MAKE_PATH/downloads/gemmlowp \
               $$TFLITE_MAKE_PATH/downloads/neon_2_sse \
               $$TFLITE_MAKE_PATH/downloads/farmhash/src \
               $$TFLITE_MAKE_PATH/downloads/flatbuffers/include

# TensorFlow Lite - Linux
linux:!android {
    INCLUDEPATH += -L$$TFLITE_MAKE_PATH/gen/linux_x86_64/obj
    LIBS += -L$$TFLITE_MAKE_PATH/gen/linux_x86_64/lib/ \
            -ltensorflow-lite -ldl
}

# TensorFlow Lite - Android - armv7a
android {
    QT += androidextras
    LIBS += -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/liballocation.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/libarena_planner.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/libexternal_cpu_backend_context.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/libframework_lib.pic.lo \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/libminimal_logging.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/libsimple_memory_arena.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/libstring_util.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/libutil.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/c/libc_api.pic.lo \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/c/libc_api_experimental.pic.lo \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/c/libcommon.pic.lo \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/core/api/libapi.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/libbuiltin_op_kernels.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/libbuiltin_ops.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/libcpu_backend_context.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/libcpu_backend_gemm.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/libeigen_support.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/libkernel_util.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/liblstm_eval.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/internal/libaudio_utils.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/internal/libkernel_utils.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/internal/libneon_tensor_utils.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/internal/libportable_tensor_utils.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/internal/libquantization_util.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/internal/libtensor_utils.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/tensorflow/lite/kernels/internal/libtranspose_utils.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/external/farmhash_archive/libfarmhash.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/external/fft2d/libfft2d.pic.a \
            -L$$TENSORFLOW_PATH/bazel-bin/external/flatbuffers/src/libflatbuffers.pic.a

}

# TensorFlow Lite - iOS - Universal library
ios {
        LIBS += -L$$TFLITE_MAKE_PATH/gen/lib/ \
                -framework Accelerate \
                -ltensorflow-lite
}

Собственно запустил сборку в следующей среде: Qt Creator 4.11.2 NDK: 20.1.5948944 (с ним же илиба собиралась) DK: 26.1.1 (с ним также собиралась либа) Компилятор: Clang Qt 5.13.2 for Android ARMv7

Сборка падает с ошибкой:

In file included from ../TensorFlowLiteQtVPlay/tensorflowlite.cpp:9:
../TensorFlowLiteQtVPlay/tensorflow/tensorflow/lite/kernels/internal/tensor_utils.h:21:10: fatal error: 'tensorflow/third_party/eigen3/Eigen/Core' file not found
#include "tensorflow/third_party/eigen3/Eigen/Core"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make: *** [tensorflowlite.o] Error 1
make: *** Waiting for unfinished jobs....
21:46:04: Процесс «/home/sergey/android-ndk-r20b/prebuilt/linux-x86_64/bin/make» завершился с кодом 2.
Ошибка при сборке/развёртывании проекта TensorFlowLiteQtVPlay (комплект: Android для armeabi-v7a (Clang Qt 5.13.2 for Android ARMv7))
Во время выполнения этапа «Сборка»
21:46:04: Прошло времени: 00:10.

Что за Eigen?

там по этому пути сам файл есть, но он пустой.

Как обойти эту ошибку?

Есть ли нормальный (современный) гайд как эту либу собирать, доставать из нее ашники и подключать к проекту?

Кто нибудь знает как эту либу собирать и подключать к Qt?

Правки: Добавил нужные ашники. Теперь сборка падает со следующими ошибками:

../TensorFlowLiteQtVPlay/tensorflow/tensorflow/lite/mutable_op_resolver.h:0: error: undefined reference to 'vtable for tflite::MutableOpResolver'
/home/sergey/android-ndk-r20b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
/home/sergey/android-ndk-r20b/sources/cxx-stl/llvm-libc++/include/memory:2339: error: undefined reference to 'tflite::FlatBufferModel::~FlatBufferModel()'
/home/sergey/android-ndk-r20b/sources/cxx-stl/llvm-libc++/include/memory:2339: error: undefined reference to 'tflite::impl::Interpreter::~Interpreter()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:14: error: undefined reference to 'tflite::ops::builtin::BuiltinOpResolver::BuiltinOpResolver()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:109: error: undefined reference to 'tflite::FlatBufferModel::BuildFromFile(char const*, tflite::ErrorReporter*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:118: error: undefined reference to 'tflite::impl::InterpreterBuilder::InterpreterBuilder(tflite::FlatBufferModel const&, tflite::OpResolver const&)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:121: error: undefined reference to 'tflite::impl::InterpreterBuilder::operator()(std::__ndk1::unique_ptr<tflite::impl::Interpreter, std::__ndk1::default_delete<tflite::impl::Interpreter> >*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:128: error: undefined reference to 'tflite::impl::Interpreter::UseNNAPI(bool)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:131: error: undefined reference to 'tflite::impl::Interpreter::SetNumThreads(int)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:136: error: undefined reference to 'tflite::impl::Interpreter::AllocateTensors()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:166: error: undefined reference to 'tflite::impl::InterpreterBuilder::~InterpreterBuilder()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:166: error: undefined reference to 'tflite::impl::InterpreterBuilder::~InterpreterBuilder()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:272: error: undefined reference to 'tflite::impl::Interpreter::Invoke()'
../TensorFlowLiteQtVPlay/tensorflow/tensorflow/lite/stderr_reporter.h:0: error: undefined reference to 'vtable for tflite::StderrReporter'
/home/sergey/android-ndk-r20b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:316: error: undefined reference to 'tflite::DefaultErrorReporter()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:316: error: undefined reference to 'tflite::impl::Interpreter::Interpreter(tflite::ErrorReporter*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:321: error: undefined reference to 'tflite::impl::Interpreter::AddTensors(int, int*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:324: error: undefined reference to 'tflite::impl::Interpreter::AddTensors(int, int*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:327: error: undefined reference to 'tflite::impl::Interpreter::SetInputs(std::__ndk1::vector<int, std::__ndk1::allocator<int> >)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:328: error: undefined reference to 'tflite::impl::Interpreter::SetOutputs(std::__ndk1::vector<int, std::__ndk1::allocator<int> >)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:336: error: undefined reference to 'tflite::ops::builtin::BuiltinOpResolver::BuiltinOpResolver()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:337: error: undefined reference to 'tflite::MutableOpResolver::FindOp(tflite::BuiltinOperator, int) const'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:340: error: undefined reference to 'tflite::impl::Interpreter::AddNodeWithParameters(std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&, std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&, char const*, unsigned int, void*, TfLiteRegistration const*, int*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:341: error: undefined reference to 'tflite::impl::Interpreter::AllocateTensors()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:354: error: undefined reference to 'tflite::impl::Interpreter::Invoke()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:316: error: undefined reference to 'tflite::DefaultErrorReporter()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:316: error: undefined reference to 'tflite::impl::Interpreter::Interpreter(tflite::ErrorReporter*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:321: error: undefined reference to 'tflite::impl::Interpreter::AddTensors(int, int*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:324: error: undefined reference to 'tflite::impl::Interpreter::AddTensors(int, int*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:327: error: undefined reference to 'tflite::impl::Interpreter::SetInputs(std::__ndk1::vector<int, std::__ndk1::allocator<int> >)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:328: error: undefined reference to 'tflite::impl::Interpreter::SetOutputs(std::__ndk1::vector<int, std::__ndk1::allocator<int> >)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:336: error: undefined reference to 'tflite::ops::builtin::BuiltinOpResolver::BuiltinOpResolver()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:337: error: undefined reference to 'tflite::MutableOpResolver::FindOp(tflite::BuiltinOperator, int) const'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:340: error: undefined reference to 'tflite::impl::Interpreter::AddNodeWithParameters(std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&, std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&, char const*, unsigned int, void*, TfLiteRegistration const*, int*)'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:341: error: undefined reference to 'tflite::impl::Interpreter::AllocateTensors()'
../TensorFlowLiteQtVPlay/tensorflowlite.cpp:354: error: undefined reference to 'tflite::impl::Interpreter::Invoke()'
../TensorFlowLiteQtVPlay/tensorflow/tensorflow/lite/interpreter.h:178: error: undefined reference to 'tflite::impl::Interpreter::SetTensorParametersReadWrite(int, TfLiteType, char const*, unsigned int, int const*, TfLiteQuantizationParams, bool, unsigned int, int const*)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libTensorFlowLiteQtVPlay.so] Error 1

Ответы (0 шт):