AX620A运行yolov5s自训练模型全过程记录(windows)

2023-10-24 00:20

本文主要是介绍AX620A运行yolov5s自训练模型全过程记录(windows),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AX620A运行yolov5s自训练模型全过程记录(windows)

文章目录

  • AX620A运行yolov5s自训练模型全过程记录(windows)
  • 前言
  • 一、搭建模型转换环境(使用GPU加速)
  • 二、转换yolov5自训练模型
  • 三、板上测试


前言

上一篇文章《ubuntu22.04搭建AX620A官方例程开发环境》记录了AX620A开发环境的搭建,这段时间板子终于到手了,尝试了一下怎么跑自己训练的yolov5模型,将整个过程记录一下。

一、搭建模型转换环境(使用GPU加速)

  模型转换工具名称叫做Pulsar工具链,官方提供了docker容器环境。因为我十分懒得装一台ubuntu实体机,所以一切操作都想办法在windows下实现的~~~

  1. 安装Windows平台的Docker-Desktop客户端
    下载地址:点这里
    无脑安装就行了,没有什么特别操作
    安装好后,打开Docker-Desktop,程序会初始化和启动,然后就可以打开cmd输入命令拉取工具链镜像了
docker pull sipeed/pulsar
  1. 下载镜像成功后,应该能在Docker-Desktop的images列表中看到了
    在这里插入图片描述
  2. 原本到这里就可以直接启动容器来转换模型了,不过突然看到工具链是支持gpu加速的,但镜像里面没有安装相应的cuda环境,所以这里就要一番折腾了。
    思路是:安装WSL2——安装ubuntu子系统——子系统内安装nVidia CUDA toolkit——再安装nvidia-docker。这一番操作后,以后在windows cmd下启动的容器(需加上“--gpus all”参数),就都带上完整的cuda环境了。
  • 使用WSL2安装ubuntu20.04
      恕我一直孤陋寡闻,直到这时才知道原来windows下有这么个方便的东西,以前一直只会装虚拟机…
    WSL2具体怎么开启百度一下,反正我的win10更新到最新版本操作没遇到什么问题。

(1) 查看windows平台可支持的linux子系统列表

wsl --list --online
以下是可安装的有效分发的列表。
请使用“wsl --install -d <分发>”安装。NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS

(2) 设置每个安装的发行版默认用WSL2启动

$ wsl --set-default-version 2

(3) 安装Ubuntu20.04

$ wsl --install -d  Ubuntu-20.04

(4) 设置默认子系统为Ubuntu20.04

$ wsl --setdefault Ubuntu-20.04

(5) 查看子系统信息,星号为缺省系统

$ wsl -l -vNAME                   STATE           VERSION
* Ubuntu-20.04           Stopped         2docker-desktop-data    Running         2docker-desktop         Running         2
  • ubuntu22.04下安装cuda
    以下操作均在windows的子系统ubuntu终端输入,逐条执行
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pinsudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-wsl-ubuntu-11-7-local_11.7.0-1_amd64.debsudo dpkg -i cuda-repo-wsl-ubuntu-11-7-local_11.7.0-1_amd64.debsudo cp /var/cuda-repo-wsl-ubuntu-11-7-local/cuda-B81839D3-keyring.gpg /usr/share/keyrings/sudo apt-get updatesudo apt-get -y install cuda
  • ubuntu22.04下安装nvidia-docker
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee 
/etc/apt/sources.list.d/nvidia-docker.listsudo apt-get updatesudo apt-get install -y nvidia-docker2

至此,cuda的相关环境就安装好了,可以在ubuntu的终端下输入:nvidia-smi确认显卡是否有识别到

  • 启动容器
    在windows的cmd终端中,输入以下命令来启动pulsar容器
docker run -it --net host  --gpus all --shm-size 12g -v D:\ax620_data:/data sipeed/pulsar --name ax620

其中:
--gpus all要加上,容器才能使用gpu。
--shm-size 12g 指定容器使用内存,根据你实际内存大小来确定。我这个数值转换yolov5s的模型没有问题。
--name ax620指定容器名称,以后在cmd下输入:docker start ax620 && docker attach ax620就可以方便进入容器环境内。
D:\ax620_data:/data 将本地硬盘指定路径映射到容器的/data目录。这个文件夹需要存放模型转换用到的工程,可以到这里下载

