【问题标题】:How to convert model.tflite to model.cc and model.h on Windows 10如何在 Windows 10 上将 model.tflite 转换为 model.cc 和 model.h
【发布时间】:2022-08-18 17:08:46
【问题描述】:

我创建了一个 TensorFlow Lite .tflite 模型,我计划在微控制器上使用它。但是,此文件必须转换为 C 源文件,即 TensorFlow Lite for Microcontrollers 模型。 TensorFlow 文档提供了一种简单的方法来convert to a C array with the unix command xxd。我使用的是 Windows 10,无法访问 unix 命令,也没有记录其他 Windows 方法。搜索超级用户后,我看到了xxd for Windows now exists。我下载了命令并在我的 .tflite 模型上运行它。结果与hello world example 不同。

首先,hello world 示例 model.h file 有一条评论说它是“使用命令从 TensorFlow Lite 平面缓冲区自动创建的:xxd -i model.tflite > model.cc\”当我运行命令时,model.h 不是“自动创建的” ”。

其次,比较 hello world 示例中的 model.cc file 与我生成的 model.cc 文件,它们完全不同,我不确定如何解释(我不是指实际数组)。同样,在示例 model.cc 文件中,它声明它是使用xxd 命令“自动创建的”。示例中的Line 28alignas(8) const unsigned char g_model[] = {line 237const int g_model_len = 2488;。相比之下,我生成的文件中的等效行是unsigned char _________g_model[] = {unsigned int _________g_model_len = 4009981;

虽然我不是 C 专家,但我不确定如何解释文件中的差异以及是否错误地生成了 model.cc 文件。对于如何从原始 model.tflite 文件正确生成 model.h 和 model.cc 文件,我将不胜感激。

  • 这种方法显然只是用模型的初始化变量替换了从文件系统加载模型。你确定你的微控制器可以执行TensorFlow 软件?您是否为您的目标成功编译了它? -- 不管怎样,当然你的模型应该给你另一个输出而不是\"hello world\"。如果您转换“hello world”,您是否比较了结果? -- 关于不同的标识符,示例的 xxd 版本和您的版本显然不同或使用不同的选项调用。
  • 你好@thebusybee - 是的,我的微控制器可以执行 TensorFlow。我确实尝试过转换hello_world.tflite。我生成的 model.cc 文件与示例(包括数组)不匹配。但是他们在 github 中没有当前版本的 model.cc(我上面的链接来自历史快照)。因此,考虑到时间的差异,示例中的模型可能会有所不同,但我无法确认。仍然不确定如何正确生成 model.h 和 model.cc。

标签: windows-10 c file-conversion xxd


【解决方案1】:

在做了一些实验之后,我认为这就是你得到差异的原因:

  1. xxd 将输入文件路径的任何非字母/非数字字符替换为下划线 ('_')。显然,您使用具有 9 个此类前导字符的输入文件的路径调用 xxd,可能类似于“../../../g.model”。 C 的语法只允许字母(a 到 z、A 到 Z)、数字(0 到 9)和下划线作为对象名称的字符,并且名称需要以非数字开头。这是 xxd 对输入文件名称所做的唯一“操作”。

  2. 由于 xxd 对 TensorFlow 一无所知,因此它无法生成版权声明。以此为指示,任何其他区别TensorFlow 作者已通过其他方式插入,尽管声明“从 TensorFlow Lite flatbuffer 自动创建......”。这可以手动或通过脚本完成,不幸的是我在他们的存储库的一些快速研究中没有找到任何提示。显然,该语句仅表示数据值。

    所以你需要编辑你的结果:

    1. 添加您认为合适的任何评论。

    2. 如果您的编译器支持,则将特定于编译器的 alignas(8) 添加到数组中。

    3. 将关键字const 添加到数组和长度变量中。这将告诉编译器禁止任何写访问。这可能会将数据放在只读存储器中。

    4. 将数组和长度变量分别重命名为 g_modelg_model_len。 TensorFlow 很可能需要这些名称。

    5. 将“model.cc”复制到“model.h”中,然后应用更多版本,如示例所示。

      不要被不同的价值观所困扰。原因是模型文件的内容不同。检查长度变量特别简单,它的值必须与输入文件的大小完全相同。

      编辑:

      在第 28 行,这是文本 alignas(8) const unsigned char,如示例转换模型中所示。当我尝试转换模型(无论是我的自定义模型还是“hello_world.tflite”示例模型)时,第 28 行上的文本是 unsigned char(该行上的任何其他文本都没有问题)。第 28 行是如何编辑和解释的?

      关于“如何”:我坚信 TensorFlow 的作者确实使用了编辑器(IDE 或像 Notepad++ 或 Geany 这样的独立程序)并编辑了该行,或者使用了一些脚本来自动执行此操作。

      alignas(8) 的原因很可能是 TensorFlow 期望数据对齐为 8 个字节,例如因为它将字节数组转换为包含 8 个字节宽度值的结构。

      const 的插入通常也会将模型定位在只读存储器中,这在大多数微控制器上是可取的。如果忽略它,模型的数据不仅是可写的,而且会位于宝贵的 RAM 中。

      在第 237 行,文本具体为const int。当我尝试转换模型(无论是我的自定义模型还是“hello_world.tflite”示例模型)时,第 237 行上的文本是unsigned int(该行上的任何其他文本都没有问题)。为什么这两条线在这些特定的地方不同?这让我相信 Windows 上的 xxd 功能不一样?

      同样,我坚信这是手动或通过脚本编辑的。 TensorFlow 可能期望这个变量的数据类型为 int,但我尝试的任何 xxd(Windows 和 Linux)都会生成 unsigned int。我不认为您的 xxd 特定版本在 Windows 上的功能有所不同。

      对于const,同样的想法适用于上述。

      最后,当我尝试使用 xxd for windows 实用程序转换示例模型“hello_world.tflite”文件时,我得到的数组与示例“hello_world.cc”文件不匹配。如果 xxd 工作,我希望数组值是相同的。最后一个问题是如何在 Windows 上生成“model.h”和“model.cc”文件。

      您是否注意到您链接的模型在另一个分支存储库的?

      如果我在“hello_world.cc”链接中使用branch on GitHub,我会在“../train/README.md”中找到此存档hello_world_2020_12_28.zip。我解压它并在包含的“model.tflite”上运行 xxd。结果的数据与存档中包含的“model.cc”相匹配。但它与“hello_world.cc”中的数据不匹配同一个分支你链接的。差异已经存在。

      我的结论是,示例结果不是从示例模型生成的。发生这种情况是因为开发人员有时没有对他们提交的内容给予足够的关注。是的,这很不幸,因为它会刺激和挫败像你这样的初学者。

      但是,正如我所写,不要让这让你头疼。试试这个简单的例子,使用文档作为说明过程.将特定数据的差异视为怪癖。在与他人的项目合作时,您会一次又一次地遇到这样的事情。这是很正常的。

【讨论】:

  • 感谢您为我做一些研究。 1、xxd.exe和model.tflite在同一个目录下。在命令提示符中,我导航到两个文件所在的目录并运行命令 xxd -i model.tflite > model.cc 2。正确,我不希望它生成 cmets/copywrite。正如在回复您上面的评论中所指出的,当通过我的 xxd 命令运行 hello world 示例 tflite 文件时,我得到不同的输出(包括数组)。因此,我不相信这种方法可以正确转换文件。还有其他方法可以做到这一点或验证它吗?谢谢。
  • 我在Win10上试过两个不同版本的xxd,都没有为变量发明新名字。所以我很困惑你说你的输入文件名“model.tflite”得到了g_model,我原以为model_tflite。 ——不管怎样,不要想太多。进行转换并尝试编译和运行模型。您不需要得到与示例完全相同的结果,这显然没有得到很好的维护。
  • 我使用“model.tflite”作为通用文件名。文件名本身不是问题。我的问题的重点是生成的文件中的第 28 行和第 237 行是不同的。与示例的相同 .cc 文件相比,当我生成 .cc 文件时,使用示例 hello_world.tflite 生成的数组对我来说是不同的。所有其他差异(包括文件名、cmets 等)都不是问题。
  • 由于您在问题中写道长度为 4009981,因此我确定您转换了模型,而不是简单的示例。您是否介意检查该值是否来自示例的 hello world 模型的转换?
  • 哦,解释了第 28 行,它已被编辑。
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 2016-11-27
  • 2021-04-03
  • 2017-12-10
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多