yolov5的后处理解析

news2024/11/18 5:57:12

        由于最近实习项目使用到了yolov5, 发现对yolov5的后处理部分不太熟悉,为防止忘记,这里简单做个记录。

在yolov5里,利用FPN特征金字塔,可以得到三个加强特征层,每一个特征层上每一个特征点存在3个先验框,每个先验框需要预测每一个特征点的回归参数、是否包含物体、以及所包含的物体种类概率。

一、常见预测结果输出类型

一般常见的yolov5模型的输入输出如下面2张图所示,图1为yolov5的三个Predict Head分别输出的示例,图2为3个Head合并后的单结果输出示例。

图1 多结果输出

  图2 单结果输出

假设模型输入为(640,640)的RGB图像,即图中所示输入节点,name:images,shape NCHW=[1,3,640,640],训练集为coco数据集,具有80个类别,即num_classes=80。

图1中的模型输出分别为(1,255,20,20),(1,255,40,40),(1,255,80,80),其中开头的1表示batch_size,(20,20)、(40,40)、(80,80)分别为3个特征层的形状大小,255=3*(80+4+1),3表示每个特征点对应的3个先验框,80为one-hot后的各类别概率,4为先验框的回归参数,1为先验框是否包含物体的概率大小。

图2中的25200=3*(20*20+40*40+80*80),即一共有25200个先验框。

有时模型经过转换后,输出结果为(1,2142000),其中2142000=25200*85。

二、预测输出结果解码:

由(一)得到的不同预测结果的输出类型,首先先将其reshape一下,变成统一形状(python中对结果列表进行操作即可,注意维度与切分间隔)。

以单结果输出类型(1,25200,85)为例:

其中的85可以拆分成4+1+80。
前4个参数用于判断每一个特征点的回归参数,回归参数调整后可以获得预测框;
第5个参数用于判断每一个特征点是否包含物体;
最后80个参数用于判断每一个特征点所包含的物体种类。

(1)输出结果解码:

主要输出参数有边界框预测的4个offsets:t_{x}t_{y}t_{w}t_{h},边界框置信度box_conf 和第i个类别的置信度cls_conf。边界框预测参数需要如下解码公式得到预测框的位置以及宽高。

这里需要注意的是,公式中的解码结果是根据先验框的位置信息进行解码的,如果给定的是先验框的实际位置信息,则解码出来的结果就是实际框的位置信息,这样就不需要针对不同特征层的不同先验框位置进行解码;如果不是,则需要根据不同特征层的先验框位置进行调整,讲个例子,如果公式中给定的c_{x}c_{y}是特征层(20,20)上的坐标网格,那得到的b_{x}b_{y}也是相对于(20,20)上的位置而言的,此时还需要将其映射到模型输入大小上,即乘以其对应的下采样strides。

 第i个类别的置信度cls_conf可以通过获取最大值及其索引得到最大概率max_cls_conf以及相应的索引值max_cls_pred,完成类别预测解码得到种类以及种类置信度。

因此经过解码后可以得到:85(4+1+80) --> 7(x,y,w,h,box_conf,max_cls_conf,max_cls_pred)

(2)非极大值抑制:

经过步骤(1)我们得到了很多的预测框,有些预测框并不准确,因此还需要进行非极大值抑制,防止同一种类框的堆积。

这里借鉴网上的图加深一下影响。

 首先利用置信度进行第一轮的筛选,即筛选出得分满足confidence置信度的预测框,其中框的置信度得分为box_conf*max_cls_con,这样在进行重合框筛选前可以大幅度减少框的数量;

然后进行非极大值抑制,即筛选出一定区域内属于同一种类得分最大的框,

1、获取预测结果中包含的所有种类
2、对种类进行循环,获取该类的全部预测结果
3、根据置信度得分对该种类进行从大到小排序。
4、每次取出得分最大的框,计算其与其它所有预测框的重合程度,重合程度过大的则剔除。

(3)输出结果校正

