地平线旭日 X3 开发板上手体验

最近嫖到一块旭日X3开发板,借此熟悉地平线 AI 芯片旭日 X3 模型部署流程,以及算法工具链。这里基本是跟着官方的用户手册进行操作,其中也遇到一些奇怪的问题。

1 烧写系统

1.1 系统选择

旭日X3派开发板支持Ubuntu 20.04 Desktop、Server两个系统版本。初上手,为方便使用和调试,选择了地平线开发者官网资源中心提供的Ubuntu20.04桌面版。

下载并解压Ubuntu20.04,并用官网资源中心提供的balenaEtcher工具烧录到容量大于8GB的SD卡。烧录软件已规划烧录步骤,按照提示操作即可。

1.2 系统烧录

在烧录Ubuntu系统镜像前,需要做如下准备:

  • 准备至少8GB容量的Micro SD卡
  • SD 读卡器
  • 下载Ubuntu镜像压缩包,并解压出Ubuntu系统镜像文件:system_sdcard.img
  • 下载镜像烧录工具balenaEtcher,
  • 板卡有两个灯,分别是红色和绿色。

系统烧录流程:

  • 打开balenaEtcher工具,点击Flash frome file按钮,选择解压出来的system_sdcard.img文件作为烧录镜像
  • 点击Select target按钮,选择对应的Micro SD存储卡作为目标存储设备
  • 点击Flash按钮开始烧录,待工具提示Flash Complete时,表示镜像烧录完成,关闭balenaEtcher工具并取出存储卡
1.3 板卡上电

使用支持 5V 3A 的 USB Type C 接口电源适配器为开发板供电。

保持旭日X3派开发板断电,然后将制作好的存储卡插入开发板的Micro SD卡槽,并通过HDMI线缆连接开发板与显示器,最后给开发板上电。可通过指示灯判断开发板状态:

  • 红色指示灯:点亮代表硬件上电正常
  • 绿色指示灯:点亮代表系统启动中,熄灭代表系统启动完成

系统首次启动时会进行默认环境配置,整个过程持续45秒左右,配置结束后会在显示器输出Ubuntu系统桌面(Ubuntu Server显示logo图标)。
在这里我遇到了开发板上电后长时间没有显示输出的现象。我是用的是一块 4K 显示器。使用串口连接电脑后,查看串口日志,发现已经成功进入系统,但是显示器依旧没有画面输出。串口连接时的电脑串口工具的参数配置如下:

  • 波特率(Baud rate):921600
  • 数据位(Data bits):8
  • 奇偶校验(Parity):None
  • 停止位(Stop bits):1
  • 流控(Flow Control):无
    串口连接示意图:
    在这里插入图片描述

后面经过查看用户手册的 HDMI 显示器规格列表:

  • 1920x1080
  • 1280x720
  • 1024x600
  • 800x480

手头只有 4K 显示器,既然手头的显示器都不支持,只能先考虑远程桌面连接了。

1.3.1 板卡连网

可以使用有线连接,也可以使用无线网连接。

有线网络连接

开发板有线网络默认采用静态IP配置,初始IP地址为192.168.1.10。可以进行静态、DHCP模式的切换。

修改静态IP配置
sudo vim /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto eth0
iface eth0 inet static
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1 
    metric 700

修改完成后,命令行输入sudo restart_network命令让配置生效。

修改DHCP配置

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
开发板的DHCP网络配置保存在/etc/network/interfaces文件,通过修改eth0相关配置,可完成对DHCP模式的修改:

sudo vim /etc/network/interfaces
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
    metric 700

修改完成后,命令行输入sudo restart_network命令让配置生效。

修改MAC地址配置

如需修改开发板默认MAC地址,可通过在/etc/network/interfaces文件中增加pre-up配置信息,指定用户需要的MAC地址:

sudo vim /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto eth0
iface eth0 inet static
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1 
    pre-up ifconfig eth0 hw ether 00:11:22:9f:51:27

修改完成后,命令行输入sudo restart_network命令让配置生效。

无线网络连接

