[嵌入式AI從0開始到入土]嵌入式AI系列教程
注:等我摸完魚再把鏈接補(bǔ)上
可以關(guān)注我的B站號(hào)工具人呵呵的個(gè)人空間,后期會(huì)考慮出視頻教程,務(wù)必催更,以防我變身鴿王。
第1期 昇騰Altas 200 DK上手
第2期 下載昇騰案例并運(yùn)行
第3期 官方模型適配工具使用
第4期 煉丹爐的搭建(基于Ubuntu23.04 Desktop)
第5期 煉丹爐的搭建(基于wsl2_Ubuntu22.04)
第6期 Ubuntu遠(yuǎn)程桌面配置
第7期 下載yolo源碼及樣例運(yùn)行驗(yàn)證
第8期 在線Gpu環(huán)境訓(xùn)練(基于啟智ai協(xié)作平臺(tái))
第9期 轉(zhuǎn)化為昇騰支持的om離線模型
第10期 jupyter lab的使用
第11期 yolov5在昇騰上推理
第12期 yolov5在昇騰上應(yīng)用
第13期_orangepi aipro開箱測(cè)評(píng)
第14期 orangepi_aipro小修補(bǔ)含yolov7多線程案例
未完待續(xù)…
前言
注:本文基于orangepi_aipro于2023.2.3公布的ubuntu_desktop鏡像
拿到手有段時(shí)間了,小問題還是比較的多的,整體上和Atlas 200i DK A2差不多。
emmm,沒錯(cuò),連產(chǎn)品名也套娃了。
說明:本文是作者測(cè)試成功并生成完善的鏡像后寫的,因此截圖會(huì)比較少,存粹是因?yàn)闉榱艘粡垐D需要重走一遍,而一遍需要好幾個(gè)小時(shí),也可能需要好幾遍才能把圖湊齊。因此只挑重點(diǎn)截圖了。
一、opencv安裝
雖然鏡像內(nèi)帶了opencv4.5.4,但是opencv應(yīng)該是從4.7.0開始支持CANN后端的。這里我參考o(jì)pencv官方github倉庫的Wiki,重新編譯了支持cann的opencv4.9.0,見文章頂部的資源。
至于為什么要換版本,看下圖
使用我提供的資源時(shí),請(qǐng)將其放置于/home/HwHiAiUser目錄下,進(jìn)入/home/HwHiAiUser/opencv4/build目錄,執(zhí)行第四步即可
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
參數(shù),會(huì)導(dǎo)致python import或者cmake include報(bào)錯(cuò)找不到文件 -
請(qǐng)確保cmake后生成如下圖所示的配置
-
如非必要,在生成配置后,不要更改opencv文件夾包括內(nèi)部文件的位置,否則將會(huì)導(dǎo)致錯(cuò)誤。
-
如果你的python不是使用的官方鏡像miniconda的base環(huán)境,需要在配置時(shí)修改為自己的路徑
3、編譯
make -j$(nproc) #-j$(nproc) 表示使用所有可用的 CPU 核心來并行編譯
- 這里一定要在開發(fā)板上編譯,大約需要2小時(shí)左右。
- 編譯到97%后可能會(huì)報(bào)錯(cuò)
fatal error: Python.h: No such file or directory
,實(shí)際上這個(gè)文件是在的,我嘗試過各種方法,不僅沒用,還導(dǎo)致從頭開始編譯。這里我用了一個(gè)最簡(jiǎn)單粗暴的方法,就是把/usr/local/miniconda3/include/python3.9
整個(gè)文件夾內(nèi)的東西都復(fù)制的到opencv/build
文件夾內(nèi),完美解決。
4、安裝
sudo make install
5、驗(yàn)證安裝
新建mobilenetv1.py
,執(zhí)行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 #設(shè)置Docker服務(wù)開機(jī)自啟
sudo docker run hello-world #驗(yàn)證Docker是否安裝成功
1、克隆torch_npu代碼倉
git clone https://gitee.com/ascend/pytorch.git -b v2.1.0-5.0.0 --depth 1
2、構(gòu)建鏡像
cd pytorch/ci/docker/{arch} # {arch} for X86 or ARM
docker build -t manylinux-builder:v1 .
3、進(jìn)入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、驗(yàn)證安裝
終端執(zhí)行
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案例
官方鏡像內(nèi)置的是python案例,缺少c++案例,我們?cè)L問倉庫,獲取案例
git clone https://gitee.com/ascend/samples.git
為了壓榨板子,我選取了sampleYOLOV7MultiInput
這個(gè)案例
1、環(huán)境準(zhǔn)備
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版本),但是經(jīng)過我實(shí)測(cè),鏡像內(nèi)都已經(jīng)內(nèi)置了。
2、下載模型和數(shù)據(jù)
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、轉(zhuǎn)換模型
atc --model=yolov7x.onnx --framework=5 --output=yolov7x --input_shape="images:1,3,640,640" --soc_version=Ascend310B4 --insert_op_conf=aipp.cfg
此處大約耗時(shí)10-15分鐘。
4、編譯程序
vim scripts/sample_build.sh
#將29行處make修改為以下內(nèi)容,來使用多線程編譯
make -j$(nproc)
sudo bash scripts/sample_build.sh
5、運(yùn)行推理
bash scripts/sample_run.sh
注意,此處不要使用root用戶執(zhí)行,否則可能會(huì)提示找不到libascendcl.so
6、查看推理結(jié)果
推理大約需要1分鐘,輸出的視頻在out文件夾,可以下載至本地查看
四、問題
1、自動(dòng)休眠問題
這個(gè)問題僅存在于ubuntu桌面鏡像,經(jīng)過和群友的討論和測(cè)試,在不登陸桌面的情況下大約5分鐘會(huì)自動(dòng)休眠,且無法喚醒。
目前解決方案如下,注意,這種方法會(huì)直接禁用休眠
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 #我們需要?dú)⒌魟偛艈?dòng)的vnc服務(wù),我這是3,視情況而定
vim .vnc/xstartup
#添加以下內(nèi)容,否則沒有桌面,是黑屏的
startxfce4 &
#修改完成后重新啟動(dòng)vnc
vncserver
在本地使用vncview等工具使用ip:端口
的方式訪問
3、dialog: command not found
這個(gè)錯(cuò)誤多在使用apt命令的時(shí)候會(huì)遇到,在Linux系統(tǒng)中,嘗試執(zhí)行含有該命令的腳本或命令行操作時(shí)發(fā)生。
解決方案如下
sudo apt install dialog
3、apt autoremove
慎用,經(jīng)大量測(cè)試,會(huì)導(dǎo)致卸載netplan.io
,這將導(dǎo)致除你當(dāng)前正在使用的網(wǎng)絡(luò)外,其余的全部嗝屁。
解決方案
sudo apt-mark hold netplan.io
4、apt upgrade在firebox卡住
這個(gè)應(yīng)該是snap導(dǎo)致的,如果你暫時(shí)不需要新版的firebox,使用以下指令跳過升級(jí)
sudo apt-mark hold firebox #升級(jí)時(shí)保留選定的軟件包
當(dāng)我們需要升級(jí)保留的軟件包或者指定的軟件包時(shí)執(zhí)行
sudo apt-mark unhold firebox #刪除保留設(shè)置
sudo apt --only-upgrade install package1 package2 #只升級(jí)指定的package
5、jupyter lab外部網(wǎng)絡(luò)訪問
這里使用鏡像notebook文件夾內(nèi)自帶的start.sh只能在本地瀏覽器訪問,因此我建議使用命令手動(dòng)啟動(dòng)jupyter,記得把ip改成開發(fā)板的ip,或者將其寫入start.sh文件內(nèi)
jupyter lab --ip 192.168.3.200 --allow-root --no-browser
6、jupyter需要輸入密碼或者token
這個(gè)密碼只能說防君子,還使得我們使用變得麻煩,因此我選擇直接去掉
執(zhí)行以下命令,二選一即可
jupyter notebook password #連續(xù)兩次回車,密碼就變成空白了,直接點(diǎn)登錄即可
當(dāng)然,作為終極懶人,這還是太麻煩了文章來源:http://www.zghlxwxcb.cn/news/detail-826496.html
jupyter lab --generate-config
vim /home/HwHiAiUser/.jupyter/jupyter_lab_config.py
#找到c.ServerApp.token這一行,修改為
c.ServerApp.token = ''
總結(jié)
不得不說,這個(gè)官方鏡像小毛病還是挺多的,我已經(jīng)打包了一份鏡像,關(guān)注我B站動(dòng)態(tài)獲取。文章來源地址http://www.zghlxwxcb.cn/news/detail-826496.html
到了這里,關(guān)于[嵌入式AI從0開始到入土]14_orangepi_aipro小修補(bǔ)含yolov7多線程案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!