X86_64 Ubuntu为树莓派zero(armv6)交叉编译tensorflow-lite

2023-05-16

⚠⚠⚠警告

Tensorflow官方在2021年8月份废弃了通过Makefile构建tflite的方式。从Tensorflow 2.7.0开始,官方只提供使用CMake或者Bazel构建tflite的支持。

本教程正是基于Makefile对tflite进行交叉编译的,这意味着本教程仅支持2.6以及之前的版本。博主会找时间对博文进行更新。

1. 编译完成的效果 

本文需要的交叉编译工具、tensorflow-lite依赖库、修改过的makefile文件以及编译好的文件都已上传至csdn:

树莓派zero交叉编译tensorflow-lite所需依赖,工具链及编译好的库文件_tensorflow交叉编译-机器学习文档类资源-CSDN下载

编译完成后,主要可以得到两个库和三个可执行文件: 

如果你已经有了现成的tflite模型文件,但需要编写一个使用该模型的C++应用程序在树莓派zero上运行,博主已经打包好了开发环境,可以在树莓派上直接编译出可执行文件,也可交叉编译:

https://github.com/NewComer00/tflite4zero_envhttps://github.com/NewComer00/tflite4zero_env

也可以参考此项目: 

GitHub - cloudwiser/ObjectDetectionRPiZero: TensorFlow Lite object detection example for Raspberry Pi Zerohttps://github.com/cloudwiser/ObjectDetectionRPiZero

2. 在github仓库下载tf最新版本 

仓库地址: 

GitHub - tensorflow/tensorflow: An Open Source Machine Learning Framework for Everyone

下载、解压源码,tensorflow源码组织如下: 

打开目录后: 

3. 下载arm的交叉编译工具链 

tf官网为我们推荐了rpi zero(即树莓派zero)交叉编译用的g++工具链: 

https://github.com/rvagg/rpi-newer-crosstools/archive/eb68350c5c8ec1663b7fe52c742ac4271e3217c5.tar.gz

我们把它下载下来,并改一个比较短的名字: 

我们需要用到的是其中6.5.0版本的交叉编译工具: 

观察6.5.0版本工具中gcc/g++/ar的地址:

/your/path/to/rpi-newer-crosstools/x64-gcc-6.5.0/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc 

/your/path/to/rpi-newer-crosstools/x64-gcc-6.5.0/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-g++ 

/your/path/to/rpi-newer-crosstools/x64-gcc-6.5.0/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-ar

我们把上述地址中的公共部分(也就是所谓的“编译器前缀”)临时赋值给环境变量CC_PREFIX,之后直接引用变量值即可:

export CC_PREFIX=/your/path/to/rpi-newer-crosstools/x64-gcc-6.5.0/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-

4. 下载编译需要的依赖库 

https://www.tensorflow.org/lite/guide/build_rpi

根据官方教程的"构建"一步,我们需要执行下载脚本,来下载编译需要的依赖库: 

/your/path/to/tensorflow-2.4.1/tensorflow/lite/tools/make/download_dependencies.sh 

但直接下载速度太慢,有好心人为我们提供了下载好的依赖包(需要消耗CSDN点数。如果点数不够,可以直接下载“1. 编译完成的效果”中的文件,里面有我调教好的依赖包): 

tensorflow-lite依赖包_tflite依赖-深度学习文档类资源-CSDN下载

下载好依赖包后,将其中的downloads文件夹放在如下路径: 

/your/path/to/tensorflow-2.4.1/tensorflow/lite/tools/make/ 

对于tf2.4来说,downloads文件夹中的ruy版本太低,需要从官方仓库下载新版的ruy替换. 

通过查询download_dependencies.sh可以知道下载地址: 

https://github.com/google/ruy/archive/54774a7a2cf85963777289193629d4bd42de4a59.zip 

5. 修改Makefile文件 

依赖准备好后,我们就要准备编译tflite了.由于rpi zero的硬件架构为armv6,tensorflow官方并没有专门对其进行适配,因此我们需要对Makefile文件进行修改.参考此链接的描述: 

Can't cross-compile TFLite "Minimal" for Raspberry Pi Zero (armv6 target) · Issue #30181 · tensorflow/tensorflow · GitHub

首先在下面的目录中找到Makefile文件,对其进行一个备份(如复制一份文件,将其重命名为Makefile.origin),然后修改原文件. 

