yolov5 应用整理

news/2024/7/10 1:56:47 标签: YOLO, 目标检测, 计算机视觉, 物联网, arm开发

yolov5 应用整理

适用于0基础人员与有一定yolov5了解的人员食用.

关于yolov5参考:

yolov5 github源码链接
目前参与过yolov5的应用:

平台
x86/arm cpuncnn
x86libtorch/pytorch
BM1684算能标准库(需要进行模型转换)
昇腾cann(ascend api)

https://gitee.com/Tencent/ncnn
https://github.com/alibaba/MNN

图像解码的延申

在所有嵌入式CPU平台进行图像的解码后都会有宽和高的对其,一般16|64位对其处理.
所有的硬件解码后的格式几乎都是NV12格式.
参考: ffmpeg的功能:

#include <libavutil/macros.h>
#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))

FFALIGN(1080, 16)  #进行16位对其

笔者经历过的设备:

  • 瑞芯微RK3399: mpp编解码时宽和高的对其均为stride=16, 使用时需要硬件的rga功能进行缩放,截图,转换格式处理, 即: MppFrame,
    https://github.com/rockchip-linux/mpp
    rk系列芯片解码图片帧

前处理

batch:数量
channel:通道
height, width: 高宽
常见输入格式 BCHW, BHWC
而数据类型有: int8, float, float16,每个数据类型有不同的内存占用情况,libtorch时需要进行转换

#rgb颜色改变, FP32数据
cv::cvtColor(img_input, img_input, cv::COLOR_BGR2RGB);  // BGR -> RGB
img_input.convertTo(img_input, CV_32FC3, 1.0f / 255.0f);  // normalization 1/255

#BHWC转BCHW格式转换
tensor_img = tensor_img.permute({ 0, 3, 1, 2 }).contiguous();  // BHWC -> BCHW (Batch, Channel, Height, Width)

后处理数据

可以用 netron 去查看模型信息

如得到yolov5模型的输出为: float32[1,25200,85]
一个yolov5 onnx模型输出
如何得到目标的坐标呢? 可以理解为一个三维数组 out[1][25200][85]
25200: 有25200个目标,需要进行过滤处理.
85: [0] [1]为中心点xy坐标;
[2] [3] 为wh;
[4]为置信度,
后面的80个为80个分类的置信度,取最大值的位置为分类目标, 值*[4]=最终置信度.
然后进行nms处理, 过滤掉目标多余的坐标框.

BM1684

参考: 算能demon https://github.com/sophgo/sophon-demo
官方的Demon对图片转换有些不足,你需要进行对其处理的完善.

算能官方将ffmpegopencv两个库进行了改编,增加了自己的编解码,入门难度简单很多.
对于ffmpeg只需要进行AVFramebm_image的相互转换即可.
目前bm1684官方说明为64对其.

	AVFrame *dst = av_frame_alloc();
	dst->width = src->width;
	dst->height = src->height;
	dst->format = AV_PIX_FMT_YUV420P;
	av_frame_get_buffer(dst, 64);

昇腾

见昇腾社区:
https://www.hiascend.com/document/detail/zh/canncommercial/63RC2/inferapplicationdev/aclcppdevg/aclcppdevg_0000.html

目前已经研究出 昇腾310 上的yolov5的转换, 昇腾在yolov5的前处理进行AIPP功能增加,使其能进行yuv数据的输入.

目前经过研究:在鲲鹏atlas800-3000中,纯使用cpu进行ffmpeg拉流解码可以达到80路视频

atc转换om模型说明

需要先将pt模型转换成onnx模型

# 将yolov5s.onnx模型转换为om模型
# 使用aipp时,输入格式为多种,这里是使用int8数据的NV12图片640大小输入
atc --model=yolov5s.onnx --framework=5 --output=yolov5s_aipp --input_format=NCHW --input_shape="input_image:1,3,640,640" --log=info --soc_version=Ascend310B1 --insert_op_conf=./aipp_YOLOv5.config 

aipp_YOLOv5.config参考 昇腾CANN => 色域转换配置说明

aipp_op {
    aipp_mode:static
    input_format : YUV420SP_U8
    src_image_size_w : 640
    src_image_size_h : 640
    crop: false
    load_start_pos_h : 0
    load_start_pos_w : 0
    crop_size_w : 640
    crop_size_h: 640
    csc_switch : true
    rbuv_swap_switch : false
    # 色域转换
    matrix_r0c0: 256
    matrix_r0c1: 0
    matrix_r0c2: 359
    matrix_r1c0: 256
    matrix_r1c1: -88
    matrix_r1c2: -183
    matrix_r2c0: 256
    matrix_r2c1: 454
    matrix_r2c2: 0
    input_bias_0: 0
    input_bias_1: 128
    input_bias_2: 128
    # 均值归一化
    min_chn_0 : 0
    min_chn_1 : 0
    min_chn_2 : 0
    var_reci_chn_0: 0.003921568627451
    var_reci_chn_1: 0.003921568627451
    var_reci_chn_2: 0.003921568627451
    }

