RISC-V SoC + AI | 在全志 D1「哪吒」开发板上,跑个 ncnn 神经网络推理框架的 demo

引言

D1 是全志科技首款基于 RISC-V 指令集的 SoC,主核是来自阿里平头哥的 64 位的 玄铁 C906。「哪吒」开发板 是全志在线基于全志科技 D1 芯片定制的 AIoT 开发板,是目前还比较罕见的使用 RISC-V SoC 且可运行 GNU/Linux 操作系统的可量产开发板。

ncnn 是腾讯优图实验室推出的一个为移动端极致优化的高性能神经网络前向计算框架,是目前同样也比较罕见的为 RISC-V 架构做过适配和优化的神经网络框架。

本文 是一份教程,步骤骑着步骤 (step by step) 地展示了如何在一块全新的全志 D1「哪吒」开发板上,跑个 ncnn 神经网络推理框架的 demo。

本文的完成参考了以下材料,非常感谢 nihui、BedRock 等开发者们在互联网上的分享!
[1] D1 哪吒 - 在线文档
[2] nihui: 在全志d1开发板上玩ncnn
[3] 腾讯优图ncnn新版本适配国产CPU,全志D1加持最高速度提升70倍!

目录

  1. 引言
  2. 必要的材料
  3. 上电!
  4. 重刷固件
  5. 安装并配置交叉编译工具链
  6. 编译 ncnn,并准备 demo 程序
  7. 使用 ADB 传输文件
  8. 运行 demo

1、必要的材料

  • 「哪吒」开发板
  • Type-C USB 线
  • USB 转 TTL 转换器
  • 安装有 GNU/Linux 或较新版本的 Windows 10 / 11 的可联网电脑
    (本文以 Windows 10 的电脑为例来展示)

2、上电

取出哪吒和 USB 转 TTL 转换器,先把转换器按下图所示接上 DEBUG 端口,再将转换器插入电脑的 USB 口。如果电脑没有识别到串口,可能是因为没有安装转换器的驱动程序,可以在 这里 下载。

在这里插入图片描述

在使用开发板自带的固件时,DEBUG 端口会在开发板上电后通过 115200 波特率的 UART 串口来提供一个 Shell,我们可以使用 PuTTY、MobaXterm 或者其它类似的终端模拟器访问这个串口来在 Shell 中操作开发板。(如果使用 PuTTY,可以参考下图来设置)

在这里插入图片描述

启动终端模拟器后,暂时只能看到个黑框,因为开发板还没上电。

找出 Type-C USB 线,将开发板的 OTG 接口与电脑相连即可上电(虽然连 POWER 也可以,但是后边一直需要使用这个 OTG 接口,所以推荐连接它)。上电后可发现,开发板上的灯亮了,而且终端模拟器中开始一条条地冒出各种提示了!大概 10 ~ 20 秒后,根据一行按下回车的提示,在终端模拟器中按下回车,即可进入如下图所示的界面,然后就可以执行各种 GNU/Linux 命令了。

在这里插入图片描述

3、重刷固件

新开封的开发板里边自带的固件是基于 Open v1.0 版本的 D1 Tina SDK 编译的,在运行 ncnn 程序时会发生非法指令错误 (参考 这里),根据全志在线开发者论坛中网友 BedRock 的评论,我们可将固件更新为基于 Open v1.01 版本的 SDK 编译的固件再进行后续的步骤。

如果想自己编译固件或者修改固件,可以参考 D1 文档中的 “Tina SDK版本” 部分 下载 SDK。当然,如果只想先跑个 ncnn 玩玩看的话,我们可以直接在 “固件下载” 选择一款全志原厂为我们准备好的固件,比如我可以选择 D1哪吒HDMI测试固件20210804(开机HDMI就有小企鹅启动logo) (名字有点长) 为例。这个固件估计是为展示 HDMI 输出功能而设计的,我们给开发板用 HDMI 线接上个屏幕就能看到个小企鹅,但是因为它是基于 v1.01 SDK 编译的,所以我们刚好也能用它来跑 ncnn 的 demo。

下载好 .img 固件文件后,参考 D1 文档中 “编译与烧写” 的 “烧写” 部分 ,下载 全志USB驱动,使用管理员权限运行 install.bat 安装驱动,再安装烧写软件进行操作,即可将固件烧写进开发板。比如,在 Windows 电脑中我们要下载 PhoenixSuit 软件来烧写固件。要注意的是,在烧写软件中要选择 “全盘擦除升级”,如下图所示,否则无法成功烧写。

