黑芝麻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.xdnf.cn/news/1544267.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

PHP探索校园新生态校园帮小程序系统小程序源码

探索校园新生态 —— 校园帮小程序系统&#xff0c;让生活更精彩&#xff01; &#x1f331;【开篇&#xff1a;走进未来校园&#xff0c;遇见新生态】&#x1f331; 你是否厌倦了传统校园的繁琐与单调&#xff1f;是否渴望在校园里也能享受到便捷、智能的生活体验&#xff1…

3d可视化图片:通过原图和深度图实现

1、depthy 在线体验demo: https://depthy.stamina.pl/#/ 也可以docker安装上面服务: docker run --rm -t -i -p 9000:9000 ndahlquist/depthy http://localhost:90001)首先传原图 2)再传对应深度图 3)效果 </ifra

网络事件管理

网络事件管理是运行组织 IT 网络不可或缺的一部分&#xff0c;网络事件管理的最终目标很简单&#xff1a;在发生中断时尽快恢复服务或功能。但是为了高效和一致地进行&#xff0c;IT 运营团队需要时刻保持警惕&#xff0c;不断了解网络事件&#xff0c;并且必须系统地遵循一套程…

opencv4.5.5 GPU版本编译

一、安装环境 1、opencv4.5.5 下载地址&#xff1a;https://github.com/opencv/opencv/archive/refs/tags/4.5.5.ziphttps://gitee.com/mirrors/opencv/tree/4.5.0 2、opencv-contrib4.5.5 下载地址&#xff1a;https://github.com/opencv/opencv_contrib/archive/refs/tags/4…

ToB项目身份认证AD集成(二):一分钟搞定window server 2003部署AD域服务并支持ssl加密(多图保姆教程+证书脚本)

在ToB的应用开发中&#xff0c;往往需要集成AD域控实现身份认证&#xff0c;同时也算是近期工作的总结&#xff0c;之前已介绍了基础的AD、Ldap&#xff0c;本文主要介绍如何大家一个本地的测试环境。 相关系列&#xff1a; ToB项目身份认证AD集成&#xff08;一&#xff09;&a…

【JavaSE】-- 类和对象(1)

文章目录 1. 面向对象的初步认知1.1 什么是面向对象1.2 面向对象与面向过程 2. 类的定义和使用2.1 简单认识类2.2 类的定义格式 3. 类的实例化3.1 什么是实例化3.2 类和对象的说明 4. this引用4.1 为什么要有this引用4.2 什么是this引用4.3 this引用的特性 5. 对象的构造及初始…

增强GPT4v的Grounding能力,video-level

开源链接&#xff1a; appletea233/AL-Ref-SAM2: AL-Ref-SAM 2: Unleashing the Temporal-Spatial Reasoning Capacity of GPT for Training-Free Audio and Language Referenced Video Object Segmentation (github.com) In this project, we propose an Audio-Language-Refe…

Spring Boot中实现一个递归获取省市区行政区划代码

Spring Boot中实现一个递归获取省市区行政区划代码 写于20240924 10:23 在Spring Boot中实现一个递归获取省市区行政区划代码的功能&#xff0c;可以按照以下步骤进行。我们将使用Spring Data JPA来与数据库交互&#xff0c;并构建一个递归的方法来获取层级数据。 首先这里数据…

11周年 | 初心不改,焕新前行,奔赴下一个10年!

2024年8月13日&#xff0c;爱加密正式迎来了11岁生日&#xff0c;在爱加密肩负着崇高使命踏浪而行的10年间&#xff0c;蓝绿色的品牌标识一直伴于左右。随着时代的变迁以及市场需求的不断变化&#xff0c;企业同样也需要在品牌上做出创新递进&#xff0c;从而更加适应市场竞争的…

数据科学的秘密武器:defaultdict——Python字典的自动化填充神器,让数据结构更灵活

目录 什么是defaultdict 引入动机 创建与初始化 工作原理 自定义默认值函数 注意事项 使用案例 使用场景 1: 计数 使用场景 2: 分组数据 使用场景 3: 嵌套字典结构 进阶案例使用 进阶案例 1: 使用 defaultdict 实现词频统计并排序 进阶案例 2: 使用 defaultdict 实…

