当前位置: 首页 > news >正文

yolov5的后处理解析

        由于最近实习项目使用到了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实现。 

仅为学习记录,侵删!

相关文章:

yolov5的后处理解析

由于最近实习项目使用到了yolov5, 发现对yolov5的后处理部分不太熟悉,为防止忘记,这里简单做个记录。 在yolov5里,利用FPN特征金字塔,可以得到三个加强特征层,每一个特征层上每一个特征点存在3个先验框&am…...

Java中注解应用场景

1.Parameter注解 Parameter(names "-browser", description "browser name, supported scope [chrome]", required true) Param注解的用法解析_parameter_fFee-ops的博客-CSDN博客 Public User selectUser(param(“userName”) String name, param(“…...

verilog

数据类型 reg reg [3:0] counter; counter是一个寄存器,这个寄存器有4bit大小; reg [3:0] byte1 [7:0]; 有8个寄存器,每个4bit大小; wire 有符号整数 interge 无符号 reg clk_temp (小数)verilog中称实数…...

基于springboot+mybatis+vue进销存管理信息系统

基于springbootmybatisvue进销存管理信息系统 一、系统介绍二、功能展示1.个人中心2.企业信息管理3.商品信息管理4.客户信息管理5.入库记录管理6.出库记录管理7.出库记录管理8.操作日志管理9.库存盘点管理 四、获取源码 一、系统介绍 系统主要功能: 普通用户&#…...

Keepalived 在CentOS安装

下载 有两种下载方式,一种为yum源下载,另一种通过源代码下载,本文章使用源代码编译下载。 官网下载地址:https://www.keepalived.org/download.html wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz --no-…...

Lua语法学习

Lua 文章目录 Lua变量数据类型nilbooleanstringtable 循环if函数运算符Table -- Events local StateEvents ReplicatedStorage:WaitForChild("StateEvents"); local AddMoneyEvent StateEvents:WaitForChild("AddMoneyEvent");AddMoneyEvent:FireServer(…...

【Ajax】笔记-jsonp实现原理

JSONP JSONP是什么 JSONP(JSON With Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来的,只支持get请求。JSONP 怎么工作的? 在网页有一些标签天生具有跨域能力,比如:img link iframe script. …...

LLM - Chinese-Llama-2-7b 初体验

目录 一.引言 二.模型下载 三.快速测试 四.训练数据 五.总结 一.引言 自打 LLama-2 发布后就一直在等大佬们发布 LLama-2 的适配中文版,也是这几天蹲到了一版由 LinkSoul 发布的 Chinese-Llama-2-7b,其共发布了一个常规版本和一个 4-bit 的量化版本…...

transformer代码注解

其中代码均来自李沐老师的动手学pytorch中。 class PositionWiseFFN(nn.Module):ffn_num_inputs 4ffn_num_hiddens 4ffn_num_outputs 8def __init__(self,ffn_num_inputs,ffn_num_hiddens,ffn_num_outputs):super(PositionWiseFFN,self).__init__()self.dense1 nn.Linear(ffn…...

【产品经理】高阶产品如何处理需求?(3方法论+2案例+1清单)

不管你是萌新小白,还是工作了几年的“老油条”,需求一直是产品经理工作的重点。只不过,不同年限的产品经理需要面对的需求大有不同,对能力的要求更高。 不知你是否遇过以下问题? 你接手一个项目后,不知从何…...

Neo4j数据库中导入CSV示例数据

本文简要介绍Neo4j数据库以及如何从CSV文件中导入示例数据,方便我们快速学习测试图数据库。首先介绍简单数据模型以及基本图查询概念,然后通过LOAD CSV命令导入数据,生成节点和关系。 环境准备 读者可以快速安装Neo4j Desktop,启…...

第四章 No.1树状数组的原理与使用

文章目录 应用问题原理树状数组练习题241. 楼兰图腾242. 一个简单的整数问题243. 一个简单的整数问题2244. 谜一样的牛 线段树的反面:树状数组原理复杂,实现简单 应用问题 支持两个操作:快速求前缀和任意地修改某个数,时间复杂度…...

mysql(五)主从配置

目录 前言 一、MySQL Replication概述 二、MySQL复制类型 三、部署MySQL主从异步复制 总结 前言 为了实现MySQL的读写分离,可以使用MySQL官方提供的工具和技术,如MySQL Replication(复制)、MySQL Group Replication(组…...

扫地机语音提示芯片,智能家居语音交互首选方案,WT588F02B-8S

智能家居已经成为现代家庭不可或缺的一部分,而语音交互技术正是智能家居的核心。在智能家居设备中,扫地机无疑是最受欢迎的产品之一。然而,要实现一个更智能的扫地机,需要一颗语音提示芯片,以提供高质量的语音交互体验…...

ChatGPT | 分割Word文字及表格,优化文本分析

知识库读取Word内容时,由于embedding切片操作,可能会出现表格被分割成多个切片的情况。这种切片方式可能导致“列名栏”和“内容栏”之间的Y轴关系链断裂,从而无法准确地确定每一列的数据对应关系,从而使得无法准确知道每一列的数…...

基于JavaSE的手机库存管理系统

1、项目背景 基于JavaSE完成如下需求: 功能需求: 1、查询库存量 2、可以修改库存中不同品牌手机的个数 3、退出系统 实现步骤: 1、把List当做库房 2、把手机存放在库房中 3、使用封装的方法区操作仓库中的手机 2、项目知识点 面向对象 集合…...

驱动开发 day4 (led灯组分块驱动)

//编译驱动(注意Makefile的编译到移植到开发板的内核) make archarm //清除编译生成文件 make clean //安装驱动 insmod mycdev.ko //卸载驱动 rmmod mycdev //编译fun.c 函数(用到交叉工具编译) arm-linux-gnueabihf-gcc fun.c head.h #ifndef __HEAD_H__ #define __HEAD_H__…...

electron dialog.showMessageBox使用案例

electron 版本&#xff1a;25.3.1 index.html <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Hello World!</title><meta http-equiv"Content-Security-Policy" content"script-src self unsa…...

代码随想录算法训练营第二十二天 | 读PDF复习环节2

读PDF复习环节2 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…...

TimescaleDB时序数据库初识

注&#xff1a;本文翻译自https://legacy-docs.timescale.com/v1.7/introduction TimescaleDB是一个开源时间序列数据库&#xff0c;针对快速摄取和复杂查询进行了优化。它说的是“完整的SQL”&#xff0c;因此像传统的关系数据库一样易于使用&#xff0c;并且以以前为NoSQL数…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...