开发板集成了2.4GHz无线WiFi模块,支持Soft AP和Station两种模式,默认运行在Station模式下。
串口命令行连接无线网:

  • 使用sudo nmcli device wifi rescan命令扫描热点
  • 使用sudo nmcli device wifi list命令列出扫描到的热点
  • 使用 sudo wifi_connect "SSID" "PASSWD"命令连接热点
1.3.2 VNC 远程桌面连接

在板子连好网络之后先通过串口连接,ifconfig命令获取到设备 IP。实际上,获取到 IP 之后,直接 ssh 连接也是很方便的,毕竟这个板子桌面环境不是很丝滑。

VNC 远程桌面连接

  • 输入设备ip地址
  • 输入IP地址后回车,弹出链接未加密的提示,点击 Continue
  • 输入密码 sunrise,勾选 Remember password, 点击 OK连接

至此,通过 VNC 远程桌面连接的方式可以进入桌面了。

2 环境配置

开发板用户名和密码都是sunrise,当然也可以登录 root 用户,用户名和密码都是 root。

2.1 系统更新

登陆系统后,先对系统执行更新操作

sudo apt update
sudo apt full-upgrade

更新完成后重启设备sudo reboot

2.2 超频

开发板采用CPU Freq驱动对CPU工作状态进行管理,默认模式为ondemand模式,此时CPU工作频率会根据负载进行动态调节,以节省功耗。可修改到performance模式,使CPU始终运行在最高频率下:

sudo bash -c 'echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor'

将CPU最高频率从1.2GHz提升到1.5GHz:

sudo bash -c 'echo 1 > /sys/devices/system/cpu/cpufreq/boost'

使用以上命令配置的 CPU 频率仅在当前运行中生效,如果设备重启则恢复默认配置。

CPU超频会增加芯片的功耗和发热,如出现稳定性问题,可以关闭超频功能:

sudo bash -c 'echo 0 > /sys/devices/system/cpu/cpufreq/boost'

查看芯片工作频率、温度等状态:

sudo hrut_somstatus
2.3 配置自启动任务
2.3.1 设置自启动Service
  • 创建启动脚本
    使用任何文本编辑器,在/etc/init.d目录下创建一个新的启动脚本 your_script_name

    #!/bin/bash
    
    ### BEGIN INIT INFO
    # Provides:          your_service_name
    # Required-Start:    $all
    # Required-Stop:     
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Start your_service_name at boot time
    # Description:       Enable service provided by your_service_name
    ### END INIT INFO
    
    /path/to/your/program &
    
    exit 0
    
  • 设置启动脚本具有可执行权限

    sudo chmod +x /etc/init.d/your_script_name
    
  • 使用update-rc.d命令将脚本添加到系统的启动项中

    sudo update-rc.d your_script_name defaults
    
  • 使用systemctl命令启用自启动

    sudo systemctl enable your_script_name
    
  • 重启开发板验证自启动服务程序是否运行正常

    root@ubuntu:~# systemctl status your_script_name.service 
    ● your_script_name.service - LSB: Start your_service_name at boot time
        Loaded: loaded (/etc/init.d/your_script_name; generated)
        Active: active (exited) since Wed 2023-04-19 15:01:12 CST; 57s ago
        Docs: man:systemd-sysv-generator(8)
        Process: 2768 ExecStart=/etc/init.d/your_script_name start (code=exited, status=0/SUCCESS)
    

3 运行默认图片分类样例

cd /app/ai_inference/01_basic_sample/
sudo ./test_mobilenetv1.py

在这里插入图片描述

3.1 图片分类样例 test_mobilenetv1.py 分析

这个样例是python接口编写,地平线同时也提供C++接口。
这个样例结构简单通过OpenCV图片解码和预处理,利用地平线提供的Python库hobot_dnn完成模型执行。
整个模型部署可以模型加载、分为预处理、模型推理、后处理。

模型加载:地平线的推理架构中编译后的AI模型以.bin结尾。

from hobot_dnn import pyeasy_dnn as dnn
models = dnn.load('../models/mobilenetv1_224x224_nv12.bin')

预处理:OpenCV完成

