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://xiahunao.cn/news/2812921.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

配置用户通过IPv6方式上网

组网需求 运营商为企业分配了WAN侧的IPv6地址1111:2222:A0EE:6::2/64和LAN侧的IPv6地址1111:3333:E840:2::1/64&#xff0c;企业通过运营商提供的IPv6地址配置上网。 图1 配置用户通过IPv6方式上网 操作步骤 1、在IPS上的配置 interface GigabitEthernet0/0/4 ipv6 enable…

【视频编码\VVC】量化基础知识

量化&#xff1a;是将信号的连续取值&#xff08;大量离散取值&#xff09;映射为有限多个离散赋值的过程。实现信号取值多对一的映射。可以有效减少信号取值的空间&#xff0c;进而获得更好的压缩效果。 根据输出和输入数据的类型&#xff0c;可以将量化器分为标量量化SQ和矢…

java中容器继承体系

首先上图 源码解析 打开Collection接口源码&#xff0c;能够看到Collection接口是继承了Iterable接口。 public interface Collection<E> extends Iterable<E> { /** * ...... */ } 以下是Iterable接口源码及注释 /** * Implementing this inte…

代码随想录Leetcode474. 一和零

题目&#xff1a; 代码(首刷看解析 2024年2月26日&#xff09; class Solution { public:// 二维 0 1背包int findMaxForm(vector<string>& strs, int m, int n) {// 1 二维 [i]表示 0 的个数&#xff0c;上限m; [j]表示 1 的个数&#xff0c;上限nvector<vector…

Project_Euler-13 题解

Project_Euler-13 题解 题目 37107287533902102798797998220837590246510135740250 46376937677490009712648124896970078050417018260538 74324986199524741059474233309513058123726617309629 91942213363574161572522430563301811072406154908250 2306758820753934617117198…

备战蓝桥杯Day17 - 链表

链表 基本概念 链表是由一系列节点组成的元素集合。 每个节点包含两部分&#xff1a;数据域 item 、指向下一个节点的指针 next 通过节点之间的相互链接&#xff0c;形成一个链表 1. 链表的初始化 # 手动建立链表 # 链表的初始化 class Node(object):def __init__(self, …

超声波气泡传感器检测原理

超声气泡传感器 超声波气泡传感器利用超声波在液体和气体中的声阻抗不同的原理来实现对气泡或液体的识别和检测。它具有体积小、重量轻、使用寿命长、检测灵敏度高、响应速度快等优点&#xff0c;广泛应用于医疗、化工、食品和环保等领域。 检测原理&#xff1a; 超声波气泡…

【ArcGIS】基于DEM/LUCC等数据统计得到各集水区流域特征

基于DEM/LUCC等数据统计得到各集水区流域特征 提取不同集水区各类土地利用类型比例步骤1&#xff1a;划分集水区为独立面单元步骤2&#xff1a;批量掩膜提取得到各集水区土地利用类型比例步骤3&#xff1a;导入各集水区LUCC数据并统计得到各类型占比 提取坡度特征流域面坡度河道…

【网络那些事】

【云计算】 云计算&#xff1a;把计算资源放在某个地方&#xff0c;并通过互联网暴露出来&#xff0c;让用户可以按需使用计算资源的方式&#xff0c;就是所谓的云计算 云计算的三种服务&#xff1a; 云平台专业名词 日常叫法 亚马逊云叫法 虚拟机 EC2 &#xff08;Elasti…

GPT润色指令

1. GPT润色指令 Below is a paragraph from an academic paper. Polish the writing to meet the academic style,improve the spelling, grammar, clarity, concision and overall readability. When necessary, rewrite the whole sentence. Paragraph &#xff1a;你的句子…

初谈软件工程(一)

我就读于兰州交通大学的软件工程专业。虽然在全国众多的985、211高校中&#xff0c;兰州交通大学可能并不显眼&#xff0c;似乎未能跻身这些所谓的“顶尖”行列就意味着不被认可。然而&#xff0c;在甘肃省的教育领域中&#xff0c;它无疑是一座璀璨的明珠&#xff0c;名列前茅…

Apache-Camel中的Quartz定时任务

需求&#xff1a;在camel的基础上增加两个定时任务&#xff0c;一个需要发邮件&#xff0c;一个只需要简单调用存储过程并拿回数据记录日志即可 package com.hkt.it.ds.dmg.eip.route;import java.util.List;import com.xxx.DmgCamelRouteConfig; import com.xxx.DmgCamelRout…

全面介绍HTML的语法!轻松写出网页

文章目录 heading(标题)paragraph(段落)link(超链接)imagemap(映射)table(表格)list(列表)layout(分块)form(表单)更多输入:datalistautocompleteautofocusmultiplenovalidatepatternplaceholderrequired head(首部)titlebaselinkstylemetascriptnoscript iframe HTML&#xff…

Java SpringBoot 获取 yml properties 自定义配置信息

Java SpringBoot 获取 yml properties 自定义配置信息 application.yml server:port: 9090servlet:context-path: /app第一种方法 HelloController package com.zhong.demo01.controller;import org.springframework.beans.factory.annotation.Value; import org.springfram…

NVM存储设备MTBF介绍

1. 概念 1.1. MTBF MTBF(Mean Time Between Failure)&#xff0c;平均故障间隔时间&#xff0c;也被称为平均无故障时间&#xff0c;是衡量一个产品的可靠性指标&#xff0c;其单位为小时。其定义为&#xff1a;产品在总的使用阶段累计工作时间与故障次数的比值&#xff1a; …

【加密算法】AES对称加密算法简介

目录 前言 工作原理 SubBytes ShiftRows MixColumns AddRoundKey 应用场景 在Java中使用AES 加密和解密数据 注意事项和最佳实践 结论 前言 AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称加密算法&#xff0c;它在密码学中被广泛应用。AES取代…

如何将本地项目上传到github上

将本地项目上传到github上有很多种方法&#xff0c;这里只讲述我认为最简单快捷的一种&#xff0c;先在github中创建一个仓库&#xff0c;接着在本地建文件夹&#xff0c;用命令行将项目推送到本地仓库&#xff0c;然后连接远程仓库&#xff0c;将本地项目推送到远程仓库上。要…

数学建模【相关性模型】

一、相关性模型简介 相关性模型并不是指一个具体的模型&#xff0c;而是一类模型&#xff0c;这一类模型用来判断变量之间是否具有相关性。一般来说&#xff0c;分析两个变量之间是否具有相关性&#xff0c;我们根据数据服从的分布和数据所具有的特点选择使用pearson&#xff…

分布式ID生成方案详解

✨✨ 祝屏幕前的您天天开心 &#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. UUID&#xff08;Universally …

开发者利器: 从 Amazon CodeWhisperer 到 Amazon Q

自 ChatGPT 火爆以来&#xff0c;生成式 AI 助手也是层出不穷&#xff0c;目前自然是以 Microsoft Copilot&#xff08;基于 GPT&#xff09;普及度最高了吧。看着微软风光了这么久&#xff0c;其他云厂商怎么可能会甘愿落后&#xff1f; 最近&#xff0c;来自亚马逊云科技的 …