解决由于历史原因解析tflite失败的问题

news2024/11/29 8:58:51

文章目录

  • 0. 背景
  • 1. tflite 历史遗留问题
  • 2. schema
  • 3. flatbuffers 编译器
    • 3.1 安装 FlatBuffers 编译器
    • 3.2. 编译 FlatBuffers schema 文件
    • 3.3 使用生成的 Python 文件
  • 4 问题未解决
  • 终极解决方案

写在最前面:解决方法是升级tensorflow版本,重新生成tflite

0. 背景

今天遇到了这么一个问题:

  File "***/scripts/tflite/schema.py", line 9366, in Tensors
    x = self._tab.Indirect(x)
  File "***/anaconda3/lib/python3.8/site-packages/flatbuffers/table.py", line 46, in Indirect
    return off + encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off)
  File "***/anaconda3/lib/python3.8/site-packages/flatbuffers/encode.py", line 26, in Get
    return packer_type.unpack_from(memoryview_type(buf), head)[0]
struct.error: unpack_from requires a buffer of at least 1574732 bytes for unpacking 4 bytes at offset 1574728 (actual buffer size is 853240)

我是在解析某个tflite模型的时候遇到这个问题的,而我在解析别的iflite文件的时候是正常的。
于是分析到是tensorflow的schema文件版本差异的问题,在此记录一下解决过程。

1. tflite 历史遗留问题

最开始的时候,tflite 认为 opcode 不会超过 256 个,所以使用了 u8 来存储。后来就超过了 256 个,改成 int 来存储。但是又不能直接改,所以搞了个巧妙的方式:如果 opcode 小于 256,那么还是用 u8 来存,但是大于 256 的就必须走新的 field 了。

不太好的一点就是,他们把老的那个 field 换了名字,而新的 field 直接用了原来的名字,导致直接调用原来的接口名字的函数在不适配他的逻辑的情况下生成的就是全 0 的东西。

这也就是为什么我解析这个 tflite 模型得到的算子全是 ADD 算子。

2. schema

schema.fbs 是一个 FlatBuffers schema 文件,它定义了数据结构。这个文件通常由你自己创建,以匹配你的特定需求。

对于TensorFlow,它们的 FlatBuffers schema 文件是公开的,可以从它们的源代码库中获取。

我在 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/schema 找到了 schema.fbs 这个文件,将其下载下来。

在这里插入图片描述
同时在这里也可以看到schema之前是有很多版本的。

需要确保 schema.fbs 文件与正在使用的 TensorFlow Lite 版本匹配。如果 schema.fbs 文件与你的 TensorFlow Lite 版本不匹配,可能会遇到问题。

3. flatbuffers 编译器

要使用 FlatBuffers 在 Python 中生成 schema 文件,需要先安装 FlatBuffers 编译器。这个编译器可以将 FlatBuffers schema 文件编译成 Python 类或其他语言的类。

我是使用python,所以在这里记录python。

3.1 安装 FlatBuffers 编译器

在 FlatBuffers 的 GitHub 仓库下载预编译的二进制文件,或者从源代码编译。

使用以下命令从源代码编译 FlatBuffers:

git clone https://github.com/google/flatbuffers.git
cd flatbuffers
mkdir build
cd build
cmake ..
make flatc

编译完成后,FlatBuffers 编译器(flatc)将位于 flatbuffers 目录。

3.2. 编译 FlatBuffers schema 文件

假设你的 FlatBuffers schema 文件名为 schema.fbs,你可以使用以下命令编译它:

./flatc --python schema.fbs
这在当前目录生成一个名为 tflite 的文件夹。

或者,使用
./flatc -p --gen-onefile schema.fbs
得到文件schema_generated.py,这样子好管理版本,但是使代码变得难以管理和阅读,因为所有的代码都在一个文件中。schema.fbs 文件中定义了很多的表和结构,生成的 Python 代码会非常长。

我个人是喜欢用前者生成一个python文件,需要参考源码的时候去后者生成的文件夹里找源码看。

3.3 使用生成的 Python 文件

import schema

# 读取 TFLite 模型文件。
with open('your_model.tflite', 'rb') as f:
    buf = f.read()

# 使用 schema 模块解析模型。
model = schema.Model.GetRootAsModel(buf, 0)

# 现在,你可以使用 model 对象来访问模型的各种属性。
# 例如,你可以获取模型中的操作符数量:
print(model.OperatorCodesLength())

