[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例

[嵌入式AI从0开始到入土]嵌入式AI系列教程

注:等我摸完鱼再把链接补上
可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。

第1期 昇腾Altas 200 DK上手
第2期 下载昇腾案例并运行
第3期 官方模型适配工具使用
第4期 炼丹炉的搭建(基于Ubuntu23.04 Desktop)
第5期 炼丹炉的搭建(基于wsl2_Ubuntu22.04)
第6期 Ubuntu远程桌面配置
第7期 下载yolo源码及样例运行验证
第8期 在线Gpu环境训练(基于启智ai协作平台)
第9期 转化为昇腾支持的om离线模型
第10期 jupyter lab的使用
第11期 yolov5在昇腾上推理
第12期 yolov5在昇腾上应用
第13期_orangepi aipro开箱测评
第14期 orangepi_aipro小修补含yolov7多线程案例
未完待续…


文章目录

  • [嵌入式AI从0开始到入土]嵌入式AI系列教程
  • 前言
  • 一、opencv安装
    • 1、下载源码
    • 2、配置cmake
    • 3、编译
    • 4、安装
    • 5、验证安装
  • 二、torch_npu的安装
    • 1、克隆torch_npu代码仓
    • 2、构建镜像
    • 3、进入Docker容器
    • 4、编译torch_npu
    • 5、安装
    • 6、验证安装
  • 三、sampleYOLOV7MultiInput案例
    • 1、环境准备
    • 2、下载模型和数据
    • 3、转换模型
    • 4、编译程序
    • 5、运行推理
    • 6、查看推理结果
  • 四、问题
    • 1、自动休眠问题
    • 2、 vnc配置
    • 3、dialog: command not found
    • 3、apt autoremove
    • 4、apt upgrade在firebox卡住
    • 5、jupyter lab外部网络访问
    • 6、jupyter需要输入密码或者token
  • 总结


前言

注:本文基于orangepi_aipro于2023.2.3公布的ubuntu_desktop镜像
拿到手有段时间了,小问题还是比较的多的,整体上和Atlas 200i DK A2差不多。
emmm,没错,连产品名也套娃了。
在这里插入图片描述
说明:本文是作者测试成功并生成完善的镜像后写的,因此截图会比较少,存粹是因为为了一张图需要重走一遍,而一遍需要好几个小时,也可能需要好几遍才能把图凑齐。因此只挑重点截图了

一、opencv安装

虽然镜像内带了opencv4.5.4,但是opencv应该是从4.7.0开始支持CANN后端的。这里我参考opencv官方github仓库的Wiki,重新编译了支持cann的opencv4.9.0,见文章顶部的资源。
至于为什么要换版本,看下图
在这里插入图片描述

使用我提供的资源时,请将其放置于/home/HwHiAiUser目录下,进入/home/HwHiAiUser/opencv4/build目录,执行第四步即可

1、下载源码

git clone https://github.com/fengyuentau/opencv.git
cd opencv
git checkout cann_backend_221010git clone https://gitee.com/opencv/opencv.git	#也可以直接使用gitee镜像

2、配置cmake

这里是大坑

cd opencv
mkdir build
cd build
cmake -D WITH_CANN=ON\-D PYTHON3_EXECUTABLE=/usr/local/miniconda3/bin/python3.9 \-D CMAKE_INSTALL_PREFIX=/usr \-D BUILD_opencv_python3=ON \-D BUILD_opencv_gapi=OFF \-D PYTHON3_LIBRARY=/usr/local/miniconda3/lib/libpython3.so \-D PYTHON3_INCLUDE_DIR=/usr/local/miniconda3/lib/ \-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/miniconda3/lib/python3.9/site-packages/numpy/core/include \..
  • 不要更改CMAKE_INSTALL_PREFIX参数,会导致python import或者cmake include报错找不到文件

  • 请确保cmake后生成如下图所示的配置
    在这里插入图片描述

  • 如非必要,在生成配置后,不要更改opencv文件夹包括内部文件的位置,否则将会导致错误。

  • 如果你的python不是使用的官方镜像miniconda的base环境,需要在配置时修改为自己的路径

3、编译

make -j$(nproc)	#-j$(nproc) 表示使用所有可用的 CPU 核心来并行编译
  • 这里一定要在开发板上编译,大约需要2小时左右。
  • 编译到97%后可能会报错fatal error: Python.h: No such file or directory,实际上这个文件是在的,我尝试过各种方法,不仅没用,还导致从头开始编译。这里我用了一个最简单粗暴的方法,就是把/usr/local/miniconda3/include/python3.9整个文件夹内的东西都复制的到opencv/build文件夹内,完美解决。

4、安装

sudo make install

5、验证安装

新建mobilenetv1.py,执行python3 mobilenetv1.py

import numpy as np
import cv2 as cvdef preprocess(image):out = image.copy()out = cv.resize(out, (256, 256))out = out[16:240, 16:240, :]out = cv.dnn.blobFromImage(out, 1.0/255.0, mean=(0.485, 0.456, 0.406), swapRB=True)out = out / np.array([0.229, 0.224, 0.225]).reshape(1, -1, 1, 1)return outdef softmax(blob, axis=1):out = blob.copy().astype(np.float64)e_blob = np.exp(out)return e_blob / np.sum(e_blob, axis=axis)image = cv.imread("/path/to/image") # replace with the path to your image
input_blob = preprocess(image)net = cv.dnn.readNet("/path/to/image_classification_mobilenetv1_2022apr.onnx") # replace with the path to the model
net.setPreferableBackend(cv.dnn.DNN_BACKEND_CANN)
net.setPreferableTarget(cv.dnn.DNN_TARGET_NPU)net.setInput(input_blob)
out = net.forward()prob = softmax(out, axis=1)
_, max_prob, _, max_loc = cv.minMaxLoc(prob)
print("cls = {}, score = {:.4f}".format(max_loc[0], max_prob))

或者使用c++版本
CMakeList.txt

cmake_minimum_required(VERSION 3.5.1)
project(cann_demo)# OpenCV
find_package(OpenCV 4.6.0 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})# PP-ResNet50
add_executable(ppresnet50 ppresnet50.cpp)
target_link_libraries(ppresnet50 ${OpenCV_LIBS})# MobileNetV1
add_executable(mobilenetv1 mobilenetv1.cpp)
target_link_libraries(mobilenetv1 ${OpenCV_LIBS})# YOLOX
add_executable(yolox yolox.cpp)
target_link_libraries(yolox ${OpenCV_LIBS})

