Tensor Flow Lite C++ API 介绍

本文深入介绍了TensorFlow Lite的核心类,包括ErrorReporter、FlatBufferModel、Interpreter和InterpreterBuilder,详细阐述了它们的作用、API用法及示例。ErrorReporter用于错误报告,FlatBufferModel用于模型序列化,Interpreter解释模型执行,InterpreterBuilder构建解释器。这些类提供了从模型加载、错误处理到执行的完整流程。
部署运行你感兴趣的模型镜像

目录

Class类介绍

tflite::ErrorReporter

头文件路径

类作用

Public API介绍

示例

tflite::FlatBufferModel

头文件路径

类作用

Public Static API介绍

Public API介绍

示例

tflite::Interpreter

头文件路径

类作用

Public 类型

Public Static 属性变量

Friend 类

Public API介绍

示例

tflite::InterpreterBuilder

头文件路径

类作用

Public API介绍

备注

tflite::OpResolver

头文件路径

Public 类型

备注


Class类介绍

类名

作用

tflite::ErrorReporter用于汇报错误,当发生错误时可以通过此类获取错误信息
tflite::FlatBufferModel用于序列化模型
tflite::Interpreter从张量输入和输出的节点图的解释器
tflite::InterpreterBuilder构建一个能够解释模型的解释器
tflite::OpResolver给定操作码或自定义操作名称返回 TfLiteRegistrations 的抽象接口

tflite::ErrorReporter

头文件路径

#include <error_reporter.h>

类作用

用于汇报错误,当发生错误时可以通过此类获取错误信息

Public API介绍

函数原型

作用

返回值

Report(const char *format, ...)

向错误日志输出一串字符串VOID

ReportError(void *, const char *format, ...)

将字符串输出到指定位置VOID

示例

调用类似于 printf。

用法:ErrorReporter foo; foo.Report("测试%d", 5); 或 va_list 参数; foo.Report("test %d", args); // 其中 args 是 va_list

子类 ErrorReporter 以提供另一个报告目标。 例如,如果您有一个 GUI 程序,您可能会重定向到驱动 GUI 错误日志框的缓冲区。

//输出数据
ErrorReporter foo;
foo.Report("测试%d", 5);

tflite::FlatBufferModel

头文件路径

#include <model_builder.h>

类作用

用于序列化模型

Public Static API介绍

函数原型

返回值

作用

FlatBufferModel(const FlatBufferModel &)

void

构造函数

~FlatBufferModel()

void

析构函数

BuildFromAllocation(std::unique_ptr< Allocation > allocation, ErrorReporter *error_reporter)

std::unique_ptr< FlatBufferModel >

直接从分配中构建模型

BuildFromBuffer(const char *caller_owned_buffer, size_t buffer_size, ErrorReporter *error_reporter)

std::unique_ptr< FlatBufferModel >

基于预加载的 flatbuffer 构建模型

BuildFromFile(const char *filename, ErrorReporter *error_reporter)

std::unique_ptr< FlatBufferModel >

基于文件构建模型

BuildFromModel(const tflite::Model *caller_owned_model_spec, ErrorReporter *error_reporter)

std::unique_ptr< FlatBufferModel >

直接从 flatbuffer 指针构建模型调用者保留缓冲区的所有权,并应使其保持活动状态,直到返回的对象被销毁

VerifyAndBuildFromAllocation(std::unique_ptr< Allocation > allocation, TfLiteVerifier *extra_verifier, ErrorReporter *error_reporter)

std::unique_ptr< FlatBufferModel >

验证分配的内容是否合法,然后根据提供的分配构建模型

VerifyAndBuildFromBuffer(const char *caller_owned_buffer, size_t buffer_size, TfLiteVerifier *extra_verifier, ErrorReporter *error_reporter)

std::unique_ptr< FlatBufferModel >

验证缓冲区的内容是否合法,然后根据预加载的 flatbuffer 构建模型

VerifyAndBuildFromFile(const char *filename, TfLiteVerifier *extra_verifier, ErrorReporter *error_reporter)

std::unique_ptr< FlatBufferModel >

验证文件内容是否合法,然后基于文件构建模型

Public API介绍

函数原型

