[嵌入式AI从0开始到入土]14

慈云数据 8个月前 (03-12) 技术支持 112 0

[嵌入式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
          • 7、只能调用3个cpu核心
          • 8、opencv调用cann后端报错
            • 1、假死
            • 2、opencv/modules/dnn/src/net cann.cp:316: error: (-2:uhspecified error)
            • 3、modules/dnn/src/net_cann.cpp:311: error: (-2:Unspecified error) CANN graph check failed in function 'compileCannGraph'
            • 9、cv2.imshow()报错
            • 总结

              前言

              注:本文基于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、下载源码

              wget https://github.com/opencv/opencv/archive/refs/tags/4.9.0.zip
              unzip opencv-4.9.0
              cd opencv-4.9.0
              git clone https://gitee.com/opencv/opencv.git	#也可以直接使用gitee镜像
              

              2、配置cmake

              这里是大坑

              cd opencv-4.9.0
              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 \
                    -D BUILD_TESTS=OFF \
                    -D BUILD_PERF_TESTS=OFF \
                    ..
              
              • 如果需要测试案例,把最后两项改为ON

              • 不要更改CMAKE_INSTALL_PREFIX参数,会导致python import或者cmake include报错找不到文件

              • 请确保cmake后生成如下图所示的配置

                在这里插入图片描述

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

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

                3、编译

                make -j$(nproc)	#-j$(nproc) 表示使用所有可用的 CPU 核心来并行编译
                
                • 大家此时大概率会发现cpu利用率卡在75%,无法继续提高,使用htop等工具查看,会发现4核cpu却有一个在摸鱼。请直接看问题区的第7点。
                • 这里一定要在开发板上编译,大约需要2小时左右。如果不编译测试案例大约能节省一半的时间
                • 编译到97%后可能会报错Fatal error: Python.h: No such file or directory,实际上这个文件是在的,我尝试过各种方法,不仅没用,还导致从头开始编译。这里我用了一个最简单粗暴的方法,就是把/usr/local/miniconda3/include/python3.9整个文件夹内的东西都复制的到opencv/build文件夹内,完美解决。此处通过sudo apt install python3-dev的方法是无效的

                  4、安装

                  #安装C++库
                  apt list | grep opencv	#看下有没有老版本
                  sudo make uninstall	#先卸载旧的,如果路径一样的话,否则手动删除目录
                  sudo make install	
                  #安装python库
                  pip list | grep opencv					#查看已经按照的opencv
                  pip uninstall opencv-python				#卸载掉老版本
                  pip uninstall opencv-python-headless	#卸载headless版本
                  cd #回到用户跟目录
                  vim .bashrc	#添加下面这个环境变量
                  export PYTHONPATH=/home/HwHiAiUser/opencv-4.9.0/build/python_loader:$PYTHONPATH
                  source .bashrc
                  #或者使用pip安装
                  python3 -m pip install opencv-4.9.0/build/python_loader
                  

                  5、验证安装

                  这里我是验证过的,但是有个坑,导致我被误导了3周

                  新建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 
                  #include 
                  #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 arch} # {arch} for X86 or ARM
                  docker build -t manylinux-builder:v1 .
                  code_path}/pytorch:/home/pytorch manylinux-builder:v1 bash
                  # {code_path} is the torch_npu source code path
                  
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon