黑芝麻A1000-Ubuntu20.04(九)yolov5从训练到板端运行过程详解

宿主机:台式电脑 Ubuntu20.04
开发板:A1000(烧录版本SDK v2.3.1.2)
模型转换容器:bsnn-tools-container-stk-4.2.0
编译容器:a1000b-sdk-fad-2.3.1.2
yolov5使用工程:黑芝麻根据https://github.com/ultralytics/yolov5修改后的yolov5 float工程(yolov5 float可从黑芝麻资料网站下载)

一、yolov5训练 onnx转换 测试验证

黑芝麻A1000目前只支持浮点型训练的模型,且使用Relu在A1000上运行效率更高,所以yolov5 float中的bst_yolov5工程基于https://github.com/ultralytics/yolov5基础,已经修改了训练方式和激活函数,并且添加了opt优化。具体修改细节自行对比。

1.训练数据集

bst_yolov5/yolov5/datasets路径中已有coco128数据集
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.环境配置

参考requirements.txt。我用的还是之前配置好的conda yolov8环境,额外安装了IPython、onnx相关库(采用清华源加快下载安装):

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple IPython
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorboard
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple onnx
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple onnx-simplifier
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple onnx2torch
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple onnxruntime

在这里插入图片描述

3.模型训练

在这里插入图片描述

coco128.yaml在data中,我复制了出来,修改coco128.yaml中相关路径。进入终端输入指令:

python train.py --data coco128.yaml --weights yolov5m.pt --img 640 --epochs 300

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述将weights中的best.pt拷贝到bst_yolov5/yolov5中,并重命名yolov5m_relu_0921.pt

注意
如果这里训练出现AttributeError: 'FreeTypeFont' object has no attribute 'getsize'报错,是因为新版本的 Pillow删除了该getsize 功能,降级到 Pillow 9.5 就可以解决该问题。直接输入指令安装即可:

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple Pillow==9.5

4.onnx转换

转换程序与https://github.com/ultralytics/yolov5中的export.py有所改动,具体请自行对比。
运行指令:

python export.py --weights yolov5m_relu_0921.pt --include=onnx

在这里插入图片描述在这里插入图片描述

5.验证测试onnx

1)验证
输入指令:

python val.py --weights yolov5m_relu_0921.onnx --data coco128.yaml --img 640

结果:
在这里插入图片描述

2)测试
输入指令:

python detect.py --weights yolov5m_relu_0921.onnx --source test.jpg

在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、toolchain 模型转换及量化测试

1.准备toolchain工具模型转换所需文件

1)inputs_jpg
在这里插入图片描述

2)image_process_config.json

{"source_image_format": "RGB","target_image_format": "RGB","mean": [0,0,0],"scale": [0.00390625,0.00390625,0.00390625]
}

3)run.yaml

# Target engine must be set.
device_engine: A1000B0 
# Tag your mode name.
model_name: yolov5s_relu_20240918
# Path to your float onnx model.
model_path: /workspace/models/yolov5_bstnnx/yolov5m_relu_0921.onnx
# Folder of calibration data.
input_data_set_path: /workspace/models/yolov5_bstnnx/inputs_jpg
# Setup data reader.
data_reader_method: image_folder_data_reader
# How to calculate "scale" and "mean" in image_process_config, let's assume X' = (X-mean)/std  
# mean = mean; scale = np.floor(std/2**-12 + 0.5) * 2**-12 -> std=1/255 -> scale = 0.00390625
image_process_config: /workspace/models/yolov5_bstnnx/image_process_config.json
# Number of calibration data used in quantization.
size_limit: 500
# Enable auto_ptq
auto_ptq: /workspace/models/yolov5_bstnnx/task_info_for_autoptq.yaml
# Setup result_dir
result_dir: auto_ptq_092101
# Setup priority range
priority_range: 100-1200# General stage settings
stage:- stage_name: pre_processing_stagepriority: 100- stage_name: graph_optimization_stagepriority: 200- stage_name: quantization_stagepriority: 300- stage_name: graph_partition_stagepriority: 400- stage_name: section_binding_stagepriority: 500- stage_name: code_generation_stagepriority: 600- stage_name: code_compilation_stagepriority: 700- stage_name: run_emulation_stageprofiling_mode: 2priority: 800- stage_name: hardware_testing_stageXTSC_NET_SIM: Truegenerate_rbf_only: Truepriority: 1100- stage_name: report_generation_stagepriority: 1200- stage_name: userland_stagepriority: 1500

4)task_info_for_autoptq.yaml

task_settings:quantization_method: ["weight_perchannel_kl"]convert_int8conv_to_int16: [[]]# convert_int8conv_to_int16: [[], ["/model.24/m.0/Conv", "/model.24/m.1/Conv", "/model.24/m.2/Conv"]] unadjustable_activations_last_n: [-1, 0, 1]calibration_method: ["minmax", "kl", "percentile_0.999"]# calibration_method: ["minmax", "kl", "percentile_0.999", "percentile_0.998", "percentile_0.997", "percentile_0.996", "percentile_0.995"]auto_update: false # default to False, # if set to True it will align the current task_order # with current task_settings and append the new tasks # to the queue of task orders.# task_order_schema:
# ["index", quantization_method", "convert_int8conv_to_int16",
# "unadjustable_activations_last_n", "calibration_method"]

5)yolov5m_relu_0921.onnx
全部存放在新建的yolov5_bstnnx文件夹中
在这里插入图片描述

2.从宿主机将yolov5_bstnnx拷贝到模型转换容器

运行bsnn-tools-container-stk-4.2.0容器,将yolov5_bstnnx拷贝到bsnn-tools-container-stk-4.2.0容器中:

docker cp /home/stk/bst_yolov5/yolov5_bstnnx bsnn-tools-container-stk-4.2.0:/workspace/models/

在这里插入图片描述

登陆容器的jupyter,yolov5_bstnnx已在路径中
在这里插入图片描述在这里插入图片描述注意修改run.yaml里面的相关路径。

3.进行模型转换

在容器中运行指令:

bstnnx_run --config models/yolov5_bstnnx/run.yaml

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

将结果/workspace/auto_ptq_0921/1100_HardwareTestingStage/yolov5s_relu_20240918.20240921032730.hw_test_config拷贝到宿主机/home/stk/heizhima路径中:

docker cp bsnn-tools-container-stk-4.2.0:/workspace/auto_ptq_092101/1100_HardwareTestingStage/yolov5s_relu_20240918.20240921032730.hw_test_config /home/stk/heizhima/

在这里插入图片描述

4.板端模型量化测试

启动开发板,将yolov5s_relu_20240918.20240921032730.hw_test_config从宿主机拷贝到开发板:

adb push /home/stk/heizhima/yolov5s_relu_20240918.20240921032730.hw_test_config /home/root

在这里插入图片描述
在板端运行:

cd /home/root/yolov5s_relu_20240918.20240921032730.hw_test_config
./run_dsp.sh

在这里插入图片描述在这里插入图片描述
测试通过。

三、基于转换后的模型文件,创建编译cmake工程

1.首先查看黑芝麻给的cmake工程demo

从黑芝麻资料网站中BSNN工具链项目模块,下载 Demos示例代码 / yolov5 / linux_yolov5_demo 中的yolov5_demo_opencv,其目录如下:
在这里插入图片描述其中:
1)3rdpartyusr两个文件夹是bst-bsnn相关库文件等;
2)yolov5model是通过toolchain转换后1100_HardwareTestingStage 后缀.hw_test_config中 得到的weights.bin、.meta、.lib三个文件;
3)src中就是检测程序;
4)start_yolov5m.sh是后面在开发板上运行用到的运行脚本。

2.创建自己的cmake工程

新建一个yolov5demo文件夹,将demo中的3rdpartyusrsrcCMakeLists.txt直接拷贝进来,并新建一个yolov5s_model文件夹:
在这里插入图片描述将前面yolov5s_relu_20240918.20240921032730.hw_test_config中weights.bin,及fw_integration中.meta、.lib文件
在这里插入图片描述在这里插入图片描述

拷贝到cmake工程yolov5demo/yolov5s_model中并重命名:
在这里插入图片描述