经过解码以及非极大值抑制后,可以得到模型预测出的相对于输入尺寸大小(640,640)的框,我们需要将预测框校正到实际的图像上。通常实际输入图片比模型输入图像要大,因此需要下采样到模型输入大小,一般采用letterbox操作,即将图像按最小尺度比缩放后在周围补上灰边以填充到模型输入大小,这样如果想得到实际图像上预测框,我们需要对预测结果进一步校正。

1、计算图像大小image_shape与模型输入大小input_shape的最小形状的比值r,得到缩放后的图像形状大小new_shape。

2、计算边界offset以及图像大小与缩放后图像大小的长宽比值scale

3、根据预测框减去边界偏差offset并除以比值得到实际图像上的框的位置与宽高信息。

image_shape=(960,1280)

input_shape=(640,640)

r = min(640/960,640/1280)=min(2/3,0.5)=0.5

new_shape=image_shape*r=(480,640)

offset = (input_shape-new_shape)/2 = ((640,640)-(480,640))/2=(0,80)

scale = 1/r=2

假设模型预测得到了某个框的位置中心点坐标为(100,300),经过上式计算后得到

real = (pred - offset)*scale=[(100,300)-(0,80)]*2=(200,440)

三、相关代码

(1)推荐b导的代码,utils_bbox中实现了torch与numpy的解码。

yolov5-pytorch/utils/utils_bbox.py at main · bubbliiiing/yolov5-pytorch (github.com)

(2)不依赖pytorch,不需要cmake编译,基于官方yolov5训练的模型进行python部署

jndxchengjiabao/yolov5_tensorrt_python: 不使用c++编译,不依赖pytorch,使用tensor和numpy进行推理,导出onnx模型即可使用。 (github.com)

该模型输出为(1,2142000),后处理代码写在trt.py中,使用tensor和numpy实现。 

仅为学习记录,侵删!

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

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

相关文章

自动化测试到底用Python还是Java?因为这个我和同事闹翻了

现在的软件测试工程师,必备的技能之一就是需要掌握自动化。对于那些不会自动化的测试工程师来说,被淘汰的概率会越来越大。因此大家通过各种途径开始学习自动化。但是刚开始都会面临一个棘手的问题:应该学习哪种编程语言进行自动化测试呢&…

Echarts 显示双Y轴

