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

文章目录

  • 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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【go从入门到精通】if else 条件控制

Go 语言条件语句&#xff1a; 在 Go 语言中&#xff0c;条件语句用于根据不同的条件执行不同的代码。Go 语言提供了两种条件语句&#xff1a;if 语句和switch 语句。 if语句 if由一个布尔表达式后紧跟一个或多个语句组成。 语法 Go 编程语言中 if 语句的语法如下&#xff…

反向海淘系统中的数据安全挑战与解决方案探讨

**反向海淘系统中的数据安全挑战与解决方案探讨** **一、背景** 随着反向海淘市场的不断扩大&#xff0c;涉及的数据安全挑战也日益增多。本文旨在探讨反向海淘系统中面临的数据安全挑战&#xff0c;以及相应的解决方案。 **二、数据安全挑战** 1. **数据传输安全**&#x…

微信支付宝--充ChatGPTPLUS/openAI key

ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够基于在预训练阶段所见的模式和统计规律&#xff0c;来生成回答&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写论文、邮件、脚本、文案、翻译、代码等…

【Python】反编译PyInstaller打包的exe

查看exe基本信息 需要反编译的exe 查看exe文件的打包工具&#xff0c;查看exe信息的软件叫Detect It Easy(查壳工具) 由图我们可以看出当前选中的exe文件是由名叫PyInstaller的打包工具打包好的exe 反编译 exe反编译工具&#xff1a;pyinstxtractor.py 使用方法 python py…

面试算法-65-二叉树的层平均值

题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,11.00000] 解释&#xff1a;第 0 层的…

【Spring高级】AOP和动态代理

目录 AspectJ实现AOPJava Agent实现AOPProxy&#xff08;代理&#xff09;模式实现AOPJDK代理CGLIB代理 AOP的底层实现切点Aspect与Advisor切面AOP底层的实现演示 Spring中的代理选择 在Java中&#xff0c;AOP&#xff08;面向切面编程&#xff09;的实现可以通过以下几种方法&…

MySQL的日志:undo log、redo log、binlog有什么作用

目录 从一个update语句说起 undo log 为什么需要undo log undo log 版本链 undo log 是如何持久化到磁盘? redo log 为什么需要redo log redo的组成 redo Log的刷盘策略 redo Log循环写 crash-safe能力 binlog 为什么需要 binlog &#xff1f; binlog与redo lo…

淘宝API接口开发系列——淘宝详情数据采集

淘宝详情数据采集涉及多种技术和方法&#xff0c;下面列举几种常见的方式&#xff1a; 请求示例&#xff0c;API接口接入Anzexi58 爬虫技术&#xff1a;使用编程语言&#xff08;如Python&#xff09;编写网络爬虫程序&#xff0c;通过模拟浏览器行为访问淘宝网站&#xff0c;…

XMind:让思维可视化,提升工作效率的利器

XMind是一款全球领先的开源思维导图和头脑风暴软件&#xff0c;它应用全球最先进的Eclipse RCP软件架构&#xff0c;拥有优秀的用户体验&#xff0c;凭借简单易用、功能强大的特点&#xff0c;在2013年被著名互联网媒体Lifehacker评选为全球最受欢迎的思维导图软件。目前&#…

PyQt上手指南

文章目录 前言PyQt的好处从一个最简单的例子入手PyQt5基础组件体系源码结构 Qt Designer基础布局高级界面Web控件 多线程列表图形绘制PyQt5.QtGuiPyQtGraphmatplotlib和PyQt结合和mplfinance结合 工具使用打包链接 前言 用户界面开发&#xff0c;我搞过visual C MFC、Delphi V…

【链表】Leetcode 142. 环形链表 II【中等】

环形链表 II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系…

ruoyi-activiti添加用车申请流程(二)

实体类Car中必须要有String userId属性。 设置自定义表单为system/car/deptleadercheck&#xff1a; 然后在CarController中编写system/car/deptleadercheck对应的函数&#xff1a; GetMapping("/deptleadercheck")public String deptleadercheck(String taskid, M…

学习总结!

最近主要学习了java&#xff0c;题目的话就写了两道。 这道题目运用三维的bfs&#xff0c;第一次做时无从下手&#xff0c;原来可以利用三维数组&#xff08;第一次用三维数组&#xff09;可以解决这类问题&#xff0c;然后套bfs模板即可。 #include<iostream> #include…

算法体系-11 第十一节:二叉树基本算法(上)

一 两链表相交 1.1 题目描述 给定两个可能有环也可能无环的单链表&#xff0c;头节点head1和head2。请实现一个函数&#xff0c;如果两个链表相交&#xff0c;请返回相交的 第一个节点。如果不相交&#xff0c;返回null 【要求】 如果两个链表长度之和为N&#xff0c;时间复杂…

瑞_Redis_短信登录_基于Session实现登录流程

文章目录 项目介绍1 短信登录1.1 项目准备1.2 基于Session实现登录流程1.2.1 功能流程介绍1.2.1.1 发送短信验证码1.2.1.2 短信验证码登录、注册1.2.1.3 校验登录状态 1.2.2 实现发送短信验证码功能1.2.2.1 页面流程1.2.2.2 代码实现1.2.2.3 测试 1.2.3 实现短信验证码登录、注…

SLAM 算法综述

LiDAR SLAM 其主要思想是通过两个算法&#xff1a;一个高频激光里程计进行低精度的运动估计&#xff0c;即使用激光雷达做里程计计算两次扫描之间的位姿变换&#xff1b;另一个是执行低频但是高精度的建图与校正里程计&#xff0c;利用多次扫描的结果构建地图&#xff0c;细化位…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月20日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年3月20日 星期三 农历二月十一 春分 1、 教育部发布新增24种本科专业 涉及智能视觉工程、足球运动等。 2、 香港特区立法会全票通过《维护国家安全条例》&#xff0c;将于23日刊宪。 3、 国际乒联更新世界排名&#xff0c…

高效数据处理:亚信安慧AntDB在行动

亚信安慧AntDB数据库在运营商自主可控替换项目中的成功应用&#xff0c;具有极其重要的意义。该数据库的落地&#xff0c;不仅为这一项目注入了强大的支持力量&#xff0c;还在更大程度上提升了整体的运营效能。作为一种高效可靠的数据库解决方案&#xff0c;AntDB引入了先进的…

【项目】YOLOv5+PaddleOCR实现艺术字验证码识别

YOLOv5PaddleOCR实现艺术字类验证码识别 一、引言1.1 实现目标1.2 人手动点选验证码逻辑1.3 计算机点选逻辑 二、计算机验证方法2.1 PaddleOCR下方文字识别方法2.2 YOLOv5目标检测方法2.3 艺术字分类方法2.4 返回结果 三、代码获取 一、引言 1.1 实现目标 要识别的验证码类型…

浏览器的渲染原理

浏览器的渲染原理 来总结一下最近理解的浏览器渲染原理和流程 首先浏览器是多进程的&#xff0c;分为渲染进程、插件进程、主进程、网络进程以及GPU进程 而我们打包出来的js html css文件&#xff0c;经过浏览器的渲染进程&#xff0c;就会展示出看到的页面。下面主要来了解一…