/your/path/to/tensorflow-2.4.1/tensorflow/lite/tools/make/ 

我们找到负责跨平台的代码部分,在其中插入一段代码,负责处理armv6平台的编译配置: 

# for rpi zero
ifeq ($(TARGET_ARCH), armv6)
  CXXFLAGS += \
    -march=armv6 \
    -mfpu=vfp \
    -funsafe-math-optimizations \
    -ftree-vectorize \
    -fPIC \
    -marm

  CFLAGS += \
    -march=armv6 \
    -mfpu=vfp \
    -funsafe-math-optimizations \
    -ftree-vectorize \
    -fPIC \
    -marm

  LDFLAGS := \
    -Wl,--no-export-dynamic \
    -Wl,--exclude-libs,ALL \
    -Wl,--gc-sections \
    -Wl,--as-needed \
    -latomic
endif

插入位置如下图所示: 

6. 开始编译 

编译前的准备都已经做好,现在我们可以着手编译tflite库了. 

首先将当前目录切换到项目的最外层文件夹: 

cd /your/path/to/tensorflow-2.4.1 

接下来输入以下命令,开始编译: 

make -j 4 -f tensorflow/lite/tools/make/Makefile TARGET=rpi TARGET_ARCH=armv6 CC=${CC_PREFIX}gcc CXX=${CC_PREFIX}g++ AR=${CC_PREFIX}ar

其中,-j 后的数字代表多线程编译的线程数量; 

-f 后为指定的Makefile文件; 

TARGET为平台名称; 

TARGET_ARCH为平台架构; 

CC后接指定的gcc编译器; 

CXX后接指定的g++编译器;

AR后接指定的gnu-ar归档工具.

编译完毕后,会在your/path/to/tensorflow-2.4.1/tensorflow/lite/tools/make/目录下生成一个gen文件夹,里面存放有编译好的文件. 

7. 运行测试 

将gen/rpi_armv6/bin目录下生成的minimal可执行文件拷贝到rpi zero机器上去. 

不带参数直接执行,以及带参数(指定一个tflite模型)执行的输出如下: 

8. 其它 

  • 官网还给出了一个使用cmake(版本至少为3.16,要求比较高)编译tflite的教程,我这里实验失败了,cmake会卡在检查编译器一步,不知道什么问题: https://www.tensorflow.org/lite/guide/build_cmake_arm#build_for_raspberry_pi_zero_armv6 

  • 如果最后在rpi zero上执行时出现了illegal instruction错误,请检查你的交叉编译工具.建议使用文章中提供的6.5.0版本的工具,如果用的是最新的arm-linux-gnueabihf工具,可能会报错. 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

