You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:40:15