3.修改自己的cmake工程

可以根据自己的需求修改CMakeLists.txt、src中的代码。
这里我就微微修改了CMakeLists.txt:
在这里插入图片描述修改src/main.cpp,因为我没有接显示器,所以注释了cv显示部分,增加检测结果图片保存:


#include <iostream>
#include <opencv2/opencv.hpp>
#include "bsnn_model_load.h"
#include "drmshow.h"
#include "image_process.h"
#include <string.h>using namespace std;int main(int argc, char* argv[])
{// std::string in_image_path = "./000000000139.jpg";std::string in_image_path = "./fad_video.avi";std::string bsnn_model_path = "./model";    cv::Mat img, input_image;// asic_type_check();if(2 <= argc) {in_image_path = argv[1];}if(3 <= argc) {bsnn_model_path = argv[2];}cv::VideoCapture capture(in_image_path);BSNN_MODEL bsnn_model(bsnn_model_path);Timer time, fps;while (true){// step 1 图片预处理capture >> img;if(img.empty()){printf("img.empty = %d\n",img.empty());capture.release();capture.open(in_image_path);continue;}time.reset();fps.reset();preprocess(img, input_image);size_t input_img_len = 3 * IMG_HEIGHT * IMG_WIDTH;// 更改图片在内存中的存储方式为WHDif (!input_image.isContinuous())printf("-> input image is not continuous in memory...");uchar input_buf[input_img_len] = {0};for (int c = 0; c < 3; c++){for (int i = 0; i < IMG_HEIGHT; i++){for (int j = 0; j < IMG_WIDTH; j++){input_buf[c * IMG_HEIGHT * IMG_WIDTH + i * IMG_WIDTH + j] = input_image.data[3 * (i * IMG_WIDTH + j) + c];}}}cout << "-> preprocess time : " << time.elapsed() << endl;// step 2 模型推理time.reset();bsnn_model.Run(input_buf, input_img_len);auto bsnn_output = bsnn_model.GetModelOutput();printf("-> lite engine inference FPS: %.2f\n", 1.0 / time.elapsed() * 1000);cout << "-> bsnn model inference time : " << time.elapsed() << endl;// step 3 后处理time.reset();std::vector<ObjInfo> result;process_output(bsnn_output.get(), result);//cout << "-> The number of objects detected: " << result.size() << endl;cout << "-> post process time : " << time.elapsed() << endl;draw_bboxes(img, result);cv::imwrite("./inferresult.jpg",img);bsnn_model.ReleaseOutputBuffer();// printf("-> full flow FPS: %.2f\n", 1.0 / fps.elapsed() * 1000);cv::Mat show_img;cv::resize(img, show_img, cv::Size(1920, 1080));//cv::imshow("img", show_img);//cv::waitKey(1);}return 0;
}

4.编译工程

1)拷贝
关闭模型转换容器,启动a1000b-sdk-fad-2.3.1.2容器,将yolov5demo拷贝到容器中:

docker cp yolov5demo a1000b-sdk-fad-2.3.1.2:opt/bstos/2.3.1.2/sysroots/aarch64-bst-linux/usr/include/src

在这里插入图片描述
此时容器中,有了yolov5demo:

cd /opt/bstos/2.3.1.2/sysroots/aarch64-bst-linux/usr/include/src
ls  #查看目录中是否有yolov5demo

在这里插入图片描述在这里插入图片描述
2)编译
容器中编译:

cd yolov5demo
mkdir build
cd build
cmake ..
make

在这里插入图片描述

四、开发板运行

1.将编译好的yolov5demo从容器拷贝到宿主机

将编译好的yolov5demo从容器拷贝到宿主机

docker cp a1000b-sdk-fad-2.3.1.2:opt/bstos/2.3.1.2/sysroots/aarch64-bst-linux/usr/include/src/yolov5demo /home/stk/heizhima

在这里插入图片描述在这里插入图片描述

2.整合运行文件

在yolov5demo中新建yolov5demo_run文件夹,在其中:

1)创建app文件夹

将yolov5demo的build文件夹中可执行文件yolov5s拷贝到app中:
在这里插入图片描述

