tag 标签: iMX8

相关帖子
相关博文
  • 热度 2
    2021-4-23 15:18
    312 次阅读|
    1 个评论
    By Toradex 秦海 1). 简介 基于类似 NXP iMX8 这样性能强劲的 ARM 平台处理器,越来越多的工业智能 / 机器人应用比如 AGV/AMR 产品控制器在 ARM 平台上面实现,在这个过程中不可避免的就涉及到将机器人应用开发框架移植到 ARM 平台来运行,因此本文就着重示例基于 Ycoto Project/Openembedded 环境,将 ROS ( Robot Operating System )编译集成到嵌入式 Linux 中运行。 ROS 是一种为机器人应用设计的分布式处理框架,集成了大量相关库和工具,目的是为了提高机器人应用开发时代码复用率 , 目前 ROS 已经发展到 ROS2 ,这里就演示将 ROS2 最新版本 Foxy 集成到 iMX8 Linux BSP 中。 本文的演示的平台来自于 Toradex Apalis iMX8 ARM 嵌入式平台,这是一个基于 NXP iMX8QM ARM 处理器,支持 Cortex-A72+A53 和 Coretex-M4 架构的计算机模块平台。 2). 准备 a). Apalis iMX8QM 4GB WB IT ARM 核心版配合 Ioxra 载板 ,连接调试串口 UART1 (载板 X22 )到开发主机方便调试。 3). Apalis iMX8 Ycoto Linux 集成 ROS2 编译环境配置和部署 a). Apalis iMX8 Ycoto Linux 通过 Ycoto/Openembedded 框架编译,具体的配置方法请参考 这里 ,首先下载好针对 Apalis iMX8 适用的基于 Ycoto Dunfeil 版本的 BSP 5.x.y 编译环境。 ---------------------------------- $ repo init -u https://git.toradex.com/toradex-manifest.git -b dunfell-5.x.y -m tdxref/default.xml $ repo sync ---------------------------------- b). 下载 meta-ros 和 meta-python2 layer 到上面下载好的 ycoto 环境 ---------------------------------- $ cd …/oe-core/layers/ ### fetch meta-ros layer $ git clone -b dunfell https://github.com/ros/meta-ros.git ### fetch meta-phthon2 layer $ git clone -b dunfell https://github.com/YoeDistro/meta-python2.git ---------------------------------- c). 配置编译环境,添加编译 ROS2 Foxy 版本需要的相关 layer ,由于目前 ycoto 编译 ROS 还无法支持图形界面相关,因此也要在编译环境中将相关的 package 排除出去。 ./ 添加环境变量 ---------------------------------- ### generate init env $ cd …/oe-core/ $ source export ### add new env $ export ROS_OE_RELEASE_SERIES="dunfell" ### make new env valid with bitbake $ export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE ROS_OE_RELEASE_SERIES" ---------------------------------- ./ 修改 build/conf/bblayers.conf 文件 ---------------------------------- ${TOPDIR}/../layers/meta-freescale-distro \ ${TOPDIR}/../layers/meta-toradex-demos \ ${TOPDIR}/../layers/meta-qt5 \ + ${TOPDIR}/../layers/meta-python2 \ + ${TOPDIR}/../layers/meta-ros/meta-ros2-foxy \ + ${TOPDIR}/../layers/meta-ros/meta-ros2 \ + ${TOPDIR}/../layers/meta-ros/meta-ros-common \ + ${TOPDIR}/../layers/meta-ros/meta-ros-backports-gatesgarth \ \ \ ${TOPDIR}/../layers/meta-toradex-distro \ ---------------------------------- ./ 修改 build/conf/local.conf 文件 ---------------------------------- ### modify machine setting to apalis imx8 MACHINE ?= "apalis-imx8" ### add ros-core only or ros-world packagegroup for all ros2-foxy packages IMAGE_INSTALL_append = " packagegroup-ros-world" ### blacklist below packages which currently not supported in ycoto compilation ### detailed impact package refer to \ /layers/meta-ros/meta-ros2-foxy/conf/ros-distro/include/foxy/ros-distro-recipe-blacklist.inc and \ layers/meta-ros/meta-ros2-foxy/recipes-core/packagegroups/packagegroup-ros-world-foxy.bb files ROS_WORLD_SKIP_GROUPS = " opengl qt5 qt5-widgets pyqt5 qt-gui-cpp x11 ffmpeg webots-python-modules java libomp connext gazebo coinor-libipopt gurumdds ignition doosan-robot2 clang launch pugixml lanelet2-traffic-rules mongodb kobuki-ftdi ros1" ### define package graphviz version PREFERRED_VERSION_graphviz = "2.40.1%" ### accept freescale EULA license ACCEPT_FSL_EULA = "1" ---------------------------------- ./ 修改 layers/meta-ros/meta-ros2-foxy/recipes-bbappends/osqp-vendor/osqp-vendor_0.0.2-1.bbappend 文件修复当前版本中的 bug ---------------------------------- -SRCREV_osqp = "c536acf012d071eed3529e0147afdd419348362a" +SRCREV_osqp = "36ad83aed022e714c2fda1f13138443150435994" SRCREV_qdldl = "12d56ee6b9494efee1da1e1dc6e7ac9c226f9ccf" ---------------------------------- d). 编译 image 和 SDK ------------------------------- # compile Reference-Minimal image $ bitbake bitbake tdx-reference-minimal-image # compile Reference-Multimedia image $ bitbake bitbake tdx-reference-multimedia-image # compile SDK bitbake tdx-reference-multimedia-image -c populate_sdk ------------------------------- e). Ycoto Linux image 部署 参考 这里 通过 Toradex Easy installer 将上面编译好的 image 更新部署到模块,目前最新季度发布版本为 Ycoto Linux V5.2 ,这里使用 Reference-Minimal BSP image 进行测试 4). ROS2 Foxy 测试 a). 修改 ROS 初始化相关脚本权限,增加执行权限 ------------------------------- root@apalis-imx8:~# chmod +x /etc/profile.d/ros/* root@apalis-imx8:~# ls -al /etc/profile.d/ros/setup.sh -rwxr-xr-x 1 root root 4372 Mar 9 2018 /etc/profile.d/ros/setup.sh ------------------------------- b). 通过下面命令进行 ROS2 Foxy 简单测试 ------------------------------- ### check network connection root@apalis-imx8:~# ping lge.com ### source setup script to export env root@apalis-imx8:~# source /usr/bin/ros_setup.sh ### ros topic print root@apalis-imx8:~# ros2 topic list /parameter_events /rosout ### ros interface print root@apalis-imx8:~# ros2 interface list -m …… ### test root@apalis-imx8:~# (sleep 5; ros2 topic pub /chatter std_msgs/String "data: Hello world") & 826 root@apalis-imx8:~# ros2 topic echo /chatter publisher: beginning loop publishing #1: std_msgs.msg.String(data='Hello world') publishing #2: std_msgs.msg.String(data='Hello world') publishing #3: std_msgs.msg.String(data='Hello world') publishing #4: std_msgs.msg.String(data='Hello world') data: Hello world --- publishing #5: std_msgs.msg.String(data='Hello world') data: Hello world …… ------------------------------- 5). 总结 本文基于 NXP iMX8 嵌入式平台演示了通过 Ycoto Project/Openembedded 框架将 ROS2 Foxy 集成到嵌入式 Linux BSP 中,目前 meta-ros layer 除了 Foxy ,还支持 ROS1 melodic , ROS1 noetic , ROS2 dashing , ROS2 eloquent ,其他 ROS 版本可以自行根据所需要的 layer 不同而适应修改后编译。 参考文献 https://github.com/ros/meta-ros/wiki/OpenEmbedded-Build-Instructions https://developer.toradex.cn/knowledge-base/board-support-package/openembedded-core
  • 热度 1
    2021-4-22 15:06
    294 次阅读|
    1 个评论
    By Toradex胡珊逢 Visual Studio Code在软件开发领域具有十分广泛的应用,其支持多种编程语言,丰富的插件极大得提高了开发效率,同时这也是一个非常开放的平台。本文接下来将介绍如何在Visual Studio Code中使用Yocto Project生成的Linux SDK,并针对Arm处理器进行C/C++应用交叉编译和调试。 首先使用 Yocto Project生成SDK ,我们这里以Apalis iMX8上的minimal console image为例,其对应的SDK为tdx-xwayland-glibc-x86_64-Reference-Minimal-Image-aarch64-apalis-imx8-toolchain-5.2.0.sh。直接运行该文件,将其安装到Linux电脑上,例如/home/ben/Toradex/LinuxDevelop/LinuxSDK/v5/arm64路径下。 然后参考 这里的说明 在Linux电脑上安装Visual Studio Code。在Extension中安装一些常用的插件,如C/C++,C++ Intellisense,Makefile Creator等。 Visual Studio Code并不像Visual Studio,后者集成了完整的代码编辑、编译和调试工具,Visual Studio Code则提供了相应的框架,根据具体使用的编程语言和用户习惯来实现对应的步骤或者任务。当然也有很多公司、组织或者个人提供现成的插件,这简化了配置任务。目前Visual Studio Code还没有现成的插件可以直接使用Yocto Project生成的Linux SDK,因此我们通过直接配置JSON文件,制定相应的编译和调试步骤。 vscode-tdxlinux 是配置好的例程,接下来我们将对其中配置进行说明,以及介绍使用方法。 下载上面的例程后,在文件夹中会有下面文件。 hello.c是一个演示代码,Makefile是编译规则文件,.vscode文件夹中四个json文件即用于配置Visual Studio Code。 c_cpp_properties.json env中包含一些自定义的变量,例如SDK版本,开发板名字,以及SDK根目录。可以用$符号对其引用,例如${env.sdkroot}引用SDK根目录。 configurations中是Visual Studio Code规定的一些设置。includePath包含项目编译用的头文件所在目录,这里包括SDK中文件系统里和gcc本身的头文件。browse是浏览头文件时可以查找的目录,常用于VS Code编写代码时用Go To Definition打开对应文件。defines预定义一些宏,__linux__:指定目标系统为Linux,__aarch64__:目标处理器为64bit Arm。intelliSenseMode将IntelliSense Mode映射到对应的平台和处理器构架,Apalis iMX8是64位处理器,所以这里选择linux-gcc-arm64。这里的配置还可以通过ctl+shift+p组合键盘选择UI方式来配置。 settings.json 这里定了一些变量,其他文件可以通过${config:var}来引用,例如${config:tdxlinuxsdk.sdkroot}。 tasks.json 这里配置了编译相关的任务。 env配置GCC编译工具,编译参数等,这部分内容来自SDK的environment-setup-aarch64-tdx-linux文件。 Run Build Task调用相关任务。 launch.json 这里配置调试方法。 嵌入式Linux通过使用gdb调试C/C++应用。在configurations中MIMode为gdb,miDebuggerPath为gdb所在目录,这是SDK中包含的软件。 customLaunchSetupCommands是gdb具体执行步骤。首先使用gdb的target remote extend-remote连接IP为192.168.20.91的目标设备即Apalis iMX8,端口为1234。第二步remote put将本地编译好的hello二进制文件上传到Apalis iMX8。最后在main函数处设置一个断点。通过上面设置,点击VS Code中的debug即可进入调试。上面的每个步骤同样可以根据项目或者用户习惯调整。下面我们将演示从编译到调试的流程。 按组合键ctrl+shift+b选择TdxLinux SDK Make. 编译完成后可以通过file命令查看hello程序的格式属性,ARM aarch64格式。 查看Apalis iMX8的IP地址。192.168.20.97也是launch.json中设置的IP。 在Apalis iMX8上运行gbdserver程序,侦听端口为1234。 在hello.c程序的printf函数设置一个断点。 点击VS Code中的调试按键。 点击step over进行单步调试。 在Apalis iMX8调试串口中可以看到执行结果。 总结 上面是VS Code交叉编译和调试的简单介绍,提供了Eclipse之外的另一种开发环境。用户可以重新调整配置文件,并配合其他插件如Makefile Creator实现个性化的IDE。 ​
  • 热度 1
    2021-4-22 12:21
    289 次阅读|
    1 个评论
    By Toradex胡珊逢 本文将介绍如何将 Ubuntu 系统移植到 Toradex Apalis iMX8 计算机模块上。该方法也同样使用与其他使用 eMMC 作为存储介质的模块,例如 Colibri、Verdin 模块。撰写文章时 Toradex 发布的最新 Linux BSP 是 5.2.0,Ubuntu 为 20.04 LTS 和 20.10。为了获得更好的支持,建议使用新的Linux BSP。这里涉及的 Ubuntu 分为两类,Ubuntu 20.04 Base 是不带任何图形界面的 console 镜像。Ubuntu 20.10 desktop 使用了 Ubuntu 自带的桌面环境,如Gnome。 首先在电脑上安装 qemu-user-static 软件仿真 arm64 运行环境。 $ sudo apt install qemu-user-static Ubuntu 20.04 Base 首先下载 Apalis iMX8 模块的 Linux BSP。 https://artifacts.toradex.com/artifactory/tdxref-oe-prod-frankfurt/dunfell-5.x.y/release/7/apalis-imx8/tdx-xwayland/tdx-reference-minimal-image/oedeploy/Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7.tar 解压文件。 $ tar vxf Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7.tar 提取 Linux BSP 中的文件系统到 rootfs 目录,里面包含一些模块的驱动和固件,稍后需要用到。 $ mkdir rootfs $ cd Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7 $ sudo tar vxf Reference-Minimal-Image-apalis-imx8.tar.xz -C ../rootfs 下载 arm64 格式的 Ubuntu base 20.04.2 文件系统。 http://cdimage.ubuntu.com/ubuntu-base/releases/20.04.2/release/ubuntu-base-20.04.2-base-arm64.tar.gz 解压 Ubuntu 文件系统到ubuntu 文件夹中。 $ mkdir ubuntu $ sudo tar vxf ubuntu-base-20.04.2-base-arm64.tar.gz -C ubuntu/ 执行下面脚本 ch-mount.sh,切换到 Ubuntu 目录中运行并安装软件。 $ chmod +x ./ch-mount.sh $ sudo ./ch-mount.sh -m ubuntu/ 设置 DNS 服务器,在线安装一些基本组件。这里页可以自行添加所需的其他软件。 /etc/resolv.conf # apt update # apt upgrade # apt install language-pack-en-base sudo ssh net-tools \ network-manager netplan.io iputils-ping rsyslog \ bash-completion htop resolvconf dialog \ vim nano alsa-utils gcc \ less resolvconf autoconf autopoint libtool \ bison flex libglib2.0-dev libpango1.0-dev libatk1.0-dev kmod pciutils -y 添加用户,如用户名ubuntu,并为ubuntu 和 root 用户设置密码。 # useradd -s '/bin/bash' -m -G adm,sudo ubuntu # passwd ubuntu # passwd root 设置主机名称。 /etc/hostname 将ttymxc0 用于默认的调试串口。 # systemctl enable serial-getty@ttymxc0.service 清除缓存。 # apt autoclean # exit 卸载 ubuntu 目录。 $ sudo ./ch-mount.sh -u ubuntu/ 这里采用netplan 作为有线网络管理工具。将相应的 yaml 配置文件复制到 ubuntu/etc/netplan 目录。这里提供两个配置文件供参考,分别为动态和静态IP 设置。 $ sudo cp 00-installer-config.yaml ubuntu/etc/netplan/ 将 Linux BSP 中的内核驱动、固件和 fstab 复制到 Ubuntu 文件系统中。 $ sudo mkdir -p ubuntu/lib/modules $ sudo cp -Ppr rootfs/lib/modules/* ubuntu/lib/modules/ $ sudo cp -Ppr rootfs/lib/firmware/* ubuntu/lib/firmware/ $ sudo rm ubuntu/etc/fstab $ sudo cp rootfs/etc/fstab ubuntu/etc/ 重新打包 Ubuntu 文件系统,用于Toradex Easy Installer 安装。 $ cd ubuntu/ $ sudo tar cvf ../ubuntu.tar . $ xz -T0 ubuntu.tar 将生成的 ubuntu.tar.xz 复制到之前解压的 Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7 目录中 $ cp ubuntu.tar.xz Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7 修改 image.json 文件。 ​ filename 为生成的 ubuntu.tar.xz。 uncompressed_size 为 ubuntu 目录大小,单位 MB,可以使用下面命令查看。 $ sudo du -sm ubuntu 至此,可以将 Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7 复制到 U 盘进行安装。 Ubuntu 20.10 desktop 首先下载 Apalis iMX8 模块的 Linux BSP。 https://artifacts.toradex.com/artifactory/tdxref-oe-prod-frankfurt/dunfell-5.x.y/release/7/apalis-imx8/tdx-xwayland/tdx-reference-minimal-image/oedeploy/Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7.tar 解压文件。 $ tar vxf Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7.tar 提取 Linux BSP 中的文件系统到 rootfs 目录,里面包含一些模块的驱动和固件,稍后需要用到。 $ mkdir rootfs $ cd Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7 $ sudo tar vxf Reference-Minimal-Image-apalis-imx8.tar.xz -C ../rootfs 这里使用 Ubuntu 首次针对 raspi Arm64 处理器发布的 Ubuntu 20.10 桌面系统。下载镜像文件并解压。 $ wget https://cdimage.ubuntu.com/releases/20.10/release/ubuntu-20.10-preinstalled-desktop-arm64+raspi.img.xz $ xz -d ubuntu-20.10-preinstalled-desktop-arm64+raspi.img.xz ubuntu-20.10-preinstalled-desktop-arm64+raspi.img 原本是为 raspi 直接烧录 SD 使用,其中包括了 u-boot、Linux kernel、device tree 等文件,但我们只需要使用其文件系统即可。使用 fdisk 命令查看 img 文件中文件系统位置。 $ fdisk -l ubuntu-20.10-preinstalled-desktop-arm64+raspi.img Disk ubuntu-20.10-preinstalled-desktop-arm64+raspi.img: 8.15 GiB, 8750736384 bytes, 17091282 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xb6b5c3c7 Device Boot Start End Sectors Size Id Type ubuntu-20.10-preinstalled-desktop-arm64+raspi.img1 * 2048 526335 524288 256M c W95 FAT32 (LBA) ubuntu-20.10-preinstalled-desktop-arm64+raspi.img2 526336 17091247 16564912 7.9G 83 Linux img2 是 Ubuntu 文件系统,其起始偏移地址为 526336,注意这里的单位是 sector。换算为字节是 526336 * 512 = 269484032。使用 mount 命令挂载时 offset=269484032 $ mkdir ubuntu $ sudo mount -o loop,offset=269484032 ubuntu-20.10-preinstalled-desktop-arm64+raspi.img ubuntu/ 删除以下文件。 $ cd ubuntu $ sudo rm -rf boot $ sudo rm etc/fstab $ sudo rm -rf lib/modules/* $ cd .. 执行下面脚本 ch-mount.sh,切换到 ubuntu 目录中运行。 $ chmod +x ./ch-mount.sh $ sudo ./ch-mount.sh -m ubuntu/ 将ttymxc0 用于默认的调试串口。 # systemctl enable serial-getty@ttymxc0.service 删除下面软件。 # apt remove u-boot-rpi flash-kernel # exit 卸载 ubuntu 目录。 $ sudo ./ch-mount.sh -u ubuntu/ 将 Linux BSP 中的内核驱动、固件和 fstab 复制到 Ubuntu 文件系统中。 $ sudo cp -Ppr rootfs/lib/modules/* ubuntu/lib/modules/ $ sudo cp -Ppr rootfs/lib/firmware/* ubuntu/lib/firmware/ $ sudo rm ubuntu/etc/fstab $ sudo cp rootfs/etc/fstab ubuntu/etc/ 注释掉 fstab 中 /dev/boot-part 挂载路径。 $ vi ubuntu/etc/fstab # stock fstab - you probably want to override this with a machine specific one /dev/root / auto noatime 1 1 #/dev/boot-part /boot auto noatime,noauto 0 0 重新打包 Ubuntu 文件系统,用于Toradex Easy Installer 安装。 $ cd ubuntu/ $ sudo tar cvf ../ubuntu-desktop.tar . $ xz -T0 ubuntu-desktop.tar 将生成的 ubuntu-desktop.tar 复制到之前解压的 Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7 目录中 $ cp ubuntu-desktop.tar Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7 修改 image.json 文件。 ​ filename 为生成的 ubuntu-desktop.tar。 uncompressed_size 为 ubuntu 目录大小,单位 MB,可以使用下面命令查看。 $ sudo du -sm ubuntu 至此,可以将 Apalis-iMX8_Reference-Minimal-Image-Tezi_5.2.0+build.7 复制到 U 盘进行安装。在安装完毕后需要连接 HDMI 显示器、键盘和鼠标。首次启动时,Ubuntu 系统会进入用户设置界面,如时区、用户名和密码等配置。期间可能会遇到错误,但可以关闭错误窗口。然后在调试串口中使用刚才设置的用户名和密码登录,运行 sudo reboot 重新启动即可。 ​
  • 热度 4
    2021-3-16 17:26
    582 次阅读|
    0 个评论
    By Toradex胡珊逢 NXP i.MX8QM/QP处理器能够支持2路4 lane的MIPI CSI-2输入,每路最高为4K@30分辨率。文章接下来将使用Apalis iMX8QM计算机模块配合e-con提供的MIPI CSI-2摄像头AR0521进行演示。 E-con MIPI CSI-2摄像头 AR0521 最高像素2592 × 1944@28fps,模组集成ISP。摄像头可以直接连接 Ixora 底板,连接方式如下。线材的卡扣很精密,安装时请小心操作。同时接触摄像头模组前,务必释放上手的静电,如触摸接地设备的金属机壳。 Apalis iMX8QM的Linux BSP对摄像头提供无缝集成,只需简单的设置即可使用。这里我们使用Toradex最新的 nightly image 。由于摄像头需要使用gstreamer组件,tdx-reference-multimedia-image参考镜像包含了常用多媒体软件,该镜像可以直接用于测试摄像头。使用 Toradex Easy Installer 进行镜像安装。 安装完毕后修改计算机模块上的/boot/overlays.txt文件,通过device tree overlay启动AR0521。在overlays.txt中添加apalis-imx8_ar0521_overlay.dtbo。 关闭tdx-reference-multimedia-image开机自启动的Qt演示程序。 重启后可以看到AR0521被正确识别。 l查看摄像头支持的格式 l预览摄像头画面 此时可能需要旋转摄像头上镜头进行对焦,直到清晰地看到拍摄物体。 l录制摄像 可以将test.avi视频文件复制到电脑上,使用mediainfo命令查看该文件的视频信息。 Gstreamer pipeline还可以支持zero-copy方式处理数据。借助zero-copy CPU能够使用一个element产生的数据而无需重新复制,从而有效降低CPU负荷。使用io-mode参数开启zero-copy,io-mode=dmabuf会使用硬件DMA。更多的说明请参考 i.MX 8 GStreamer User Guide 。 两种模式下CPU占用率从101.7%下降到10.6%。 l播放视频文件 播放上面录制的avi视频文件 lRTP网络传输 Apalis iMX8QM作为RTP服务器 Ubuntu电脑作为客户端查看视频。上面的PC_IP为电脑的IP地址。 总结 本文简要地介绍了在Apalis iMX8QM使用MIPI-CSI摄像头的方法。不同的摄像头通常需要对应的驱动,并根据摄像头参数调整gstreamer pipeline配置,从而实现高效的采集、编解码、传输和存储。 ​
  • 热度 3
    2021-3-11 14:23
    777 次阅读|
    1 个评论
    By Toradex秦海 1). 简介 随着嵌入式处理器性能的提升甚至一些嵌入式处理器已经开始集成针对人工智能和机器学习的硬件加速单元NPU,机器学习应用在嵌入式边缘设备的应用也慢慢展现。为此,NXP也发布了eIQ for i.MX软件工具包,用于在NXP的i.MX系列嵌入式处理器上面来支持目前比较常见的各种机器学习推理引擎,比如TensorFlow、Caffe等,具体的支持情况可以参考下图,其中ArmNN、TensorFlowLite、ONNX可以支持GPU/NPU硬件加速,而OpenCV和PyTorch目前只支持在CPU运行。 ​ NXP eIQ协议栈通过Neural Network Runtime (NNRT)模块来对不同的前端Runtime进行硬件加速支持,具体的架构可以参考下图,对于很多机器学习算法场景,通过硬件加速引擎可以很大提升算法推理性能。 ​ 本文的演示的平台来自于Toradex Apalis iMX8 ARM嵌入式平台,这是一个基于NXP iMX8QM ARM处理器,支持Cortex-A72+A53和Coretex-M4架构的计算机模块平台。 2). 准备 a). Apalis iMX8QM 4GB WB IT ARM核心版配合 Ioxra载板 ,连接调试串口UART1(载板X22)到开发主机方便调试。载板连接HDMI显示器。 3). Apalis iMX8 Ycoto Linux 编译部署以及配置 a). Apalis iMX8 Ycoto Linux通过Ycoto/Openembedded框架编译,具体的配置方法请参考 这里 ,参考如下修改后编译Reference-Multimedia image镜像 ./ iMX8 Ycoto layer中默认没有包含NXP Machine Learning和OpenCV 4.4.0版本支持,因此首先需要通过下面修改添加相关layer,详细的NXP Ycoto指南请参考i.MX Yocto Project User's Guide Rev. L5.4.70_2.3.0 ------------------------------- ### download related layers from NXP official repository $ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-zeus -m imx-5.4.70-2.3.0.xml $ repo sync $ DISTRO=fsl-imx-wayland MACHINE=imx8qmmek source imx-setup-release.sh -b build ### copy mechine learning layer meta-ml to Toradex ycoto environment $ cp -r …/sources/meta-imx/meta-ml …/oe-core/layers/ ### modify meta-ml layer …/layers/meta-ml/conf/layer.conf file to support ycoto dunfell --- a/layers/meta-ml/conf/layer.conf 2021-03-03 15:50:59.718815084 +0800 +++ b/layers/meta-ml/conf/layer.conf 2021-03-03 16:55:46.791158625 +0800 @@ -8,4 +8,4 @@ BBFILE_COLLECTIONS += "meta-ml" BBFILE_PATTERN_meta-ml := "^${LAYERDIR}/" BBFILE_PRIORITY_meta-ml = "8" -LAYERSERIES_COMPAT_meta-ml = "warrior zeus" +LAYERSERIES_COMPAT_meta-ml = "warrior zeus dunfell" ### copy opencv 4.4.0 related to Toradex ycoto environment $ cp -r …/sources/meta-imx/meta-bsp/recipes-support/opencv/ …/oe-core/layers/meta-toradex-nxp/recipes-support/opencv/ ### modify build/conf/bblayer.conf to add above extra layers --- a/build/conf/bblayers.conf +++ b/build/conf/bblayers.conf @@ -24,6 +24,9 @@ ${TOPDIR}/../layers/meta-openembedded/meta-python \ ${TOPDIR}/../layers/meta-freescale-distro \ ${TOPDIR}/../layers/meta-toradex-demos \ + ${TOPDIR}/../layers/meta-ml \ ${TOPDIR}/../layers/meta-qt5 \ \ \ ------------------------------- ./修改local.conf,增加mechine learning相关支持 ------------------------------- ### add python and opencv support ### +IMAGE_INSTALL_append = " python3 python3-pip opencv python3-opencv python3-pillow" ### add eIQ support ### +IMAGE_INSTALL_append = " arm-compute-library nn-imx tensorflow-lite armnn onnxruntime" +PACKAGECONFIG_append_pn-opencv_mx8 = " dnn jasper qt5 test" ### remove opencl conflict ### +PACKAGECONFIG_remove_pn-opencv_mx8 = "opencl" +PACKAGECONFIG_remove_pn-arm-compute-library = "opencl" ### option, add onnxruntime and armnn dev support to SDK ### +TOOLCHAIN_TARGET_TASK_append += " onnxruntime-dev armnn-dev " ACCEPT_FSL_EULA = "1" ------------------------------- ./编译image和SDK ------------------------------- # compile Reference-Multimedia image $ bitbake bitbake tdx-reference-multimedia-image # compile SDK bitbake tdx-reference-multimedia-image -c populate_sdk ------------------------------- b). Ycoto Linux image部署 参考 这里 通过Toradex Easy installer将上面编译好的image更新部署到模块,目前最新稳定版本为Ycoto Linux V5.1,最新测试版本为Ycoto Linux V5.2 4). TensorFlow Lite 测试 a). NXP iMX8 eIQ TensorFlow Lite支持特性和协议栈框图如下 ./ TensorFlow Lite v2.3.1 ./ Multithreaded computation with acceleration using Arm Neon SIMD instructions on Cortex-A cores ./ Parallel computation using GPU/NPU hardware acceleration (on shader or convolution units) ./ C++ and Python API (supported Python version 3) ./ Per-tensor and Per-channel quantized models support ​ b).示例应用测试 ./ Image预装的TensorFlow Lite测试示例应用位置 /usr/bin/tensorflow-lite-2.3.1/examples ./基于mobilenet model测试“label_image”示例应用 ------------------------------- $ cd /usr/bin/tensorflow-lite-2.3.1/examples/ ### Run on CPU $ ./label_image -m mobilenet_v1_1.0_224_quant.tflite -i grace_hopper.bmp -l labels.txt Loaded model mobilenet_v1_1.0_224_quant.tflite resolved reporter invoked average time: 44.999 ms 0.780392: 653 military uniform 0.105882: 907 Windsor tie 0.0156863: 458 bow tie 0.0117647: 466 bulletproof vest 0.00784314: 835 suit ### Run with GPU acceleration $ ./label_image -m mobilenet_v1_1.0_224_quant.tflite -i grace_hopper.bmp -l labels.txt -a 1 Loaded model mobilenet_v1_1.0_224_quant.tflite resolved reporter INFO: Created TensorFlow Lite delegate for NNAPI. Applied NNAPI delegate. invoked average time: 13.103 ms 0.784314: 653 military uniform 0.105882: 907 Windsor tie 0.0156863: 458 bow tie 0.0117647: 466 bulletproof vest 0.00784314: 668 mortarboard ### TensorFlow Lite Python API predefined example script run, no option to choose CPU or GPU, run with GPU acceleration by default if libneuralnetworks.so or libneuralnetworks.so.1 is found in the /usr/lib directory, otherwise run on CPU $ python3 label_image.py INFO: Created TensorFlow Lite delegate for NNAPI. Applied NNAPI delegate. Warm-up time: 5052.5 ms Inference time: 12.7 ms 0.674510: military uniform 0.129412: Windsor tie 0.039216: bow tie 0.027451: mortarboard 0.019608: bulletproof vest ------------------------------- c).更多示例和benchmark测试,C++ API应用开发以及当前eIQ对于TensorFlow Lite不同模型的限制等更多信息可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 3 TensorFlow Lite,从上面简单测试可以看出NPU加速下mobilenet模型要比CPU运行性能更好。 5). Arm Compute Library 测试 a). ACL(ARM-Compute Library)是专为ARM CPU & GPU优化设计的计算机视觉和机器学习库,基于NEON & OpenCL支持的SIMD技术,但在iMX8平台目前只支持CPU NEON加速,另外因为其为ARM NN架构的计算引擎,因此一般来说建议直接使用ARM NN。NXP iMX8 eIQ ACL支持特性如下 ./ Arm Compute Library 20.02.01 ./ Multithreaded computation with acceleration using Arm Neon SIMD instructions on Cortex-A cores ./ C++ API only ./ Low-level control over computation b).示例应用测试 ./ Image预装的ACL测试示例应用位置 /usr/share/arm-compute-library/build/examples ./ MobileNet v2 DNN model,随机输入量测试 ------------------------------- $ cd /usr/share/arm-compute-library/build/examples $ ./graph_mobilenet_v2 Threads : 1 Target : NEON Data type : F32 Data layout : NHWC Tuner enabled? : false Cache enabled? : false Tuner mode : Normal Tuner file : Fast math enabled? : false Test passed ------------------------------- c).更多示例测试和参数说明可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 4 Arm Compute Library。 6). Arm NN 测试 a). Arm NN是适用于CPU,GPU和NPU的开源推理引擎,该软件桥接了现有神经网络框架(例如TensorFlow、TensorFlow Lite、Caffe或ONNX)与在嵌入式Linux平台上运行的底层处理硬件(例如CPU、GPU或NPU)。这样,开发人员能够继续使用他们首选的框架和工具,经Arm NN无缝转换结果后可在底层平台上运行,NXP iMX8 eIQ ARM NN支持特性和协议栈框图如下 ./ Arm NN 20.02.01 ./ Multithreaded computation with acceleration using Arm Neon SIMD instructions on Cortex-A cores provided by the ACL Neon backend ./ Parallel computation using GPU/NPU hardware acceleration (on shader or convolution units) provided by the VSI NPU backend ./ C++ and Python API (supported Python version 3) ./ Supports multiple input formats (TensorFlow, TensorFlow Lite, Caffe, ONNX) ./ Off-line tools for serialization, deserialization, and quantization (must be built from source) ​ b). Apalis iMX8 $Home目录下创建如下测试使用目录以供后续测试使用 ------------------------------- $ mkdir ArmnnTests $ cd ArmnnTests $ mkdir data $ mkdir models ------------------------------- c). Caffe示例应用测试 ./ Image包含如下ARM NN Caffe模型测试示例,本文随机选择CaffeAlexNet-Armnn进行测试 /usr/bin/CaffeAlexNet-Armnn /usr/bin/CaffeCifar10AcrossChannels-Armnn /usr/bin/CaffeInception_BN-Armnn /usr/bin/CaffeMnist-Armnn /usr/bin/CaffeResNet-Armnn /usr/bin/CaffeVGG-Armnn /usr/bin/CaffeYolo-Armnn ./部署模型和输入数据文件到模块 ------------------------------- ###从 这里 下载,bvlc_alexnet_1.caffemodel模型文件,部署到Apalis iMX8 ~/ArmnnTests/models;shark.jpg输入文件,部署到Apalis iMX8 ~/ArmnnTests/data $ cd ArmnnTests ### Run with C++ backend, CPU without NEON $ CaffeAlexNet-Armnn --data-dir=data --model-dir=models --compute=CpuRef Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 2 with value: 0.706227 Info: Top(2) prediction is 0 with value: 1.26575e-05 Info: Total time for 1 test cases: 15.842 seconds Info: Average time per test case: 15841.653 ms Info: Overall accuracy: 1.000 ### Run with ACL NEON backend, CPU with NEON $ CaffeAlexNet-Armnn --data-dir=data --model-dir=models --compute=CpuAcc Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 2 with value: 0.706226 Info: Top(2) prediction is 0 with value: 1.26573e-05 Info: Total time for 1 test cases: 0.237 seconds Info: Average time per test case: 236.571 ms Info: Overall accuracy: 1.000 ### Run with GPU/NPU backend $ CaffeAlexNet-Armnn --data-dir=data --model-dir=models --compute=VsiNpu Info: ArmNN v20200200 , size = 618348Warn-Start NN executionInfo: = Prediction values for test #0 Info: Top(1) prediction is 2 with value: 0.706227 Info: Top(2) prediction is 0 with value: 1.26573e-05 Info: Total time for 1 test cases: 0.304 seconds Info: Average time per test case: 304.270 ms Info: Overall accuracy: 1.000 ------------------------------- d). TensorFlow示例应用测试 ./ Image包含如下ARM NN TensorFlow模型测试示例,本文随机选择TfInceptionV3-Armnn进行测试 /usr/bin/TfCifar10-Armnn /usr/bin/TfInceptionV3-Armnn /usr/bin/TfMnist-Armnn /usr/bin/TfMobileNet-Armnn /usr/bin/TfResNext-Armnn ./部署模型和输入数据文件到模块 ------------------------------- ###从 这里 下载,inception_v3_2016_08_28_frozen.pb模型文件,部署到Apalis iMX8 ~/ArmnnTests/models;shark.jpg, Dog.jpg, Cat.jpg输入文件,部署到Apalis iMX8 ~/ArmnnTests/data $ cd ArmnnTests ### Run with C++ backend, CPU without NEON $ TfInceptionV3-Armnn --data-dir=data --model-dir=models --compute=CpuRef Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 0.454895 Info: Top(2) prediction is 160 with value: 0.00278846 Info: Top(3) prediction is 131 with value: 0.000483914 Info: Top(4) prediction is 56 with value: 0.000304587 Info: Top(5) prediction is 27 with value: 0.000220489 Info: = Prediction values for test #1 Info: Top(1) prediction is 283 with value: 0.481285 Info: Top(2) prediction is 282 with value: 0.268979 Info: Top(3) prediction is 151 with value: 0.000375892 Info: Top(4) prediction is 24 with value: 0.00036751 Info: Top(5) prediction is 13 with value: 0.000330214 Info: = Prediction values for test #2 Info: Top(1) prediction is 3 with value: 0.986568 Info: Top(2) prediction is 0 with value: 1.51615e-05 Info: Total time for 3 test cases: 1477.627 seconds Info: Average time per test case: 492542.205 ms Info: Overall accuracy: 1.000 ### Run with ACL NEON backend, CPU with NEON $ TfInceptionV3-Armnn --data-dir=data --model-dir=models --compute=CpuAcc Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 0.454888 Info: Top(2) prediction is 160 with value: 0.00278851 Info: Top(3) prediction is 131 with value: 0.00048392 Info: Top(4) prediction is 56 with value: 0.000304589 Info: Top(5) prediction is 27 with value: 0.000220489 Info: = Prediction values for test #1 Info: Top(1) prediction is 283 with value: 0.481286 Info: Top(2) prediction is 282 with value: 0.268977 Info: Top(3) prediction is 151 with value: 0.000375891 Info: Top(4) prediction is 24 with value: 0.000367506 Info: Top(5) prediction is 13 with value: 0.000330212 Info: = Prediction values for test #2 Info: Top(1) prediction is 3 with value: 0.98657 Info: Top(2) prediction is 0 with value: 1.51611e-05 Info: Total time for 3 test cases: 4.541 seconds Info: Average time per test case: 1513.509 ms Info: Overall accuracy: 1.000 ### Run with GPU/NPU backend $ TfInceptionV3-Armnn --data-dir=data --model-dir=models --compute=VsiNpu Info: ArmNN v20200200 , size = 1072812Warn-Start NN executionInfo: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 0.454892 Info: Top(2) prediction is 160 with value: 0.00278848 Info: Top(3) prediction is 131 with value: 0.000483917 Info: Top(4) prediction is 56 with value: 0.000304589 Info: Top(5) prediction is 27 with value: 0.00022049 Warn-Start NN executionInfo: = Prediction values for test #1 Info: Top(1) prediction is 283 with value: 0.481285 Info: Top(2) prediction is 282 with value: 0.268977 Info: Top(3) prediction is 151 with value: 0.000375891 Info: Top(4) prediction is 24 with value: 0.000367508 Info: Top(5) prediction is 13 with value: 0.000330214 Warn-Start NN executionInfo: = Prediction values for test #2 Info: Top(1) prediction is 3 with value: 0.986568 Info: Top(2) prediction is 0 with value: 1.51615e-05 Info: Total time for 3 test cases: 5.617 seconds Info: Average time per test case: 1872.355 ms Info: Overall accuracy: 1.000 ------------------------------- e). ONNX示例应用测试 ./ Image包含如下ARM NN ONNX模型测试示例,本文随机选择OnnxMobileNet-Armnn进行测试 /usr/bin/OnnxMnist-Armnn /usr/bin/OnnxMobileNet-Armnn ./部署模型和输入数据文件到模块 ------------------------------- ###从 这里 下载,mobilenetv2-1.0.onnx模型文件,部署到Apalis iMX8 ~/ArmnnTests/models;shark.jpg, Dog.jpg, Cat.jpg输入文件,部署到Apalis iMX8 ~/ArmnnTests/data $ cd ArmnnTests ### Run with C++ backend, CPU without NEON $ OnnxMobileNet-Armnn --data-dir=data --model-dir=models --compute=CpuRef Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 17.1507 Info: Top(2) prediction is 207 with value: 15.3666 Info: Top(3) prediction is 159 with value: 11.0918 Info: Top(4) prediction is 151 with value: 5.26187 Info: Top(5) prediction is 112 with value: 4.09802 Info: = Prediction values for test #1 Info: Top(1) prediction is 281 with value: 13.6938 Info: Top(2) prediction is 43 with value: 6.8851 Info: Top(3) prediction is 39 with value: 6.33825 Info: Top(4) prediction is 24 with value: 5.8566 Info: Top(5) prediction is 8 with value: 3.78032 Info: = Prediction values for test #2 Info: Top(1) prediction is 2 with value: 22.6968 Info: Top(2) prediction is 0 with value: 5.99574 Info: Total time for 3 test cases: 163.569 seconds Info: Average time per test case: 54523.023 ms Info: Overall accuracy: 1.000 ### Run with ACL NEON backend, CPU with NEON $ OnnxMobileNet-Armnn --data-dir=data --model-dir=models --compute=CpuAcc Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 17.1507 Info: Top(2) prediction is 207 with value: 15.3666 Info: Top(3) prediction is 159 with value: 11.0918 Info: Top(4) prediction is 151 with value: 5.26187 Info: Top(5) prediction is 112 with value: 4.09802 Info: = Prediction values for test #1 Info: Top(1) prediction is 281 with value: 13.6938 Info: Top(2) prediction is 43 with value: 6.88511 Info: Top(3) prediction is 39 with value: 6.33825 Info: Top(4) prediction is 24 with value: 5.8566 Info: Top(5) prediction is 8 with value: 3.78032 Info: = Prediction values for test #2 Info: Top(1) prediction is 2 with value: 22.6968 Info: Top(2) prediction is 0 with value: 5.99574 Info: Total time for 3 test cases: 1.222 seconds Info: Average time per test case: 407.494 ms Info: Overall accuracy: 1.000 ### Run with GPU/NPU backend $ OnnxMobileNet-Armnn --data-dir=data --model-dir=models --compute=VsiNpu Info: ArmNN v20200200 , size = 602112Warn-Start NN executionInfo: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 8.0422 Info: Top(2) prediction is 207 with value: 7.98566 Info: Top(3) prediction is 159 with value: 6.76481 Info: Top(4) prediction is 151 with value: 4.16534 Info: Top(5) prediction is 60 with value: 2.40269 Warn-Start NN executionInfo: = Prediction values for test #1 Info: Top(1) prediction is 287 with value: 5.98563 Info: Top(2) prediction is 24 with value: 5.49244 Info: Top(3) prediction is 8 with value: 2.24259 Info: Top(4) prediction is 7 with value: 1.36127 Info: Top(5) prediction is 5 with value: -1.69145 Error: Prediction for test case 1 (287) is incorrect (should be 281) Warn-Start NN executionInfo: = Prediction values for test #2 Info: Top(1) prediction is 2 with value: 11.099 Info: Top(2) prediction is 0 with value: 3.42508 Info: Total time for 3 test cases: 0.258 seconds Info: Average time per test case: 86.134 ms Error: One or more test cases failed ------------------------------- f).除了上述推理引擎前端,TensorFlow Lite也是支持的,更多示例测试和参数说明以及ARMNN C++ API/Python API开发流程可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 5 Arm NN。 7). ONNX 测试 a). ONNX也是一款开源的机器学习推理引擎,NXP iMX8 eIQ ONNX支持特性和协议栈框图如下 ./ ONNX Runtime 1.1.2 ./ Multithreaded computation with acceleration using Arm Neon SIMD instructions on Cortex-A cores provided by the ACL and Arm NN execution providers ./ Parallel computation using GPU/NPU hardware acceleration (on shader or convolution units) provided by the VSI NPU execution provider ./ C++ and Python API (supported Python version 3) ​ b).示例应用测试 ./ ONNX Runtime提供了一个onnx_test_runner(BSP以及预装于/usr/bin)用于运行ONNX model zoo提供的测试模型,下面几个模型是在iMX8 eIQ测试过的模型 MobileNet v2, ResNet50 v2, ResNet50 v1, SSD Mobilenet v1, Yolo v3 ./ MobileNet v2模型测试 ------------------------------- ###从这里下载模型文件压缩包,然后在Apalis iMX8设备上$Home目录解压出文件夹mobilenetv2-7 $ cd /home/root/ ### Run with ARMNN backend with CPU NEON $ onnx_test_runner -j 1 -c 1 -r 1 -e armnn ./mobilenetv2-7/ … Test mobilenetv2-7 finished in 0.907 seconds, t result: Models: 1 Total test cases: 3 Succeeded: 3 Not implemented: 0 Failed: 0 Stats by Operator type: Not implemented(0): Failed: Failed Test Cases: ### Run with ACL backend with CPU NEON $ onnx_test_runner -j 1 -c 1 -r 1 -e acl ./mobilenetv2-7/ … Test mobilenetv2-7 finished in 0.606 seconds, t result: Models: 1 Total test cases: 3 Succeeded: 3 Not implemented: 0 Failed: 0 Stats by Operator type: Not implemented(0): Failed: Failed Test Cases: ### Run with GPU/NPU backend $ onnx_test_runner -j 1 -c 1 -r 1 -e vsi_npu ./mobilenetv2-7/ … Test mobilenetv2-7 finished in 0.446 seconds, t result: Models: 1 Total test cases: 3 Succeeded: 3 Not implemented: 0 Failed: 0 Stats by Operator type: Not implemented(0): Failed: Failed Test Cases: ------------------------------- c).更多示例测试和参数说明以及C++ API可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 6 ONNX Runtime。 8). OpenCV 测试 a). OpenCV是大家熟知的一款开源的传统机器视觉库,它包含一个ML模块可以提供传统的机器学习算法,可以支持神经网络推理(DNN模型)和传统机器学习算法(ML模型),NXP iMX8 eIQ OpenCV支持特性如下 ./ OpenCV 4.4.0 ./ C++ and Python API (supported Python version 3) ./ Only CPU computation is supported ./ Input image or live camera (webcam) is supported b).示例应用测试 ./ BSP预装OpenCV测试模型数据如下 DNN示例应用- /usr/share/OpenCV/samples/bin 输入数据、模型配置文件- /usr/share/opencv4/testdata/dnn ./Image classification DNN示例应用测试 ------------------------------- ###从 这里 下载,模型文件squeezenet_v1.1.caffemodel和配置文件model.yml复制到/usr/share/OpenCV/samples/bin ###复制数据文件到执行目录 $ cp /usr/share/opencv4/testdata/dnn/dog416.png /usr/share/OpenCV/samples/bin/ $ cp /usr/share/opencv4/testdata/dnn/squeezenet_v1.1.prototxt/usr/share/OpenCV/samples/bin/ $ cp /usr/share/OpenCV/samples/data/dnn/classification_classes_ILSVRC2012.txt /usr/share/OpenCV/samples/bin/ $ cd /usr/share/OpenCV/samples/bin/ ### Run with default image $ ./example_dnn_classification --input=dog416.png --zoo=models.yml squeezenet ​ ### Run with actual camera(/dev/video2) input ./example_dnn_classification --device=2 --zoo=models.yml squeezenet ​ ------------------------------- c).更多示例测试和说明可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 8 OpenCV machine learning demos。 9). 总结 本文基于NXP eIQ机器学习工具库在iMX8嵌入式平台简单演示了多种机器学习推理引擎示例应用,并简单对比了CPU NEON和GPU进行模型推理的性能表现,实际进行相关应用开发的时候还会遇到很多学习模型到实际推理模型转换的问题,本文就不做涉及。 参考文献 i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 i.MX Yocto Project User's Guide Rev. L5.4.70_2.3.0 https://developer.toradex.cn/knowledge-base/board-support-package/openembedded-core
广告