mobilenetv1.cpp

#include <iostream>
#include <vector>#include "opencv2/opencv.hpp"void preprocess(const cv::Mat& src, cv::Mat& dst)
{src.convertTo(dst, CV_32FC3);cv::cvtColor(dst, dst, cv::COLOR_BGR2RGB);// center cropcv::resize(dst, dst, cv::Size(256, 256));cv::Rect roi(16, 16, 224, 224);dst = dst(roi);dst = cv::dnn::blobFromImage(dst, 1.0/255.0, cv::Size(), cv::Scalar(0.485, 0.456, 0.406));cv::divide(dst, cv::Scalar(0.229, 0.224, 0.225), dst);
}void softmax(const cv::Mat& src, cv::Mat& dst, int axis=1)
{using namespace cv::dnn;LayerParams lp;Net netSoftmax;netSoftmax.addLayerToPrev("softmaxLayer", "Softmax", lp);netSoftmax.setPreferableBackend(DNN_BACKEND_OPENCV);netSoftmax.setInput(src);cv::Mat out = netSoftmax.forward();out.copyTo(dst);
}int main(int argc, char** argv)
{using namespace cv;Mat image = imread("/path/to/image"); // replace with the path to your imageMat input_blob;preprocess(image, input_blob);dnn::Net net = dnn::readNet("/path/to/image_classification_mobilenetv1_2022apr.onnx"); // replace with the path to the modelnet.setPreferableBackend(dnn::DNN_BACKEND_CANN);net.setPreferableTarget(dnn::DNN_TARGET_NPU);net.setInput(input_blob);Mat out = net.forward();Mat prob;softmax(out, prob, 1);double min_val, max_val;Point min_loc, max_loc;minMaxLoc(prob, &min_val, &max_val, &min_loc, &max_loc);std::cout << cv::format("cls = %d, score = %.4f\n", max_loc.x, max_val);return 0;
}