2)创建yolov5s文件夹

将yolov5demo的yolov5s_model文件夹中三个文件,拷贝到yolov5s文件夹中:
在这里插入图片描述在这里插入图片描述

3)创建datasets文件夹

该文件夹内存放运行用的检测图片或者视频,这里我存放了一些图片和视频:
在这里插入图片描述

4)根据需求是否创建保存检测结果的文件夹

在yolov5demo/src/main.cpp中,我直接将检测后的图片保存在当前运行目录路径,无需创建。

5)创建运行脚本文件

创建start_yolov5s.sh,内容,其中前四行是黑芝麻给的:

#!/bin/sh
mkdir -p /run/user/1000
export XDG_RUNTIME_DIR="/run/user/1000"echo 0 > /sys/devices/platform/vsp@1/enable && weston --tty=1 &./app/yolov5s ./datasets/fad_quick_start_video_01.avi ./yolov5s

最终,yolov5demo_run文件夹:
在这里插入图片描述

3.运行

1) yolov5demo中usr/lib64 文件夹下的文件cp到开发板 usr/lib/文件夹下

adb push libbsnn.so /usr/lib/
adb push libbsnn.so.3 /usr/lib/
adb push libbsnn.so.3 /usr/lib/

在这里插入图片描述

2)将yolov5demo_run文件夹从宿主机拷贝到开发板上:

adb push /home/stk/heizhima/yolov5demo/yolov5demo_run /userdata

在这里插入图片描述
3)运行

cd /userdata/yolov5demo_run
chmod +x start_yolov5s.sh
./start_yolov5s.sh

在这里插入图片描述在这里插入图片描述

运行过程中,随机时间拷贝结果到宿主机查看:

adb pull /userdata/yolov5demo_run/inferresult.jpg /home/stk/heizhima

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

高性能分布式搜索引擎Elasticsearch详解

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

[vulnhub] Jarbas-Jenkins

靶机链接 https://www.vulnhub.com/entry/jarbas-1,232/ 主机发现端口扫描 扫描网段存活主机&#xff0c;因为主机是我最后添加的&#xff0c;所以靶机地址是135的 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-21 14:03 CST Nmap scan…

【Linux】Linux基本命令

目录 文件和目录操作&#xff1a; ls cd pwd cp mv rm mkdir rmdir touch clear history which/whereis 文件查看和编辑&#xff1a; cat less head tail vi 或 vim sz/rz echo 系统信息和管理&#xff1a; su uname hostname df free top ps ki…

2025台球展,2025河南台球及配套设施展览会3月举办

阳春三月&#xff0c;年度招商季&#xff0c;壹肆柒中国国际台球产业博览会助力全国台球企业拓市场&#xff1b; 2025中国&#xff08;郑州&#xff09;国际台球产业博览会&#xff08;壹肆柒台球展&#xff09; The 2025 China (Zhengzhou) International Billiards Industry…

C++:采用模板封装顺序表,栈,队列

1.顺序表&#xff1a; list.hpp #ifndef LIST_HPP #define LIST_HPP #include <iostream>using namespace std;template <class L>class Seqlist { private:L *ptr;L size;L len0;public:void init(L n){//堆区申请空间&#xff08;大小为n&#xff09;this->…

博主回归!数据结构篇启动

目录 1>>闲话 2>>数据结构前言 3>>复杂度的概念 4>>时间复杂度 5>>大O渐进表示法 6>>总结 1>>闲话 家人们好久不见&#xff0c;小编军训终于是结束了&#xff0c;大一事情太多了&#xff0c;这几天没时间健身&#xff0c;没时间…

2024.9.26 作业 +思维导图

一、作业 1、什么是虚函数&#xff1f;什么是纯虚函数 虚函数&#xff1a;函数前加关键字virtual&#xff0c;就定义为虚函数&#xff0c;虚函数能够被子类中相同函数名的函数重写 纯虚函数&#xff1a;把虚函数的函数体去掉然后加0&#xff1b;就能定义出一个纯虚函数。 2、基…

el-table+el-form实现表单校验和解决不垂直居中导致的问题