二、转换yolov5自训练模型

  1. yolov5使用的是最新的V6.2版,按照标准流程训练出来pt模型文件后,使用export.py导出为onnx格式
python export.py --weights yourModel.pt --simplify --include onnx
  1. 要将onnx三个输出层的后处理去掉,因为这部分的处理将在ax620程序里面实现处理。可参考这位大哥的文章《爱芯元智AX620A部署yolov5 6.0模型实录》。具体处理的python代码如下:
import onnxinput_path = r"D:\ax620_data\model\yourModel.onnx"
output_path = r"D:\ax620_data\model\yourModel_rip.onnx"
input_names = ["images"]
output_names = ["onnx::Reshape_326","onnx::Reshape_364","onnx::Reshape_402"]onnx.utils.extract_model(input_path, output_path, input_names, output_names)

注意这里的三个层的名称Reshape_326Reshape_364Reshape_402可能和你的模型里面是不一样的,具体使用netron工具来确认。得到了以下结尾的模型。注:我这里最后的一个输出形状是1x18x20x20,因为我的模型只有一个识别种类(4+1+1)* 3 = 18
在这里插入图片描述

  1. 去到pulsar容器环境进行模型转换,onnx->joint,输入
pulsar build --input model/yourModel_rip.onnx --output model/yourModel.joint --config config/yolov5s.prototxt --output_config config/output_config.prototxt

其中:

  • yolov5s.prototxt这个配置文件需要到爱芯元智的百度网盘下载:到这里下载
  • 随机选取1000张你训练集的图片,打包成coco_1000.tar,放到容器/data/dataset目录内,作为量化校准用
    模型转换比较慢。即使用到了gpu加速,也需要好几分钟。最后将在容器的/data/model目录下生成你的joint模型文件
  1. 模型仿真与对分。测试模型转换后与原来onnx的精度差别。可以看出三个输出的余弦相似度都很高,精度误差很小。
pulsar run model/yourModel_rip.onnx  model/yourModel.joint --input images/test.jpg --config config/output_config.prototxt--output_gt gt/...(运行过程省略)
[<frozen super_pulsar.func_wrappers.pulsar_run.compare>:82] Score compare table:
------------------------  ----------------  ------------------
Layer: onnx::Reshape_326  2-norm RE: 4.08%  cosine-sim: 0.9994
Layer: onnx::Reshape_364  2-norm RE: 4.49%  cosine-sim: 0.9991
Layer: onnx::Reshape_402  2-norm RE: 6.77%  cosine-sim: 0.9981
------------------------  ----------------  ------------------

三、板上测试

  1. 通过AXERA-TECH/ax-samples 仓库构建自己的测试程序。
    因为是自训练模型,我的模型只有1个类别,官方的yolov5测试程序是使用coco数据集的80分类的,需要做一点调整。
  • 在examples目录下,复制ax_yolov5s_steps.cc另存为ax_yolov5s_my.cc
  • 修改ax-samples/examples/base/detection.hpp,新增一个generate_proposals_n函数,cls_num就是模型类别数