在这里插入图片描述

烧写成功后,重新上电即可。

4、安装并配置交叉编译工具链

注意:第 4 节和第 5 节的操作需要在 GNU/Linux 操作系统下进行。如果你的电脑装有 GNU/Linux 操作系统、或者可使用虚拟机,可直接在 GNU/Linux 操作系统中进行操作。如果你的电脑装的是较新版本的 Windows 10 / 11,也可以上网搜索相关教程安装并配置个 WSL (Windows Subsystem Linux),然后在 WSL 中进行操作。

在平头哥芯片开放社区的 “资源下载” 页面,我们可以在 “工具链-900系列” 中找到 V2.0.1 版本的 riscv64-linux-x86_64-20210512.tar.gz,下载它到电脑里,放到 <自己想放的路径>,解压它

tar -xf riscv64-linux-x86_64-20210512.tar.gz

解压完成后,使用 vim 或者其它文本编辑器,打开 ~/.bashrc,在结尾添加工具链的路径至环境变量,即下列内容

# My PATH
export RISCV_ROOT_PATH=/<自己想放的路径>/riscv64-linux-x86_64-20210512

保存并关闭编辑器,然后使用 source 命令刷新 Shell 环境:

source ~/.bashrc

就安装并配置好交叉编译工具链了。

5、编译 ncnn,并准备 demo 程序

在 GitHub 上下载 2021 年 7 月 20 日 Release 的 ncnn 的源代码(Source code)到电脑里,比如 ncnn-20210720.tar.gz,解压,然后进入 ncnn-20210720 目录,准备并开始编译

mkdir build-c906
cd build-c906
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906.toolchain.cmake -DCMAKE_BUILD_TYPE=relwithdebinfo -DNCNN_OPENMP=OFF -DNCNN_THREADS=OFF -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON ..
make -j32

编译大概需要几分钟,完成后,可在 build-c906 目录中找到编译好的所有文件。

我们可先尝试两个 demo,分别为:

① 使用 benchncnn 做基准测试
② 使用 NanoDet 模型对一张自己的图片做目标检测(NanoDet 是个可在移动端超快运行的超轻量目标检测模型)

为了方便后续将文件传输进开发板,我们可先在电脑上创建 benchncnn_demo 和 nanodet_demo 两个文件夹,将 ① 和 ② 所需的文件分别都放进去准备好。