img_file = cv2.imread('./zebra_cls.jpg')
h, w = get_hw(models[0].inputs[0].properties)
des_dim = (w, h)
resized_data = cv2.resize(img_file, des_dim, interpolation=cv2.INTER_AREA)
nv12_data = bgr2nv12_opencv(resized_data)

模型推理:

outputs = models[0].forward(nv12_data)

后处理:

print("=" * 10, "Classification result", "=" * 10)
assert np.argmax(outputs[0].buffer) == 340
print("cls id: %d Confidence: %f" % (np.argmax(outputs[0].buffer), outputs[0].buffer[0][np.argmax(outputs[0].buffer)]))

本次只是把板子跑起来了,后续继续尝试地平线旭日3开发板关于C++推理接口、对摄像头视频推理、视频流编解码、模型转换/模型量化/模型部署调试工具链、大模型部署。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现: 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析 代码实现: 一、冒泡排序 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大…

轮胎侧偏刚度线性插值方法

一、trucksim取数据 步骤一 步骤二 二、数据导入到matlab中 利用simulink的look up table模块 1是侧偏角;2是垂直载荷;输出是侧向力。 侧向力除以侧偏角就是实时的侧偏刚度。

unocss+iconify技术在vue项目中使用20000+的图标

安装依赖 npm i unocss iconify/json配置依赖 vue.config.js文件 uno.config.js文件 main.js文件 使用 <i class"i-fa:user"></i> <i class"i-fa:key"></i>class名是 i- 开头&#xff0c;跟库名:图标名&#xff0c;那都有什么库…

数据结构之dict类

dict类 dict 是字典类。什么是字典&#xff08;Dictionary&#xff09;呢&#xff1f;就是一个可以通过索引找到对象的数据类型。在Python 的dict类里&#xff0c;索引就是“键”&#xff0c;对象也叫“值”&#xff0c;二者合起来就叫“键值对”。每个“键值对”之间用逗号&a…

“深入理解 Docker 和 Nacos 的单个部署与集成部署“

目录 引言&#xff1a;Docker Nacos 单个部署1.1 什么是 Docker&#xff1f;Docker 的概念和工作原理Docker 为什么受到广泛应用和认可 1.2 什么是 Nacos&#xff1f;Nacos 的核心功能和特点Nacos 在微服务架构中的作用 1.3 Docker 单个部署 Nacos Docker Nacos 集成部署总结&a…

【从零开始学习Redis | 第七篇】利用Redis构造全局唯一ID(含其他构造方法)

目录 前言&#xff1a; 什么是全局唯一ID&#xff1f; 尝试构造全局唯一ID&#xff1a; 其他构造全局唯一ID的方法 1.基于数据库自增构造全局唯一ID&#xff1a; 2.基于UUID构造全局唯一ID&#xff1a; 3.基于雪花算法构造全局唯一ID&#xff1a; 总结&#xff1a; 前…

leetcode 013二维区域和检索---矩阵不可变

给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的左上角为 (row1, col1) &#xff0c;右下角为 (row2, col2) 。 实现 NumMatrix 类&#xff1a; NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进…

Python数据分析案例36——基于神经网络的AQI多步预测(空气质量预测)

案例背景 不知道大家发现了没&#xff0c;现在的神经网络做时间序列的预测都是单步预测&#xff0c;即(需要使用X的t-n期到X的t-1期的数据去预测X的t期的数据)&#xff0c;这种预测只能预测一个点&#xff0c;我需要预测X的t1期的数据就没办法了&#xff0c;有的同学说可以把预…

部署Sqli-labs靶场:一篇文章解析全过程

部署Sqli-labs靶场&#xff1a;一篇文章解析全过程 0x01 前言 Sqli-labs是一个在线的SQL注入练习平台&#xff0c;提供了一系列关卡供用户练习SQL注入的技巧和防范方法。在这个平台上&#xff0c;用户可以尝试注入攻击&#xff0c;并测试自己的技能和工具&#xff0c;同时也可…

无心剑七绝《腊八粥香》