static void generate_proposals_n(int cls_num, int stride, const float* feat, float prob_threshold, std::vector<Object>& objects,int letterbox_cols, int letterbox_rows, const float* anchors, float prob_threshold_unsigmoid){int anchor_num = 3;int feat_w = letterbox_cols / stride;int feat_h = letterbox_rows / stride;// int cls_num = 80;int anchor_group;if (stride == 8)anchor_group = 1;if (stride == 16)anchor_group = 2;if (stride == 32)anchor_group = 3;auto feature_ptr = feat;for (int h = 0; h <= feat_h - 1; h++){for (int w = 0; w <= feat_w - 1; w++){for (int a = 0; a <= anchor_num - 1; a++){if (feature_ptr[4] < prob_threshold_unsigmoid){feature_ptr += (cls_num + 5);continue;}//process cls scoreint class_index = 0;float class_score = -FLT_MAX;for (int s = 0; s <= cls_num - 1; s++){float score = feature_ptr[s + 5];if (score > class_score){class_index = s;class_score = score;}}//process box scorefloat box_score = feature_ptr[4];float final_score = sigmoid(box_score) * sigmoid(class_score);if (final_score >= prob_threshold){float dx = sigmoid(feature_ptr[0]);float dy = sigmoid(feature_ptr[1]);float dw = sigmoid(feature_ptr[2]);float dh = sigmoid(feature_ptr[3]);float pred_cx = (dx * 2.0f - 0.5f + w) * stride;float pred_cy = (dy * 2.0f - 0.5f + h) * stride;float anchor_w = anchors[(anchor_group - 1) * 6 + a * 2 + 0];float anchor_h = anchors[(anchor_group - 1) * 6 + a * 2 + 1];float pred_w = dw * dw * 4.0f * anchor_w;float pred_h = dh * dh * 4.0f * anchor_h;float x0 = pred_cx - pred_w * 0.5f;float y0 = pred_cy - pred_h * 0.5f;float x1 = pred_cx + pred_w * 0.5f;float y1 = pred_cy + pred_h * 0.5f;Object obj;obj.rect.x = x0;obj.rect.y = y0;obj.rect.width = x1 - x0;obj.rect.height = y1 - y0;obj.label = class_index;obj.prob = final_score;objects.push_back(obj);}feature_ptr += (cls_num + 5);}}}}
  • 修改ax_yolov5s_my.cc
44const char* CLASS_NAMES[] = {"piggy"};		//修改模型类别名称252for (uint32_t i = 0; i < io_info->nOutputSize; ++i){auto& output = io_info->pOutputs[i];auto& info = joint_io_arr.pOutputs[i];auto ptr = (float*)info.pVirAddr;int32_t stride = (1 << i) * 8;// det::generate_proposals_255(stride, ptr, PROB_THRESHOLD, proposals, input_w, input_h, ANCHORS, prob_threshold_unsigmoid);// 使用新的generate_proposals_n对预测框进行解码det::generate_proposals_n(1, stride, ptr, PROB_THRESHOLD, proposals, input_w, input_h, ANCHORS, prob_threshold_unsigmoid);}
  • 修改ax-samples/examples/CMakeLists.txt文件,在101行下新增
101axera_example (ax_crnn                  ax_crnn_steps.cc)axera_example (ax_yolov5_my             ax_yolov5s_my.cc)		//增加编译源文件
else() # ax630a supportaxera_example (ax_classification        ax_classification_steps.cc)axera_example (ax_yolov5s               ax_yolov5s_steps.cc)axera_example (ax_yolo_fastest          ax_yolo_fastest_steps.cc)axera_example (ax_yolov3                ax_yolov3_steps.cc)
endif()
  • 对工程进行交叉编译或者板上直接编译,生成ax_yolov5_my可执行程序文件
  1. 将程序和joint模型文件拷到板上同一目录内,执行:
 ./ax_yolov5_my -m yourModel.joint -i /home/images/test.jpg--------------------------------------
[INFO]: Virtual npu mode is 1_1Tools version: 0.6.1.14
4111370
run over: output len 3
--------------------------------------
Create handle took 470.84 ms (neu 21.46 ms, axe 0.00 ms, overhead 449.38 ms)
--------------------------------------
Repeat 1 times, avg time 25.28 ms, max_time 25.28 ms, min_time 25.28 ms
--------------------------------------
detection num: 60:  97%, [ 198,   97,  437,  328], piggy0:  96%, [  35,  190,  260,  377], piggy0:  95%, [ 575,  166,  811,  478], piggy0:  93%, [ 526,   47,  630,  228], piggy0:  91%, [ 191,   55,  301,  197], piggy0:  76%, [   0,  223,   57,  324], piggy
[AX_SYS_LOG] Waiting thread(2971660832) to exit
[AX_SYS_LOG] AX_Log2ConsoleRoutine terminated!!!
exit[AX_SYS_LOG] join thread(2971660832) ret:0

在这里插入图片描述
可以看到,即使此时分了一半算力给isp,yolov5s单张图片的推理时间可以去到25ms,那是相当给力了!

这篇关于AX620A运行yolov5s自训练模型全过程记录(windows)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271421

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者