对于 ①,我们把 ncnn 目录中的 build-c906/benchmark/benchncnn 和 benchmark/*.param 复制进去即完成准备。

对于 ②,我们需要把 ncnn 目录中的 build-c906/examples/nanodet 复制进去,在 ncnn-assets中下载 nanodet_m.bin 和 nanodet_m.param 两个文件放进去,再放入一张你想检测的图片即可。

即,两个目录的结构分别是类似这样的:

benchncnn_demo/
├ benchncnn
├ alexnet.param
├ blazeface.param
└ <一大堆其它模型的 param>nanodet_demo/
├ nanodet
├ nanodet_m.bin
├ nanodet_m.param
└ <你想检测的图片>

6. 使用 ADB 传输文件

ADB 是 Android Debug Bridge,原本为 Android 设计,全志给 Tina Linux 也做了适配,所以我们可以使用 ADB 来调试 Tina Linux 的设备。参考 D1 文档中的 “研发生产工具” 部分 可以下载,下载完成后,将其路径加入环境变量即可使用。

我们在跑这两个 demo 时,可能暂时只需要用到以下几个命令,如果需要使用其它功能也可上网搜索相关教程。

检查设备与电脑的连接情况,可以使用

adb devices

adb push 可以把电脑上的文件或文件夹传给开发板,使用语法如下

adb push <电脑上的文件路径> <开发板上的目标路径>

adb pull 可以把开发板上的文件或文件夹传给电脑,使用语法如下

adb pull <开发板上的文件路径> <电脑上的目标路径>

要注意的是,开发板上的路径都需要填写绝对路径。

7、运行 demo

把第 5 节所示的类似 benchncnn_demo 和 nanodet_demo 的文件夹通过 adb push 命令传进开发板,在开发板上进入 benchncnn_demo 目录,再输入

./benchncnn 4 1 0 -1 0

可开始做基准测试。如果成功运行即可慢慢看到类似下图这样的提示,展示了当前平台运行 ncnn 使用各种模型推理一帧所需的毫秒耗时。

在这里插入图片描述

(如果不想等测试慢慢跑完,也可以按 Ctrl + C 停止运行)

在开发板上进入 nanodet_demo 目录,再输入

./nanodet <你想检测的图片>

即可使用 NanoDet 对这张图片目标检测。运行完成后,可在命令行中看到文字版的检测结果,也可以使用 adb pull 把生成的 image.png 图片文件传给电脑再打开查看,上边会画好边界框、类别和置信度。比如这是它检测出的南京市长 江大桥上边的车车车车。

在这里插入图片描述

到了这里,我们就成功在一块运行 GNU/Linux 系统的 RISC-V 开发板上跑了个神经网络框架的 demo,如果想进行后续的实验或研发,可以了解有关 D1 哪吒 和 ncnn 的更多内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wireshark TS | Linux 系统对时问题

问题描述 节前业务运维同事提交了一个 case &#xff0c;说是部署在新业务区域的 Linux 服务器和老业务区域的 Linux 服务器无法对时&#xff0c;脚本里使用的是 clockdiff 命令&#xff0c;无法正常返回结果&#xff0c;而在老业务区域两台服务器之间执行命令就正常&#xff…

OSI参考模型和TCP/IP网络参考模型

1、OSI参考模型 1.1 产生背景 为了解决网络之间的兼容性问题,实现网络设备间的相互通讯,国际标准化组织ISO于1984年提出了OSIRM(Open System Interconnection Reference Model,开放系统互连参考模型)。OSI参考模型很快成为计算机网络通信的基础模型。由于种种原因,并没有…

linux系统---nginx(2)rewrite重写功能

目录 一、rewrite概述 1、rewrite功能 2、跳转场景 二、标准配置指令 1、rewrite日志记录指令 2、未初始化变量告警日志记录指令 3、rewrite 指令 3.1 正则表达式 三、rewrite模块使用实例 1.基于域名的跳转 一、rewrite概述 1、rewrite功能 访问重写 rewrite 是 …

11个Linux性能分析命令

Linux性能分析命令有很多&#xff0c;不同的命令可以用来监控不同的系统资源和活动。根据您的问题&#xff0c;我为您推荐以下11个常用的Linux性能分析命令&#xff1a; uptime&#xff1a;显示系统的运行时间和平均负载。dmesg&#xff1a;显示系统的启动信息和内核的日志信息…

如何改变.net托管的入口main函数

有小伙伴问: .NET托管入口Main函数可以修改成别的函数&#xff0c;用来作为程序的入口吗&#xff1f; 答案&#xff1a;当然是可以的。这也算是.NET里面非常简单的骚操了。本篇来用最新的.NET8演示下&#xff0c;如何修改Main入口。 1.简单控制台例子&#xff1a; namespace…

【JavaEE】_tomcat的安装与使用

目录 1. Tomcat简介 2. Tomcat安装 2.1 下载Tomcat并解压缩 2.2 启动Tomcat 2.2.1 Tomcat乱码问题 2.2.2 Tomcat闪退问题 2.3 访问Tomcat欢迎页面 3. 使用Tomcat部署前端代码 3.1 路径匹配 3.2 文件路径访问与网络访问 4. 静态页面与动态页面 5. 基于tomcat的网站后…

更换个人开发环境后,pycharm连接服务器报错Authentication failed

原因&#xff1a;服务器中更换个人开发环境后&#xff0c;密码变了。 解决&#xff1a;在pycharm中修改服务器开发环境密码即可。 1 找到Tools-Depolyment-Configuration 2 点击SSH Configuration后的省略号 3 修改这里面的Password即可

婚恋交友系统源码-交友APP小程序H5开发-源码交付,支持二开-实名制交友更放心!

一、交友小程序开发的重要性 1. 满足人们的社交需求&#xff1a;交友小程序为人们提供了一个便捷的社交平台&#xff0c;使得人们可以随时随地地结识新朋友&#xff0c;拓展自己的社交圈子。 2. 丰富人们的业余生活&#xff1a;通过交友小程序&#xff0c;人们可以参加各种线…

lv21 QT 常用控件 2

1 QT GUI 类继承简介 布局管理器 输出控件 输入控件 按钮 容器 2 按钮示例 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QCheckBox> #include <QLineEdit> #include <QPushButton>class Widget : public QWidget {Q_OBJECTpublic…

探究前端路由hash和history的实现原理(包教包会)

今天我们来讲一讲前端中很重要的一个部分路由&#xff08;router&#xff09;&#xff0c;想必前端小伙伴对‘路由’一词都不会感到陌生。但是如果哪天面试官问你&#xff0c;能大概说一说前端路由的实现原理吗&#xff1f; 你又会如何应对呢&#xff1f; 今天勇宝就带着大家一…

LeetCode 0938.二叉搜索树的范围和:深度优先搜索(可中序遍历)

【LetMeFly】938.二叉搜索树的范围和&#xff1a;深度优先搜索&#xff08;可中序遍历&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/range-sum-of-bst/ 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。…

动态规划课堂2-----路径问题

目录 引言&#xff1a; 例题1&#xff1a;不同路径 例题2&#xff1a;不同路径II 例题3&#xff1a;礼物的最⼤价值 例题4&#xff1a;下降路径最⼩和 例题5&#xff1a;最小路径和 结语&#xff1a; 引言&#xff1a; 在学习完动态规划斐波那契数列模型后&#xff0c;…

信息安全计划

任何管理人员或人力资源专业人士都知道&#xff0c;除非彻底记录标准和实践&#xff0c;否则永远无法真正实施和执行标准和实践。正如您可能想象的那样&#xff0c;在保护您的网络、技术和数据系统免受网络威胁以及在发生这些事件时规划最及时、高效和有效的响应时&#xff0c;…

Linux环境搭建Jenkins(详细图文)

目录 简介Jenkins 特点 一、环境准备 1.jdk环境准备 2.maven环境准备 3.git环境准备 二、安装部署Jenkins&#xff08;采用war包方式&#xff09; 1.下载Jenkins ​2.启动war包 1&#xff09;将下载好的Jenkins的war包上传到服务器上 2&#xff09;编辑启动脚本,方便…

nginx反向代理和负载均衡配置

配置文件 位置 : /usr/local/software/nginx/conf vim nginx.conf 在http大括号下配置: upstream wnBalance{ server ip:端口 weight比重 :1或者2; 1为配重高 server ip:端口 weight1; } wnBalance : 代表括号中两个ip的变量名 位置 : /usr/local/so…

图像的压缩感知的MATLAB实现(第3种方案)

前面介绍了两种不同的压缩感知实现&#xff1a; 图像压缩感知的MATLAB实现&#xff08;OMP&#xff09; 压缩感知的图像仿真&#xff08;MATLAB源代码&#xff09; 上述两种方法还存在着“速度慢、精度低”等不足。 本篇介绍一种新的方法。 压缩感知&#xff08;Compressed S…

Vue-Cropper头像裁剪插件使用

1. 效果预览 2. 插件介绍 官网地址&#xff1a;[GitHub - xyxiao001/vue-cropper: A simple picture clipping plugin for vue](https://github.com/xyxiao001/vue-cropper?fromthosefree.com) 3 . 插件使用 下载插件 npm install vue-croppernext3 . 封装好的代码&#x…

Rider 2023:打造高效.NET项目的智能IDE,让开发更简单mac/win版

JetBrains Rider 2023激活版下载是一款专为.NET开发者打造的强大集成开发环境&#xff08;IDE&#xff09;。这款IDE提供了丰富的功能&#xff0c;旨在帮助开发者更快速、更高效地编写、调试和测试.NET应用程序。 Rider 2023 软件获取 Rider 2023在保持了其一贯的智能代码补全…

RK3568驱动指南|驱动基础进阶篇-进阶4 内核是如何运行ko文件的_insmod

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Kotlin:组合挂起函数

点击查看&#xff1a;组合挂起函数 中文官网 点击查看&#xff1a;组合挂起函数 英文文档 默认顺序调用 假设我们在不同的地方定义了两个进行某种调用远程服务或者进行计算的挂起函数。我们只假设它们都是有用的&#xff0c;但是实际上它们在这个示例中只是为了该目的而延迟了…