返回值

作用

函数原型

返回值

作用

CheckModelIdentifier() constbool如果模型标识符正确则返回真(否则为假并报告错误)
GetMinimumRuntime() conststd::string获取最小运行时间
GetModel() constconst tflite::Model *获取序列化的模型指针
allocation() constconst Allocation *获取分配的内存空间
error_reporter() constErrorReporter *获取错误报告类指针
initialized() constbool初始化
operator->() constconst tflite::Model *->操作符实现
operator=(const FlatBufferModel &)=deleteFlatBufferModel &=操作符实现

示例

这使用 flatbuffers 作为序列化格式。

注意:当前的 API 要求客户端保持 FlatBufferModel 实例处于活动状态,只要它被任何依赖的 Interpreter 实例使用。 由于 FlatBufferModel 实例在创建后实际上是不可变的,因此客户端可以安全地使用具有多个依赖 Interpreter 实例的单个模型,甚至跨多个线程(但请注意,每个 Interpreter 实例都不是线程安全的)。

using namespace tflite;
StderrReporter error_reporter;
auto model = FlatBufferModel::BuildFromFile("interesting_model.tflite",
                                            &error_reporter);
MyOpResolver resolver;  // 你需要继承 OpResolver 以提供实现
  
InterpreterBuilder builder(*model, resolver);
std::unique_ptr interpreter;
if(builder(&interpreter) == kTfLiteOk) {
  //.. run model inference with interpreter
}

tflite::Interpreter

头文件路径

#include <interpreter.h>

类作用

从张量输入和输出的节点图的解释器

Public 类型

变量名

原型

作用

TfLiteDelegatePtrusing std::unique_ptr< TfLiteDelegate, void(*)(TfLiteDelegate *)>委托类型

Public Static 属性变量

变量名

返回值

作用

kTensorsCapacityHeadroom = 16constexpr int在调用 ops 的准备和调用函数之前 tensors_ 向量的容量余量
kTensorsReservedCapacity = 128constexpr int张量预留容量

Friend 类

类名

tflite::InterpreterTest
tflite::delegates::InterpreterUtils
tflite::delegates::test_utils::TestDelegation

Public API介绍

函数原型

返回值

作用

函数原型

返回值

作用