X86_64 Ubuntu为树莓派zero(armv6)交叉编译tensorflow-lite 的相关文章

  • 如何在 Keras 中将多个数据集与一个模型一起使用?

    我正在尝试使用 LSTM 网络通过 Keras 和 Tensorflow 进行外汇预测 我当然希望它能够在很多天的交易中进行训练 但要做到这一点 我必须给它提供具有大跳跃和无运动阶段的连续数据 当市场收盘时 这并不理想 因为它变得由于这些跳
  • TensorFlow:有没有办法将冻结图转换为检查点模型?

    可以将检查点模型转换为冻结图 ckpt 文件转换为 pb 文件 但是 是否有反向方法将 pb 文件再次转换为检查点文件 我想它需要将常量转换回变量 有没有办法将正确的常量识别为变量并将它们恢复回检查点模型 目前支持将变量转换为常量 http
  • 无法将大小为 1665179 的数组重塑为形状 (512,512,3,3)

    该脚本用于进行检测 权重文件是 yolov4 coco 预训练模型 可以在这里找到 https drive google com file d 1cewMfusmPjYWbrnuJRuKhPMwRe b9PaT view https dri
  • Keras 通过设置种子获得不同的结果[重复]

    这个问题在这里已经有答案了 在keras中 每次运行都有很高的方差和不稳定的性能 为了解决这个问题 根据https keras io getting started faq how can i obtain reproducible res
  • 将 Docker 与具有 Node-gyp 依赖项的 Nodejs 一起使用

    我计划使用 Docker 部署 node js 应用程序 该应用程序有几个需要node gyp的依赖项 Node gyp 根据交付平台上的编译库构建这些模块 例如 canvas lwip qrcode 根据我的经验 这些构建可能高度依赖于操
  • Native TF 与 Keras TF 性能比较

    我使用本机和后端张量流创建了完全相同的网络 但在使用多个不同参数进行了多个小时的测试后 仍然无法弄清楚为什么 keras 优于本机张量流并产生更好 稍微但更好 的结果 Keras 是否实现了不同的权重初始化方法 或者执行除 tf train
  • 预训练 inception v3 模型的层名称(tensorflow)[重复]

    这个问题在这里已经有答案了 任务是获取a的每层输出预训练的 cnn inceptionv3 https www tensorflow org versions master tutorials image recognition index
  • 在 keras 中集成采样的 softmax 失败

    基于如何在 Keras 模型中使用 TensorFlow 的采样 softmax 损失函数 https stackoverflow com questions 47892380 how can i use tensorflows sampl
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 按字节数对向量进行混洗

    有什么办法可以左移 v 0 gt v 1 a m128i by n字节 其中n仅在运行时才知道 我目前仅限于 AVX1 但如果 AVX2 512 使这变得更容易 我非常感兴趣 I found mm bslli si128 m128i imm
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • Apache 反向代理的基本身份验证问题

    我想为在 Ubuntu 服务器 12 04 1 上运行的 Apache 反向代理站点添加基本身份验证 网络应用程序是Jenkins http jenkins ci org运行在 Java EE 容器上 我在中添加了以下配置httpd con
  • scikit-learn 和tensorflow 有什么区别?可以一起使用它们吗?

    对于这个问题我无法得到满意的答案 据我了解 TensorFlow是一个数值计算库 经常用于深度学习应用 而Scikit learn是一个通用机器学习框架 但它们之间的确切区别是什么 TensorFlow 的目的和功能是什么 我可以一起使用它
  • 对于只有 10000 个单词的字典来说,真正需要什么嵌入层 output_dim?

    我正在训练一个 RNN 其单词特征集非常少 大约 10 000 个 我计划在添加 RNN 之前从嵌入层开始 但我不清楚真正需要什么维度 我知道我可以尝试不同的值 32 64 等 但我宁愿先有一些直觉 例如 如果我使用 32 维嵌入向量 则每
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • 在 Ubuntu 中执行 .cgi 文件

    我在 Ubuntu 下运行 Apache PHP 当我运行 cgi 文件时 通过http localhost mycgi cgi 浏览器将显示代码而不是运行它 如何让浏览器执行 CGI 文件而不是显示其内容 将这些行添加到您的 apache
  • 带有 CUDA 的 Tensorflow:导入错误

    我已经按照 NVIDIA 教程中的说明一步步安装了 TensorFlow Ubuntu 16 04 桌面版 GTX 970 http www nvidia com object gpu accelerated applications te
  • 无法加载动态库“libcudart.so.11.0”;

    我尝试将 Tensorflow 2 7 0 与 GPU 结合使用 但我不断遇到同样的问题 2022 02 03 08 32 31 822484 W tensorflow stream executor platform default ds
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 异常:加载数据时 URL 获取失败

    我正在尝试设置我的机器来运行 Tensorflow 2 我从未使用过 Tensorflow 只是下载了 Python 3 7 我不确定这是否是我的机器的问题 我按照上面列出的安装说明进行操作TensorFlow 的网站 https www

