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

这里写目录标题

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

问题描述

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

在这里插入图片描述


原因分析与解决方法:

根据经验,第一感觉是后处理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.hqwc.cn/news/213479.html

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

相关文章

牛客 HJ106 字符逆序 golang实现

牛客题目算法连接 题目 golang 实现 package mainimport ("fmt""bufio""os" )func main() {str, _ : bufio.NewReader(os.Stdin).ReadString(\n)if len(str) 0 {return } else {newstr:""strLen:len(str)-1for i:strLen;i>0;i-…

Java零基础——Linux篇

1.【熟悉】认识Linux 1.1 什么是操作系统 1.2 现实生活中的操作系统 1.2.1 Win10 1.2.2 Mac 1.2.3 Android(Linux) 1.2.4 iOS(Unix) 1.3 操作系统的发展史 1.3.1 Unix 1965年之前的时候&#xff0c;电脑并不像现在一样普遍&#xff0c;它可不是一般人能碰的起的&#xff0c…

AI“胡说八道”?怎么解?

原创 | 文 BFT机器人 01 引言 近年来&#xff0c;人工智能产业迅猛发展&#xff0c;大型语言模型GPT-4发展势头强劲&#xff0c;OpenAI推出ChatGPT、微软推出Bing、马斯克推出“最好的聊天机器人Grok”……科技巨头纷纷入局AI领域&#xff0c;引入人工智能作为办公工具的行业…

LeetCode.88合并两个有序数组

LeetCode.88合并两个有序数组 1.问题描述2.解题思路3.代码 1.问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同…

rocketMQ5.0顺序消息golang接入

本人理解&#xff0c;顺序消息如果不分消息组&#xff0c;那么会影响并行处理速度&#xff0c;所以尽量消息组分的散一些 首先上要求&#xff0c;官方文档如下&#xff1a; 总结&#xff1a; 1.必须同一个消息组&#xff0c;消息组和消费组不是一个概念&#xff0c;不要混 2.必…

Javaweb之前后台分离开发介绍的详细解析

2.1 前后台分离开发介绍 在之前的课程中&#xff0c;我们介绍过&#xff0c;前端开发有2种方式&#xff1a;前后台混合开发和前后台分离开发。 前后台混合开发&#xff0c;顾名思义就是前台后台代码混在一起开发&#xff0c;如下图所示&#xff1a; 这种开发模式有如下缺点&a…

java 手机商城免费搭建+电商源码+小程序+三级分销+SAAS云平台

【SAAS云平台】打造全行业全渠道全场景的SaaS产品&#xff0c;为店铺经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营…

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫1.安装Anaconda2.安装Python3.63.更换pip源4.安装Python包5.下载phantomjs 模型训练1.安装依赖2.安装lmageAl 实际应用1.前端2.安装Flask3.安装Nginx 相关其它博客工程源代码下载其它资料下载 前言 本项目通过爬虫技术…

分布式篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、什么是补偿事务?二、消息队列是怎么实现的?三、那你说说Sagas事务模型前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。…

【Vue】Vue3 配置全局 scss 变量

variables.scss $color: #0c8ce9;vite.config.ts // 全局css变量css: {preprocessorOptions: {scss: {additionalData: import "/styles/variables.scss";,},},},.vue 文件使用

2023年小学生古诗文大会复赛(复选)最后一天复习建议和答题策略

今天是2023年11月24日&#xff0c;星期五。 明天是2023年11月25日&#xff0c;星期六&#xff0c;也就是2023年第八届小学生古诗文大会复选&#xff08;复赛&#xff09;的日子&#xff0c;还有一天。 根据近期和一些家长的交流来看&#xff0c;大家都铆足了劲&#xff0c;希…

如何从 C# 制作报表到 FastReport Cloud

众所周知&#xff0c;我们的世界在不断发展&#xff0c;新技术几乎每天都会出现。如今&#xff0c;不再需要在办公室内建立整个基础设施、雇用人员来监控设备、处理该设备出现的问题和其他困难。 如今&#xff0c;越来越多的服务提供业务云解决方案&#xff0c;例如FastReport…