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

这篇具有很好参考价值的文章主要介绍了[嵌入式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多线程案例
未完待续…



前言

注:本文基于orangepi_aipro于2023.2.3公布的ubuntu_desktop镜像
拿到手有段时间了,小问题还是比较的多的,整体上和Atlas 200i DK A2差不多。
emmm,没错,连产品名也套娃了。
[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例,嵌入式ai从0到入土,人工智能,ascend,opencv
说明:本文是作者测试成功并生成完善的镜像后写的,因此截图会比较少,存粹是因为为了一张图需要重走一遍,而一遍需要好几个小时,也可能需要好几遍才能把图凑齐。因此只挑重点截图了

一、opencv安装

虽然镜像内带了opencv4.5.4,但是opencv应该是从4.7.0开始支持CANN后端的。这里我参考opencv官方github仓库的Wiki,重新编译了支持cann的opencv4.9.0,见文章顶部的资源。
至于为什么要换版本,看下图
[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例,嵌入式ai从0到入土,人工智能,ascend,opencv

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

1、下载源码

git clone https://github.com/fengyuentau/opencv.git
cd opencv
git checkout cann_backend_221010

git 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后生成如下图所示的配置
    [嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例,嵌入式ai从0到入土,人工智能,ascend,opencv

  • 如非必要,在生成配置后,不要更改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 cv

def 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 out

def 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 crop
    cv::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 image
    Mat input_blob;
    preprocess(image, input_blob);

    dnn::Net net = dnn::readNet("/path/to/image_classification_mobilenetv1_2022apr.onnx"); // replace with the path to the model
    net.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、验证安装

终端执行

python

import torch
import torch_npu

x = 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)

[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例,嵌入式ai从0到入土,人工智能,ascend,opencv

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:端口的方式访问
[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例,嵌入式ai从0到入土,人工智能,ascend,opencv

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站动态获取。文章来源地址https://www.toymoban.com/news/detail-826496.html

到了这里,关于[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式一开始该怎么学?学习单片机

    学习单片机: 模电数电肯定必须的,玩单片机大概率这两门课都学过,学过微机原理更好。 直接看野火的文档,芯片手册,外设手册。 学单片机不要纠结于某个型号,我认为stm32就OK,主要是原理和感觉。 看 野火文档 的时候,可以做笔记(记忆力好的人可以忽略),各种手

    2024年02月14日
    浏览(42)
  • 从零开始的嵌入式Linux生活(一) 背景介绍

    近年来(截至2023年3月),随着各种各样的因素:实体经济、米国制裁、芯片热、智能汽车等, 嵌入式软件开发(Embedded Software)越来越火热,众多的芯片公司、应用方案公司、甚至是代理商公司如雨后春笋般成立; 各大招聘网站上“嵌入式开发”“驱动开发”等岗位也成为

    2023年04月09日
    浏览(34)
  • 详解从0开始的嵌入式学习路线,学什么、怎么学?

    嵌入式是个大筐,什么都可以往里面装,电子、机械、计算机、自动化、测控、通信、物联网……很多很多专业都和嵌入式沾边,硬件、驱动、操作系统、网络、应用、算法……很多同学越学越迷糊,越学越感觉什么也不会。 首先要记住一句话,嵌入式学习奥义: 先观其广

    2024年02月02日
    浏览(46)
  • 从何着手OpenHarmony?从这里开始认识嵌入式开源鸿蒙操作系统

    首先,我们需要知道HarmonyOS与OpenHarmony是不同的概念,我们需要知道它们的区别:         HarmonyOS是华为独家开发的,但华为在2020、2021年分两次 将HarmonyOS的基础能力全部捐献给了开放原子开源基金会,形成了OpenHarmony开源项目 ,华为对开源鸿蒙没有控制权,当然华为仍将

    2024年02月04日
    浏览(43)
  • RK3588平台开发系列讲解(嵌入式AI篇)嵌入式AI的学习步骤

    沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将给大家介绍什么是嵌入式AI。

    2024年02月04日
    浏览(42)
  • 什么是嵌入式AI

    人工智能概念: AI,英文的直译就是人工智能,什么是人工智能?计算机科学家们为我们定义了:就是希望计算机有类似人的意识,比如可以推理,自我学习,感情等能力,研究、开发用于模拟、延伸和扩展人智能的理论、方法、技术及应用系统的一门新技术科学。人工智能

    2024年04月23日
    浏览(28)
  • 从零开始教你使用Clion优雅开发STM32(三)Clion嵌入式开发必备插件

    (一)软件安装与环境配置 (二)移植工程文件到其他芯片 (三)Clion嵌入式开发必备插件 文章目录 前言 1)Chinese(simplified) 2)CodeGlance Pro 3)File Watchers  4)Key Promoter X 5)CodeGlance Pro 6)Monokai Pro Theme 7)Rainbow Brackets Lite 8)Serial Port  Monitor 总结 前段时间,稚晖君用 Cl

    2024年02月06日
    浏览(45)
  • (三)内核移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

    目录 一、bootloader、kernel、rootfs联系 二、内核移植 1. 内核源码获取 2. 内核配置与编译 🍍 基础配置与编译 🍍 TF卡分区 🍍 内核烧录 三、参考内容 kernel可以理解为一个 庞大的裸机程序 ,和uboot以及其他比如点灯类似的裸机程序没有本质区别,只是kernel分为 用户态和内核态

    2024年02月15日
    浏览(52)
  • AI嵌入式K210项目(5)-串口通讯

    串口通讯是平时大家进行调试最常用的方法,嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求,它能够灵活地与外部设备进行全双工数据交换,那么本章我们来了解下,本节课主要学习K210的串口通讯。 串

    2024年01月16日
    浏览(49)
  • AI嵌入式K210项目(24)-口罩检测

    本节课主要学习口罩检测功能,将摄像头采集的画面分析,比对模型,分析是否佩戴口罩,打印出佩戴口罩的状态 请先将模型文件导入内存卡上,再将内存卡插入到K210开发板的内存卡插槽上,具体操作步骤请参考: AI嵌入式K210项目(21)-AI模型文件导入至TF卡 本实验使用/

    2024年02月20日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包