随机推荐

  • 思维导图——机器人制作知识框架

    最近整理了制作水下机器人所需知识 xff0c 大致画了个思维导图 xff0c 方便以后学习 xff0c 理清思路 xff0c 不足之处请大神多多指点 xff0c 后面会不断完善
  • C#项目创建和项目中的组成部分

    本文介绍C 在VS中新建的步骤已经各组成部分 操作流程 1 1 新建一个C 项目 新建C 项目如下所示 xff1a 1 2 C 项目组成介绍 1 2 1 Properties 存放资源文件和成员集属性用的 一般也不去修改 Propertie
  • SQL语句之分组查询--GROUP BY(group by)

    SQL语句之分组查询 GROUP BY xff08 group by xff09 语法 span class token keyword select span 聚合函数 xff0c 列 xff08 要求出现在 span class tok
  • W: GPG error: http://ppa.launchpad.net trusty InRelease: ...NO_PUBKEY 5BB92C09DB82666C

    运行 sudo apt get update 时 xff0c 出现W GPG error http ppa launchpad net trusty InRelease The following signatures couldn 39
  • VIM文本替换命令

    1 替换当前行中的内容 xff1a s from to xff08 s即substitude xff09 s from to xff1a 将当前行中的第一个from xff0c 替换成to 如果当前行含有多个from xff0c 则只会替换
  • Windows10下Linux子系统Ubuntu使用教程(9)——pip和pip3的安装、升级及卸载,解决升级后遇到的问题

    一 pip安装 升级及卸载 安装 span class token function sudo span span class token function apt get span span class token function in
  • c++结构体中数组的使用_C中的数组

    c 43 43 结构体中数组的使用 In C language arrays are reffered to as structured data types An array is defined as finite ordered co
  • 互联网红利之道-流量变现

    目录 流量从哪里来 有了流量之后怎样变现 互联网发展迅猛的今天 xff0c 互联网平台涌现 xff0c 不论是随着发展壮大至今的平台 xff0c 还是在发展的路径中展现过光芒的平台 xff0c 流量变现无疑是互联网红利的一个极其重要的红利通
  • 安装完anaconda后输入conda没有反应

    根据网上的教程成功安装了anaconda xff0c anaconda安装 但出现了conda没有反应的情况 xff0c 按照教程进入vim bashrc输入了export PATH 61 anaconda3 bin PATH也没有解决 经
  • Flink 读取Kafka数据示例

    1 目标 本例模拟中将集成Kafka与Flink xff1a Flink实时从Kafka中获取消息 xff0c 每隔10秒去统计机器当前可用的内存数并将结果写入到本地文件中或者打印出来 2 环境 Apache Kafka 0 11 0 0
  • C语言 N个人围圈报数,数到3退出

    有n个人围成一圈 xff0c 顺序排号 从第一个人开始报数 从1到3报数 xff0c 凡是报到3的人退出圈子 xff0c 问最后留下来的是原来的第几位 xff08 指针方法处理 xff09 C语言 include lt stdio h gt
  • 怎么解决编译时出现的“undefined reference to `xxx`”错误

    编译的时候 xff0c 偶尔会碰到 undefined reference to 96 xxx function 的错误 xff0c 遇到这种问题怎么解决呢 xff1f 怎么解决 xff1f 首先我们需要知道 xff0c 出现这样现象的时候
  • c语言数据排序的三种方法

    数据排序的三种方法 1 xff0c 比较排序法 设有数组a N 将数组元素a i i 61 0 1 2 N 2 分别与其后的每一个元素a j j 61 i 43 1 n 1 逐个比较 xff0c 若有a i gt a j 升序 xff09
  • Python 计算两个日期相差的天数

    有时候需要算两个日期相差多少天 xff0c 如果两个日期相差大 xff0c 真的去数肯定很麻烦 xff0c 还得计算有的是有三十天 xff0c 有的是三十一天 xff0c 还有闰年和平年的区别 而这时候如果有一个方法或者函数 xff0c 只
  • QT6安装教程(兼容QT5、QT4)

    QT安装教程 1 QT简介 QT是一个跨平台的C 43 43 图形用户界面库 xff0c 由挪威TrollTech公司出品 xff0c 目前包括Qt Creator xff0c QtEmbedded xff0c Qt Designer快速开
  • python获取日期之间的间隔天数

    python获取日期之间的间隔天数 python获取日期之间的间隔天数 python获取日期之间的间隔天数 span class token keyword import span datetime span class token com
  • 学习python正则表达式的可视化网站

    https regexr com 非常好用 xff0c 适合学习与验证正则表达式的效果 可以层次化地显示正则表达式的匹配过程 xff0c 也可以自定义匹配的flag参数 xff08 任意匹配 全匹配等 xff09
  • JavaScript正则表达式运算

    Regular expression is the language to define specific pattern for text data Javascript supports regular expression Regul
  • python正则表达式完全匹配

    a z A Z 0 9 12 表示句首 xff0c 表示句尾 xff0c 加上这两个符号就要求整句话必须符合正则表达式的结构 上面的表达式用于匹配十二位的含字母学号 xff0c 并且仅能匹配十二位的含字母学号 如果在十二位的含字母学号之后附
  • X86_64 Ubuntu为树莓派zero(armv6)交叉编译tensorflow-lite

    警告 Tensorflow官方在2021年8月份废弃了通过Makefile构建tflite的方式 从Tensorflow 2 7 0开始 xff0c 官方只提供使用CMake或者Bazel构建tflite的支持 本教程正是基于Makefil