el-tableel-form实现表单校验 1.实现el-table的表单校验 关键点123 2.解决不垂直居中导致的问题 问题效果图 解决方案 .item-align-center {display: inline-flex; }

数据定义语言CREATE的应用

新书速览|SQL Server 2022从入门到精通&#xff1a;视频教学超值版_sql server 2022 出版社-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) SQL Se…

IGZO基底无电容DRAM单元前景看好

1.DRAM技术简介 DRAM&#xff08;Dynamic Random Access Memory&#xff0c;动态随机存取存储器&#xff09;是一种用于计算机和其他电子设备中的主存储器类型&#xff0c;其主要由存储单元阵列构成&#xff0c;而每一个存储单元由一个电容器和一个晶体管组成&#xff0c;如图…

EasyAR自定义相机RTSP视频流(CustomCamera)

EasyAR可以使用视频源作为输入源&#xff0c;官方给出了示例和文档&#xff0c;但是对于大部分Unity开发人员来说看了文档还是一头雾水。 在Android Studio中将custom-camera.jar添加libs中&#xff0c;就可以查看源代码了 分析其源代码&#xff0c;主要是ExternalCameraSampl…

AI数字人直播爆火,数字人虚拟主播成品牌闲时直播最佳选择!

近年来&#xff0c;随着互联网的普及和发展&#xff0c;电商和直播平台在我国迅速崛起。根据中国网络信息中心的数据显示&#xff0c;我国直播用户7.5亿&#xff0c;使用率已经超过70%&#xff0c;直播已经成为企业重要的营销和销售通道。 一、在经历了几年的爆发式增长后&…

日期类的实现- 计算日期之间相差多少天-解决单参数构造

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 这里有坑&#xff0c;这里有坑&#xff0c;这里有坑 首选我们直接上代码&#xff0c;因…

Unity场景内画车道线(根据五阶曲线系数)

之前做过使用Dreamteck Splines插件构建车道线之前需求是给定车道线的点位&#xff0c;根据点位来进行构建。 由于AI识别出来的点位不线性&#xff0c;画出来的车道线经常是歪七扭八&#xff0c;所以使用五阶曲线系数进行构建。 使用在线图形计算器进行测试构建&#xff0c;公式…

【C++】STL标准模板库容器set

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;关联式容器set(集合)简介 &#x1f4cc;set(集合)的使用 &#x1f38f;set(集合)的模板参数列表 &#x1f38f;set(集合)的构造函数 &#x1f38f;set(集合)的迭代…

Vue 项目实战4-无缝轮播图

养成好习惯&#xff0c;先赞后看&#xff0c;感谢对作者大大的支持 一、话不多说&#xff0c;直接上效果图&#xff1a; 完整视频展示链接如下&#xff1a; https://item.taobao.com/item.htm?ftt&id833405684191 二、实现思路 HTML结构 文档头部设置&#xff1a;定义…

C# 委托(Delegate)二

一.委托的多播&#xff08;Multicasting of a Delegate&#xff09;&#xff1a; 委托对象&#xff0c;使用 "" 运算符进行合并&#xff0c;一个合并委托调用它所合并的两个委托。使用"-" 运算符从合并的委托中移除组件委托。 注&#xff1a;只有相同类型…

C语言编译和链接详解(通俗易懂,深入本质)

我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序(Executable Program)。在 Windows 下,可执行程序的后缀有.exe和.com(其中.exe比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判…

小小扑克牌算法

1.定义一个扑克牌类Card&#xff1a; package democard; public class Card {public String suit;//表示花色public int rank;//表示牌点数Overridepublic String toString() {return "{"suit rank"}";}//实例方法&#xff0c;初始化牌的点数和花色public…

Redis篇(初识Redis)

目录 一、数据库 二、NoSQL 三、认识Redis 三、关系数据库与非关系数据库对比 1. 结构化与非结构化 2. 关联和非关联 3. 查询方式 4. 事务 5. 存储方式 6. 扩展性 7. 总结 7.1. 图形梳理 7.2. 表格梳理 7.3. 优缺点 关系型数据库 非关系型数据库 四、再次认识R…