AllocateTensors()
TfLiteStatus
获取TfLiteStatus副本
EnsureTensorDataIsReadable(int tensor_index)TfLiteStatus确保 tensor.data 中的数据可读
GetAllowFp16PrecisionForFp32() constbool获取半精度标志
GetBufferHandle(int tensor_index, TfLiteBufferHandle *buffer_handle, TfLiteDelegate **delegate)TfLiteStatus获取委托缓冲区句柄,以及可以处理缓冲区句柄的委托
GetInputName(int index) constconst char *返回给定输入的名称
GetOutputName(int index) constconst char *返回给定输出的名称
GetProfiler()Profiler *获取用于操作跟踪的探查器
Invoke()TfLiteStatus调用解释器(按依赖顺序运行整个图)
ModifyGraphWithDelegate(TfLiteDelegate *delegate)TfLiteStatus允许委托查看图形并修改图形以自行处理图形的某些部分
ModifyGraphWithDelegate(std::unique_ptr<Delegate,Deleter>delegate)TfLiteStatus与 ModifyGraphWithDelegate 相同,但此解释器拥有提供的委托的所有权
ModifyGraphWithDelegate(std::unique_ptr< TfLiteDelegate > delegate)=deleteTfLiteStatus这种超载永远不会好
OpProfilingString(const TfLiteRegistration & op_reg, const TfLiteNode *node) constconst char *检索操作员对其工作的描述,用于分析目的
ReleaseNonPersistentMemory()TfLiteStatus警告:实验界面,可能会发生变化
ResetVariableTensors()TfLiteStatus将所有变量张量重置为默认值
ResizeInputTensor(int tensor_index, const std::vector< int > & dims)TfLiteStatus改变给定张量的维度
ResizeInputTensorStrict(int tensor_index, const std::vector<int> & dims)TfLiteStatus需要调用 AllocateTensors() 来更改张量输入缓冲区
SetAllowBufferHandleOutput(bool allow_buffer_handle_output)void设置是否允许缓冲区句柄输出
SetAllowFp16PrecisionForFp32(bool allow)voidAllow float16 precision for FP32 calculation when possible
SetBufferHandle(int tensor_index, TfLiteBufferHandle buffer_handle, TfLiteDelegate *delegate)TfLiteStatus将委托缓冲区句柄设置为张量
SetCancellationFunction(void *data, bool(*)(void *) check_cancelled_func)void设置取消函数指针,以便在调用 Invoke() 的过程中取消请求
SetCustomAllocationForTensor(int tensor_index, const TfLiteCustomAllocation & allocation, int64_t flags)TfLiteStatus为张量设置自定义位置
SetExternalContext(TfLiteExternalContextType type, TfLiteExternalContext *ctx)void设置外部上下文
SetNumThreads(int num_threads)TfLiteStatus设置解释器可用的线程数
SetProfiler(Profiler *profiler)void将探查器设置为跟踪执行
SetProfiler(std::unique_ptr< Profiler > profiler)void与 SetProfiler 相同,但此解释器拥有提供的分析器的所有权
execution_plan() constconst std::vector< int > &执行计划
input_tensor(size_t index)TfLiteTensor *返回一个指向给定输入张量的可变指针
input_tensor(size_t index) constconst TfLiteTensor *返回一个指向给定输入张量的不可变指针
input_tensor_by_signature_name(const char *signature_input_name, const char *signature_method_name)TfLiteTensor *警告:实验性接口,可能会更改返回由“signature_method_name”标识的签名中由“signature_input_name”标识的输入张量
inputs() constconst std::vector< int > &对输入列表的只读访问权限
node_and_registration(int node_index) constconst std::pair< TfLiteNode, TfLiteRegistration > *如果在边界内,则获取指向操作和注册数据结构的指针
nodes_size() constsize_t返回模型中的操作数
operator=(const Interpreter &)=deleteInterpreter &=重载运算符
output_tensor(size_t index)TfLiteTensor *返回一个指向给定输出张量的可变指针
output_tensor(size_t index) const

const TfLiteTensor *

返回一个指向给定输出张量的不可变指针
output_tensor_by_signature_name(const char *signature_output_name, const char *signature_method_name) constconst TfLiteTensor *警告:实验性接口,可能会更改返回由“signature_method_name”标识的签名中由“signature_output_name”标识的输出张量
outputs() constconst std::vector< int > &只读访问输出列表
signature_def_names() conststd::vector< const std::string * >警告:实验性接口,可能会更改返回模型中定义的不同方法签名的所有名称的列表
signature_inputs(const char *method_name) constconst std::map< std::string, uint32_t > &警告:实验性接口,可能会发生变化返回输入到通过“method_name”指定的签名中的张量索引的映射
signature_outputs(const char *method_name) constconst std::map< std::string, uint32_t > &警告:实验性接口,可能会发生变化返回输出到通过“method_name”指定的签名中的张量索引的映射
tensor(int tensor_index)TfLiteTensor *获取可变张量数据结构
tensor(int tensor_index) constconst TfLiteTensor *等一个不可变的张量数据结构
tensors_size() constsize_t返回模型中张量的数量
typed_input_tensor(int index)T *将输入量量返回给定输入的数据中
typed_input_tensor(int index) constconst T *返回一个指向给定输入张量数据的不可变指针
typed_output_tensor(int index)T *返回指向给定输出张量数据的可变指针
typed_output_tensor(int index) constconst T *返回一个指向给定输出张量数据的不可变指针
typed_tensor(int tensor_index)T *对适当的张量类型(可变指针版本)执行检查转换
typed_tensor(int tensor_index) constconst T *对适当的张量类型(不可变指针版本)执行检查转换
variables() constconst std::vector< int > &只读访问变量张量列表

示例

图的每个节点处理一组输入张量并产生一组输出张量。 所有输入/输出张量都由索引引用