# 或者,你可以获取模型中的第一个操作符的类型:
op_code = model.OperatorCodes(0)
print(op_code.BuiltinCode())

4 问题未解决

我更换了其他版本的 schema.fbs 之后,问题还是没有解决。。。
看来不是schema的问题

需要在解析的时候做以下修改:

tfliteOpSet[tfliteOp->opcode_index]->builtin_code

改成

static_cast<tflite::BuiltinOperator>(tfliteOpSet[tfliteOp->opcode_index]->deprecated_builtin_code)

  • tfliteOpSet[tfliteOp->opcode_index]->builtin_code:这里使用的是builtin_code,这是TensorFlow Lite中内建操作的枚举值。这种方式是推荐的,因为builtin_code是最新的,包含了所有的TensorFlow Lite内建操作。

  • static_cast<tflite::BuiltinOperator>(tfliteOpSet[tfliteOp->opcode_index]->deprecated_builtin_code):这里使用的是 deprecated_builtin_code,这是在旧版本的TensorFlow Lite中使用的,现在已经被标记为弃用(deprecated)。static_cast<tflite::BuiltinOperator>是将 deprecated_builtin_code 转换为 BuiltinOperator 枚举类型。这种方式不推荐使用,因为 deprecated_builtin_code 可能不包含所有的TensorFlow Lite内建操作。

终极解决方案

升级tensorflow版本,重新生成tflite。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1529894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法---二分查找练习-2(寻找旋转排序数组中的最小值)

寻找旋转排序数组中的最小值 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;检查数组的最后一个元素是否大于第一个元素。如果是&#xff0c;说明数组没有进行旋转&#xff0c;直接返回第一个元素作为最小值…

ISIS接口明文认证实验简述

默认情况下&#xff0c;ISIS接口认证通过在ISIS协议数据单元&#xff08;PDU&#xff09;中添加认证字段&#xff0c;例如&#xff1a;一个密钥或密码&#xff0c;用于验证发送方的身份。 ISIS接口认证防止未经授权的设备加入到网络中&#xff0c;并确保邻居之间的通信是可信的…

华为配置HTTPS服务器实验

配置HTTPS服务器示例 组网图形 图1 配置HTTPS服务器组网图 组网需求配置思路配置注意事项操作步骤配置文件 组网需求 如图1所示&#xff0c;用户通过Web方式访问网关设备AP。 为了防止传输的数据不被窃听和篡改&#xff0c;实现对设备的安全管理&#xff0c;网络管理员要…

【Unity】从0到1的横版2d制作笔记-DAY1

写在前面&#xff1a; 感谢旻子提供的Unity2d课程捏&#xff0c;红豆泥阿里嘎多 创建项目 测试Visual Studio的使用 右键选择【create】&#xff0c;右键创建C# Script&#xff0c;待文件创建完毕后双击查看能否正确跳转。 正确跳转的结果是能看见代码中注释标注有&#xff1a;…

策略模式实战

项目推荐最近开发完成的项目中使用到了策略模式&#xff0c;实现多种支付方式&#xff0c;避免了后期支付方式if-else代码的冗余&#xff0c;也有利于后期支付的一个扩展。同时这个项目非常适合于做毕设&#xff0c;想了解这个项目的同学可以联系我QQ&#xff1a;3808898981 前…

android studio 安装lombok插件

android studio 安装lombok插件 由于 AS 不是基于 IDEA release 版本进行开发的&#xff0c;因此lombok对idea的插件可能再as中无法查看到。因此再as中通过plugins管理无法安装lombok插件。这就导致再gradle引入lombok后&#xff0c;虽然编译可能会通过&#xff0c;但是代码在查…

二、Kubernetes(k8s)中部署项目wordpress(php博客项目,数据库mysql)

前期准备 1、关机顺序 2、开机顺序 (1)、k8s-ha1、k8s-ha2 (2)、master01、master02、master03 (3)、node01、node02 一、集群服务对外提供访问&#xff0c;需要通过Ingress代理发布域名 mast01上传 ingress-nginx.yaml node01、node02 上传 ingress-nginx.tar 、kube-webh…

10-项目部署_持续集成-黑马头条

项目部署_持续集成 1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从…

uniapp 云开发省钱之调整函数执行内存大小

