如何初始化TFLite Micro第三方库并构建自定义示例?
问题描述
我正在尝试初始化TFLite Micro的第三方依赖库,已通过sudo apt update && sudo apt install bazel-7.0.0安装对应版本Bazel,但执行tflite-micro$ bazel build third_party/flatbuffers时出现报错:
WARNING: Target pattern parsing failed. ERROR: Skipping 'third_party/flatbuffers': no such target '//third_party/flatbuffers:flatbuffers': target 'flatbuffers' not declared in package 'third_party/flatbuffers' defined by /home/user/tflite-micro/third_party/flatbuffers/BUILD (Tip: use `query "//third_party/flatbuffers:*"` to see all the targets in that package) ERROR: no such target '//third_party/flatbuffers:flatbuffers': target 'flatbuffers' not declared in package 'third_party/flatbuffers' defined by /home/user/tflite-micro/third_party/flatbuffers/BUILD (Tip: use `query "//third_party/flatbuffers:*"` to see all the targets in that package)
最终目标是通过CMake构建极简TFLite Micro示例代码,相关代码如下:
示例C++代码
#include <math.h> #include "modelData.h" #include "tensorflow/lite/core/c/common.h" #include "tensorflow/lite/micro/micro_interpreter.h" #include "tensorflow/lite/micro/micro_log.h" #include "tensorflow/lite/micro/micro_mutable_op_resolver.h" #include "tensorflow/lite/micro/micro_profiler.h" #include "tensorflow/lite/micro/recording_micro_interpreter.h" #include "tensorflow/lite/micro/system_setup.h" #include "tensorflow/lite/schema/schema_generated.h" TfLiteStatus LoadFloatModelAndPerformInference() { const tflite::Model* model = ::tflite::GetModel( model ); TFLITE_CHECK_EQ( model->version(), TFLITE_SCHEMA_VERSION ); HelloWorldOpResolver op_resolver; TF_LITE_ENSURE_STATUS( RegisterOps( op_resolver ) ); // Arena size just a round number. The exact arena usage can be determined // using the RecordingMicroInterpreter. constexpr int kTensorArenaSize = 3000; uint8_t tensor_arena[ kTensorArenaSize ]; tflite::MicroInterpreter interpreter( model, op_resolver, tensor_arena, kTensorArenaSize ); TF_LITE_ENSURE_STATUS( interpreter.AllocateTensors() ); constexpr int kNumTestValues = 2; float inputs[ kNumTestValues ] = { 1.0f, 0.0f }; for (int i = 0; i < kNumTestValues; ++i) { interpreter.input(0)->data.f[0] = inputs[i]; TF_LITE_ENSURE_STATUS( interpreter.Invoke() ); float y_pred = interpreter.output(0)->data.f[0]; } return kTfLiteOk; } int main( int argc, char* argv[] ) { tflite::InitializeTarget(); TF_LITE_ENSURE_STATUS( LoadFloatModelAndPerformInference() ); return kTfLiteOk; }
原始CMake脚本
cmake_minimum_required( VERSION 3.5 FATAL_ERROR ) project( Net) set( TARGET Net) add_executable( tensorflowLoader src/tensorflowLoader.cpp ) target_include_directories( ${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/tflite-micro/ ) target_include_directories( ${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/tflite-micro/third_party/ ) set( CMAKE_CXX_STANDARD 17 )
请问该如何正确初始化TFLite Micro的第三方库以完成构建?
解决方案
1. 修正Bazel构建命令(若需用Bazel处理依赖)
报错核心是third_party/flatbuffers包中无名为flatbuffers的目标,先执行以下命令查看该包下所有可用目标:
bazel query "//third_party/flatbuffers:*"
通常flatbuffers的有效目标为//third_party/flatbuffers:flatbuffers_lib或//third_party/flatbuffers:runtime,替换后执行构建:
bazel build //third_party/flatbuffers:flatbuffers_lib
2. CMake集成TFLite Micro的正确方式
你的CMake脚本缺少核心库链接、子模块初始化步骤,需按以下流程修改:
步骤1:拉取完整子模块依赖
TFLite Micro的第三方依赖以git子模块形式存在,执行以下命令初始化所有子模块:
cd tflite-micro git submodule update --init --recursive
步骤2:修改CMake脚本
替换原CMake脚本为以下内容,自动处理第三方依赖和核心库链接:
cmake_minimum_required(VERSION 3.16 FATAL_ERROR) project(Net) set(TARGET Net) # 强制启用C++17标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 添加TFLite Micro源码目录,自动构建核心库及第三方依赖 set(TFLITE_MICRO_DIR ${CMAKE_CURRENT_LIST_DIR}/tflite-micro) add_subdirectory(${TFLITE_MICRO_DIR} tflite-micro-build) # 创建可执行文件 add_executable(tensorflowLoader src/tensorflowLoader.cpp) # 链接TFLite Micro核心库(自动包含所有第三方依赖) target_link_libraries(tensorflowLoader PRIVATE tflite-micro) # 添加自定义头文件路径(如modelData.h所在目录) target_include_directories(tensorflowLoader PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src)
步骤3:修正示例代码问题
原代码存在两处错误,需调整:
const tflite::Model* model = ::tflite::GetModel( model );中model未定义,需替换为modelData.h中生成的模型数组(如g_model)HelloWorldOpResolver和RegisterOps未定义,替换为官方提供的MicroMutableOpResolver并注册模型所需算子,示例修正如下:
// 替换原OpResolver相关代码 tflite::MicroMutableOpResolver<5> op_resolver; // 根据模型实际用到的算子注册,示例添加常用算子 TF_LITE_ENSURE_STATUS(op_resolver.AddConv2D()); TF_LITE_ENSURE_STATUS(op_resolver.AddFullyConnected()); TF_LITE_ENSURE_STATUS(op_resolver.AddActivation()); TF_LITE_ENSURE_STATUS(op_resolver.AddSoftmax()); TF_LITE_ENSURE_STATUS(op_resolver.AddReshape());
3. 执行构建
创建构建目录并编译:
mkdir build && cd build cmake .. make -j$(nproc)
内容的提问来源于stack exchange,提问作者binaryBigInt
相关产品推荐
相关产品推荐

