如何为TensorFlow Lite Micro添加多输入多输出支持(一)

伍华  2026-03-15 11:40:41  阅读 6 次

在边缘AI迅速普及的今天,越来越多的应用开始依赖复杂的神经网络模型来完成多模态识别、多任务处理等能力。然而,由于嵌入式设备资源受限,开发者常常希望在极小的内存占用下同时处理多路数据、生成多路输出。

但现实是什么呢?

大部分TensorFlow Lite Micro(TFLM)的示例,包括很多MCU SDK(例如NXP eIQ examples),默认都只支持“单输入+单输出”模型。

这不仅限制了模型选择,也让开发者在面对多模态模型、检测模型时十分受限。

因此,本系列文章将带你从架构到实现,一步步为TFLM添加真正完善的多输入、多输出(Multi-Input Multi-Output, MIMO)支持

真的需要多输入多输出吗?

你可能会疑惑:

“我平时的项目都是单输入单输出模型,也够用了呀,还需要这么折腾吗?”

下面我们从典型场景来看:

1.多模态融合模型

图像 +IMU融合姿态识别

声音 +图像的情绪识别模型

2.检测类复杂模型

YOLO:输出分类概率、边界框、置信度

人脸识别:输出特征向量 +人脸关键点

3.多任务学习模型

同时进行分类与回归

语音识别 +情感分析的联合模型

这些模型本质上都需要从多个输入源获取数据,并产生多个输出结果

而若代码层只能访问第一个输入、只取第一个输出,那么其余张量就完全“废掉”了。

以下是我们在SDK中常见的典型“单输入”实现:

uint8_t*MODEL_GetInputTensorData(tensor_dims_t* dims,tensor_type_t* type)
{
TfLiteTensor* inputTensor = s_interpreter->input(0);// 只支持第一个输入
returnGetTensorData(inputTensor, dims, type);
}

这显然无法满足现代边缘AI模型需求。下面就让我们以此为基础,开始设计支持多输入多输出的软件架构:

一. 架构思路设计

为了让TFLM具备完整的多输入多输出能力,同时保持现有项目可平滑过渡,我们从四个原则出发:

1.核心设计原则

向后兼容:原有单输入接口不做破坏

类型安全:强检查避免运行期崩溃

轻量高效:尽量减少内存和额外运算消耗

易于使用:API简洁,开发者上手快

二.系统整体架构

如何为TensorFlow Lite Micro添加多输入多输出支持(一)

该结构主要解决三个问题:

统一管理所有输入输出张量

抽象元数据(维度、类型、指针)

提供友好的API给应用层调用

三.关键数据结构设计

为了支持多张量信息管理,我们需要设计三个核心结构:这些结构将作为“输入管理器”“输出管理器”的基础能力。

(1)张量维度结构

typedefstruct{

intsize;
             
//
维度数量

intdata[MAX_TENSOR_DIMS];
    
//
各维度大小
}tensor_dims_t;

2)张量类型

typedefenum{
kTensorType_FLOAT32,

kTensorType_UINT8,

kTensorType_INT8
}tensor_type_t;

3)多张量信息结构(核心)

typedefstruct{

intcount;
                 
//
张量数量

tensor_dims_tdims[MAX_INPUT_TENSORS];
   
//
维度信息数组

tensor_type_ttypes[MAX_INPUT_TENSORS];
  
//
类型信息数组

uint8_t* data[MAX_INPUT_TENSORS];
     
//
数据指针数组
}multi_tensor_info_t;
四. API接口设计(预览)

下面展示的是应用层会使用到的主要接口。

(1)基础查询

//获取输入/输出张量数量

intMODEL_GetInputTensorCount(void);
intMODEL_GetOutputTensorCount(void);

2)单张量访问

//按索引获取张量数据

uint8_t*MODEL_GetInputTensorData(intindex,tensor_dims_t* dims,tensor_type_t* type);
uint8_t*MODEL_GetOutputTensorData(intindex,tensor_dims_t* dims,tensor_type_t* type);

3)批量获取所有张量信息

//一次性获取所有张量信息

status_tMODEL_GetAllInputTensors(multi_tensor_info_t* input_info);
status_tMODEL_GetAllOutputTensors(multi_tensor_info_t* output_info);

4)差异化预处理

//支持按张量索引的差异化预处理

voidMODEL_ConvertInput(uint8_t* data,tensor_dims_t* dims,
tensor_type_ttype,inttensor_index);

让开发者可以针对不同的输入,有不同的量化、归一化策略。

五.结语与预告

在本篇文章中,我们从“为什么需要MIMO支持”讲起,到支持多输入多输出的架构设计、数据结构设计与API规划,构建了一套清晰完整的解决方案。

通过这样的设计,我们不仅能够保持现有代码兼容,也能让TFLM顺利支持更复杂的边缘AI模型,从而大幅提升应用可扩展性、减少重复开发工作,并显著提高项目的工程效率。

在下一篇《如何为TensorFlow Lite Micro添加多输入多输出支持(二)》中,我们将正式进入代码实现,包括:头文件设计;完整的类型定义和接口声明以及核心函数实现;张量管理和数据访问的具体实现

欢迎持续关注,如果您在实际开发中遇到相关问题,欢迎在评论区讨论交流。

本文地址:https://www.shazhe.cn/huagu1326.html
免责声明:本文为原创文章,版权归 伍华 所有,欢迎分享本文,转载请保留出处!

评论已关闭!