通过其API来获取模型的信息:

#使用RGB输入格式时(可以用opencv读取图片/视频缩放后直接输入)
input[0] size:4915200 fmt:0(ACL_FORMAT_NCHW) dtype:0(ACL_FLOAT) dims(4):input_image= 1,3,640,640
#其中输入数据长度计算方式: 数据大小见 `sizeof(FLOAT)=4`
#1*640*640*3*4=4,915,200

#使用AIPP的NV12格式时(需要dvpp进行解码成NV12并进行缩放)
input num:1
input[0] size:614400 fmt:1(ACL_FORMAT_NHWC) dtype:4(ACL_UINT8) dims(4):input_image
1,640,640,3,
out num:1
output[0] fmt:2(ACL_FORMAT_ND) dtype:0(ACL_FLOAT) dims(3):Concat_309:0:output0
1,25200,85,
# 其中: 1*640*640*1.5=614400 

http://www.niftyadmin.cn/n/4994798.html

相关文章

家用电脑可以用做服务器吗

家用电脑的结构与服务器的结构是相同的&#xff0c;家用电脑是可以用来搭建服务器使用。但使用家用电脑做服务器在稳定性会比服务器差很多 1.家用电脑没有公网IP&#xff0c;网络运营商分配的IP重启路由之后是会变化&#xff0c;不固定。服务器运行是需要有固定IP让人连接访问。…

[dasctf]misc3 chrchrchr.pcapng

webshell 流量分析 php代码部分没啥看的&#xff0c;主要在标黄的部分&#xff0c;裁剪掉前面的字符可base解码 能看到在向a.txt中写入数据 wp # tshark.exe -r chrchrchr.pcapng -T fields -e urlencoded-form.value -Y "urlencoded-form.keyzd2ebbfb26dd" >…

深度学习-4-二维目标检测-YOLOv5源码测试与训练

本文采用的YOLOv5源码是ultralytics发行版3.1 YOLOv5源码测试与训练 1.Anaconda环境配置 1.1安装Anaconda Anaconda 是一个用于科学计算的 Python 发行版&#xff0c;支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。 官方网址下载安装包&…

OpenCV(十四):ROI区域截取

在OpenCV中&#xff0c;你可以使用Rect对象或cv::Range来截取图像的感兴趣区域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。 方法一&#xff1a;使用Rect对象截取图像 Rect_(_Tp _x&#xff0c; _Tp _y&#xff0c; _Tp _width,_Tp _height) Tp:数据类型&…

OpenAI 创始人 Sam Altman 博客有一篇 10 年前的文章

OpenAI 创始人 Sam Altman 博客有一篇 10 年前的文章《Advice for ambitious 19 year olds》&#xff0c;给 19 岁年轻人的建议&#xff0c;从 #参考答案 看到&#xff0c;非常适合我们&#x1f923;年轻人&#xff0c;顺便用 GPT4 重新翻译了下全文。 太长不读纯摘要版本如下&…

分布式锁实现二. memcached分布式锁

文章目录 memcached分布式锁实现原理&#xff1a;优缺点 开发准备安装memcached服务端安装jar到maven本地仓库 代码开发初始化Memcached客户端锁相关操作核心代码源码传送本地运行效果docker运行编排文件 memcached分布式锁 实现原理&#xff1a; memcached带有add函数&#…

python编写MQTT订阅程序

Download | Eclipse Mosquitto 1、下载&#xff1a; https://mosquitto.org/files/binary/win64/mosquitto-2.0.17-install-windows-x64.exe 2、安装&#xff1a; 3、conf配置 1)使用notepad打开“C:\Program Files\mosquitto\mosquitto.conf”另存为c:\myapp\msquitto\mo…

提高Python并发性能 - asyncio/aiohttp介绍

在进行大规模数据采集时&#xff0c;如何提高Python爬虫的并发性能是一个关键问题。本文将向您介绍使用asyncio和aiohttp库实现异步网络请求的方法&#xff0c;并通过具体结果和结论展示它们对于优化爬虫效率所带来的效果。 1. 什么是异步编程&#xff1f; 异步编程是一种非阻…