OpenCSG推出StarShip SecScan:AI驱动的软件安全革新

OpenCSG 导读 如今&#xff0c;IT 技术迅速发展&#xff0c;软件安全不仅是企业稳健运营的基础&#xff0c;更是整个社会经济体系安全的保障。加强软件安全&#xff0c;尤其是在开发阶段识别和修补漏洞&#xff0c;是企业必须重视的问题。国际数据公司&#xff08;IDC&#xf…

MyBatis 入门教程-搭建入门工程

Maven作为一个优秀的项目构建和管理工具,在日常的开发中被大多数开发者使用,后续的项目也是基于Maven来构建。 创建一个Maven项目 利用IDEA创建项目工具来创建一个Maven项目 添加MyBatis的依赖 这里可以从Maven仓库地址中进行查看, https://mvnrepository.com/ 从这里可…

反汇编—switch

x64和x86分析类似 标号1的位置要计算出&#xff1a;减去(debug) / 加上(release)第一个case要等于0&#xff0c;因为第一个case在跳转表数组的0下标位置 通过1和2&#xff0c;可以知道它们应该是连续case&#xff0c;还要判断是否缺项&#xff0c;进入跳转表看 可以看到原本应…

经济型伺服电缸EMB系列

经济型伺服电缸系列特点 小型电缸&#xff0c;推力范围:5kg-1500kg 精巧设计 所有部件模块化组合&#xff0c;标准化&#xff0c;经济化 轧制滚珠丝杠&#xff0c;高效率&#xff0c;高速度 匹配经济型步进伺服电机驱动器一体化&#xff0c;可总线 can&#xff0c;erthercat等&…

NAS求变,“0成本、低门槛”的鲁大师能否脱颖而出?

互联网科技的高速发展&#xff0c;推动了全球信息爆炸的进程。如何高效地存储和使用这些海量数据成了困扰企业、乃至个人的一大难题。从U盘、到移动硬盘、再到各种网云盘、以及愈发大众化的NAS……存储解决方案也随着个人及家庭数据存储需求的不断增长而发展着。如今&#xff0…

shardingjdbc-读写分离配置

文章目录 1、application.yml2、shardingsphere.yaml3、创建实体类 User4、创建 UserMapper5、添加依赖6、读写分离测试7、事务测试 我们的主从复制已经提前搭建好&#xff1a; mysql-搭建主从复制&#xff1a;https://blog.csdn.net/m0_65152767/article/details/142214434 1…

AI最大的应用是什么,如何成为初代AGI产品经理?

❝ 在当今这个由数据驱动的时代&#xff0c;AI技术正以前所未有的速度发展&#xff0c;它不仅改变了我们与数字世界的互动方式&#xff0c;更在物理世界中掀起了一场革命。阿里巴巴集团CEO吴泳铭在2024云栖大会上的演讲&#xff0c;为我们描绘了AI技术未来的巨大潜力。他指出&a…

华为云长江鲲鹏深度赋能,大势智慧稳居“实景三维+AI”领域排头兵

本文转自长江日报大武汉客户端 走出象牙塔第10年&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;已成长为国内三维技术创新及应用领域龙头企业&#xff0c;其自主研发的“重建大师”等三维测绘软件系统在各级测绘系统占有率达到87.5%。 这…

奇迹再现!帕金森患者6年后停药,竟能自如行走:背后的故事与启示

在医学的浩瀚星空中&#xff0c;总有一些故事如同璀璨星辰&#xff0c;照亮着患者与家属的希望之路。今天&#xff0c;我们要讲述的&#xff0c;就是一位与帕金森病抗争了6年之久的患者&#xff0c;如何在看似不可能的境遇下&#xff0c;实现了停药后自如行走的奇迹。这不仅是对…

前端——元素类型+文字样式

一、元素类型 1. 块级元素 >块级标签: div p h1~h6 ul ol li dl dt dd hr br等 还有表格标签 table 特征: 1.独占一行 不会共享一行的位置 2.不设置宽度 默认是继承父级宽度 100% 结构上没有父级那就是浏览器 3.高度不设置 默认由内容撑开 4.可…