边缘设备使用记录--阿加犀AIBox 6490

边缘设备使用记录--阿加犀AIBox 6490

  • 设备介绍
  • 设备连接
  • glog && gflags
  • onnx2tflite
  • AidLite SDK for C++
    • 模型输入输出的shape
    • 执行推断
  • OpenCV使用

设备介绍

阿加犀AIBox 6490是一款基于高通QCS6490平台的高性价比智能边缘计算终端,具有14TOPS AI算力,可独立运行Android、Linux、Ubuntu操作系统,或选择Android+Linux双系统原生融合并行,带来更加高效的使用体验。 详情可以参考官网链接,我手中的这块板子是单独的Ubuntu 20.04系统。

设备连接

6490自己是有HDMI out输出的,所以最简单的办法就是直接插上鼠标键盘还有显示器,当正常的电脑用,不过这里的桌面应该是简化过的,只有左上角有个终端的按钮,别的什么都没有

在这里插入图片描述

单纯这么使用的话应该是有点麻烦的,所以这里还是选择和之前树莓派,以及Nvidia Orin nx一样的方法,使用SSH远程开发。 然后这里就有新的问题了,这个目前似乎是没有开机自动WiFi连接的方法的,按之前给树莓派配WiFi的方法试了下也没成功,所以这里就退而求其次,选择用网线和主机连接,再把主机的网络共享给6490板子,实现的效果也是一样的。在连上网线之后,可以在网络设备里看到刚刚插入的网口
在这里插入图片描述

这个未识别的网络指的就是刚刚连上的了,接下来只需要再设置下WiFi的网络共享以及对应以太网的IP地址就可以了
在这里插入图片描述

然后再根据arp -a命令可以查到当前设备的IP地址,之后只需要用自己习惯的方式连上就可以,我这里配的是tabby和vscode
在这里插入图片描述
之后就可以进行愉快的coding了

  • 这里有一个小问题,就是板子每次重启后,虽然我连的网口没变,但IP还是会发生改变,这样其实倒也没什么问题。。就是后边用的次数多了可能会增加找到这个IP的难度。目前还没想到什么好办法解决,之后看看有没有办法能解决吧

glog && gflags

因为个人的习惯问题,还是把glog,gflags日志库安装了一下,这里还是源码编译,之前也源码编译安装了很多次了,首先要注意一定要先安装gflags

git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build
cmake .. -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC ..
make -j4
sudo make install

然后再安装glog,不过这里直接拉最新的代码是不行的,主要报错是在CMake文件里,虽然感觉应该不难改,但这里还不如降低一下版本。。所以直接换成了0.5.0的版本,安装没什么问题

git clone -b v0.5.0 https://github.com/google/glog
cd glog
mkdir build && cd build
cmake -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_SHARED_LIBS=ON ..
make -j4
sudo make install

然后就在自己的程序里链接到这两个库就能愉快的使用了

onnx2tflite

我比较常用的模型都是onnx,之前在看autoware的时候有了解过TensorRTtvm两种部署方式,里面是通过加载onnx然后生成engine引擎文件实现的。在Aidlux自带的AI包中,支持的模型种类没有onnx,所以这里是稍微搜了下,发现了onnx2tflite这个库,所以这里把这个库先安装一下。第一步还是经典的依赖问题,直接pip install网络估计还是会报错,所以这里直接指定清华源了

sudo pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装之后其实报了版本冲突的警告,但是不知道后边会不会有影响,先运行下试试

  • 然后果然就出问题了,运行的时候一直会提示The TensorFlow library was compiled to use AVX instructions, but these aren’t available on your machine.这个错误,然后直接段错误,上网搜了下我的CPU应该是不支持AVX,所以要使用SSE版本的Tensorflow才行。。这里参考Tensorflow针对CPU的编译优化加速这篇文章进行了Tensorflow的重新安装

