目标检测框存在内嵌情况分析与解决

这里写目录标题

  • 问题描述
  • 原因分析与解决方法:
  • 后续及思考
  • 参考文档

问题描述

目标检测模型输出的检测框存在内嵌情况。

在这里插入图片描述


原因分析与解决方法:

根据经验,第一感觉是后处理nms部分出了问题。来看下对应的代码:

static float CalcIou(const vector<float> &box1, const vector<float> &box2)
{float area1 = box1[6];float area2 = box2[6];float xx1 = max(box1[0], box2[0]);float yy1 = max(box1[1], box2[1]);float xx2 = min(box1[2], box2[2]);float yy2 = min(box1[3], box2[3]);float w = max(0.0f, xx2 - xx1 + 1);float h = max(0.0f, yy2 - yy1 + 1);float inter = w * h;float ovr = inter /(area1 + area2 - inter);return ovr;
}static void MulticlassNms(vector<vector<float>>& bboxes, const vector<vector<float>>& vaildBox, float nmsThr)
{for (auto &item : vaildBox) { /* score, xcenter, ycenter, w, h, classId */float boxXCenter = item[XCENTER_IDX];float boxYCenter = item[YCENTER_IDX];float boxWidth = item[W_IDX];float boxHeight = item[H_IDX];float x1 = (boxXCenter - boxWidth / 2);float y1 = (boxYCenter - boxHeight / 2);float x2 = (boxXCenter + boxWidth / 2);float y2 = (boxYCenter + boxHeight / 2);float area = (x2 - x1 + 1) * (y2 - y1 + 1);bool keep = true;/* lx, ly, rx, ry, score, class id, area */vector<float> bbox {x1, y1, x2, y2, item[SCORE_IDX], item[CLSAA_ID_IDX], area};for (size_t j = 0; j < bboxes.size(); j++) {if (CalcIou(bbox, bboxes[j]) > nmsThr) {keep = false;break;}}if (keep) {bboxes.push_back(bbox);}}
}

目前分析最可能的原因是nmsnmsThr设置过大,没能滤除重叠检测框,原来nmsThr设置的为0.45,现调整为0.1
检测框内嵌情况基本消失:
在这里插入图片描述


后续及思考

先给个结论,综合的看下各个Loss函数的不同点::
IOU_Loss:主要考虑检测框和目标框重叠面积
GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。
此项目中用的是基本的IOU,在推理性能足够的情况下,可以考虑使用DIOU,下面也给出使用DIOUnms代码:

static float CalcDiou(const vector<float>& box1, const vector<float>& box2) {float x1 = min(box1[0], box2[0]);float y1 = min(box1[1], box2[1]);float x2 = max(box1[2], box2[2]);float y2 = max(box1[3], box2[3]);float c_x1 = (box1[0] + box1[2]) / 2.0;float c_y1 = (box1[1] + box1[3]) / 2.0;float c_x2 = (box2[0] + box2[2]) / 2.0;float c_y2 = (box2[1] + box2[3]) / 2.0;float dist_center = sqrt((c_x1 - c_x2) * (c_x1 - c_x2) + (c_y1 - c_y2) * (c_y1 - c_y2));float w = max(0.0f, x2 - x1);float h = max(0.0f, y2 - y1);float intersection = w * h;float area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]);float area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]);float union_area = area1 + area2 - intersection;float diou = intersection / union_area - dist_center * dist_center / (union_area * union_area);return diou;
}static void MulticlassNms(vector<vector<float>>& bboxes, const vector<vector<float>>& vaildBox, float nmsThr)
{for (auto &item : vaildBox) { /* score, xcenter, ycenter, w, h, classId */float boxXCenter = item[XCENTER_IDX];float boxYCenter = item[YCENTER_IDX];float boxWidth = item[W_IDX];float boxHeight = item[H_IDX];float x1 = (boxXCenter - boxWidth / 2);float y1 = (boxYCenter - boxHeight / 2);float x2 = (boxXCenter + boxWidth / 2);float y2 = (boxYCenter + boxHeight / 2);float area = (x2 - x1 + 1) * (y2 - y1 + 1);bool keep = true;vector<float> bbox {x1, y1, x2, y2, item[SCORE_IDX], item[CLSAA_ID_IDX], area};for (size_t j = 0; j < bboxes.size(); j++) {if (CalcDiou(bbox, bboxes[j]) > nmsThr) {keep = false;break;}}if (keep) {bboxes.push_back(bbox);}}
}

有读者会有疑问,这里为什么不用CIOU_nms,而用DIOU_nms?
答:因为CIOU_loss,是在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。
但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。

参考文档

https://blog.csdn.net/nan355655600/article/details/106246625

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

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

相关文章

通过对比 入库申请->入库审核流程 与 直接入库 代码实现,解决前者误修改stock_info表is_in=1或2数据的bug

