- 2024-12-13
-
回复了主题帖:
【极海APM32M3514电机通用评估板】滑膜观测器电角度与霍尔采集到的电角度数据比对
这个滑膜,电机可以反转吗?
- 2024-12-11
-
回复了主题帖:
【Luckfox幸狐 RV1106 Linux 开发板】3-PWM测试__控制舵机任意旋转
xfliu11 发表于 2024-12-9 10:45
为啥我的舵机一接上,就一直自己转呢,pwm都没有使能
自己用示波器看下就知道了
- 2024-09-07
-
回复了主题帖:
【Luckfox幸狐 RV1106 Linux 开发板】5-给系统移植QT环境__显示电子时钟界面
羽落清泫 发表于 2024-8-16 17:31
为什么这里选不了qt5,是需要下载源码嘛?
应该是依赖其他的模块,你可以看看依赖关系
-
回复了主题帖:
【STM32MP135F-DK】7-部署QT开发环境+运行第一个QT程序
lsc2001 发表于 2024-9-5 15:50
博主你好,我在最后运行程 序的时候出现了界面显示不全,但是在Ubuntu中是完整的
...
添加字库就好了
- 2024-08-11
-
加入了学习《【DigiKey“智造万物,快乐不停”创意大赛】-简易电流源演示》,观看 【DigiKey“智造万物,快乐不停”创意大赛】-简易电流源演示
-
加入了学习《【DigiKey创意大赛】多通道微型气相色谱采集单元》,观看 多通道微型气相色谱采集单元
-
发表了主题帖:
【正点原子i.MX93开发板】7-测评汇总贴(完整小项目)
再次感谢eeworld和正点原子给我这次测评的机会,本期测评对之前的测评进行汇总,并将之前的测评代码汇总起来形成了iot一个小项目。
这个开发板所有的测评贴子如下:
【正点原子i.MX93开发板】1-开箱与开机测评 https://bbs.eeworld.com.cn/thread-1284416-1-1.html
【正点原子i.MX93开发板】2-LCD显示测评和移植LVGL显示框架 https://bbs.eeworld.com.cn/thread-1285675-1-1.html
【正点原子i.MX93开发板】3-人工智能的测评(AI识别) https://bbs.eeworld.com.cn/thread-1285843-1-1.html
【正点原子i.MX93开发板】4-LVGL的GUI制作(显示更新系统信息) https://bbs.eeworld.com.cn/thread-1286331-1-1.html
【正点原子i.MX93开发板】5-移植mqtt,上传数据到云端 https://bbs.eeworld.com.cn/thread-1288628-1-1.html
【正点原子i.MX93开发板】6-QT上位机搭建(获取云端数据) https://bbs.eeworld.com.cn/thread-1290200-1-1.html
我测评了这个开发板的音频播放能力,视频播放能力、网络能力、AI运算能力、显示屏色彩还原度等等。同时我将之前做demo汇聚起来了,下面是整个小项目的视频:
[localvideo]74ed072391755d8fd0cad223387e0c74[/localvideo]
在之前的测评中我已经将所有的代码分享出来了,如果有可能用到参考的话,可以去之前的测评去取。
-
发表了主题帖:
【正点原子i.MX93开发板】6-QT上位机搭建(获取云端数据)
本帖最后由 qiao--- 于 2024-8-11 02:17 编辑
上期测评我成功实现了正点原子i.MX93开发板物联网的能力,让他能够把数据上云,本期测评我将为这个开发板做一个QT上位机,这样一整个物联网的项目就非常完整了。
由于是为大家展示效果加上本人UI制作本领有限,所以界面做的不是很好看,望网友见谅。工程在本文的最后也分享给到大家。
本次QT上位机是使用HTTPS协议获取云端的数据,我将本期测评的内容划分为下面几个步骤:
鉴权Token获取
JSON数据获取
界面搭建
1.鉴权Token获取
使用HTTPS协议获取华为云上我们自己定义的属性的时候,华为云有个鉴权机制,需要验证这个Token,这个Token可以用你的账号和密码去获取,并且这个Token获取的有效期只有一天。这里我们需要编写一个函数用来获取我们的Token,这样我们每一次打开软件的时候就可以自动获取Token。下面是我的获取Token的代码:
上面我打马赛克的地方就是需要我们填写账号和密码的地方,在返回的接受回调函数中我们存储Token并且打印它,看看Token长什么样子。
下面就是Token,它是一个很长的字符串:
2. JSON数据获取
我们在成功获取Token后就可以进行华为云上属性的获取了,我们需要编写一个属性获取的函数,并把他们存储在变量里,最后编写一个定时器,每隔一段时间获取一次。
这段代码,我们编写了一个获取JSON数据属性的代码,并把他们解析了出来装在了变量里,方便我们后边使用。返回的JSON数据可以给大家看一下长这样,其中红框部分就是我们需要解析的数据。
3.界面搭建
这里我简单搭建了一个界面显示温度和湿度信息,我是直接拖动控件搭建UI的。然后在主界面里添加图片和定时器更新代码:
界面如图所示:
总结:通过本期测评我搭建了QT上位机,使我之前的项目更加完整了,最后通过测评获取到的华为云的数据准确无误。
- 2024-08-01
-
加入了学习《AI人工智能深度学习(RV1126)-第1期 准备篇》,观看 IMX415和IMX335摄像头的使用
- 2024-07-31
-
回复了主题帖:
【正点原子i.MX93开发板】5-移植mqtt,上传数据到云端
lugl4313820 发表于 2024-7-25 16:20
大佬的文章,一如既住那么优秀,感谢分享mqtt的知识分享!
感谢贴友捧场
- 2024-07-24
-
发表了主题帖:
【正点原子i.MX93开发板】5-移植mqtt,上传数据到云端
本帖最后由 qiao--- 于 2024-7-25 14:11 编辑
正点原子的这块i.MX93开发板具有两块千兆网口,本期测评将测评这块开发板的网络传输的能力。移植mqtt库到开发板上,最后上传到云端方便数据的记录和查看。
本期测评将分为下面的几个步骤:
交叉编译mqtt库
编写mqtt测试程序
测试并观察结果
1.交叉编译mqtt库
我这次使用的mqtt库是paho.mqtt.c,这个库还需要依赖ssl库,因此在交叉编译paho.mqtt.c之前还需要交叉编译ssl库。
先给出两个库的下载连接:
paho.mqtt.c-1.3.13 :https://github.com/eclipse/paho.mqtt.c/archive/refs/tags/v1.3.13.tar.gz
openssl-OpenSSL_1_1_1g:https://codeload.github.com/openssl/openssl/tar.gz/refs/tags/OpenSSL_1_1_1g
将这两个库下载好后拷贝到我们的交叉编译服务器上,并解压。
先交叉编译openssl,可以输入下面的命令
tar zxf openssl-OpenSSL_1_1_1g.tar.gz
cd openssl-OpenSSL_1_1_1g/
./config no-asm shared no-async --prefix=`pwd`/ssl_result --cross-compile-prefix=aarch64-none-linux-gnu-
sed -i 's/-m64//' Makefile
make && make install
最后会生成下面的文件
紧接着编译paho.mqtt.c,使用下面的命令
tar zxf paho.mqtt.c-1.3.13.tar.gz
mkdir paho.mqtt.c_result/bin -p
mkdir paho.mqtt.c_result/include -p
mkdir paho.mqtt.c_result/lib -p
mkdir paho.mqtt.c_result/share/man/man1 -p
cd paho.mqtt.c-1.3.13/
make CC=aarch64-none-linux-gnu-gcc CFLAGS:="-I `pwd`/../ssl_result/include" LDFLAGS:="-L `pwd`/../ssl_result/lib"
make install
最后会生成下面的文件
到这里库就编译完成了。库的目录结构如下:
2.编写mqtt测试程序
我这里是上传自己的捏造的数据。首先需要定义自己的连接参数,如下图所示。
然后编写,连接到iot的函数,代码如下所示。
其次是编写上传Topic的函数。
最后在主函数中编写调用逻辑,我这里就是连接上了之后,就每隔5S上传一次数据。
总的代码如下所示。
#include "MQTTClient.h" //包含 MQTT 客户端库头文件
#define CLIENTID "" //客户端 id
#define USERNAME "" //用户名
#define PASSWORD "" //密码
#define BROKER_ADDRESS ""
#define HOSTNAME ""
#define HOSTPORT ""
#define TOPIC ""
MQTTClient client ;
MQTTClient_connectOptions conn_opts ;
MQTTClient_willOptions will_opts ;
MQTTClient_message pubmsg ;
int msgarrvd(void *context, char *topicName, int topicLen,MQTTClient_message *message)
{
return 1;
}
void connlost(void *context, char *cause)
{
printf("\nConnection lost\n");
printf(" cause: %s\n", cause);
}
void connect_mqtt()
{
conn_opts = MQTTClient_connectOptions_initializer;
will_opts = MQTTClient_willOptions_initializer;
pubmsg = MQTTClient_message_initializer;
int rc;
/* 创建 mqtt 客户端对象 */
if (MQTTCLIENT_SUCCESS !=
(rc = MQTTClient_create(&client, BROKER_ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL))) {
printf("Failed to create client, return code %d\n", rc);
rc = EXIT_FAILURE;
return;
}
/* 设置回调 */
if (MQTTCLIENT_SUCCESS !=
(rc = MQTTClient_setCallbacks(client, NULL, connlost,
msgarrvd, NULL))) {
printf("Failed to set callbacks, return code %d\n", rc);
rc = EXIT_FAILURE;
return;
}
conn_opts.keepAliveInterval = 30; //心跳包间隔时间
conn_opts.cleansession = 0; //cleanSession 标志
conn_opts.username = USERNAME; //用户名
conn_opts.password = PASSWORD; //密码
if (MQTTCLIENT_SUCCESS !=
(rc = MQTTClient_connect(client, &conn_opts))) {
printf("Failed to connect, return code %d\n", rc);
rc = EXIT_FAILURE;
return;
}
printf("MQTT 服务器连接成功!\n");
return;
}
int count = 0;
int MQTT_Publish(){
int rc;
count++;
MQTTClient_message tempmsg = MQTTClient_message_initializer;
sprintf(payload, "{\"services\": [{\"service_id\":\"ZD\",\"properties\": {\"TEMP\": %f,\"HUMI\": %f}}]}", count,count+1); // 格式化要发布的数据
tempmsg.payload = payload; //消息的内容
tempmsg.payloadlen = strlen(payload); //内容的长度
tempmsg.qos = 0; //QoS 等级
tempmsg.retained = 1; //保留消息
if (MQTTCLIENT_SUCCESS !=
(rc = MQTTClient_publishMessage(client, TOPIC, &tempmsg, NULL))) {
printf("Failed to publish message, return code %d\n", rc);
rc = EXIT_FAILURE;
return rc;
}
return 0;
}
int main(){
connect_mqtt();
while (1)
{
MQTT_Publish();
msleep(5000); // 每隔5s
}
return 0;
}
我这里编写了一个 CMakeLists.txt,用cmake来管理项目,里面的代码如下所示:
cmake_minimum_required(VERSION 3.10)
project(mqtt)
# 设置目标平台和交叉编译器
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm64)
set(CMAKE_C_COMPILER aarch64-none-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-none-linux-gnu-g++)
link_directories(${PROJECT_SOURCE_DIR}/paho.mqtt.c_result/lib)
# 指定包含目录
include_directories(${PROJECT_SOURCE_DIR}/paho.mqtt.c_result/include)
# 添加源文件
set(SRC_LIST main.c)
# 创建可执行文件
add_executable(main ${SRC_LIST})
# 链接
target_link_libraries(main paho-mqtt3c)
最后交叉编译一下我们项目,就可以了。
mkdir build
cd build
cmake ..
make
3.测试并观察结果
我们将我们的项目拷贝到我们板子上,然后运行他。
首先要保证自己的网络没问题,我这里使用是网口,可以ping一下baidu看看网络连接情况。
我的板子连接情况如下所示。
进入板子的终端运行程序,效果如下。
华为云有设备连接显示在线。
同时也有数据不断的上传上来。
我的代码逻辑是湿度比温度高一,上传的准确无误。
总结:本期测评测评了正点原子i.MX93开发板的物联网的能力,该开发板能够准确的上传数据到华为云,网络连接的稳定性很好。
- 2024-07-12
-
回复了主题帖:
颁奖:嵌入式工程师AI挑战营(初阶),致敬敢于将边缘AI收入统治领域的你们
个人信息已确认,请安排邮寄。优秀奖选择均码防晒衣。感谢luckfox和EEworld对本次活动的大力支持
-
回复了主题帖:
【STM32MP135F-DK】7-部署QT开发环境+运行第一个QT程序
zhgongzuoshi 发表于 2024-7-11 16:03
楼主,“勾选上后我们从新编译一下我们的内核 make uImage LOADADDR=0xC2000040
”时,会报错, ...
重新拉代码编译
- 2024-07-01
-
回复了主题帖:
【正点原子i.MX93开发板】4-LVGL的GUI制作(显示更新系统信息)
wangerxian 发表于 2024-6-30 11:45
GUI_Guider免费还是收费的呀?
完全免费的
- 2024-06-30
-
发表了主题帖:
【正点原子i.MX93开发板】4-LVGL的GUI制作(显示更新系统信息)
本帖最后由 qiao--- 于 2024-6-30 02:14 编辑
前言:在我的第二期测评我们成功的移植了LVGL框架,本期测评就可以利用这个框架开发出一些好看的UI。本人的审美能力欠缺,UI制作的可能并不是很好看(这是UI工程师干的活),帖友们不要介意,重要的是开发过程。本期测评将分为以下三个部分的:
用GUI_Guider开发一个简易界面并移植运行
写一个C语言程序读出系统信息(ip地址,cpu占用率,cpu温度等)
将以上两者综合移植
1.用GUI_Guider开发一个简易界面并移植运行
经常看我的测评的贴友应该知道,GUI_Guider是我的老朋友了,我经常用这个软件开发我的lvgl应用。里面自带模拟器开发起来方便,就是里面的控件有点少,不过也够用了。有对GUI_Guider不熟悉的贴友可以看我之前的文章:
【ACM32G103RCT6】8-基于RTC和LVGL的手机时间界面 https://bbs.eeworld.com.cn/thread-1270419-1-1.html
【Sipeed 博流BL808全能板】5-手表界面开发 https://bbs.eeworld.com.cn/thread-1273077-1-1.html
这两篇文章讲了GUI_Guider工程的创建和移植,但是不是Linux下的移植,本期 测评将移植于Linux系统。
在GUI_Guider创建一个工程后简单添加一些控件,并运行模拟器,我的效果如下图所示:
成功运行,接下来就是把我们这个工程移植到我们之前的lvgl框架中。移植步骤还是移植下面两个文件夹,由于我的custom文件夹下没有内容,我就不移植了,我就只移植generated这一个文件夹。
将这个文件夹复制到我们第二期测评拉下来代码的lvgl目录中,目录结构如下所示:
此时这个项目还不知道我们移植这个文件的.c和.h文件的位置,因此还要修改Makefile文件
修改lvgl目录下的lvgl.mk文件,添加以下内容:
include $(LVGL_DIR)/$(LVGL_DIR_NAME)/generated/generated.mk
在generated目录下的generated.mk文件添加以下内容
PRJ_DIR ?= $(LVGL_DIR)/$(LVGL_DIR_NAME)
修改完成后我们还需要修改我们的main.c中的代码,调用我们UI代码。代码主要是添加一个头文件,然后调用系统生成的UI创建代码。
然后进行编译make -j4 ,就可以编译成功。我们运行这个程序,效果如下所示:
但是这个UI里面的数据不是动态显示的,我们还要添加一些代码。
2.写一个C语言程序读出系统信息(ip地址,cpu占用率,cpu温度等)
由于上面的代码不能动态显示,我们还需要写一个demo,读出系统的信息,最后将他移植到我们项目中。Linux 的一些系统信息都是通过文件的形式来提供接口的,我们只需要通过文件IO来访问这些接口就行了。我的示例代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <time.h>
#define MAX_BUFFER_SIZE 256
#define MAX_IP_LENGTH 16 // 定义IPv4地址的最大长度为15个字符,加上字符串终止符'\0'
// 实现获取本地IP地址的函数
int get_local_ip(char *ip_buffer) {
int fd; // 套接字描述符
struct ifreq ifr; // 网络接口请求结构体
// 创建一个套接字
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
perror("socket"); // 输出错误信息并返回
return -1;
}
// 指定要查询的网络接口(这里使用eth0,可根据实际情况修改)
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1); // 拷贝接口名到请求结构体
// 获取接口的IP地址
if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
perror("ioctl"); // 输出错误信息并返回
close(fd); // 关闭套接字
return -1;
}
// 将获取到的IP地址转换成字符串形式并存储在ip_buffer中
inet_ntop(AF_INET, &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr, ip_buffer, INET_ADDRSTRLEN);
close(fd); // 关闭套接字
return 0; // 返回成功
}
// 获取 CPU 温度
float get_cpu_temperature() {
FILE *fp;
float temp = 0.0;
fp = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
if (fp == NULL) {
perror("Error opening temperature file");
return -1.0;
}
fscanf(fp, "%f", &temp);
fclose(fp);
return temp / 1000.0; // 转换为摄氏度
}
// 获取 CPU 占用率
float get_cpu_usage() {
FILE *fp;
char buffer[MAX_BUFFER_SIZE];
long double a[4], b[4];
float usage;
fp = fopen("/proc/stat", "r");
if (fp == NULL) {
perror("Error opening CPU stat file");
return -1.0;
}
fgets(buffer, sizeof(buffer), fp);
sscanf(buffer, "cpu %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2], &a[3]);
fclose(fp);
sleep(1); // 等待一段时间再次获取数据
fp = fopen("/proc/stat", "r");
if (fp == NULL) {
perror("Error opening CPU stat file");
return -1.0;
}
fgets(buffer, sizeof(buffer), fp);
sscanf(buffer, "cpu %Lf %Lf %Lf %Lf", &b[0], &b[1], &b[2], &b[3]);
fclose(fp);
usage = ((b[0] + b[1] + b[2]) - (a[0] + a[1] + a[2])) / ((b[0] + b[1] + b[2] + b[3]) - (a[0] + a[1] + a[2] + a[3])) * 100.0;
return usage;
}
int main() {
float cpu_temp, cpu_usage;
cpu_temp = get_cpu_temperature();
time_t rawtime;
struct tm *timeinfo;
char timeBuffer[80];
char ip_address[MAX_IP_LENGTH]; // 用于存储IP地址的字符数组
time(&rawtime); // 获取当前时间
timeinfo = localtime(&rawtime); // 将时间转换为本地时间结构体
strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %H:%M:%S", timeinfo); // 格式化时间为字符串
printf("当前时间是: %s\n", timeBuffer);
// 调用获取本地IP地址的函数
if (get_local_ip(ip_address) == 0) {
printf("Local IP address: %s\n", ip_address); // 打印获取到的IP地址
} else {
printf("Failed to get local IP address.\n"); // 获取失败时的错误提示
}
if (cpu_temp != -1.0) {
printf("CPU Temperature: %.2f°C\n", cpu_temp);
} else {
printf("Failed to get CPU Temperature.\n");
}
cpu_usage = get_cpu_usage();
if (cpu_usage != -1.0) {
printf("CPU Usage: %.2f%%\n", cpu_usage);
} else {
printf("Failed to get CPU Usage.\n");
}
return 0;
}
在系统上编译并运行就可以成功的打印出系统信息,运行结果如下图所示:
3.将以上两步综合移植
现在我们就需要将上面两步综合让我们的UI能够动态显示。
我的想法是创建一个子线程来更新UI标签,这样就可以动态显示了。我的线程执行代码如下所示:
// 线程函数,用于更新标签文本
void *update_label_thread(void *arg) {
float cpu_temp, cpu_usage;
char cpu_temp_s[10],cpu_usage_s[10];
char ip_address[MAX_IP_LENGTH]; // 用于存储IP地址的字符数组
char timeBuffer[80];
while (1) {
time_t rawtime;
struct tm *timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d\r\n%H:%M:%S", timeinfo);
cpu_temp = get_cpu_temperature();
if (cpu_temp != -1.0) {
printf("CPU Temperature: %.2f°C\n", cpu_temp);
} else {
printf("Failed to get CPU Temperature.\n");
}
// 调用获取本地IP地址的函数
if (get_local_ip(ip_address) == 0) {
printf("Local IP address: %s\n", ip_address); // 打印获取到的IP地址
} else {
printf("Failed to get local IP address.\n"); // 获取失败时的错误提示
}
cpu_usage = get_cpu_usage();
if (cpu_usage != -1.0) {
printf("CPU Usage: %.2f%%\n", cpu_usage);
} else {
printf("Failed to get CPU Usage.\n");
}
// 更新 lvgl 标签的文本
lv_label_set_text(guider_ui.screen_timeInfo, timeBuffer);
lv_label_set_text(guider_ui.screen_ipInfo, ip_address);
sprintf(cpu_usage_s, "%.2f%%", cpu_usage);
lv_label_set_text(guider_ui.screen_CPULoad, cpu_usage_s);
sprintf(cpu_temp_s, "%.2f *C", cpu_temp);
lv_label_set_text(guider_ui.screen_CPUTemp, cpu_temp_s);
// 等待一段时间,这里简单地使用 usleep 模拟
usleep(10000); // 等待 10毫秒
}
return NULL;
}
然后再在main函数里创建线程调用上面那个线程执行函数。
最后进行编译就OK了。动态显示效果如下的视频所示:
[localvideo]e52272a624dabf6edfbdec7037b14ae8[/localvideo]
我在这里解压了一个程序,可以看到CPU占用率立即就上去了,而且时间也一直再变,可见我们的程序没有出错。
我改变一下我的ip地址试试。
[localvideo]306d5817bc86cf55c7d17062ee1a693e[/localvideo]
IP地址也变了,移植成功!
总结:通过本期测评我们成功用LVGL框架开发出了一个UI,并且能够显示系统信息到UI上,后面我们将移植MQTT程序将这些数据上传到云平台上(这个板子没有传感器,只能采取读系统信息这种方式)。
- 2024-06-27
-
回复了主题帖:
【正点原子i.MX93开发板】3-人工智能的测评(AI识别)
hellokitty_bean 发表于 2024-6-26 09:29
NPU厉害呀。。。。准确率、算力和10ms出结果,已算上乘了
是的,常见的一些应用已经足够了
-
回复了主题帖:
【正点原子i.MX93开发板】3-人工智能的测评(AI识别)
wangerxian 发表于 2024-6-25 19:17
有NPU的手势识别例程嘛?话说NPU的AI性能比CPU强这么多呀。
无,npu并行计算的,肯定要快的多
- 2024-06-25
-
发表了主题帖:
【正点原子i.MX93开发板】3-人工智能的测评(AI识别)
本帖最后由 qiao--- 于 2024-6-25 00:30 编辑
正点原子i.MX93开发板具有0.5TOPS算力,对于一般的一些AI识别应用来说已经足够了。接下来我将测评这块开发板这方面的性能。这里我将分别用CPU跑AI和用NPU跑AI来看看效果。
首先来测评一下正点原子这块开发板的AI的相关资料。直接说结论,目前这块开发板由于最近才上市,所以这块资料不是很完善,只能保证满足官方的历程能跑通。下面是他们文档中的声明,但是我相信后面正点原子会很快把这方面的资料补起来。
1.CPU进行AI识别
我这里跑的都是官方的例子。用的摄像头是USB摄像头。
首先将正点原子的模型文件拷贝到板子里,他们家的模型相关资料在01、程序源码\01、程序源码\06、AI例程源码\01、例程源码中,模型文件如下所示:
将他们拷贝到板子的/usr/bin/eiq-examples-git/modes下面即可。
这里我用CPU跑一个手势识别的例子,看看帧率如何,精度如何。
在跑这些例子的时候首先要做一下准备工作,如下:
将开发板的初始UI关掉,方便我们显示结果到显示屏上。
开启Weston 的支持,因为正点原子提供的程序需要使用 OpenCV 来管理窗口。
命令分别如下:
systemctl stop systemui
systemctl start weston
然后进入到手势识别的项目目录
cd /usr/bin/eiq-examples-git/gesture_detection/
执行下面命令进行识别
python3 main.py -i /dev/video0
效果视频如下:
[localvideo]21d5fd7215eadb3f7761f344c72e152c[/localvideo]
由上视频可以看出。用CPU进行推理的的帧率肉眼可见的低,几乎是1s推理一帧图片,识别率还可以,手掌可以使识别出来,经过我的测试发现,手掌做一些复杂的动作时候就推理不出来了。不过这块板子用CPU推理的速度相比其他市场上的一些开发板用CPU推理已经很高了。
2.GPU进行AI识别
我这里GPU进行AI识别的例子是使用的目标检测识别。
在上面拷贝了模型文件的基础上需要通过 vela 工具将模型编译成可以使 NPU 进行推理的 vela 模型。
进入到/usr/bin/eiq-examples-git 目录,使用 vela 工具编译 models 目录下 mobilenet_v1_1.0_224_quant.tflite模型,并使用--output-dir 参数指定 vela_models 目录,执行以下命令
这样NPU可推理的模型就在vela_models/目录下了。
cd /usr/bin/eiq-examples-git
vela models/ssd_mobilenet_v1_quant.tflite --output-dir vela_models/
出现下面的结果代表转化成功
在测试之前需要将 main.py 推理脚本里面的模型路径和模型名称进行修改
cd /usr/bin/eiq-examples-git/object_detection
vi main.py
我的修改如下所示:
最后就可以进行推理了,使用下面的命令,其中/usr/lib/libethosu_delegate.so是指定NPU推理的动态库。
python3 main.py -i cars0.bmp -d /usr/lib/libethosu_delegate.so
推理效果如下所示:
[localvideo]952d71b04109542941520db5d754a560[/localvideo]
从视频中可以看出,推理速度肉眼可见的上升,大约10ms可以推理出来一帧数据,检测的准确率还可以。
总结:通过本期测评我们测评了正点原子i.MX93开发板AI识别方面的性能以及资料情况,正点原子AI方面的教程有待完善,开发板的NPU推理的性能不错,有0.5TOPS算力,在推理目标检测模型的时候每10ms可以推出1帧数据,识别准确率较好。
- 2024-06-24
-
回复了主题帖:
【正点原子i.MX93开发板】2-LCD显示测评和移植LVGL显示框架
本帖最后由 qiao--- 于 2024-6-25 00:57 编辑
lugl4313820 发表于 2024-6-22 22:33 大佬,你一出手,果然是惊艳呀,他应该支持HDMI吧,那样显示器是不是便宜一点?
是的,不支持HDMI,应该是接口PCB没画
- 2024-06-22
-
回复了主题帖:
【Luckfox幸狐 RV1106 Linux 开发板】5-给系统移植QT环境__显示电子时钟界面
jafatek 发表于 2024-6-21 09:57
感谢大佬,根据您的步骤一点点操作完美运行。膜拜,辛苦了
感谢支持