二、torch_npu的安装

这里我参考了官方文档
注意,需要提前安装docker

sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce
sudo systemctl start docker
sudo systemctl enable docker	#设置Docker服务开机自启
sudo docker run hello-world		#验证Docker是否安装成功

1、克隆torch_npu代码仓

git clone https://gitee.com/ascend/pytorch.git -b v2.1.0-5.0.0 --depth 1

2、构建镜像

cd pytorch/ci/docker/{arch} # {arch} for X86 or ARM
docker build -t manylinux-builder:v1 .

3、进入Docker容器

docker run -it -v /{code_path}/pytorch:/home/pytorch manylinux-builder:v1 bash
# {code_path} is the torch_npu source code path

4、编译torch_npu

cd /home/pytorch
bash ci/build.sh --python=3.9

5、安装

pip install ./torch_npu-2.1.0+gitb2bbead-cp39-cp39-linux_aarch64.whl

6、验证安装

终端执行

pythonimport torch
import torch_npux = torch.randn(2, 2).npu()
y = torch.randn(2, 2).npu()
z = x.mm(y)print(z)

三、sampleYOLOV7MultiInput案例

官方镜像内置的是python案例,缺少c++案例,我们访问仓库,获取案例

git clone https://gitee.com/ascend/samples.git

为了压榨板子,我选取了sampleYOLOV7MultiInput这个案例

1、环境准备

cd sample_master/inference/modelInference/sampleYOLOV7MultiInput
sudo apt install libx11-dev
sudo apt-get install libjsoncpp-dev
sudo ln -s /usr/include/jsoncpp/json/ /usr/include/json
vim src/main.cpp
#添加
#include <fstream>
sudo ln -s /usr/include/opencv4/opencv2 /usr/include/opencv2 #这样就不用去将opencv版本了

这里readme中说需要安装x264,ffmpeg,opencv(3.x版本),但是经过我实测,镜像内都已经内置了。

2、下载模型和数据

cd data
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/car0.mp4 --no-check-certificate
cd ../model
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov7/yolov7x.onnx --no-check-certificate
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov7/aipp.cfg --no-check-certificate

3、转换模型

atc --model=yolov7x.onnx --framework=5 --output=yolov7x --input_shape="images:1,3,640,640"  --soc_version=Ascend310B4  --insert_op_conf=aipp.cfg

此处大约耗时10-15分钟。

4、编译程序

vim scripts/sample_build.sh
#将29行处make修改为以下内容,来使用多线程编译
make -j$(nproc)

在这里插入图片描述

sudo bash scripts/sample_build.sh

5、运行推理

bash scripts/sample_run.sh

注意,此处不要使用root用户执行,否则可能会提示找不到libascendcl.so

6、查看推理结果

推理大约需要1分钟,输出的视频在out文件夹,可以下载至本地查看

四、问题

1、自动休眠问题

这个问题仅存在于ubuntu桌面镜像,经过和群友的讨论和测试,在不登陆桌面的情况下大约5分钟会自动休眠,且无法唤醒。
目前解决方案如下,注意,这种方法会直接禁用休眠

sudo systemctl status sleep.target
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

2、 vnc配置

vncserver
netstat -antup | grep vnc #查看vnc端口
vncserver -kill :3	#我们需要杀掉刚才启动的vnc服务,我这是3,视情况而定
vim .vnc/xstartup
#添加以下内容,否则没有桌面,是黑屏的
startxfce4 &
#修改完成后重新启动vnc
vncserver

在本地使用vncview等工具使用ip:端口的方式访问
在这里插入图片描述

3、dialog: command not found

