zzzcms建站系统,西安网站开发公司哪家好,站长网站查询工具,南通seo快速排名第三篇 环境搭建及开发板操作 文章目录 第三篇 环境搭建及开发板操作1.配置VMware使用桥接网卡1.1 vmware设置1.2 虚拟网络编辑器设置 2.安装软件2.2 安装 Windows 软件2.3 使用MobaXterm远程登录Ubuntu2.4 使用FileZilla在Windows和Ubuntu之间传文件2.5编程示例#xff1a;Ub…第三篇 环境搭建及开发板操作 文章目录 第三篇 环境搭建及开发板操作1.配置VMware使用桥接网卡1.1 vmware设置1.2 虚拟网络编辑器设置 2.安装软件2.2 安装 Windows 软件2.3 使用MobaXterm远程登录Ubuntu2.4 使用FileZilla在Windows和Ubuntu之间传文件2.5编程示例Ubuntu上的Hello程序2.5.1 用Source Insight编写hello.c2.5.2 用FileZilla上传源码 1.1.1 编译、运行程序 3.DongshanPI-Vision开发板基本操作3.1 DongshanPI-Vision开发板硬件资源简介3.2 DongshanPI-Vision开发板软件资源介绍3.2.1 开发开发环境3.2.2 核心软件3.2.3 文件系统 3.3 启动方式选择3.4 开发板硬件连接3.4.1 天线连接3.4.2 连接摄像头3.4.3 连接显示屏3.4.4串口及OTG连接 3.5 查看串口端口号3.6 使用MobaXterm软件打开串口3.7 通过串口操作开发板3.8 开机自启应用程序3.9 更新系统3.9.1 更新EMMC系统3.9.1.1 硬件操作3.9.1.2 安装串口驱动3.9.1.3 烧录镜像3.9.1.4 安装烧录驱动3.9.1.5 完整烧录镜像3.9.1.6 启动EMMC系统 3.9.2 制作SD卡镜像3.9.2.1 格式化microSD卡3.9.2.2 使用Etcher烧录镜像3.9.2.3 启动SD卡系统 3.10 使用wifi连接网络3.10.1 结束开启联网脚本3.10.2 填写WIFI信息3.10.3 连接WiFi 3.11 使用TFTP服务在Ubuntu和开发板传输文件3.11.1 Ubuntu安装TFTP服务3.11.2 开发板通过tftp传输文件 3.12 配置开发板SSH功能3.12.1 修改ssh配置文件3.12.2 启动ssh3.12.3 连接ssh3.12.4 使用MobaXterm传输文件 4.系统功能及AI应用初体验4.1 系统功能体验指南4.1.1 ai demo程序4.1.2 ffmpeg4.1.3 alsa_demo4.1.4 TWOD demo4.1.5 RTC demo4.1.6 WDT demo4.1.7 UART demo4.1.8 ETH demo4.1.9 SDMMC demo4.1.10 SHA/AES demo4.1.11 TRNG demo4.1.12 DRM demo4.1.13 V4L2_DRM demo4.1.14 LVGL demo4.1.15 PWM demo4.1.16 WIFI demo4.1.17 GPIO_KEYS demo 4.2 AI应用体验指南4.2.1人脸对齐4.2.2人脸检测人脸检测器-bf16人脸检测器-uint8 4.2.3人脸表情识别4.2.4人脸关键点检测4.2.5人脸识别5.2.6人形检测人体关键点检测-openpose人体关键点检测-YOLOV5S 4.2.7指尖指定区域识别4.2.8头部态角估计4.2.9车牌识别4.2.10YOLOV5目标检测YOLOV5目标检测-bf16YOLOV5目标检测-uint8 4.2.11自学习KNN算法 5.编写一个简单的helloword程序5.1 编写helloword应用程序5.2.编写Makefile编译规则5.3 交叉编译hellowrod程序5.2 上传程序到开发板上运行 6.编译一个简单的AI demo程序6.1 编译hello AI的demo程序6.2 上传程序到开发板运行6.3 hello AI程序讲解6.3.1 程序框架6.3.2 程序讲解 7.嵌入式开发7.1编译工具链7.2 交叉编译工具链7.3 获得合适的交叉编译工具链7.4 Makefile构建工具7. 5 CMake构建工具 1.配置VMware使用桥接网卡
1.1 vmware设置
使用桥接模式下虚拟主机与真实主要在VMnet0构成的局域网内通信同时通过真实主机中的网关与外网通信即可实现Ubuntu与开发板进行文件传输。
设置网络适配器为桥接模式。 图1.1 进入VMware虚拟机设置 点击网络适配器 NAT将网络连接方式选择为桥接模式。 图1.2 修改网络适配器 1.2 虚拟网络编辑器设置
在开始菜单搜索“虚拟网络编辑器”点击“以管理员身份运行”打开虚拟网络编辑器 图1.3 更爱虚拟网络编辑器 参考图 1.4点击“VMnet0”选择“桥接模式”在桥接模式下的“已桥接至”下拉框中选中你电脑中实际使用WIFI网卡最后点击确定即可完成vmware配置。
注意必须是“VMnet0”如果没有“VMnet0”可以点击“添加网络”。 图1.4 桥接实际的wifi网卡 2.安装软件
2.2 安装 Windows 软件
“开发板配套资料\2_DongshanPI-Vision_配套工具\”
在网盘资料包的上述目录中,可以得到一系列的安装软件建议全部安装。有如下软件
表 2‑1 Windows中需要安装的软件 软件名说明VMwareWorkstation虚拟机软件安装时需要用到管理员权限SD Card FormatterSD卡格式化工具MobaXterm串口工具、远程登录工具Filezilla文件传输工具在Windows和Ubuntu之间传输文件Source insight阅读、编写源码的工具即装即用推荐初学者使用
2.3 使用MobaXterm远程登录Ubuntu
先确认Ubuntu的IP在Ubuntu终端执行ifconfig命令确定桥接网卡IP(注意这个IP过一段时间会发生变化那就使用新IP重新连接)如图 2.3所示 图 2.3 ifconfig查看网络IP 安装、运行MobaXterm如下建立Session 图 2.4 建立ssh 按图 2.4操作后在MobaXterm左侧就可以看到图 2.5这项双击它就可以登录Ubuntu(第1次登录时会提示你输入密码密码是ubuntu)然后就可以执行各种Linux命令了 图 2.5 Mobaxterm登陆上了Ubuntu 2.4 使用FileZilla在Windows和Ubuntu之间传文件
使用MobaXterm既可以ssh登录又可以传输文件不过Mobaxterm在传输文件时使用效率上没有 FileZilla高所以我们推荐Windows和Ubuntu互相传输文件时使用FileZilla。
双击打开FileZilla后按图 2.6操作 图 2.6 FileZilla连接Windows和Ubuntu 第1次连接时会有如图 2.7所示的提示选择“总是信任” 图 2.7 FileZilla建立连接 在Filezilla中左边是Windows文件右边是Ubuntu的文件如图 2.8 图 2.8 FileZilla下Windows和Ubuntu互传文件 2.5编程示例Ubuntu上的Hello程序
本节演示如何在Windows编写程序、上传到Ubuntu在Ubuntu中编译、执行。只涉及一个简单的Hello程序使用命令行编译不涉及Makefile等知识这些知识在后面的应用基础中讲解。
2.5.1 用Source Insight编写hello.c
启动Source Insight点击“File”-“New”新建文件如图 2.9 图 2.9 SI新建文件 接下来编写代码保存文件如图 2.10所示 图 2.10 SI编写代码并保存
hello.c的源码如下
#include stdio.h
int main(int argc, char **argv)
{printf(hello, world!\n);return 0;
}2.5.2 用FileZilla上传源码
如图 2.11操作 图 2.11 从windows传文件到Ubuntu 1.1.1 编译、运行程序
如图 2.12操作对于gcc命令的用法在后面讲到应用开发基础时再细讲这里只是体验一下 图 2.12 体验Hello World 3.DongshanPI-Vision开发板基本操作
3.1 DongshanPI-Vision开发板硬件资源简介
DongshanPI-Vision开发板是围绕着嘉楠 勘智K510芯片构建的采用64位双核RISC-V架构 主频为800MHz支持双精度FPU扩展。采用64位DSP扩展主频为800MHz。芯片内置通用神经网络引擎KPU拥有2.5TFLOPS BF16/2.5TOPS INT8算力支持TensorFlow、PyTorch、ONNX等多种框架的算子库。
特征描述处理器嘉楠 勘智K510内存512MB LPDDR3存储4GB EMMCWIFI/蓝牙天线2.4GHz视频输出MIPI显示(MIPI DSI)/HDMI显示(HDMI)/SPI显示SPI DSI视频输入两路MIPI摄像头(MIPI CSI *2)/DVP摄像头(DVP Canera)音频输入MIC咪头音频输出扬声器/耳机其他连接器·TF卡槽·2个USB连接器· JTAG调试口·电池接口
开发板组成位置
本章节介绍开发板中关键的元器件及位置功能介绍如下所示各个标号对应的硬件在板子上都写有名字。
开发板正面图 开发板背面图 3.2 DongshanPI-Vision开发板软件资源介绍
3.2.1 开发开发环境 图 3.3 开发板开发环境 3.2.2 核心软件 图3.4 核心软件 3.2.3 文件系统 图3.5 文件系统 3.3 启动方式选择
板子上的拨码开关用来设置启动方式支持这3种方式EMMC启动、SD卡启动、串口烧写。启动方式如表3-1所示
BOOT MODELSW1(BOOT0)SW2(BOOT1)EMMCOFFOFFSDOFFON串口烧录ONON
这3种启动方式的设置示意图 3.7如下 图 3.7 拨码开关与启动方式 注意设置为串口烧录时不能插上SD卡、TF卡上电之后才可以插卡。刚出厂的板子在EMMC上烧写了系统你可以设置为EMMC启动方式。
3.4 开发板硬件连接
3.4.1 天线连接
要使用WIFI您需要连接DongshanPI-Vision盒子中提供的2.4GHz天线下面是将天线连接到DongshanPI-Vision开发板的指南。 3.4.2 连接摄像头
要使用摄像头获取图像数据如果您只单独购买了DongshanPI-Vision开发板可能还需另外购买MIPI摄像头。下面图片是将MIPI摄像头连接到DongshanPI-Vision开发板的指南。 3.4.3 连接显示屏
要使用显示屏显示摄像头获取的图像如果您只单独购买了DongshanPI-Vision开发板可能还需另外购买MIPI显示屏或者也可直接使用HDMI线连接电脑显示器。下面是将MIPI显示屏连接到DongshanPI-Vision开发板的指南。 3.4.4串口及OTG连接
通过Type-C线将板连接到PC电脑您可以使用DongshanPI-Vision盒子中的的两条Type-C线。连接指南如下所示 注意请直接将两条数据线连接到电脑端请勿使用USB HUB连接两条Type-C数据线。如果您的电脑没有多余的USB口可使用5V1A的电源适配器连接到OTG口进行供电。 一旦开发板套件通电后核心板上会亮起红灯红灯位置如下图中蓝色箭头所示 3.5 查看串口端口号
在接好串口处的Type-C数据线连接电脑和开发板后打开电脑的设备管理器并展开端口(COM和LPT)列表。可以看到下图中连接后的端口号为COM37。开发板上的USB串口芯片可能是CP210x或CH9102它们的性能是一样的。你电脑上显示的COM序号可能不一样记住你电脑显示的数字。 如果电脑没有显示出端口号就需要手动安装驱动已经将驱动安装包放入网盘资料中了 图 3.10 USB串口驱动
如果电脑中没有自动安装驱动在“设备管理器”会有黄色感叹号提示当前连接的是哪种类型的串口芯片根据提示选择驱动安装。如果提示中有“CP210x”字样则选择“CP210x_Windows_Drivers.zip”否则就选择另外一个驱动安装。
3.6 使用MobaXterm软件打开串口
打开MobaXterm点击左上角的“Session”在弹出的界面选中“Serial”如下图所示选择端口号前面设备管理器显示的端口号COM17或COM19、波特率Speed 115200、流控Flow Control: none,最后点击“OK”即可。步骤如图 3.11所示。 注意流控Flow Control一定要选择none否则你将无法在MobaXterm中向串口输入数据。 随后显示一个黑色的窗口 此时打开板子的电源开关将收到板子串口发过来的数据如图 3.12所示。 4.进入串口调试控制台后如果开发板正在启动uboot或者kernel则会不断打印输出信息直到系统完全启动如果开发板已经完全启动则不会打印信息可直接按下回车键进入开发板系统控制台。 3.7 通过串口操作开发板
在串口看到rootcanaan这类登录的提示信息时输入回车即可然后就可以执行各种Linux命令了如图 3.14所示 3.8 开机自启应用程序
当系统启动后如果您正常连接两个摄像头和显示屏系统会在uboot系统启动阶段显示canaan官方logo效果图如下所示 当系统完全启动后会自动运行实时预览程序使用V4L2抓取摄像头图像并实时显示在显示屏上。效果图如下所示 如果您想结束掉该进程或者想运行其他需要使用摄像头和显示屏的程序您可以通过在串口终端控制台输入ps查看所以进程并找到进程名.为v4l2_drm.out所对对应的进程号如下所示
188 root 0:00 ./v4l2_drm.out -f video_drm_1920x1080.conf -e 1 -s可以看到最前面的为进程号可能您的进程号和我不一致这里我的进程号为188此时我应该输入
kill -9 188如果您的进程号不是188需要将188修改为您实际的进程号才能正常结束该应用程序。
3.9 更新系统
3.9.1 更新EMMC系统
硬件要求
DongshanPI-Vision开发板Type-c数据线 x2
软件要求
DongshanPI-Vision开发板EMMC镜像https://dongshanpi.cowtransfer.com/s/5482c150ff6147KendryteBurningTool 烧录工具https://dongshanpi.cowtransfer.com/s/b3709a719d2342
开始前请下载DongshanPI-Vision开发板EMMC镜像 并记住它在计算机中保存的位置。
3.9.1.1 硬件操作
将下图中的拨码开关的boot0和boot1都向上拨使开发板进入下载模式。使用两条Type-C线连接开发板端和电脑端用于给开发板进行供电和使用串口进行烧录EMMC系统。 3.9.1.2 安装串口驱动
串口驱动安装程序2_DongshanPI-Vision_配套工具/【Windows】串口驱动工具 安装前说明每台计算机安装一次即可。 打开串口驱动安装软件CH341SER.EXE打开后会进入如下界面 点击安装 等待安装完成即可。 3.9.1.3 烧录镜像
下载EMMC镜像并记住它在计算机中的位置。打开KendryteBurningTool 烧录工具进入KendryteBurningTool\bin目录下双击打开BurningTool.exe如下所示的文件。 注意在使用KendryteBurningTool 烧录工具时需要关闭串口软件和虚拟机防止串口被占用。 打开BurningTool.exe程序后会进入如下界面 点击选择文件选择下载好的EMMC镜像。选择完成后点击保存操作步骤如下所示 保存后需要在串口选择中选择开发板的串口号当我们将开发板和PC电脑端通过Type-C连接起来后可以在BurningTool软件中点击红色箭头处查看我开发板的端口号选择开发板的串口端口号。我们也可以在设备管理器中确认开发的端口号 选择完成后点击开始烧录烧录。如果您不是第一次进行烧录此时等待成功烧录完成即可。如果您是第一次进行烧录请继续阅读下面的内容。第一次烧录步骤如下所示 当PC电脑首次进行烧录时第一个进度条结束后会显示下图中的错误信息。此时需要安装驱动。 3.9.1.4 安装烧录驱动
zadig-2.4烧录驱动安装文件 安装前说明每台计算机安装一次即可。 打开zadig-2.4软件进入如下界面 点击Option中的选择List All Devices列出所有设备具体操作如下所示 上述操作完成后可以看到在虚线框内出现了设备名我们需要切换设备为 Mass storage devices,具体操作如下所示 点击Replace Driver替换驱动程序此时会弹出一个确认窗口点击是。 安装完成后会弹出以下窗口点击close 到此烧录驱动成功安装。
3.9.1.5 完整烧录镜像
安装完成烧录镜像后再次打开BurningTool.exe烧录工具软件按照1.3章节中的操作进行烧录即可。完整烧录步骤如下所示 3.9.1.6 启动EMMC系统
将下图中的拨码开关的boot0和boot1都向下拨使开发板进入EMMC启动模式。使用两条Type-C线连接开发板端和电脑端用于给开发板进行供电和使用串口登录开发板控制台。 使用串口软件查看串口控制台成功启动后会进入开发板控制台。 3.9.2 制作SD卡镜像
硬件要求
DongshanPI-Vision开发板microSD卡建议最小8GType-c数据线 x2
软件要求
DongshanPI-Vision开发板SD卡镜像https://dongshanpi.cowtransfer.com/s/bac8fbdce7c046SD卡格式化工具:SD Memory Card FormatterSD卡刷机工具ETCHER
开始前请下载DongshanPI-Vision开发板SD卡镜像并记住它在计算机中保存的位置。
3.9.2.1 格式化microSD卡
将您的SD卡使用读卡器通过USB口插入您的PC电脑使用SD卡格式化工具SD Memory Card Formatter格式化您的SD卡。点击下图中红框位置开始格式化内存卡。 点击完成后会弹出下图所示的提示框该提示警告我们格式化将清空卡中的所有数据询问我们是否继续这里点击是 等待格式化完成后会弹出以下对话框提示我们格式化后的文件系统为FAT32以及内存大小可用空间点击确定即可完成SD卡的格式化。 3.9.2.2 使用Etcher烧录镜像
使用Etcher将DongshanPI-Vision开发板SD卡镜像写入您的microSD卡。
下载Etcher烧写工具并安装它。启动Etcher应用程序启动后界面如下图所示 点击Flash from file如下图所示点击下图红框处。 此时会弹出文件资源管理器选择您刚刚下载的DongshanPI-Vision开发板SD卡镜像。 选择完成后会显示下面的界面点击下图中红框处Select target选择要写入的目标microSD卡。 点击完成后会弹出选择目标此时选择您通过读卡器插入电脑中的microSD卡。 选择完成后会显示以下界面点击Flash后即可开始烧写。 如下图所示等待烧写完成即可。 使用Etcher烧写完成后Windows可能会不知道如何读取您的microSD卡会弹出如下图所示警告点击取消后拔出microSD卡即可。 3.9.2.3 启动SD卡系统
将下图中的拨码开关的boot0向下拨和boot1向上拨使开发板进入SD卡启动模式。将SD卡插入开发板的卡槽中步骤如下图所示 使用两条Type-C线连接开发板端和电脑端用于给开发板进行供电和使用串口登录开发板控制台。 使用串口软件查看串口控制台成功启动后会进入开发板控制台。 3.10 使用wifi连接网络
3.10.1 结束开启联网脚本
安装启动开发板完成后打开串口终端进入开发板控制台。由于开发板启动后会启动联网脚本我们第一次配网时需要手动结束联网脚本。输入ps查看进程找到下面所示的两个进程。 159 root 0:00 wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.178 root 0:00 udhcpc -R -n -p /var/run/udhcpc.eth0.pid -i eth0 -b通过上述信息可以发现我们需要手动结束159和178这两个进程您的进程号可能和我不一致按您开发板上世纪的进程操作。输入
kill -9 PID假设我使用的开发板中wpa_supplicant和udhcpc进程号分别为159和178此时我应该输入以下命令
kill -9 159
kill -9 178手动结束后使用ps查看是否还存在对应进程。
3.10.2 填写WIFI信息
修改/etc/wpa_supplicant.conf文件填写wifi名称和密码输入
vi /etc/wpa_supplicant.conf进入vi编辑器后会显示以下信息
ctrl_interface/var/run/wpa_supplicant
update_config1
ap_scan1在文件末尾增加网络信息
network{ssidwifi名称psk密码}假设我的WiFi名称为Programmers密码为123456则实际添加的网络信息为
network{ssidProgrammerspsk12345678}添加完成后保存并退出vi编辑器。
3.10.3 连接WiFi
连接到 SSID输入
wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant.conf执行完成后如下所示 获取ip地址输入
udhcpc -i wlan0获取完成后即为成功连接互联网。
测试WiFi是否可以访问互联网输入ping www.baidu.com输入后如下所示
[rootcanaan ~ ]$ ping www.baidu.com
PING www.baidu.com (14.119.104.189): 56 data bytes
64 bytes from 14.119.104.189: seq0 ttl55 time10.241 ms
64 bytes from 14.119.104.189: seq1 ttl55 time16.292 ms
64 bytes from 14.119.104.189: seq2 ttl55 time15.699 ms
64 bytes from 14.119.104.189: seq3 ttl55 time12.508 ms在后续启动开发板中开发板会自动连接到SSID您只需要重新获取ip地址即可访问互联网。
3.11 使用TFTP服务在Ubuntu和开发板传输文件
3.11.1 Ubuntu安装TFTP服务
在Ubuntu中执行以下命令安装TFTP服务
sudo apt-get install tftp-hpa tftpd-hpa然后创建TFTP服务工作目录并打开TFTP服务配置文件如下:
mkdir -p /home/ubuntu/tftpboot
chmod 777 /home/ubuntu/tftpboot
sudo gedit /etc/default/tftpd-hpa在配置文件/etc/default/tftpd-hpa中将原来的内容删除修改为
TFTP_USERNAMEtftp
TFTP_ADDRESS:69
TFTP_DIRECTORY/home/ubuntu/tftpboot
TFTP_OPTIONS-l -c -s最后重启TFTP服务:
sudo service tftpd-hpa restart查看tftp服务是否在运行,运行如下命令即可查看是否在后台运行。
ubuntuubuntu2004:~/Desktop$ ps -aux | grep “tftp”
ubuntu 4555 0.0 0.0 9040 652 pts/0 S 02:33 0:00 grep --colorauto “tftp”3.11.2 开发板通过tftp传输文件
首先确保Ubuntu或Windows的tftp服务目录内有需要下载到板子上的文件比如
ubuntuubuntu2004:~$ ls /home/ubuntu/tftpboot/
object_detect确认Ubuntu的网络IP例如 比如下载Ubuntu服务器下的zImage 文件则在开发板上执行如下命令(Ubuntu的桥接网卡IP是192.168.0.197)
[rootcanaan ~ ]$ tftp -g -r object_detect 192.168.0.197下载过程如下所示
[rootcanaan ~ ]$ tftp -r object_detect -g 192.168.0.197
object_detect 100% |********************************| 894k 0:00:00 ETA下载完成后可以在当前目录找到该文件
[rootcanaan ~ ]$ ls
data emmc object_detect如何从开发板上传文件到Ubuntu比如我们现在开发板家目录下创建一个1.txt 的文本文件然后写入111111….
[root100ask:~]$ tftp -p -l 1.txt 192.168.5.197
1.txt 100% |********************************| 8 0:00:00 ETA此时我们查看Ubuntu服务器的tftp服务目录下即可看到之前在开发板上创建的1.txt
ubuntuubuntu2004:~$ ls /home/ubuntu/tftpboot/
1.txt object_detect3.12 配置开发板SSH功能
3.12.1 修改ssh配置文件
使用Mobaxterm终端工具访问开发板的串口控制台等待系统启动后进入/etc/ssh目录下
[rootcanaan ~ ]$ cd /etc/ssh/
[rootcanaan /etc/ssh ]$ ls
moduli ssh_config sshd_config进入ssh目录可以看到有三个文件您需要修改sshd_config使用vi命令进行修改
[rootcanaan /etc/ssh ]$ vi sshd_config输入后进入vi编辑器修改下图中红框处的两项。
配置SSH登录设置 将红框处两项取消注释并将参数设置为yes
PermitRootLogin yes
PermitEmptyPasswords yes修改完成后如下所示 配置SFTP服务
修改sshd_config中的sftp配置项
修改前
Subsystem sftp /usr/libexec/sftp-server修改后
Subsystem sftp internal-sftp修改完成后按下esc输入:wq保存并退出编辑器。
3.12.2 启动ssh
当您修改完成配置文件后后需要手动重启ssh在终端输入/etc/init.d/S50sshd restart。
[rootcanaan ~ ]$ /etc/init.d/S50sshd restart
Stopping sshd: killall: sshd: no process killed
OK
Starting sshd: OK输入完成后ssh会重新启动。
3.12.3 连接ssh 开始前请注意 您的PC电脑需要和开发板连接同一个WIFI。 在开发板串口终端输入udhcpc -i wlan0获取您的开发板连接WIFI的IP地址
[rootcanaan ~ ]$ udhcpc -i wlan0
udhcpc: started, v1.31.1
udhcpc: sending discover
udhcpc: sending select for 192.168.0.154
udhcpc: lease of 192.168.0.154 obtained, lease time 122
deleting routers
adding dns 192.168.0.1
adding dns 192.168.0.1获取完成后输入ifconfig wlan0 查看开发板所连接WIFI的IP地址
[rootcanaan ~ ]$ ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 8C:F7:10:47:9B:6Einet addr:192.168.0.154 Bcast:192.168.0.255 Mask:255.255.255.0inet6 addr: fe80::8ef7:10ff:fe47:9b6e/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:438 errors:0 dropped:2 overruns:0 frame:0TX packets:21 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:34571 (33.7 KiB) TX bytes:2446 (2.3 KiB)可以看到wlan0选项中的IP地址为192.168.0.154
3.12.4 使用MobaXterm传输文件
使用MobaXterm终端工具点击会话Session如下图中红框所示 点击完成后会弹出以下界面点击使用SSH如下图红框所示 进入ssh配置界面后远程主机Remote host的框输入开发板的IP地址勾选指定用户名Specify username前的框在后面填写开发板的用户名root填写完成后点击OK即可。如下图所示 点击完成后就会打开一个新的终端如下图所示 您可以看到这里也可以访问开发的串口终端。您可以看到左边选项卡中的开发板对应的文件系统例如data/emmc您在选项卡中可以对文件夹中内容进行下载或者上传。如下图所示这里我进入/root/emmc/p3/app/ai/exe/目录中选择face_detect文件单击右键后弹出选项栏选择Download即可开始下载该文件。 如果您想上传文件到当前目录在左侧选项卡的空白处点击右键选择Upload to current folder上传到当前文件夹即可。 4.系统功能及AI应用初体验
4.1 系统功能体验指南
4.1.1 ai demo程序
说明
nncase 的demo程序源码位于SDK目录下的package/ai目录目录结构如下
$ tree -L 2 ai
ai
├── ai.hash
├── ai.mk
├── code
│ ├── build.sh
│ ├── cmake
│ ├── CMakeLists.txt
│ ├── common
│ ├── face_alignment
│ ├── face_detect
│ ├── face_expression
│ ├── face_landmarks
│ ├── face_recog
│ ├── hand_image_classify
│ ├── head_pose_estimation
│ ├── imx219_0.conf
│ ├── imx219_1.conf
│ ├── license_plate_recog
│ ├── object_detect
│ ├── object_detect_demo
│ ├── openpose
│ ├── person_detect
│ ├── retinaface_mb_320
│ ├── self_learning
│ ├── shell
│ ├── simple_pose
│ ├── video_192x320.conf
│ ├── video_object_detect_320.conf
│ ├── video_object_detect_320x320.conf
│ ├── video_object_detect_432x368.conf
│ ├── video_object_detect_512.conf
│ ├── video_object_detect_640.conf
│ └── video_object_detect_640x480.conf
└── Config.in可以参考retinaface_mb_320的源码和CMakeLists.txt添加新的nncase 的demo程序。
模型的编译参见nncase_demo.mk里面定义的POST_INSTALL_TARGET_HOOKS
NNCASE_DEMO_DEPENDENCIES mediactl_lib nncase_linux_runtime opencv4 libdrm
define NNCASE_DEMO_COMPILE_MODELmkdir -p $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320cd $(D) /usr/bin/python3 retinaface_mb_320/rf_onnx.py --quant_type uint8 --model ai_kmodel_data/model_file/retinaface/retinaface_mobile0.25_320.onnxcp $(D)/rf.kmodel $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320/rf_uint8.kmodelcd $(D) /usr/bin/python3 retinaface_mb_320/rf_onnx.py --quant_type bf16 --model ai_kmodel_data/model_file/retinaface/retinaface_mobile0.25_320.onnxcp $(D)/rf.kmodel $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320/rf_bf16.kmodelNNCASE_DEMO_POST_INSTALL_TARGET_HOOKS NNCASE_DEMO_COMPILE_MODEL模型的编译需要nncase环境关于nncase环境的搭建参考k510_nncase_Developer_Guides.md。以后nncase有更新buildroot sdk会同步更新到nncase。
retinaface
功能人脸检测人脸特征点检测
程序路径 /app/ai/shell 运行 执行非量化模型./retinaface_mb_320_bf16.sh 执行uint8量化模型./retinaface_mb_320_uint8.sh
脚本里面有关于QOS的设置下面的两个demo的设置一样。
#devmem phyaddr width value
devmem 0x970E00fc 32 0x0fffff00
devmem 0x970E0100 32 0x000000ff
devmem 0x970E00f4 32 0x00550000跑demo时需要优先保证屏幕显示正常即调整显示相关的QoS为高优先级。 QOS_CTRL0.ax25mp write QoS 5 QOS_CTRL0.ax25mp read QoS 5 QOS_CTRL2.ispf2k write QoS 0xf QOS_CTRL2.ispf2k read QoS 0xf QOS_CTRL2.ispr2k write QoS 0xf QOS_CTRL2.ispr2k read QoS 0xf QOS_CTRL2.isp3dtof write QoS 0xf QOS_CTRL3.display read QoS 0xf QOS_CTRL3.display write QoS 0xf
QOS 控制寄存器0(QOS_CTRL0) offset[0x00f4]
QOS 控制寄存器1(QOS_CTRL1) offset[0x00f8]
QOS 控制寄存器2(QOS_CTRL2) offset[0x00fc]
QOS 控制寄存器3(QOS_CTRL3) offset[0x0100]
模型的编译安装详见文件package/ai/ai.mk
编译脚本路径 100ask_base-aiApplication-demo/code/retinaface_mb_320/rf_onnx.py
object_detect
功能物体分类检测80分类
程序路径 /app/ai/shell
运行 执行非量化模型./object_detect_demo_bf16.sh 执行uint8量化模型./object_detect_demo_uint8.sh
模型的编译安装详见文件package/ai/ai.mk
编译脚本路径 100ask_base-aiApplication-demo/code/object_detect_demo/od_onnx.py
4.1.2 ffmpeg
ffmpeg在ffmpeg-4.4开源代码上进行移植0001-buildroot-ffmpeg-0.1.patch为补丁包增加了
ff_k510_video_demuxer控制isp输入引用了libvideo.soff_libk510_h264_encoder控制h264硬件编码引用了libvenc.so
可以通过help指令查看可配置参数
ffmpeg -h encoderlibk510_h264 #查看k510编码器的参数
ffmpeg -h demuxerlibk510_video #查看demuxer的配置参数详细运行说明参考K510_Multimedia_Developer_Guides.md
4.1.3 alsa_demo
alsa demo程序放在/app/alsa_demo目录下
运行准备:
插上耳机
使用ALSA UTILS测试。
4.1.4 TWOD demo
运行 rotation 使用方法
cd /app/twod_app
./twod-rotation-app将ouput.yuv 拷到yuv显示器上设置尺寸1080 x 1920显示格式nv12结果如下
scaler 使用方法
cd /app/twod_app
./twod-scaler-app将ouput.yuv 拷到yuv显示器上设置尺寸640x480显示格式nv12结果如下
运行 rgb2yuv 使用方法
cd /app/twod_app
./twod-osd2yuv-app将ouput.yuv 拷到yuv 显示器上设置尺寸320x240,显示格式nv12结果如下
运行 yuv2rgb 使用方法
cd /app/twod_app
./twod-scaler-output-rgb888-app将ouput.yuv 拷到rgb888显示器上设置尺寸640x480显示格式rgb24结果如下
运行 输出yuv上叠加osd 使用方法
cd /app/twod_app
./twod-scaler-overlay-osd-app将ouput.yuv 拷到显示器上设置尺寸640x480显示格式nv12结果如下
API:
/* 创建内存 */
twod_create_fb()
/* 配置原图片参数 */
twod_set_src_picture()
/* 配置输出图片参数 */
twod_set_des_picture()
/* 设置 scaler */
twod_set_scaler()
/* 等待操作完成 */
twod_wait_vsync()
/* Invali cache */
twod_InvalidateCache()
/* flash cache */
twod_flashdateCache()
/* 释放内存*/
twod_free_mem()
/* 设置旋转 */
twod_set_rot()4.1.5 RTC demo
RTC驱动会注册生成/dev/rtc0设备节点。
应用层遵循Linux系统中的标准RTC编程方法调用驱动在运行参考例程之前建议通过shell 控制台关闭内核信息打印。
echo 0 /proc/sys/kernel/printk进入/app/rtc目录输入如下命令启动rtc应用程序。
cd /app/rtc
./rtc 2021-11-3 21:10:59程序的执行结果为 RTC demo程序的主要代码片段如下详细请参考package/rtc 文件夹下的代码。
/*解析参数获取当前年月日、时分秒*/
if(argc !3) {fprintf(stdout, useage:\t ./rtc year-month-day hour:minute:second\n);fprintf(stdout, example: ./rtc 2021-10-11 19:54:30\n);return -1;
}sscanf(argv[1], %d-%d-%d, year, month, day);
sscanf(argv[2], %d:%d:%d, hour, minute, second);/*打开RTC设备设备节点是/dev/rtc0 */
fd open(/dev/rtc0, O_RDONLY);
if (fd -1) {perror(/dev/rtc0);exit(errno);
}/* 设置RTC时间。*/
retval ioctl(fd, RTC_SET_TIME, rtc_tm);
if (retval -1) {perror(ioctl);exit(errno);
}/* 休眠 2秒。 */
sleep(2);/* 读取RTC当前时间。*/
retval ioctl(fd, RTC_RD_TIME, rtc_tm);
if (retval -1) {perror(ioctl);exit(errno);
}/* 打印 RTC当前时间。*/
fprintf(stdout, \nRTC date/time: %d/%d/%d %02d:%02d:%02d\n,rtc_tm.tm_mday, rtc_tm.tm_mon 1, rtc_tm.tm_year 1900,rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);4.1.6 WDT demo
K510一共有三个看门狗WDT驱动会注册生成/dev/watchdog0、/dev/watchdog1、/dev/watchdog2 设备节点。
应用层遵循 Linux系统中的标准WDT编程方法调用驱动wathdog应用程序第一个参数可为0、1分别代表watchdog0、watchdog1第二个参数表示可设置的超时时间单位秒例如如下命令表示启动watchdog0watchdog0溢出时间40秒。
cd /app/watchdog
./watchdog 0 40程序启动后将每间隔1秒喂一次看门狗当shell终端中输入stop字符后应用程序停止喂狗看门狗将在设置超时时间溢出后复位设备重启详细请参考package/watchdog文件夹下的代码。
程序的执行结果为 注意当前k510看门狗模块的工作时钟频率为757575Hz以秒为单位的超时时间需要转换成看门狗实际的工作时钟频率的超时时间计算公式是2^n/757575因此实际的超时时间会大于等于输入的超时时间。
实际超时时间的计算过程是 输入402^25/75757544 402^24/75757522 40因此设置为44秒 输入1552^27/757575177 155因此设置为177秒 输入20002^31/7575752834 2000因此设置为2834秒
4.1.7 UART demo
K510一共有4个串口当前驱动中串口2、3没有使能串口0驱动会注册生成/dev/ttyS0设备节点。
应用层遵循Linux系统中的标准UART编程方法调用驱动。uart应用程序第一个参数可为0、1分别代表uart0、uart1。
将开发板使用有线网连接到路由器使得开发板和调试PC在一个网络中当开发板上电后将自动获取IP在开发板的shell串口终端中输入ifconfig命令获取IP地址调试PC利用此IP通过telent连接开发板打开一个telent窗口。例如调试PC通过MobaXterm使用telent连接开发板的操作如下图。 telent终端窗口中输入如下命令启动串口0工作。
cd /app/uart
./uart 0在telent窗口中输入要发送的内容可以在shell串口终端窗口看到接收到的数据详细请参考package/crb_demo/uart文件夹下的代码。 例如telent窗口的输入 对应的Shell串口终端窗口显示 4.1.8 ETH demo
应用层遵循Linux系统中的标准ETH编程方法调用驱动。
Client
设备作为client端进入/app/client目录输入如下命令启动client应用程序ETH应用程序第一个参数表示要建立TCP链接的服务器ip地址例如输入如下命令表示启动ETH程序与10.20.5.1.13的server建立通信。
cd /app/client
./client 10.20.1.13通过tcp协议连接server进行通信在另一台ubuntu机器上运行server程序详细代码请参考package/app/client文件夹下内容。
设备端显示日志 Server
设备作为server端进入/app/server目录例如输入如下命令表示启动server程序。
cd /app/server
./server在另一台ubuntu机器上运行client程序通过tcp协议连接server进行通信详细代码请参考package/crb_demo/server文件夹下内容。
设备端显示日志 4.1.9 SDMMC demo
K510一共有3个SDMMC主控制器开发板上SDMMC0用于接eMMCSDMMC1用于WIFI模块SDMMC2控制器用于接sdcard。
SDMMC驱动会注册生成/dev/mmcblk0EMMC驱动会注册成/dev/mmcblk1设备节点。
SD卡在系统启动后会自动挂载到/root/data 进入/app/write_read_file目录SDMMC应用程序第一个参数表示要进行读写操作的文件如SD卡挂载到/root/data可对/root/data/目录下的文件进行读写操作先写后读输入如下命令启动SDMMC应用程序对SD卡进行读和写的操作并计算读写速度单位m/s。
cd /app/write_read_file
./write_read_file /root/data/test.txt开启对SD卡进行1G数据的读写代码请参考package/app/write_read_file文件夹下的内容。 4.1.10 SHA/AES demo
SHA/AES demo 使用Linux 内核导出 AF_ALG 类型的 Netlink 接口在用户空间使用内核加密 API。详细信息请参考https://www.kernel.org/doc/html/latest/crypto/userspace-if.html。
参数 -h 打印帮助信息 -t 算法类型hash、skcipher -n 算法名称sha256、ecb(aes)、cbc(aes) -x 解密操作 -k AES KEY(16进制字符串) -v AES IV(16进制字符串) sha256 test
cd /app/crypto
echo -n This is a test file, hello world plain.txt
./crypto -t hash -n sha256 plain.txt sha256.txt
xxd -p -c 32 sha256.txt
sha256sum plain.txtecb(aes) 128 test
cd /app/crypto
echo -n This is a test file, hello world plain.txt
./crypto -t skcipher -n ecb(aes) -k 00112233445566778899aabbccddeeff plain.txt ecb_aes_en.bin
./crypto -t skcipher -n ecb(aes) -k 00112233445566778899aabbccddeeff -x ecb_aes_en.bin ecb_aes_de.bin
cmp ecb_aes_de.bin plain.txt
cat ecb_aes_de.bincbc(aes) 128 test
cd /app/crypto
echo -n This is a test file, hello world plain.txt
./crypto -t skcipher -n cbc(aes) -k 00112233445566778899aabbccddeeff -v 00112233445566778899aabbccddeeff plain.txt cbc_aes_en.bin
./crypto -t skcipher -n cbc(aes) -k 00112233445566778899aabbccddeeff -v 00112233445566778899aabbccddeeff -x cbc_aes_en.bin cbc_aes_de.bin
cmp cbc_aes_de.bin plain.txt
cat cbc_aes_de.binaes-ecb-128和aes-cbc-128加密时要求明文要16字节对齐不足会自动补0。
4.1.11 TRNG demo
TRNG demo通过读取/dev/hwrng字符设备产生指定长度的随机数按16进制字符串输出。
./trng的输入参数含义
-h 打印帮助信息
-b 指定输出随机数长度单位byte 4.1.12 DRM demo
drm demo展示了VO硬件多图层功能。
VO共有8个layer 背景层可配置背景色。 layer0是video层支持YUV422和YUV420支持NV12和NV21格式大小端可配支持硬件scaling up和scaling down。 layer1-layer3是video层支持YUV422和YUV420支持NV12和NV21格式大小端可配。 layer4-layer6是OSD层支持多种ARGB格式。
开发板启动后进入/app/drm_demo目录输入命令
cd /app/drm_demo
./drm_demo4.1.13 V4L2_DRM demo
v4l2_drm demo展示了摄像头输入和显示的功能。
开发板启动后进入/app/mediactl_lib目录输入命令
cd /app/mediactl_lib
./v4l2_drm.out -f video_drm_1080x1920.conf
或者
./v4l2_drm.out -f video_drm_1920x1080.conf
或者
./v4l2_drm.out -f imx385_video_1920x1080.conf imx385 demo 这个需要修改配置具体参照 K510_V4l2_Developer_Guides.md运行命令如下
./v4l2_drm.out -f imx385_video_1920x1080.conf 启动v4l2_drm.out应用程序v4l2_drm.out显示效果 4.1.14 LVGL demo
进入/app/lvgl,运行以下命令
cd /app/lvgl
./lvgl显示效果如下
4.1.15 PWM demo
PWM驱动会注册生成/sys/class/pwm/pwmchip0和/sys/class/pwm/pwmchip3设备节点。
本例程可分别对pwm0和pwm1进行配置和使能进入/app/pwm目录pwm应用程序第一个参数表示设置pwm的周期单位为ns第二个参数设置pwm一个周期中“ON”的时间单位为ns第三个参数可以为0、1分别代表pwm0和pwm1例如输入如下命令表示使能pwm0周期为1s占空比为1000000000/500000000*100% 50%详细代码请参考package/app/pwm文件夹下的内容。
cd /app/pwm
./pwm 1000000000 500000000 0程序的执行结果为 通过示波器连接K510 CRB5.1.2开发板J15的28号引脚可以示波器上观察到一个周期为1秒占空比为50%的波形图。
4.1.16 WIFI demo
WiFi模块驱动加载后会生成无线网卡wlan0遵循标准网口驱动正常参考TCP/IP socket编程。 在笔记本打开“移动热点”然后设置热点的名称和密码 在笔记本上启动NetAssist配置协议类型、本地主机IP、本地主机端口、接收设置、发送设置及需要发送的数据如下图 wifi测试程序的参数格式为
./wifi AP name password local ip server ip例如进入/app/wifi目录输入启动wifi测试程序命令程序的执行结果如下图 4.1.17 GPIO_KEYS demo
按键驱动使用linux kernel自身集成的基于input子系统的通用gpio-keys驱动驱动加载后在/dev/input目录下生成事件监控节点eventXX为事件节点序号可以通过cat /proc/bus/input/devices查看
gpio-keys例程阻塞式读取按键上报事件并打印事件信息其信息包括按键编码和按键动作按键编码标识按键身份按键动作分为pressed和released在按键release时例程会计算按键按下的持续时间
程序执行结果如下图所示:
4.2 AI应用体验指南
开发板系统中内置了丰富的AI应用示例程序对每个示例程序我们都提供有对应的脚本文件脚本文件中已经设置需要运行AI应用程序和对应的参数。
在开始演示AI应用指南前需要确保您已经正确连接摄像头和显示屏并正常上电启动开发板。启动开发板后可以发现会自动运行摄像头获取图像并在显示屏上实时预览程序需要手动结束该应用程序。使用方法如下 输入ps查看应用程序查看进程号例如实时预览程序进程端口号为189。 189 root 0:01 ./v4l2_drm.out -f video_drm_1920x1080.conf -e 1 -s输入kill -9 进程号结束实时预览程序进程例如我查看的端口号为189则应该输入 kill -9 189结束实时预览程序后显示屏会显示白屏即代表成功结束摄像头获取图像并在显示屏上实时预览程序。
本章节介绍开发板内置的AI应用程序运行脚本都位于/app/ai/shell/目录中。进入该目录查看是否有对应脚本文件。
[rootcanaan ~ ]$ cd /app/ai/shell/
[rootcanaan /app/ai/shell ]$ ls
face_alignment.sh object_detect_demo_bf16.sh
face_detect.sh object_detect_demo_uint8.sh
face_expression.sh open_pose.sh
face_landmarks.sh person_detect.sh
face_recog.sh retinaface_mb_320_bf16.sh
hand_image_classify.sh retinaface_mb_320_uint8.sh
head_pose_estimation.sh self_learning.sh
license_recog.sh simple_pose.sh
object_detect.sh下面介绍每个脚本对应的AI应用程序的运行指南在进行以下演示时需要确保您的串口终端控制台已进入/app/ai/shell/目录下。
4.2.1人脸对齐
人脸对齐可得到图像或视频中的每个人脸估计出来的depth或者pncc信息。其中pncc信息为三维人脸形状上的顶点不仅包含这一点的三维坐标信息还包含此处的RGB取值。
论文链接https://sci-hub.et-fine.com/10.1109/TPAMI.2017.2778152
将3D平均人脸的顶点坐标和RGB取值进行归一化操作即NCC操作。如下图所示下图取自论文中的截图。 Face Alignment 人脸对齐任务是基于一定量的训练集得到一个模型使得该模型对输入的一张任意姿态下的人脸图像能够进行特征点(landmark)标记。Face Alignment 任务一般的呈现方式是人脸特征点的检测与标记。
运行人脸对齐演示示例在终端输入:
./face_alignment.sh效果图如下所示 4.2.2人脸检测
人脸检测采用了retina-face网络结构backbone选取0.25-mobilenet。
论文链接https://arxiv.org/pdf/1905.00641.pdf
GitHub链接https://github.com/deepinsight/insightface
下图为单阶段逐像素密集人脸定位方法。 使用该应用时可得到图像或视频中的每个人脸检测框以及每个人脸的左眼球/右眼球/鼻尖/左嘴角/右嘴角五个landmark。使用方法如下所示输入
./face_detect.sh人脸检测器-bf16
执行非量化模型。使用方法如下所示输入
./retinaface_mb_320_bf16.sh人脸检测器-uint8
执行uint8量化模型。使用方法如下所示输入
./retinaface_mb_320_uint8.sh4.2.3人脸表情识别
人脸表情识别中需要用到两个模型一个模型用于检测人脸一个模型用于进行人脸表情识别。人脸表情识别采用了人脸表情分类的方式使用该应用可得到图像或视频中的每个人脸属于以下表情的概率。使用方法如下所示输入
./face_expression.sh4.2.4人脸关键点检测
人脸关键点检测采用了PFLD(practical facial landmarks detection)。
论文链接https://arxiv.org/pdf/1902.10859.pdf
使用该应用可得到图像或视频中的每个人脸轮廓的106个关键点。使用方法如下所示输入
./face_landmarks.sh4.2.5人脸识别
人脸识别采用了人脸特征提取后比对的方式相同的人的特征会尽可能的像而不同的人的特征则会有较大差距使用该应用可得到图像或视频中的每个人脸与人脸底库中的人脸的相似度以进行人脸识别任务。使用方法如下所示输入
./face_recog.sh执行完成后会进入人脸检测模式当摄像头检测到人脸后会按下开发板的Key1位置如下所示 按下之后可以在串口控制台中看到以下输出信息 key code: 30, action: pressed
total took 55.4448 ms
total took 56.2784 ms
Please Enter Your Name to Register:key code: 30, action: released 上述输出信息提示您需要在串口终端输入人脸的登记名称可直接输入录入人脸的信息输入完成后按下回车即可。注意目前登记信息仅支持英文输入。假设我这里输入登记名称为A如下所示 输入完成后会继续进入人脸检测模式此时如果您刚刚登记的人脸再次被检测则会在检测时标注出该人脸的登记信息。 您可重复进行登记人脸信息登记后可以在人脸检测模式中进行人脸识别区分登记不同信息的人脸。但当检测到没有登记的人脸信息则不会在检测时标注出人脸信息。
5.2.6人形检测
使用该应用时可得到图像或视频中人体的检测框。使用方法如下所示输入
./person_detect.sh人体关键点检测-openpose
人体关键点检测主要有两种检测方式一个是自上而下一种是自下而上。本应用采用了自下而上的模型openpose。使用该应用可得到图像或视频中的每个人体的17个关键点。使用方法如下所示输入
./open_pose.sh人体关键点检测-YOLOV5S
人体关键点检测主要有两种检测方式一个是自上而下一种是自下而上。本应用采用了自上而下的模型采用了YOLOV5S进行人体检测然后使用simplepose进行关键点回归。使用该应用可得到图像或视频中的每个人体的17个关键点。使用方法如下所示输入
./simple_pose.sh4.2.7指尖指定区域识别
指尖指定区域识别主要包含3个流程手掌检测手掌关键点检测图像识别。其中手掌检测使用了512x512分辨率的 tiny-yolov3;手掌关键点检测使用了256x256分辨率的squeezenet1.1;图像识别使用了基于imagenet训练出来的mobilenetv2。通过手部关键点检测利用两个食指尖框定待识别区域。利用imagenet分类模型确定待识别区域。使用方法如下所示输入
./hand_image_classify.sh4.2.8头部态角估计
头部态角估计可得到图像或视频中的每个人脸的roll/yaw/pitch。roll代表了人头歪的程度yaw代表了人头左右旋转的程度pitch代表了人头低头抬头的程度。使用方法如下所示输入
./head_pose_estimation.sh4.2.9车牌识别
车牌识别的整体流程实际上包含了车牌检测车牌识别两个流程。车牌检测采用了retinanet车牌识别采用了lprnet。使用该应用可得到图像或视频中的每个车牌的内容。使用方法如下所示输入
./license_recog.sh4.2.10YOLOV5目标检测
目标检测采用了YOLOV5使用该应用可得到图像或视频中属于以下标签的目标的检测框。
person, bicycle, car, motorcycle, airplane, bus, train, truck,
boat, traffic light, fire hydrant, stop sign, parking meter, bench, bird, cat,
dog, horse, sheep, cow, elephant, bear, zebra, giraffe,
backpack, umbrella, handbag, tie, suitcase, frisbee, skis, snowboard,
sports ball, kite, baseball bat, baseball glove, skateboard, surfboard, tennis racket, bottle,
wine glass, cup, fork, knife, spoon, bowl, banana, apple,
sandwich, orange, broccoli, carrot, hot dog, pizza, donut, cake,
chair, couch, potted plant, bed, dining table, toilet, tv, laptop,
mouse, remote, keyboard, cell phone, microwave, oven, toaster, sink,
refrigerator, book, clock, vase, scissors, teddy bear, hair drier, toothbrush使用方法如下所示输入
./object_detect.shYOLOV5目标检测-bf16
执行非量化模型使用方法如下所示输入
./object_detect_demo_bf16.shYOLOV5目标检测-uint8
执行uint8量化模型。使用方法如下所示输入
./object_detect_demo_uint8.sh4.2.11自学习KNN算法
自学习借鉴的是KNNk-Nearest Neighbors的思想。该算法的思想是 一个样本与数据集中的k个样本最相似 如果这k个样本中的大多数属于某一个类别 则该样本也属于这个类别。使用方法如下所示输入
./self_learning.sh执行完成后会在显示屏上出现一个绿色的框。
该AI示例需要用到按键(Key 1)和按键(Key 2)两个按键的位置如下所示 将需要识别的物体放在摄像头范围内使该物体可以显示在绿色框中的正中间此时需要手动标记按下Key1开始标记class0按下Key1时会串口终端会提示以下信息 key code: 30, action: pressed
Please press UP or DOWN button, UP: confirm, DOWN: switch!key code: 30, action: released 上述信息为提示您如果按下Key1则为标注图像按下Key2则为切换模式。
继续按下Key1可开始自动标记该物体此时串口终端会输出如下信息 key code: 30, action: pressed
Pressed UP button!
class_0 : 1key code: 30, action: released 此时再按下Key1会继续继续让您选择继续标注图像还是切换。 key code: 30, action: pressed
Please press UP or DOWN button, UP: confirm, DOWN: switch!key code: 30, action: released 如果需要重复标记多次图像可以继续按下Key1标记该物体。如下所示 当标注完类别1class 0后按下Key2串口终端会输出以下内容 key code: 48, action: released key code: 48, action: pressed
Pressed DOWN button!
switch to class_1此时会切换标注类别1class 1,继续按下Key 1进行标注类别1选择功能。 key code: 30, action: pressed
Please press UP or DOWN button, UP: confirm, DOWN: switch!key code: 30, action: released 继续按下Key 1标注类别1物体 key code: 30, action: pressed
Pressed UP button!
class_1 : 1key code: 30, action: released 如果需要重复标记多次图像可以继续按下Key1标记该物体与上面类别0(class 0)标注方法一直。
在标注完成后在不进入功能选择时按下key 2结束标注如下图所示。 key code: 30, action: pressed
Pressed UP button!
class_1 : 8key code: 30, action: released key code: 48, action: released key code: 48, action: pressed
Pressed DOWN button!
Enter recog!将刚才标注过的物体放在绿框内此时会开发板会在显示屏上自动检测识别的物品识别到物体时左上角会显示对应物体的类别以及检测的精准度。
5.编写一个简单的helloword程序
5.1 编写helloword应用程序
打开Ubuntu虚拟机打开终端进入Home目录中新建helloword文件夹
ubuntuubuntu2004:~$ mkdir helloword进入 helloword文件夹下新建hello.c程序。
ubuntuubuntu2004:~$ cd helloword/
ubuntuubuntu2004:~/helloword$ touch helloword.c在终端内gedit工具会打开一个 文本编辑器进入文本编辑器内 将helloword程序代码粘贴进去粘贴完成后直接按下 ctrl s 保存最后点击 右上角的 x 关 闭文本编辑器
ubuntuubuntu2004:~/helloword$ gedit helloword.c helloword程序代码
#include stdio.h
int main (void)
{ printf(hello word!\n);return 0;
} 编写完成后保存到 helloword.c 之后。我们需要指定存放交叉编译需要使用的库文件头文件的文件夹。如果需要在任意位置或者终端都可以使用交叉编译工具链则需要单独 增加 工具链bin的路径至 ubuntu PATH环境变量里可以添加至 ~/.bashrc也可以在每一个终端单独配置。在终端执行以下命令
export PATH$PATH:~/100ask_base-aiApplication-demo/riscv64-buildroot-linux-gnu_sdk-buildroot/bin/输入完成后需要验证是否添加成功在终端输入
riscv64-linux-gcc -v输入后可以正常打印gcc version 7.3.0 (2019-11-20_nds64le-linux-glibc-v5d-6c120106e03)即可。
5.2.编写Makefile编译规则
ubuntuubuntu2004:~/helloword$ touch Makefile
ubuntuubuntu2004:~/helloword$ gedit Makefile将下面的程序复制到Makefile文件中
CC : riscv64-linux-gcc
helloword: helloword.c${CC} -o helloword helloword.c
clean:rm helloword填写完成后按下Crtls保存Makefile文件。
5.3 交叉编译hellowrod程序
查看当前目录下是否存在helloword.c和Makefile:
ubuntuubuntu2004:~/helloword$ ls
helloword.c Makefile确定文件存在后执行编译命令make进行编译如下所示
ubuntuubuntu2004:~/helloword$ make
riscv64-linux-gcc -o helloword helloword.c编译完成后会生成可执行文件hellword。
可以执行 file hellword 命令 来查看编译出来的文件类型 是否是 riscv 架构类型。
ubuntuubuntu2004:~/helloword$ file helloword
helloword: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 4.15.0, with debug_info, not stripped5.2 上传程序到开发板上运行
把编译生成的 hello 文件通过 ssh或者TFTP拷贝到开发板上运行这里使用TFTP传输将生成的hello程序拷贝到tftpboot目录下:
ubuntuubuntu2004:~/helloword$ cp helloword /home/ubuntu/tftpboot拷贝完成后,查看Ubuntu当前IP地址,输入ifconfig后获得IP地址为192.168.0.163 进入开发板的串口终端界面获取tftpboot目录中helloword文件。
[rootcanaan ~ ]$ tftp -g -r helloword 192.168.0.163
helloword 100% |********************************| 11680 0:00:00 ETA为helloword程序增加可执行权限
[rootcanaan ~ ]$ chmod 777 helloword在开发板端执行helloword程序。
[rootcanaan ~ ]$ ./helloword
hello word!6.编译一个简单的AI demo程序
6.1 编译hello AI的demo程序
在任意目录中使用终端获取Hello AI的demo程序输入以下命令获取
git clone https://e.coding.net/weidongshan/dongsahnpi-vision/100ask_hello-ai_demo.git例如 如果你无法下载可访问百度网盘资料中的开发板名称/5_DongshanPI-Vision_嵌入式AI应用开发资料/2.Hello-AI_demo程序该目录有demo程序压缩包传入Ubuntu并解压即可。 下载完成后进入/home/ubuntu/100ask_base-aiApplication-demo/code新建hello_ai_demo文件夹
ubuntuubuntu2004:~$ cd /home/ubuntu/100ask_base-aiApplication-demo/code/
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code$ mkdir hello_ai_demo进入hello_ai_demo目录下将获取Hello AI的demo程序拷贝到当前的hello_ai_demo目录下
cp /home/ubuntu/100ask_hello-ai_demo/* ./ -rf拷贝完成后可以看到hello-ai-demo文件夹下的文件如下所示
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo$ ls
CMakeFiles cv2_utils.cc format main.cc object_detect.h
cmake_install.cmake cv2_utils.h images Makefile README.md
CMakeLists.txt file include object_detect.cc拷贝完成返回上一级的code目录下修改code目录下的CMakeLists.txt文件
ubuntuubuntu2004:~/ai_demo/100ask_base-aiApplication-demo/code/hello_ai_demo$ cd ../
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code$ gedit CMakeLists.txt在文件末尾增加一句add_subdirectory(hello_ai_demo)修改后的CMakeLists.txt如下所示
cmake_minimum_required(VERSION 3.2)
project(ai C CXX)#set(DEMO_ROOT ${PROJECT_SOURCE_DIR}/../crb_demo)
set(CMAKE_C_FLAGS_DEBUG -O0 -g3)
set(CMAKE_C_FLAGS_RELEASE -O2 -s)
set(CMAKE_CXX_FLAGS_DEBUG -O0 -g3)
set(CMAKE_CXX_FLAGS_RELEASE -O2 -s)
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fopenmp)set(input imx219_1080x1920_0.conf imx219_0.conf imx219_1.conf video_192x320.conf video_object_detect_320.conf video_object_detect_432x368.conf video_object_detect_512.conf video_object_detect_640x480.conf video_object_detect_320x320.conf video_object_detect_480x640.conf video_object_detect_640.conf)
install(PROGRAMS ${input} DESTINATION exe)add_subdirectory(face_detect)
add_subdirectory(face_landmarks)
add_subdirectory(object_detect)
add_subdirectory(face_alignment)
add_subdirectory(face_expression)
add_subdirectory(head_pose_estimation)
add_subdirectory(face_recog)
add_subdirectory(simple_pose)
add_subdirectory(openpose)
add_subdirectory(person_detect)
add_subdirectory(hand_image_classify)
add_subdirectory(license_plate_recog)
add_subdirectory(self_learning)
add_subdirectory(object_detect_demo)
add_subdirectory(retinaface_mb_320)
add_subdirectory(hello_ai_demo)修改完成后按下Crtls保存修改后的文件。
在code目录的终端下激活环境输入
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code$ source build.sh激活环境完成进入hello_ai_demo目录开始进行编译Hello AI的demo程序
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code$ cd hello_ai_demo/
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo$ make编译完成即可在hello_ai_demo目录下查看编译完成的可执行程序如下图红框中所示文件 6.2 上传程序到开发板运行
把编译生成的 hello 文件通过 ssh或者TFTP拷贝到开发板上运行这里使用TFTP传输将生成的hello_ai_demo程序拷贝到tftpboot目录下:
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo$ cp hello_ai_demo ~/tftpboot/将待检测的图像传入开发板待测图像已经提前准备在hello_ai_demo目录下的images文件夹下
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo$ cd images/
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo/images$ ls
01_person.bmp 02_cat.bmp将两张图像拷贝到tftpboot目录下:
ubuntuubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo/images$ cp ./* ~/tftpboot/拷贝完成后,查看Ubuntu当前IP地址,输入ifconfig后获得IP地址为192.168.0.163 进入开发板的串口终端界面获取tftpboot目录中helloword文件。
[rootcanaan ~ ]$ tftp -g -r hello_ai_demo 192.168.0.163
hello_ai_demo 100% |********************************| 818k 0:00:00 ETA
[rootcanaan ~ ]$ tftp -g -r 01_person.bmp 192.168.0.163
01_person.bmp 100% |********************************| 300k 0:00:00 ETA
[rootcanaan ~ ]$ tftp -g -r 02_cat.bmp 192.168.0.163
02_cat.bmp 100% |********************************| 300k 0:00:00 ETA由于该程序需要使用模型文件对待测图像进行预测我们可以拷贝开发板中模型文件使用
[rootcanaan ~ ]$ cp /app/ai/kmodel/kmodel_release/object_detect/yolov5s_320/yol
ov5s_320_sigmoid_bf16_with_preprocess_output_nhwc.kmodel ./拷贝完成后可以在当前目录看到对应文件。
[rootcanaan ~ ]$ ls
01_person.bmp
02_cat.bmp
data
emmc
hello_ai_demo
yolov5s_320_sigmoid_bf16_with_preprocess_output_nhwc.kmodel为hello_ai_demo程序增加可执行权限
[rootcanaan ~ ]$ chmod 777 hello_ai_demo在开发板端执行hello_ai_demo程序。
./hello_ai_demo ./yolov5s_320_sigmoid_bf16_with_preprocess_output_nhwc.kmodel ./01_person.bmp执行结果如下所示
例子1
[rootcanaan ~ ]$ ./hello_ai_demo ./yolov5s_320_sigmoid_bf16_with_preprocess_out
put_nhwc.kmodel ./01_person.bmp
hello 100ask AI demorun inference finished!
image inference result: person:0.89程序识别出01_person.bmp文件中有人概率为0.89。
例子2
[rootcanaan ~ ]$ ./hello_ai_demo ./yolov5s_320_sigmoid_bf16_with_preprocess_out
put_nhwc.kmodel ./02_cat.bmp
hello 100ask AI demorun inference finished!
image inference result: cat:0.86它识别出02_cat.bmp图片文件中有猫概率为0.86。 注意您可以传入自定义的图像进行预测需要保证图像格式为bmp尺寸为320x320。 6.3 hello AI程序讲解
6.3.1 程序框架 6.3.2 程序讲解
从BMP文件提取RGB分量
int get_rgb_from_bmp(char *file, uint8_t *rbuf, uint8_t *gbuf, uint8_t *bbuf)
{ int err;unsigned int *p;unsigned int rgb32;int r_pos 0, g_pos 0, b_pos 0;/* 点阵数据 */T_PixelDatas bmpPixelDatas;/* 解析BMP文件 */err GetPixelDatasForIcon(file, bmpPixelDatas);if (err){DebugPrint(Can not get digit bmp file: %s\n, file);return -1;}/* 把里面的RGB单独拆出来 */for (int y 0; y MIN(320, bmpPixelDatas.iHeight); y){p (unsigned int *)(bmpPixelDatas.aucPixelDatas y * bmpPixelDatas.iLineBytes);r_pos g_pos b_pos y*320;for (int x 0; x MIN(320, bmpPixelDatas.iWidth); x){rgb32 p[x];/*将RGB三通道的数据分别存入3个buf*/rbuf[r_pos] (rgb32 16) 0xff;gbuf[g_pos] (rgb32 8) 0xff;bbuf[b_pos] (rgb32 0) 0xff;}}return 0;}初始化模型
objectDetect od(0.5, 0.45, 320, {320, 320});//置信度、nms阈值、模型尺寸、图像尺寸
od.load_model(argv[1]); //加载模型 yolov5s_320_sigmoid_bf16_with_preprocess_output_nhwc.kmodel
od.prepare_memory(); // memory allocation 准备内存使用模型 /* 把RGB数据复制进od里 */od_r (uint8_t *)od.virtual_addr_input[0]; od_g od_r 320*320;od_b od_g 320*320;memcpy(od_r, rbuf, 320*320);memcpy(od_g, gbuf, 320*320);memcpy(od_b, bbuf, 320*320);od.set_input(0);//设置输入od.set_output();//设施输出od.run();//运行推理od.get_output();//获得推理结果后处理 /*后处理将推理结果转换为可使用的数据*/std::vectorBoxInfo result;od.post_process(result);//运行后处理 for (auto r : result){std::string text od.labels[r.label] : std::to_string(round(r.score * 100) / 100.0).substr(0,4);coutimage inference result: ;couttextendl;}7.嵌入式开发
7.1编译工具链
工具链是一组编程工具用于开发软件、创建软件产品。工具链通常是另一个计算机程序或一组相关程序。通常工具链里有多个工具前一个工具的输出结果是下一个工具的输入也就是说前一个工具处理完再交给下一个工具处理。
一个简单工具链可能由三部分组成编译器和链接器将源代码转换为可执行程序、库为操作系统提供接口和调试器用于测试和调试创建的程序。一个复杂的软件产品如视频游戏需要准备音效、音乐、纹理、3 维模型和动画的工具以及将这些资源组合成成品的附加工具。
**GNU ** 工具链 是一个广泛收集的、遵守GNU协议的、众多编程工具。这些工具形成一个工具链用于开发应用程序和操作系统。
GNU 工具链在Linux、一些BSD系统和嵌入式系统软件的开发中起着至关重要的作用。
7.2 交叉编译工具链
**交叉编译器**在平台A上使用它能够生成程序这个程序时运行在平台B上的。例如在PC上运行程序但这个程序是在Android 智能手机上运行的这个编译器就是交叉编译器。
在PC上为其他平台(目标平台)编译代码时需要交叉编译器。能否直接在目标平台上编译程序比如在ARM板上编译程序大多时候不可行因为ARM板资源很可能受限。
交叉编译器的基本用途是将构建环境与目标环境分开。这在几种情况下很有用 设备资源极其有限的嵌入式计算机。例如微波炉将有一个非常小的计算机来读取它的键盘和门传感器向数字显示器和扬声器提供输出并控制烹饪食物的机器。这台计算机通常不够强大无法运行编译器、文件系统或开发环境。 为多目标编译。例如公司可能希望用同一套代码支持多个不同的操作系统。通过使用交叉编译器可以设置单个构建环境为每个目标系统单独编译程序。 在服务器上编译。服务器性能强大很多公司都是在服务器上为其他平台编译程序。 引导到新平台。在为新平台开发软件时人们使用交叉编译器来编译必要的工具例如操作系统和本地编译器。 7.3 获得合适的交叉编译工具链 获取现成的 来自发行版系统内 Ubuntu 和 Debian 有许多现成的交叉编译器。 来自不同组织 芯片原厂提供的交叉编译工具链(一般包含在配套的BSP内)。 Bootlin社区提供的各种架构工具链 。 ARM 官方提供的aarch32 aarch64工具链。 Linaro 提供 ARM 和 AArch64 工具链以及一些早期版本工具链。 gnutoolchains 提供可以在windows上运行的交叉编译工具链。 riscv-collab 提供的riscv GNU 工具链。 自己编译构建 Crosstool-NG专门构建交叉编译工具链的工具。 迄今为止拥有最可配置选项/并支持多种功能的。 嵌入式Linux构建系统一般都知道如何构建交叉编译工具链Yocto/OpenEmbedded、Buildroot、OpenWRT等。 参考文档 Crosstool-NG 文档https://github.com/crosstool-ng/crosstool-ng/blob/master/docs/ GCC 文档https://gcc.gnu.org/onlinedocs/ Binutils 文档https://sourceware.org/binutils/docs/
7.4 Makefile构建工具 7. 5 CMake构建工具
CMake 是一个开源的跨平台工具系列旨在构建、测试和打包软件。 CMake 用于使用简单的平台和编译器独立配置文件来控制软件编译过程并生成可在您选择的编译器环境中使用的本机 makefile 和工作区。 CMake 工具套件是由 Kitware 创建的旨在响应 ITK 和 VTK 等开源项目对强大的跨平台构建环境的需求。
CMake 是 Kitware 的商业支持开源软件开发平台集合的一部分。