查看: 1961|回复: 1

[分享] TFLite模型的开盲盒体验

[复制链接]
  • TA的每日心情
    开心
    2020-12-18 12:56
  • 签到天数: 55 天

    连续签到: 1 天

    [LV.5]常住居民I

    144

    主题

    343

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2174
    最后登录
    2025-8-29
    发表于 2024-2-29 10:25:32 | 显示全部楼层 |阅读模式
    TFLite模型的开盲盒体验之flatbuffer格式介绍

    相信在嵌入式平台上部署过神经网络模型的伙伴,都不会对TFLite格式陌生。TFLite是谷歌推出的一个轻量级推理库,它的主要目标是在移动端和嵌入式设备上部署深度学习模型。为了在这些设备上运行,需要将训练好的TensorFlow模型转换成一种特殊的格式,这就是TensorFlow Lite模型。转换过程包括模型转化、部署和优化三个步骤,旨在提升运算速度并减少内存、显存占用。

    具体来说,这其中最终要的就是以.TFLite为格式的模型文件,其主结构为一个Model。在这个模型中,包含了操作符(Operator code)、子图(SubGraph)以及缓冲区(Buffer)。子图中定义了模型中的子图,包括各个tensor,输入输出的Tensor,以及子图中的各个算子。

    还真是麻雀虽小,五脏俱全啊。那么是什么技术支撑TFLite这个小小的身体内部能够储存这么大的能量呢?答案就是FlatBuffer。

    FlatBuffers是一种高效的二进制序列化格式,使用C++编写,是一个开源的、跨平台的序列化工具库,由Google提供并维护。它实现了一种类似于Protocol Buffers的序列化格式。这个库的主要特点包括:对序列化的数据不需要打包和拆包,内存和效率速度高,扩展灵活,代码依赖较少,强类型设计,编译期即可完成类型检查,使用简单,可跨平台使用。

    一个FlatBuffers文件主要由三部分组成:verison、string table和buffer。其中,version表示FlatBuffers的版本号;string table存储了序列化数据中所有的字符串;buffer则包含了实际的数据内容。

    在实际应用中,例如在Android应用程序中,JSON数据可以在应用程序之外的某个地方被转换成FlatBuffer格式的文件。这些二进制数据可以以文件的形式提交,也可以从API直接返回FlatBuffer二进制文件。

    值得一提的是,FlatBuffers是一种无需解码的二进制格式,因此其解码性能极高,要比Protobuf快几百倍,比JSON更快得多。所以,对于需要重度依赖反序列化的场景,可以考虑使用FlatBuffers。

    相较于其他序列化格式,如JSON、XML和Protocol Buffers等,FlatBuffers具有以下特点:
    1. 高效性:FlatBuffers的序列化和反序列化速度非常快,因为它不需要进行解析和编码操作,而是直接将数据写入或读取内存。
    2. 紧凑性:FlatBuffers生成的二进制文件大小比JSON、XML等文本格式更小,因为它只存储实际的数据内容,而不包括任何元数据或格式化信息。
    3. 灵活性:FlatBuffers支持定义复杂的数据结构,并可以在运行时动态修改这些结构。此外,它还提供了一些高级功能,如嵌套表、枚举类型和引用等。
    4. 易于使用:FlatBuffers提供了一个简单的API,可以方便地将数据序列化为二进制格式,或将二进制数据反序列化为对象。此外,它还提供了一个可视化工具,可以帮助用户快速创建和管理数据模型。
    5. 跨平台性:FlatBuffers可以在多种编程语言中使用,包括C++、Java、Python等。此外,它还支持多种操作系统和硬件平台。
    当然,讲了这么多,小编也只是想告诉大家,正所谓知己知彼。既然我们想要打开TFLite这个盲盒,当然要知道他是谁,以及他的一切。那么现在,我们知道了,TFLite表面上是一种模型表达格式,包含了模型的基本信息。而其内在,是一个叫做FlatBuffer的技术在支撑着它。

    具体来说,TFLite模型实际上是以FlatBuffer格式存储的。在进行模型转换时,例如将TensorFlow训练好的模型转化为适合在移动设备上运行的轻量级模型时,我们主要使用的是TensorFlow Lite Converter。这个转换器可以将训练好的TensorFlow模型转换成.TFLite文件,也就是FlatBuffer格式的文件。所以说,TFLite与FlatBuffers的关系就在于,TFLite利用FlatBuffer这种高效二进制序列化格式来存储和表示其模型数据。

    想要打开盲盒,钥匙就在这个叫做FlatBuffer的技术。我们可以使用flatc工具来解析FlatBuffer,其依赖对应的schema,这个schema类似于protobuf的proto文件,用来定义数据封装格式。

    如此一来,我们就找到了切入点,利用一个叫做flatc的工具来解析FlatBuffer格式的TFLite模型,以查看其中的内容。当然,查看内容是为了后面根据需要进行修改。

    小编将在下期带大家从源码开始构建属于我们自己的flatc工具,并对TFLite模型进行解析及简单修改。预知如何编辑,请见下期分解啦!


    签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-9-13 10:02
  • 签到天数: 297 天

    连续签到: 1 天

    [LV.8]以坛为家I

    34

    主题

    3512

    帖子

    38

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6076

    活跃会员

    最后登录
    2025-8-27
    发表于 2024-3-1 11:05:53 | 显示全部楼层
    支持一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-30 03:18 , Processed in 0.089446 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表