这里也是废了半天劲,最后转换得到了一个yolox_nano.tflite文件,而且还不知道能不能用。。先继续往下看吧(后边试了一下,加载模型的时候会提示GATHER不支持GPU加速,但好像也没什么大问题?

在这里插入图片描述

  • 又在网上搜了半天,发现了YOLOX-ti-lite Object Detector in TFLite这样一个仓库,里面是一些在边缘设备部署YOLOx的代码,而且也有几个训练好的模型,这里也是下了几个别人训练好的模型准备后边拿来测试一下,至少创建模型是可以的

AidLite SDK for C++

本来还想着要装tvm呢,后来搜了搜发现阿加犀自己有对应的模型推理的一个SDK,而且使用文档写的相对还挺全的,这个文档的地址在AidLite SDK for C++,这里就参考这个文档依次来学习一下

模型输入输出的shape

在模型创建的代码中,我们发现里面对input_shapeoutput_shape进行了设置

// 创建Model实例对象,并设置模型相关参数
Model* model = Model::create_instance("./inceptionv3_float32.dlc");
if(model == nullptr){printf("Create model failed !\n");return EXIT_FAILURE;
}
std::vector<std::vector<uint32_t>> input_shapes = {{1,299,299,3}};
std::vector<std::vector<uint32_t>> output_shapes = {{1,1001}};
model->set_model_properties(input_shapes, DataType::TYPE_FLOAT32, output_shapes, DataType::TYPE_FLOAT32);

像这里,我个人觉得第一个1代表的就是批次,然后输入后边对应的就是2992993的图像,下面输出的1000应该对应着1001种类别。 OK,因为我对各种网络其实不是很熟悉,所以这里还是以YOLOx为例,之前也有在autoware.universe源码略读(3.1)–perception:yolo初识这篇文章总结过,这里的输出应该是85*8400,所以设置的话应该设置成[1, 8400,85]?这里我暂时是这么设置的

  • 这里又看了下,YOLOx-nano和tiny应该是只支持416*416一种输入的,所以这里的输入输出都得跟着改成下面这样
std::vector<std::vector<uint32_t>> input_shapes = {{1, 416, 416, 3}};
std::vector<std::vector<uint32_t>> output_shapes = {{1, 3549, 85}};
model->set_model_properties(input_shapes, Aidlux::Aidlite::DataType::TYPE_FLOAT32,output_shapes, Aidlux::Aidlite::DataType::TYPE_FLOAT32);

还不知道这样对不对,还是一边写一边测试吧。然后是创建 Config 类型的对象,此对象用于记录模型推理相关的配置信息,推理框架运行过程中会使用到这些配置信息。

执行推断

这里其实照着文档来就可以了,不过值得注意的是,我本来以为这个板子是NPU,结果发现还是GPU(其实我也不是很了解两者的区别),因为在设置Config提示我tflite模型不能用NPU我才发现这个问题。还有和之前用到的TensorRT不同的一点是,因为这里指定了输入和输出的shapes,所以保存成cv::Mat就可以了

cv::Mat input_data;
preprocess(FLAGS_input_image, input_data);
result = fast_interpreter->set_input_tensor(0, static_cast<void*>(input_data.data));
if (result != 0)
{LOG(FATAL) << "interpreter set input tensor false!\n";
}

然后执行推理过程,稍微计时了一下,在我使用yolox_nano_ti_lite_float32.tflite模型的时候每次推理的耗时在20-30ms,不是很清楚这个算什么水平。然后我们在这里直接把输出再转成一个vector,这样应该会好处理一些

result = fast_interpreter->invoke();
if (result != 0)
{LOG(FATAL) << "invoke failed!\n";
}
time_end = std::chrono::system_clock::now();
auto time_cost = std::chrono::duration_cast<std::chrono::milliseconds>(time_end - time_begin);
LOG(INFO) << "invoke cost: " << time_cost.count() << "ms.\n";
float* out_data = nullptr;
uint32_t output_tensor_length = 0;
result = fast_interpreter->get_output_tensor(0, (void**)&out_data, &output_tensor_length);
assert(result == 0);
std::vector<float> out_data_vec(out_data, out_data + output_tensor_length / 4);
LOG(INFO) << "out data vec size: " << out_data_vec.size() << std::endl;

最后当然还有一步骤是输出的后处理,这个就要针对不同的模型进行不同的操作了,就不在这里说了

OpenCV使用

在板子里是有预先安装好OpenCV的,但是可以看到里面有不止一个
在这里插入图片描述
这里是有两个版本,4.9.0和4.2.0,其实我也不太清楚这两个版本具体有什么区别,但是因为之前自己用的都是4.2.0的,所以这里还是用4.2.0的进行后续的开发。在CMake里直接find_package的找到的是4.9.0的版本,所以这里只需要制定以下cmake文件的路径就好

find_package(OpenCV REQUIREDPATHS /usr/local/lib/aidlux_opencv/lib/cmake/opencv4NO_DEFAULT_PATH)
include_directories(${OpenCV_INCLUDE_DIRS})
# message(STATUS "OpenCV include path: ${OpenCV_INCLUDE_DIRS}")

其实不需要消息输出,因为会提示找到的OpenCV的版本

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

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

相关文章

【机器学习】使用Python的dlib库实现人脸识别技术

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、传统人脸识别技术1. 基于几何特征的方法2. 基于模板匹配的方法3. 基于统计学习的方法 三、深度学习在脸识别中的应用1. 卷积神经网络&#xff08;CNN&#xff09;2. FaceNet和ArcFace 四、使用Python和dlib库实…

有了这5个高效视频剪辑工具,你一定会爱上剪辑

如果你是个剪辑新手&#xff0c;不知道如何挑选剪辑视频的工具&#xff0c;又或者是自己目前使用的剪辑工具不理想&#xff0c;想寻找新的剪辑软件&#xff1b;那就请你看看这篇文章&#xff0c;这里介绍的5款剪辑软件都是专业&#xff0c;简单&#xff0c;又高效的剪辑工具。 …

算法日记day 12(栈实现队列|队列实现栈|有效的括号)

队列是先进先出的&#xff0c;就像排队一样&#xff0c;谁在前谁先获得服务 栈是一种先进后出的数据结构 一、用栈实现队列 题目&#xff1a; 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xf…

mac docker no space left on device

mac 上 docker 拉取镜像报错 Error response from daemon: write /var/lib/docker/tmp/docker-export-3995807640/b8464f52498789c4ebbc063d508f04e8d2586567fbffa475e3cd9afd3c5a7cf2/layer.tar: no space left on device解决&#xff1a; 增加 docker 虚拟磁盘大小。如下图

笔记 | 算法时间复杂度T(n)的计算方法

&#x1f47b; 基本思想&#xff1a;找出关键语句总执行次数 T 与 输入规模 n 的关系式 &#xff08;本博客仅提供一种解题思路与通用方法&#xff0c;具体问题请具体分析&#xff09; &#x1f47b; 类型&#xff1a;while循环 &#x1f680; 思路 找出不满足while条件时&…

fine BI 怎么制作桑基图

fine BI 怎么制作桑吉图 文章目录 fine BI 怎么制作桑吉图桑基图起源什么是桑基图一、数据二、导入帆软 BI三、组件并完成四、 外国桑基图资源&#xff08;sankeydiagram&#xff09;总结 桑基图起源 桑基图的起源可以追溯到1898年&#xff0c;‌当时Matthew Henry Phineas Ri…

《昇思25天学习打卡营第22天|生成式-Diffusion扩散模型》

Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c;执行Python文件时&#xff0c;请…

嵌入式系统中的GPIO控制与应用

GPIO是嵌入式系统中最常见且功能最强大的接口之一。它允许硬件工程师通过编程来配置和控制芯片上的数字引脚&#xff0c;实现输入和输出的功能。在本文中&#xff0c;我们将从理论和实践两个方面探讨GPIO的工作原理&#xff0c;并通过一个简单的示例项目来演示如何利用GPIO控制…

微软全球系统蓝屏根源与警示

本次事件是一次由CrowdStrike软件更新引发的全球性IT问题&#xff0c;主要影响运行Windows操作系统的机器。CrowdStrike是一家知名的美国网络安全公司&#xff0c;其产品Falcon Sensor旨在保护云工作负载和终端安全&#xff0c;防止黑客攻击和系统中断。然而&#xff0c;这次故…

关于springboot的@DS(““)多数据源的注解无法生效的原因

对于com.baomidou.dynamic.datasource.annotation的DS注解&#xff0c;但凡有一个AOP的修改都会影响到多数据源无法生效的问题&#xff0c;本次我是添加了方法上添加了Transactional&#xff0c;例如下图&#xff1a; 在方法上写了这个注解&#xff0c;会影响到DS("db2&qu…

Hyper-V和VMWare使用对比

图片来自互联网 1.起因 最近在学习Linux相关的知识&#xff0c;第一步当然就是装虚拟机了。之前是基于微软Hyper-V平台装的Ubuntu,用起来总是感觉卡卡的。我还一直天真的以为虚拟机都是这个样子的&#xff0c;直到用了VMWare之后…。VMWare我主要装的是VMWare16Pro&#xff0…

Xinstall教你如何利用携带参数下载,精准追踪用户来源!

在移动互联网时代&#xff0c;App的推广和运营成为了各行各业竞相追逐的焦点。然而&#xff0c;随着渠道环境的日益复杂&#xff0c;如何精准追踪用户来源、提升运营效率&#xff0c;成为了摆在推广者面前的一大难题。好在&#xff0c;Xinstall携带参数下载技术的出现&#xff…

Java学习Day7

一 &#xff1a;数组和自定义数据类型的关系 1.1 有什么关系&#xff1f; 数组可以存储自定义数据类型 1.2 数组如何存自定义数据类型&#xff1f; 数组:数据类型[] 数组名 new 数据类型[长度]&#xff1b; 定义数组和初始化 Student[] arr new Student[5]; 自定义数据类…

2、建立模型,截图,参数配置(simulink仿真)

2、建立模型&#xff0c;截图&#xff0c;参数配置&#xff08;simulink仿真&#xff09; 基本技能建模导入Word&#xff08;截图是不要用qq截图&#xff0c;不专业&#xff0c;应使用其自带截图方式&#xff09;配置参数 基本技能 1&#xff0c;参数设置 2&#xff0c;结果保…

矩阵形式的bezier曲线

本文分享一段矩阵形式的bezier代码&#xff1a; clc clear% 控制点 P [25;10;5;13]; %% 获得M矩阵 n length(P) - 1; M zeros(n1,n1); for i 1:n1for j 1:n1if(ij<n3)M(i,j) (-1)^(n -i-j2)*nchoosek(n,n-i1)*nchoosek(n-i1,j-1);elseM(i,j) 0;endend end t_temp l…

Python爬虫(1) --基础知识

爬虫 爬虫是什么&#xff1f; spider 是一种模仿浏览器上网过程的一种程序&#xff0c;可以获取一些网页的数据 基础知识 URL 统一资源定位符 uniform resource locator http: 超文本传输协议 HyperText Transfer Protocol 默认端口 80 https: 安全的超文本传输协议 security…

【洁净室】压缩气体检测参考标准:悬浮粒子、微生物、水油检测

在洁净室&#xff0c;特别是达到ISO 5或更高级别的环境中&#xff0c;维护严格的污染控制是不可或缺的。其中&#xff0c;压缩气体的质量是一个至关重要的潜在污染源。为确保压缩气体不会引入损害洁净室完整性的微粒&#xff0c;适当的气体取样成为了一项核心任务。国际标准ISO…

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好&#xff0c;互相成全&#xff1b;反求诸己是致良知的第一步&#xff1b;有苦难才能超越自己&#xff0c;开胸怀和智慧&#xff1b;不浪费任何一次困苦&#xff0c;危机中寻找智慧&#xff0c;成长自己。 把困苦当作当下…

生成式之Diffusion扩散模型

前言 基于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;的扩散模型&#xff0c;该模型已在图像/音频/视频生成领域取得显著成果。目前比较受欢迎的例子包括GLIDE、DALL-E 2、潜在扩散和图像生成。生成模型的扩散概念最早在2015年由Sohl-Dickstein等人…

系统架构师考点--统一建模语言UML

大家好。今天我来总结一下面向对象的第二个考点–统一建模语言UML。 UML(统一建模语言)是一种可视化的建模语言&#xff0c;而非程序设计语言&#xff0c;支持从需求分析开始的软件开发的全过程。UML的结构包括构造块、规则和公共机制三个部分。其中考点主要集中在构造块部分&…