option 对象 option {yAxis: [{ name: 重量(kg), position: left, type: value },{ name: 金额(元), position: right, type: value }],xAxis: { type: category },legend: {},series: [{name: 剩余量,label: { normal: { show…

2023年全国程序员薪酬排行天梯榜

文章目录 ⭐️ 2023年全国程序员薪酬排行天梯榜 在过去很长的一段时间内,网上总有一个声音:“大厂裁员”、“程序员内卷严重”、“程序员人员过盛”、“35岁中年危机”、“码农吃的青春饭”、“互联网寒冬” 等等等等。 讲道理,我对这种人为的…

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的,受此启发,Google将其用于图像,并对分类流程作尽量少的修改。 起源:从机器翻译的角度来看,一个句子想要翻译好,必须考虑上下文的信息&…

Redisson源码分析(1)源码下载及本地调试

目录 前言 源码下载 其他准备 前言 新开个坑,关于Redisson源码分析的,感觉不记一下,看完以后,过段时间又忘了... 源码下载 Redisson:https://github.com/redisson/redisson 本次源码我这下载的是3.17.7版本 3.…

Java期末复习基础题编程题

文章目录 基础题记录实践题记录&&与C比较题目1:题目2:题目3: 基础题记录 编译型语言: 定义:在程序运行之前,通过编译器将源程序编译成机器码(可运行的二进制代码),以后执行这个程序时&…

【图像分类】CNN+Transformer结合系列.2

介绍几篇利用CNNTransformer实现图像分类的论文:CMT(CVPR2022),MaxViT(ECCV2022),MaxViT(ECCV2022),MPViT(CVPR2022)。主要是说明Transformer的局限性&#x…

【DFS】CF598D

Problem - D - Codeforces 题意: 思路: 直接搜索即可,对于每个连通块都去染色,对于每一个色块都维护这个色块的墙壁数 或者麻烦点用并查集维护也行 Code: int n, m, k; bool st[N][N]; char g[N][N]; int ans[N *…

C#时间轴曲线图形编辑器开发2-核心功能实现

目录 三、关键帧编辑 1、新建Winform工程 (1)界面布局 (2)全局变量 2、关键帧添加和删除 (1)鼠标在曲线上识别 (2)键盘按键按下捕捉 (3)关键帧添加、删…

脉冲信号测试应如何选择示波器带宽?

示波器模拟带宽的定义大家都比较熟悉,是针对于正弦波信号定义的。从频域上看,正弦波信号的频谱就是单根谱线,只要示波器的带宽不小于信号的频率,那么就可以有效观测到波形。若要追求更高的幅度测试精度,则可以按照5倍法…

全球视频编码领域顶级大赛放榜,网易云信首次参赛即斩获H.265赛道多项指标第一

近日,2022 MSU 世界视频编码器大赛正式放榜,网易云信首次参赛就获得骄人成绩,自研的结合智码超清技术的 NE265E 编码器以公开身份参赛,在 H.265 赛道下获得多项指标第一名。 首次参赛,斩获 3 项指标第一 MSU Video Co…

【JVM】详细解析java创建对象的具体流程

目录 一、java创建对象的几种方式 1.1、使用new关键字 1.2、反射创建对象 1.2.1、Class.newInstance创建对象 1.2.2、调用构造器再去创建对象Constructor.newInstance 1.3、clone实现 1.4、反序列化 二、创建对象的过程 2.1、分配空间的方式 1、指针碰撞 2、空闲列表 …

Mac代码编辑器sublime text 4中文注册版下载

Sublime Text 4 for Mac简单实用功能强大,是程序员敲代码必备的代码编辑器,sublime text 4中文注册版支持多种编程语言,包括C、Java、Python、Ruby等,可以帮助程序员快速编写代码。Sublime Text的界面简洁、美观,支持多…

数据库访问和组件技术相关概念(ADO、ActiveX、DLL、ODBC等)详解

目录 背景概念ADO核心组件代码展示 ActiveX组件对象模型ADO与ODBC的关系 总结 背景 最近又再重新学习vb,老师说过无论学习什么知识一定不能独立的学习,学习编程语言也是一样,把两种或者三种语言放到一起进行比较,通过比较每种语言…

短视频矩阵源码/系统搭建/源码

一、短视频矩阵系统开发需要具备以下能力 短视频技术能力:开发人员应具备短视频相关技术能力,如视频编解码、视频流媒体传输等。 大数据存储和处理能力:短视频矩阵系统需要处理大量的视频数据,因此需要具备大数据存储和处理的能力…

【Spring Boot】

目录 🍪1 Spring Boot 的创建 🎂2 简单 Spring Boot 程序 🍰3 Spring Boot 配置文件 🍮3.1 properties 基本语法 🫖3.2 yml 配置文件说明 🍭3.2.1 yml 基本语法 🍩3.3 配置文件里的配置类…

CSDN浏览如何解决

一、对于平时我们苦恼csdn数据不够好看 当面试等各个场合需要我们装*或者秀技术无法拿出亮眼的时候,刚好我闲时间编译的在线模块适合你 二、如何操作(虚拟平台我已给大家放到最后直接使用即可) 重点:pc端必须拥有python环境 win…

【lesson6】Linux make和makefile

文章目录 make和Makefile的介绍make和Makefile的使用make和Makefile的项目测试 make和Makefile的介绍 make是一个命令 Makefile是一个文件 make和Makefile是Linux自动化构建项目的工具。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个…

6门新兴语言,小众亦强大

编码语言在塑造我们创建软件的方式方面起着至关重要的作用。多年来,我们观察到Python,Java和C等成熟语言的流行。然而,如今一波新的编码语言浪潮已经出现,提出了创造性的解决方案,并推动了软件工程领域所能完成的极限。…

12页线性代数图解教程,github星标9.1k,适合小白

线性代数“困难户”注意,今天我给大家分享一个超适合小白的线性代数学习笔记,只有12页纸,一半都是图解,不用担心看不懂。 这份笔记名为《线性代数的艺术》,是日本学者Kenji Hiranabe基于Gilbert Strang教授的《每个人…