这个错误多在使用apt命令的时候会遇到,在Linux系统中,尝试执行含有该命令的脚本或命令行操作时发生。
解决方案如下

sudo apt install dialog

3、apt autoremove

慎用,经大量测试,会导致卸载netplan.io,这将导致除你当前正在使用的网络外,其余的全部嗝屁。
解决方案

sudo apt-mark hold netplan.io

4、apt upgrade在firebox卡住

这个应该是snap导致的,如果你暂时不需要新版的firebox,使用以下指令跳过升级

sudo apt-mark hold firebox							#升级时保留选定的软件包

当我们需要升级保留的软件包或者指定的软件包时执行

sudo apt-mark unhold firebox						#删除保留设置
sudo apt --only-upgrade install package1 package2	#只升级指定的package

5、jupyter lab外部网络访问

这里使用镜像notebook文件夹内自带的start.sh只能在本地浏览器访问,因此我建议使用命令手动启动jupyter,记得把ip改成开发板的ip,或者将其写入start.sh文件内

jupyter lab --ip 192.168.3.200 --allow-root --no-browser

6、jupyter需要输入密码或者token

这个密码只能说防君子,还使得我们使用变得麻烦,因此我选择直接去掉
执行以下命令,二选一即可

jupyter notebook password	#连续两次回车,密码就变成空白了,直接点登录即可

当然,作为终极懒人,这还是太麻烦了

jupyter lab --generate-config
vim /home/HwHiAiUser/.jupyter/jupyter_lab_config.py
#找到c.ServerApp.token这一行,修改为
c.ServerApp.token = ''

总结

不得不说,这个官方镜像小毛病还是挺多的,我已经打包了一份镜像,关注我B站动态获取。

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

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

相关文章

PHP毕业设计图片分享网站76t17

图片分享网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xff0c;…

【C语言】Linux内核bind系统调用代码

