边缘设备使用记录--阿加犀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.rhkb.cn/news/379080.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot整合ShardingJdbc实现分库分表方案

一、创建库表 1、创建两个数据库 CREATE SCHEMA shard_db_0 DEFAULT CHARACTER SET utf8 ; CREATE SCHEMA shard_db_1 DEFAULT CHARACTER SET utf8 ; 2、在每个数据库各创建三个分表 CREATE TABLE tb_order_0 (order_id bigint(20) NOT NULL,buyer_id bigint(20) not null …

dom4j 操作 xml 之按照顺序插入标签

最近学了一下 dom4j 操作 xml 文件&#xff0c;特此记录一下。 public class Dom4jNullTagFiller {public static void main(String[] args) throws DocumentException {SAXReader reader new SAXReader();//加载 xml 文件Document document reader.read("C:\\Users\\24…

【数据结构】探索排序的奥秘

若有不懂地方&#xff0c;可查阅我之前文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~_csdn博客 所属专栏&#xff1a;数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…

前后端数据交互设计到的跨域问题

前后端分离项目的跨域问题及解决办法 一、跨域简述 1、问题描述 这里前端vue项目的端口号为9000&#xff0c;后端springboot项目的端口号为8080 2、什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域 当前页面url被请求页面url是否…

K8S 上部署 Emqx

文章目录 安装方式一&#xff1a;1. 快速部署一个简单的 EMQX 集群&#xff1a;2. 部署一个持久化的 EMQX 集群&#xff1a;3. 部署 EMQX Edge 集群和 EMQX 企业版集群&#xff1a; 安装方式二&#xff1a;定制化部署1. 使用 Pod 直接部署 EMQX Broker2. 使用 Deoloyment 部署 …

Jmeter关联

案例脚本实现&#xff1a;选择商品加入购物车 客户端发送一个登录的HTTP请求&#xff0c;服务端返回一个带着token的响应&#xff0c;后续发出一个带token信息的加入购物车的HTTP请求&#xff0c;返回响应。 关联&#xff1a;当请求直接由依赖关系的时候&#xff0c;比如一个请…

LLM基础模型系列:Prompt-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ 大型预训练语言模型的规模不断扩大&#xff0c;在许多自然语言处理 &#xff08;NLP&#xff09; 基准测试中取得了最先进的结果。自GPT和BERT开发以来&#xff0c;标准做法一直是在下游…

IDEA中Git常用操作及Git存储原理

Git简介与使用 Intro Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一款分布式版本控制系统&#xff08;VCS&#xff09;&#xff0c;是团队合作开发…

2010-2022年别克英朗维修手册电路图线路图接线图资料更新

经过整理&#xff0c;2010-2022年别克英朗汽车全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对…

How to integrate GPT-4 model hosted on Azure with the gptstudio package

题意&#xff1a;怎样将托管在Azure上的GPT-4模型与gptstudio包集成&#xff1f; 问题背景&#xff1a; I am looking to integrate the OpenAI GPT-4 model into my application. Here are the details I have: Endpoint: https://xxxxxxxxxxxxxxx.openai.azure.com/Locatio…

uniapp 开发 App 对接官方更新功能

插件地址&#xff1a;升级中心 uni-upgrade-center - App - DCloud 插件市场 首先创建一个 uni-admin 项目&#xff0c;选择你要部署的云开发服务商&#xff1a; 然后会自动下载模板&#xff0c;部署云数据库、云函数 第二步&#xff1a;将新创建的 uni-admin 项目托管到…

[算法] 优先算法(六):二分查找算法(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

传输层和网络层的关系,ip协议+ip地址+ip报头字段介绍(4位TOP字段,8位生存时间(ttl)),ip地址和端口号的作用

目录 传输层和网络层的关系 引入 介绍 ip协议 介绍 ip地址 引入 数据传递过程 举例(ip地址的作用) ip报头 格式 4位版本号 ip地址不足的问题 8位服务类型 4位TOP(type of service)字段 最小延时 最大吞吐量 4位首部长度 16位总长度 8位协议号 首部校验和…

vivado FFT IP Core

文章目录 前言FFT IP 接口介绍接口简介tdata 格式说明 其他细节关于计算精度及缩放系数计算溢出架构选择数据顺序实时/非实时模式数据输入输出时序关于配置信息的应用时间节点 FFT IP 例化介绍控制代码实现 & 测试参考文献 前言 由于计算资源受限&#xff0c;准备将上位机 …

【Linux应用编程】系统信息与资源 | 如获取、设置系统时间、日期、/proc 虚拟文件系统等

系统信息与系统资源 通过 Linux 系统调用或 C 库函数获取系统信息&#xff08;如获取系统时间、日期以及设置系统时间、日期等&#xff09;&#xff1b; Linux 系统下的/proc 虚拟文件系统&#xff08;读取系统、进程有关信息&#xff09;&#xff1b; 系统信息 主要介绍了用…

成都亚恒丰创教育科技有限公司 【插画猴子:笔尖下的灵动世界】

在浩瀚的艺术海洋中&#xff0c;每一种创作形式都是人类情感与想象力的独特表达。而插画&#xff0c;作为这一广阔领域中的璀璨明珠&#xff0c;以其独特的视觉语言和丰富的叙事能力&#xff0c;构建了一个又一个令人遐想连篇的梦幻空间。成都亚恒丰创教育科技有限公司 在众多插…

数据采集监控平台:挖掘数据价值 高效高速生产!

在当今数字化的时代&#xff0c;数据已成为企业非常宝贵的资产之一。然而&#xff0c;要充分发挥数据的潜力&#xff0c;离不开一个强大的数据采集监控平台&#xff0c;尤其是生产制造行业。它不仅是数据的收集者&#xff0c;更是洞察生产的智慧之眼&#xff0c;高效高速处理产…

昇思MindSpore学习开始

昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;易开发表现为API友好、调试难度低&#xff1b;高效执行包括计算效率、数据预处理效率和分布式训练效率&#xff1b;全场景则指框架同时支持云、边缘以…

stm32:CAN通讯

目录 介绍 协议层 CAN的 帧/报文 种类 数据帧 远程帧&#xff08;遥控帧&#xff09; 错误帧 过载帧 帧间隔 总线仲裁 stm32的CAN外设 工作模式 测试模式 功能框图 时序 标准时序 例子 环回静默模式测试 寄存器代码 HAL版本 介绍 一种功能丰富的车用总线标…

基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 小程序用户登录&#…