我这个5块钱一个月的服务空间配置&#xff1a; 现在还只有少量的用户和自己测试之用&#xff0c;目前消耗的情况&#xff1a; 云函数的使用量还是挺高的&#xff0c;目前还是正好能覆盖一个月的使用量&#xff0c;等用户量上来肯定是不行的&#xff0c;所以得想想办法压榨一下云…

问GPT:将Excel中一行转换为一列的方法

问GPT&#xff1a;将excel中一行转换为一列的方法 函数&#xff1a; TRANSPOSE(A2:E2)

前端项目,个人笔记(二)【Vue-cli - 引入阿里矢量库图标 + 吸顶交互 + setup语法糖】

目录 1、项目中引入阿里矢量库图标 2、实现吸顶交互 3、语法糖--<script setup> 3.1、无需return 3.2、子组件接收父组件的值-props的使用 3.3、注册组件 1、项目中引入阿里矢量库图标 步骤一&#xff1a;进入阿里矢量库官网中&#xff1a;iconfont-阿里巴巴矢量…

内网横向移动小结

windows Windows-Mimikatz 适用环境&#xff1a; 微软为了防止明文密码泄露发布了补丁 KB2871997&#xff0c;关闭了 Wdigest 功能。当系统为 win10 或 2012R2 以上时&#xff0c;默认在内存缓存中禁止保存明文密码&#xff0c;此时可以通过修改注册表的方式抓取明文&#xff…

MacOS Xcode 使用LLDB调试Qt的 QString

环境&#xff1a; MacOS&#xff1a; 14.3Xcode&#xff1a; Version 15.0Qt&#xff1a;Qt 6.5.3 前言 Xcode 中显示 预览 QString 特别不方便, 而Qt官方的 lldb 脚本debugger/lldbbridge.py一直加载失败&#xff0c;其他第三方的脚本都 不兼容当前的 环境。所以自己研究写…

嵌入式学习41-数据结构2

今天学习了链表的增删改查 &#xff08;暂定&#xff01;&#xff01;后续再补内容&#xff09; 高内聚 &#xff1a;一个函数只实现一个功能 …

led灯驱动芯片有哪些型号?

LED灯驱动芯片是LED灯的重要组成部分&#xff0c;其主要特性包括&#xff1a; 1. 高效能&#xff1a;LED灯的电压和电流要求较低&#xff0c;因此合理设计的LED灯驱动芯片可以提供高效能的工作性能。这有助于节省能源&#xff0c;减少对环境的影响。 2. 稳定性&#xff1a;LE…

杰发科技AC7801——Flash数据读取

0. 简介 因为需要对Flash做CRC校验&#xff0c;第一步先把flash数据读出来。 1. 代码 代码如下所示 #include "ac780x_eflash.h" #include "string.h" #define TestSize 1024 ///< 4K #define TestAddressStart 0x08000000 uint8_t Data[7000]; int…

论文阅读:机器人跑酷学习

项目开源地址&#xff1a;https://github.com/ZiwenZhuang/parkour 摘要&#xff1a; 跑酷对腿部机动性是一项巨大的挑战&#xff0c;要求机器人在复杂环境中快速克服各种障碍。现有方法可以生成多样化但盲目的机动技能&#xff0c;或者是基于视觉但专门化的技能&#xff0c;…

自动化部署利器:Jenkins+Gitlab助力Springboot项目快速上线,实现持续集成与持续交付!

Jenkins 能干什么 来自官网 官网 Jenkins怎么用【Linux版】 下载 war包 本机为Java8 选择Jenkins版本为2.289.1 注意&#xff1a; 如果是Java8 尽量和我的Jenkins版本保持一致哈&#xff01;后面可能会遇到各种坑。 把下载好的war放到Linux服务器的某一个目录下 启动war …

HarmonyOS ArkTS 通用事件(二十三)

通用事件目录 点击事件事件ClickEvent对象说明EventTarget8对象说明示例 触摸事件事件TouchEvent对象说明TouchObject对象说明示例 挂载卸载事件事件示例 点击事件 组件被点击时触发的事件。 事件 ClickEvent对象说明 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中…

高性能 MySQL 第四版(GPT 重译)(二)

第四章&#xff1a;操作系统和硬件优化 你的 MySQL 服务器的性能只能和它最弱的环节一样好&#xff0c;而运行 MySQL 的操作系统和硬件通常是限制因素。磁盘大小、可用内存和 CPU 资源、网络以及连接它们的所有组件都限制了系统的最终容量。因此&#xff0c;你需要仔细选择硬件…