一、Linux 4.9内核bind系统调用代码注释 int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) {struct socket *sock; // 定义socket对象的指针struct sockaddr_storage address; // 用于存储从用户空间复制过来的地址int err…

谷歌搜索技巧与 ChatGPT 实用指南:提升你的在线生产力

探索谷歌搜索技巧&#xff0c;提升搜索效率 前言 在搜索三巨头百度、必应、谷歌中&#xff0c;谷歌在搜索精确度以及多语言兼容性方面有明显的优势。其次在国内想要使用谷歌搜索你需要会科学上网&#xff08;这里不说&#xff09;。 一.排除干扰内容&#xff08;广告&#xff…

vue-进阶语法(四)

目录 v-model原理 v-model应用于组件 sync修饰符 ref 和 $refs&#xff08;重点&#xff09; $nextTick v-model原理 原理&#xff1a;v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写。 作用&#xff1a;提供数据的双向…

压缩PDF的大小-Adobe Acrobat Pro

经常遇到上传的pdf太大&#xff0c;无法成功上传。 今天找到一个方法&#xff1a; 打开Adobe Acrobat Pro软件 → 文件 → 另存为其他&#xff08;H&#xff09;... →缩小大小的PDF 版本选择 4.0 最低的版本。 文件由9M变为1.5M。

Codeforces Round 924 (Div. 2) B - D

B. Equalize 题目&#xff1a; 思路&#xff1a;首先排序然后去重&#xff08;可以用set来去重&#xff09;&#xff0c;我们可以肯定的是&#xff0c;如果连续k个数最大值最小值的差小于等于n的话&#xff0c;那么这个长度为k的区间就符合答案要求&#xff0c;那么k就和答案…

###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 目录 一. 延时函数的生成 1.通过延时计算器得到延时函数 2.可赋值改变…

Linux释放内存

free -m是Linux上查看内存的指令&#xff0c;其中-m是以兆&#xff08;MB&#xff09;为单位&#xff0c;如果不加则以KB为单位。 如下图表示&#xff0c;&#xff08;total&#xff09;总物理内存是809MB&#xff0c;&#xff08;used&#xff09;已使用167MB&#xff0c;&…

【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 18 Jan 2024 Totally 35 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deciphering Textual Authenticity: A Generalized Strategy through the Lens of Large Language Semantics …

【Py/Java/C++三种语言详解】LeetCode每日一题240215【二叉树BFS】LeetCode107、二叉树的层序遍历II

有LeetCode交流群/华为OD考试扣扣交流群可加&#xff1a;948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目链接题目描述解题思路DFS和BFS异同用队列维护的BFS 代码PythonJavaC时空复杂度 相关习题华为OD算法/大…

计算机视觉基础:获取图像的ROI

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。在设定感兴趣区域ROI后&#xff0c;就可以对该区域进行整体操作。 Python实现代码如下&#xff1a; # -…

[职场] 花园管家是做什么的 #笔记#学习方法

花园管家是做什么的 一、工作内容职责&#xff1a; 1.管理花园内的活动和工作&#xff0c;协调各方资源&#xff0c;确保活动的顺利进行&#xff1b; 2.提供优质的客户服务和接待工作&#xff0c;解决客户问题&#xff0c;处理投诉&#xff0c;提高客户满意度&#xff1b; …

(03)Hive的相关概念——分区表、分桶表

目录 一、Hive分区表 1.1 分区表的概念 1.2 分区表的创建 1.3 分区表数据加载及查询 1.3.1 静态分区 1.3.2 动态分区 1.4 分区表的本质及使用 1.5 分区表的注意事项 1.6 多重分区表 二、Hive分桶表 2.1 分桶表的概念 2.2 分桶表的创建 2.3 分桶表的数据加载 2.4 …

操作系统(14)----文件系统的结构

目录 一.文件系统的层次结构 1.用户接口&#xff1a; 2.文件目录系统&#xff1a; 3.存取控制模块&#xff1a; 4.逻辑文件系统与文件信息缓冲区&#xff1a; 5.物理文件系统&#xff1a; 二.文件系统的全局结构 1.文件系统在外存中的结构 &#xff08;1&#xff09;物…

Mermaid绘制UML图教程

Mermaid 是一种轻量级的图形描述语言&#xff0c;用于绘制流程图、时序图、甘特图等各种图表。它采用简单的文本语法&#xff0c;使得用户能够快速绘制各种复杂图表&#xff0c;而无需深入学习图形绘制工具。 一、安装Mermaid Mermaid 可以在浏览器中直接使用&#xff0c;也可…

剑指offer——数值的整数次方

目录 1. 题目描述2. 一般思路2.1 有问题的思路2.2 全面但不高效的思路2.3 面试小提示 3. 全面又高效的思路 1. 题目描述 题目:实现函数 double Power(double base,int exponent)&#xff0c;求base 的exponent 次方。不得使用库函数&#xff0c;同时不需要考虑大数问题 2. 一般…

第13讲创建图文投票

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b;、 <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&…

AIGC盛行,带你轻松调用开发

文章目录 前言一、&#x1f4d6;AIGC简介二、&#x1f4e3;开通体验开通模型获取API-KEY 三、&#x1f4dd;基于java实现调用1.设置API-KEY2.体验大语言模型多轮对话演示补充流式输出 3.体验通义千问VL使用官方提供照片本地文件多轮对话流式输出 总结 前言 本篇文章基于java和…

C++的进阶泛型编程学习(1):函数模板的基本概念和机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、模板1.1 模板的概念1.1.1 形象的解释&#xff1a;模板就是通用的模具&#xff0c;目的是提高通用性1.1.1 模板的特点&#xff1a;1.1.2 综述模板的作用 1.2…

揭秘Angular世界的奥秘:全面提升你的前端开发技能!

介绍&#xff1a;Angular是一个由Google维护的开源JavaScript框架&#xff0c;专为构建Web应用程序而设计&#xff0c;特别适合开发大型单页应用&#xff08;SPA&#xff09;。以下是对Angular的详细介绍&#xff1a; 技术栈&#xff1a;Angular使用HTML作为模板语言&#xff0…