入库申请->入库审核流程&#xff1a; 提交按键定义位置&#xff1a;src\views\purchase\rurchase\RurchaseAdd.vue <a-button click"handleSubmit" type"primary" :loading"loading">确认物品已入库</a-button> <template&…

二、类与对象(二)

8 this指针 8.1 this指针的引入 我们先来定义一个日期的类Date&#xff1a; #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…

Python BDD之Behave测试报告

behave 本身的测试报告 behave 本身提供了四种报告格式&#xff1a; pretty&#xff1a;这是默认的报告格式&#xff0c;提供颜色化的文本输出&#xff0c;每个测试步骤的结果都会详细列出。plain&#xff1a;这也是一种文本格式的报告&#xff0c;但没有颜色&#xff0c;并且…

电动汽车充放电V2G模型MATLAB代码

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要内容&#xff1a; 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消纳供给商场基础负荷…

【办公常识】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

五大资源之Service(可以固定IP)

Service可以看作是一组同类Pod对外访问接口,借助Service应用可以方便的实现服务发现与负载均衡 创建集群内部可以访问Service #暴露Service(也创建在了namespace dev下) [root@master ~]# kubectl expose deployment(pod控制器) nginx --name=svc-nginx1 --type=Cluste…

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于原子轨道搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

Python入门教学——输入任意长度的int整型一维数组

使用python输入一个任意长度的整型一维数组&#xff1a; nums input("请输入整数数组&#xff0c;用空格分隔&#xff1a; ") nums [int(i) for i in nums.split( )] # 将每个数转换为整型后输出 运行结果&#xff1a; 【注】如果不强制转换类型&#xff0c;数字…

如何使用YOLOv8代码框架中的RT-DETR

1. RT-DETR RT-DETR是由由此&#xff0c;百度推出了——RT-DETR (Real-Time DEtection TRansformer) &#xff0c;一种基于 DETR 架构的实时端到端检测器&#xff0c;其在速度和精度上取得了 SOTA 性能。 RT-DETR开源的代码在百度自己的飞桨paddlepaddle上&#xff0c;因此非…

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于天鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

新手必看!!附源码!!STM32通用定时器输出PWM

一、什么是PWM? PWM&#xff08;脉冲宽度调制&#xff09;是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号&#xff0…

实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值

目录 背景问题问题分析问题解决 错误解决与定位技巧总结 背景 仍旧是学生信息管理系统的问题&#xff0c;当时做的时候没发现这么多问题呢&#xff0c;只能说明一件事&#xff0c;做的时候没有站在用户的角度考虑需求&#xff0c;设置了什么内容&#xff0c;就按照设置好的去测…

AIGC ChatGPT4总结SQL优化细节操作

数据库SQL优化是一个复杂的过程,它通常涉及到许多不同的技术和方法。以下是一些常用的SQL优化策略: 1. **索引使用**:索引可以极大地加速查询速度。但是,索引并不总是有好处的,因为它们需要额外的空间来存储,并且在插入和更新数据时可能会减慢速度。因此,选择正确的字段…

Unity中Shader纹理的过滤

文章目录 前言一、为什么要过滤&#xff1f;二、过滤方式1、Point(no filter) 无过滤2、Bilinear 双线性过滤3、Trilinear 三线性过滤 前言 Unity中Shader纹理的过滤 一、为什么要过滤&#xff1f; 事实上没有一个纹理上的纹素是与屏幕上的像素是一一对应的。 屏幕上的 一个…

redis安装(Windows和linux)

如何实现Redis安装与使用的详细教程 Redis 简介 Redis是一个使用C语言编写的开源、高性能、非关系型的键值对存储数据库。它支持多种数据结构&#xff0c;包括字符串、列表、集合、有序集合、哈希表等。Redis的内存操作能力极强&#xff0c;其读写性能非常优秀&#xff0c;且…

万字解析:十大排序(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序+归并排序+计数排序+基数排序+桶排序)

文章目录 十大排序排序算法复杂度及稳定性分析一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四…

【蓝桥杯省赛真题45】Scratch九宫格游戏 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch九宫格游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

轻量封装WebGPU渲染系统示例<37>- 多个局部点光源应用于非金属材质形成的效果(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BasePbrMaterialMultiLights.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class BasePbrMaterial…

2023年09月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 点击绿旗,运行程序后,舞台上的图形是?( ) A:画笔粗细为4的三角形 B:画笔粗细为5的六边形 C:画笔粗细为4的六角形 D:画笔粗细为5的三角形 答案:D 第2题 如下图所示,从所给…

缓存雪崩、击穿、穿透_解决方案

文章目录 缓存雪崩、击穿、穿透1.缓存雪崩造成缓存雪崩解决缓存雪崩 2. 缓存击穿造成缓存击穿解决缓存击穿 3.缓存穿透造成缓存穿透解决缓存穿透 缓存雪崩、击穿、穿透 一般用户数据存储于磁盘&#xff0c;读写速度慢。 使用redis作为缓存&#xff0c;相当于数据缓存在内存&a…