tensorflowlite Interpreter 的构造函数

本文解析了TensorFlow Lite解释器的构造函数,探讨了如何初始化运行时环境,包括错误报告器设置、子图添加及外部上下文初始化,并分析了AddSubgraphs函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Interpreter::Interpreter(ErrorReporter* error_reporter)
    : error_reporter_(error_reporter ? error_reporter
                                     : DefaultErrorReporter()) {
  // TODO(b/128420794): Include the TFLite runtime version in the log.
  TFLITE_LOG_PROD_ONCE(TFLITE_LOG_INFO, "Initialized TensorFlow Lite runtime.");

  // There's always at least 1 subgraph which is the primary subgraph.
  AddSubgraphs(1);
  context_ = primary_subgraph().context();

  // Reserve some space for the tensors to avoid excessive resizing.
  for (int i = 0; i < kTfLiteMaxExternalContexts; ++i) {
    external_contexts_[i] = nullptr;
  }

  UseNNAPI(false);
}

上 源码;

##----解释AddSubgraphs----##
函数原型
void Interpreter::AddSubgraphs(int subgraphs_to_add,
                               int* first_new_subgraph_index) { //first_new_subgraph_index  == nullptr 默认参数
  const size_t base_index = subgraphs_.size();
  if (first_new_subgraph_index) *first_new_subgraph_index = base_index;//所以,这句话,也不会执行

  subgraphs_.reserve(base_index + subgraphs_to_add);//预留的容器的空间
  for (int i = 0; i < subgraphs_to_add; ++i) {//执行1次
    Subgraph* subgraph =
        new Subgraph(error_reporter_, external_contexts_, &subgraphs_);
    subgraphs_.emplace_back(subgraph);//所以呢,只是放入了一个对象Subgraph
  }
}
##

头文件 是这么写的:

 Subgraph& primary_subgraph() {
   return *subgraphs_.front();  // Safe as subgraphs_ always has 1 entry.
 }

 std::vector<std::unique_ptr<Subgraph>> subgraphs_;

所以,关键在于  理解这个 Subgraph 类里面的函数...怎么调用的...

kTfLiteMaxExternalContexts  这个是什么值? 

在 lite/c/c_api_internal.h

typedef enum {
  kTfLiteEigenContext = 0,       // include eigen_support.h to use.
  kTfLiteGemmLowpContext = 1,    // include gemm_support.h to use.
  kTfLiteEdgeTpuContext = 2,     // Placeholder for Edge TPU support.
  kTfLiteCpuBackendContext = 3,  // include cpu_backend_support.h to use.
  kTfLiteMaxExternalContexts = 4
} TfLiteExternalContextType;

for 循环也没具体做什么, 就是初始化了空指针...

UseNNAPI(false); //就是不使能 NNAPI ..事实上 还是调用了  Subgraph 类里边的 UseNNAPI

在 OpenMV 中加载 `.tflite` 模型文件时,出现异常提示“无法加载 `trained.tflite`,`module` 对象没有 `load` 属性”,通常是由于调用方式错误或模型加载模块未正确使用导致的。OpenMV 使用的是 MicroPython 环境,其 TensorFlow Lite 支持依赖于 `tf` 模块中的 `lite` 子模块,但该模块并不提供 `load()` 方法来加载模型[^2]。 正确的加载方式应通过 `tf.lite.Interpreter` 构造函数并传入模型路径,如下所示: ```python import tf # 加载 TFLite 模型 interpreter = tf.lite.Interpreter(model_path="trained.tflite") ``` 如果误用了 `tf.lite.load()` 方法,例如: ```python # 错误示例 interpreter = tf.lite.load("trained.tflite") # 此方法不存在 ``` 则会触发“module object has no attribute 'load'”的异常。 此外,确保模型文件 `trained.tflite` 已正确复制到 OpenMV 的存储设备中,并且路径书写规范。路径错误、文件未正确上传、或文件名拼写错误都可能导致模型加载失败。可以使用如下代码验证文件是否存在: ```python import os if "trained.tflite" not in os.listdir(): print("模型文件未找到,请确认文件是否已正确复制") ``` 同时,若模型用于图像分类任务,还应确保 `labels.txt` 文件也已复制到设备中,并在推理阶段用于映射输出结果到对应标签。 ### 文件读写异常处理 在读取模型文件或标签文件时,建议加入异常处理机制,以增强程序的健壮性。例如: ```python try: with open("trained.tflite", "rb") as model_file: model_data = model_file.read() interpreter = tf.lite.Interpreter(model_content=model_data) except FileNotFoundError: print("文件不存在!") except PermissionError: print("无权限访问文件!") except Exception as e: print(f"发生未知错误:{e}") ``` 这种方式不仅适用于模型文件加载,也适用于其他资源文件(如 `labels.txt`)的读取操作。 ### 固件版本与兼容性 如果上述方法仍无法解决问题,可能是由于 OpenMV IDE 的固件版本过旧或与当前模型格式不兼容。建议升级至 v4.5.4 或更高版本的固件,并通过 IDE 中的 “Tools > Run Bootloader (Load Firmware)” 功能重新烧录固件,以确保底层支持 TensorFlow Lite 的运行时环境正常工作[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teleger

你的支持是我前进的方向

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值