七绝腊八粥香 欣逢腊八粥浓香 五谷丰登聚宝庄 祈福心诚情不尽 佳肴共品待春芳 2024年1月18日 平水韵七阳平韵 这首七言绝句《腊八粥香》以腊八节为背景&#xff0c;描绘了人们欢庆腊八、祈福迎新的情景。 首句“欣逢腊八粥浓香”&#xff0c;开门见山地点明了主题——腊八节&a…

【笔记】《WebGL 编程指南》第 2 章 WebGL 入门

第一个 WebGL 程序 【P42】 默认情况下&#xff0c;<canvas>是透明的 【P44】 它不直接提供绘图方法&#xff0c;而是提供一种叫上下文&#xff08;context&#xff09;的机制来进行绘图。 【P45】 计算机系统通常使用红、绿、蓝这三原色组合来表示颜色&#xff0c;这种…

IMX6LL|时钟控制

一.时钟控制模块 4个层次配置芯片时钟 晶振时钟PLL与PFD时钟PLL选择时钟根时钟/外设时钟 1.1晶振时钟 系统时钟来源 RTC时钟源&#xff1a;32.768KHz&#xff0c;连接RTC模块&#xff0c;进行时间计算。系统时钟&#xff1a;24MHz&#xff0c;芯片主晶振 1.2PLL和PFD倍频时钟…

十一、常用API——正则表达式

目录 练习1&#xff1a; 正则表达式的作用 正则表达式 字符类&#xff08;只匹配一个字符&#xff09; 预定义字符&#xff08;只匹配一个字符&#xff09; 数量词 类 Pattern 正则表达式的构造摘要 反斜线、转义和引用 字符类 行结束符 组和捕获 Unicode 支持 与…

leetcode234. 回文链表

题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;hea…

关于KT6368A双模蓝牙芯片的BLE在ios的lightblue大数量数据测试

测试简介 关于KT6368A双模蓝牙芯片的BLE在ios的lightblue app大数量数据测试 测试环境&#xff1a;iphone7 。KT6368A双模程序96B6 App&#xff1a;lightblue ios端 可以打开log日志查看通讯流程 测试数据&#xff1a;长度是1224个字节&#xff0c;单次直接发给KT6368A&a…

ELK之Filebeat输出日志格式设置及输出字段过滤和修改

一、Filebeat输出日志格式设置 1.1 编辑vim filebeat.yml文件,修改输出格式设置 # output to console output.console:codec.format: string: %{[@timestamp]} %{[message]}pretty: true### 1.2 测试 执行 ./filebeat -e 可以看到/tmp/access.log(目前文件里只有140.77.188…

【Java 设计模式】结构型之桥接模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使它们可以独立变化&#xff0c;从而降低它们之间的耦合。桥接模式通过将抽象部分和实现部分分离&#x…

【PyTorch】PyTorch之Tensors操作篇

文章目录 前言一、Tensor创建1、TENSOR2、SPARSE_COO_TENSOR3、SPARSE_CSR_TENSOR4、ASARRAY5、AS_TENSOR6、FROM_NUMPY7、FROMBUFFER8、ZEROS和ZEROS_LIKE9、ONES和ONES_LIKE10、ARANGE11、LINSPACE12、LOGSPACE13、EYE14、EMPTY和EMPTY_LIKE15、FULL和FULL_LIKE 前言 介绍Te…

Docker搭建MySQL主从数据库-亲测有效

1、测试环境概述 1、使用MySQL5.7.35版本 2、使用Centos7操作系统 3、使用Docker20版本 案例中描述了整个测试的详细过程 2、安装Docker 2.1、如果已经安装docker,可以先卸载 yum remove -y docker \ docker-client \ docker-client-latest \ docker-common \ docker-l…

Nginx重写功能location与rewrite

1. location 从功能看 rewrite 和 location 似乎有点像&#xff0c;都能实现跳转&#xff0c;主要区别在于 rewrite 是在同一域名内更改获取资源的路径&#xff0c;而 location 是对一类路径做控制访问或反向代理&#xff0c;还可以proxy_pass 到其他机器。 rewrite 对访问的…