// 从文件创建模型
// 注意,模型实例必须比解释器实例存活时间更长
auto model = tflite::FlatBufferModel::BuildFromFile(...);
if (model == nullptr) {
 // 返回错误
}
// Create an Interpreter with an InterpreterBuilder.
std::unique_ptr interpreter;
tflite::ops::builtin::BuiltinOpResolver resolver;
if (InterpreterBuilder(*model, resolver)(&interpreter) != kTfLiteOk) {
  // 返回失败
}
if (interpreter->AllocateTensors() != kTfLiteOk) {
// 返回失败
}
  
auto input = interpreter->typed_tensor(0);
for (int i = 0; i < input_size; i++) {
  input[i] = ...;  interpreter.Invoke();

tflite::InterpreterBuilder

头文件路径

#include <interpreter_builder.h>

类作用

构建一个能够解释模型的解释器

Public API介绍

AddDelegate(TfLiteDelegate *delegate)void任何使用 AddDelegate 添加的委托都将按添加顺序应用于由 operator() 生成的解释器
PreserveAllTensorsExperimental()InterpreterBuilder &启用保留中间体以进行调试
SetNumThreads(int num_threads)TfLiteStatus设置用于解释器的 CPU 线程数
operator()(std::unique_ptr< Interpreter > *interpreter)TfLiteStatus构建一个解释器并将其存储在 *interpreter 中
operator()(std::unique_ptr< Interpreter > *interpreter, int num_threads)TfLiteStatus与上面相同,但还设置要使用的 CPU 线程数(覆盖之前对 SetNumThreads 的任何调用)
operator=(const InterpreterBuilder &)=deleteInterpreterBuilder &=重载运算符

备注

生命周期必须至少与构建器创建的任何解释器一样长的模型。原则上,多个解释器可以由单个模型构成。 op_resolver:实现 OpResolver 接口的实例,它将自定义操作名称和内置操作代码映射到操作注册。提供的 op_resolver 对象的生命周期必须至少与 InterpreterBuilder 一样长;与 model 和 error_reporter 不同, op_resolver 不需要在任何创建的 Interpreter 对象的持续时间内存在。 error_reporter:一个被调用来报告处理 printf var arg 语义的错误的函子。 error_reporter 对象的生命周期必须大于或等于由 operator() 创建的 Interpreter。

成功时返回 kTfLiteOk 并将解释器设置为有效的解释器。注意:用户必须确保模型(和错误报告器,如果提供)的生命周期至少与解释器的生命周期一样长,并且单个模型实例可以安全地与多个解释器一起使用。

tflite::OpResolver

头文件路径

#include <op_resolver.h>

类作用

给定操作码或自定义操作名称返回 TfLiteRegistrations 的抽象接口

Public 类型

变量名

原型

作用

变量名

原型

作用

TfLiteDelegatePtrVectorusing
std::vector< std::unique_ptr< TfLiteDelegate, void(*)(TfLiteDelegate *)>>
委托 Ptr 向量

Public API介绍

~OpResolver()void析构函数
FindOp(tflite::BuiltinOperator op, int version) const =0virtual const TfLiteRegistration *通过枚举代码查找内置运算符的操作注册,纯虚函数用户必须继承然后实现这个方法
FindOp(const char *op, int version) const =0virtual const TfLiteRegistration *按操作名称查找自定义运算符的操作注册,纯虚函数用户必须继承然后实现这个方法
GetDelegates(int num_threads) constvirtual TfLiteDelegatePtrVector获取委托

备注

这是在 flatbuffer 模型中引用的操作映射到可执行函数指针 (TfLiteRegistrations) 的机制

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

在PLC(可编程逻辑控制器)中直接运行AI模型是工业自动化领域的一个前沿方向,传统PLC主要用于执行逻辑控制、顺序控制等任务,计算能力有限,但随着工业边缘计算的发展,部分高端PLC已具备运行轻量级AI模型的能力。 --- ## 一、可行性分析 ### 1.1 PLC运行AI模型的限制 | 限制因素 | 说明 | |----------|------| | CPU性能 | 多数PLC为嵌入式ARM或x86架构,计算能力有限 | | 内存容量 | 内存较小,不适合运行复杂模型 | | 实时性要求 | AI模型推理可能影响PLC原有控制任务 | | 编程语言限制 | 多数PLC使用IEC 61131-3语言(如ST、LD),不支持Python等 | ### 1.2 可行方案 | 方案 | 描述 | |------|------| | **边缘PLC + Linux系统** | 如倍福(Beckhoff)TwinCAT 3,支持在Windows/Linux下运行Python模型 | | **PLC嵌入AI协处理器** | 如使用FPGA、NPU协处理器加速推理 | | **模型部署在PLC的Soft PLC环境** | 使用TwinCAT、CODESYS等软PLC环境运行AI模型 | | **模型转换为C/C++代码嵌入PLC** | 使用TensorFlow Lite for Microcontrollers、ONNX Runtime等 | --- ## 二、实现方案详解(以TwinCAT 3为例) ### 2.1 硬件平台:倍福嵌入式PLC(如CX9020) 该PLC运行Linux系统,支持TwinCAT 3运行时,可安装Python环境。 ### 2.2 软件环境 - 操作系统:Linux(TwinCAT 3运行时) - 支持Python 3.x、TensorFlow Lite、ONNX Runtime - 支持C/C++、IEC 61131-3混合编程 --- ## 三、具体实现步骤 ### 3.1 模型准备(Python端) ```python # train_model.py from sklearn.ensemble import RandomForestRegressor import numpy as np import joblib # 示例数据 X = np.random.rand(1000, 5) y = np.random.rand(1000) # 训练模型 model = RandomForestRegressor() model.fit(X, y) # 保存模型 joblib.dump(model, 'boiler_efficiency_model.pkl') ``` ### 3.2 模型转换为ONNX格式(便于部署) ```python # convert_to_onnx.py from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType import joblib model = joblib.load('boiler_efficiency_model.pkl') initial_type = [('float_input', FloatTensorType([None, 5]))] onnx_model = convert_sklearn(model, initial_types=initial_type) with open("boiler_efficiency_model.onnx", "wb") as f: f.write(onnx_model.SerializeToString()) ``` ### 3.3 在PLC中部署ONNX模型(使用ONNX Runtime) ```python # model_inference.py import onnxruntime as ort import numpy as np # 加载ONNX模型 ort_session = ort.InferenceSession("boiler_efficiency_model.onnx") # 输入数据 input_data = np.array([[1200, 1500, 100, 850, 3.5]], dtype=np.float32) # 推理 outputs = ort_session.run( None, {'float_input': input_data} ) print("预测效率:", outputs[0][0]) ``` --- ## 四、集成到TwinCAT项目中 1. 在TwinCAT 3中创建一个“T_SampleTask”任务 2. 使用TcCOM调用Python脚本(或使用.NET集成) 3. 或将模型转换为C代码,使用TwinCAT C++库调用 --- ## 五、轻量化部署方案(适用于低端PLC) ### 5.1 使用TensorFlow Lite for Microcontrollers ```c #include "tensorflow/lite/micro/all_ops_resolver.h" #include "tensorflow/lite/micro/micro_interpreter.h" #include "tensorflow/lite/schema/schema_generated.h" #include "model.h" // 编译后的TFLite模型 const tflite::Model* model = tflite::GetModel(g_model); tflite::AllOpsResolver resolver; const tflite::Interpreter* interpreter; // 初始化 TfLiteStatus init_status = interpreter->AllocateTensors(); if (init_status != kTfLiteOk) { // 错误处理 } // 设置输入 float* input = interpreter->typed_input_tensor<float>(0); input[0] = 1200.0; // primary_air_flow input[1] = 1500.0; // secondary_air_flow ... // 推理 interpreter->Invoke(); // 获取输出 float* output = interpreter->typed_output_tensor<float>(0); printf("预测效率:%f\n", output[0]); ``` --- ## 六、总结 | 方法 | 适用场景 | 优点 | 缺点 | |------|----------|------|------| | TwinCAT + Python | 高端PLC,边缘设备 | 灵活、开发快 | 资源消耗大 | | ONNX Runtime | 支持Linux的PLC | 跨平台、兼容性强 | 需要部署运行时 | | TensorFlow Lite | 微控制器、嵌入式PLC | 占用资源小 | 开发复杂 | | C/C++模型嵌入 | 定制化系统 | 性能高 | 开发周期长 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

17岁boy想当攻城狮

感谢打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值