检测一切YOLO-World的几个实用使用技巧,助力精准高效目标检测任务!

引言

YOLO-World 是一种最先进的零样本目标检测模型。您可以向 YOLO-World 提供任意文本提示,让模型在没有任何微调的情况下识别图像中的对象实例。没有预定义的类别列表;您需要尝试不同的提示,看看模型是否能够以对您的项目可接受的标准来识别对象。

之前文中已经对其使用进行了详细介绍《YOLO-World检测一切的任务框架使用指南,支持开放词汇检测任务》。在本文中,将分享YOLO-World的五个技巧。通过阅读本文章,您将获得可应用于更有效地使用YOLO-World识别对象。

1.YOLO-World 提示技巧

1.1忽略置信度大小

对于大多数流行的计算机视觉模型,置信度超过80%通常代表“高置信度”。YOLO-World并不遵循这一趋势。你可以期望置信度低至5%,1%,甚至0.1%来产生有效的预测。

在这里插入图片描述

虽然对于其他流行模型(如YOLOv8)来说,过滤掉所有低于80%的预测是很正常的,但YOLO World 准确地预测了上图中的门把手,并且置信度在23%到35%之间。

在这里插入图片描述

由于YOLO-World是在Microsoft COCO上训练的,所以对COCO类别的置信度比其他类别高得多。在上面的例子中,吹风机(COCO中的一个类别)具有 21% 的置信度,而许多其他物体的置信度低于 10%,甚至低于 1%。为了确保每个类都被正确预测,对每个类别的不同置信度间隔很重要。设置为 15% 置信度可以确保我们不会看到图像右侧的吹风机假阳性,但几乎所有保湿霜类都将不会被检测到。

1.2添加空类

一个空类是指你不感兴趣的类别,但让模型检测它,因为它提高了你关心的类的性能。例如,让我们尝试使用YOLO-World来检测车牌。

在这里插入图片描述

从上图我们可以看到模型预测了我们关心的对象(车牌),但是错误地检测到汽车是车牌。在观察到次要对象被错误地检测为感兴趣的对象时,通常很有用的是将次要对象car作为类别添加。看看当汽车被添加为一个类别的时候会发生什么。如下图:

在这里插入图片描述

可以看到检测错误的问题修复了!虽然我们可能不关心汽车的位置,但把它当作一个类来调用可以防止对车牌等感兴趣的对象进行错误预测。

1.3使用两阶段检测工作流程

两阶段工作流程串联了模型,其中第一阶段模型的输出是第二阶段模型的输入。举个例子,我们试着在人群中检测人的瞳孔。

在这里插入图片描述

即使设置低至 0.3% 的置信度阈值,我们也会错过许多眼睛。为了提高性能,我们可以使用具有以下步骤的两阶段工作流程:

第一步:检测人脸。

第二步:对于每张脸,裁剪并检测眼睛。

这是如何运作的?

首先,我们检测到所有的人脸。注意我们找到的人脸数量比眼球多得多。这是因为人脸是更大的物体,因此更容易被检测到。
在这里插入图片描述
现在,让我们裁剪这些预测并运行第二阶段的眼球模型:
在这里插入图片描述

还不错!我们已经挑出了几个初始模型漏掉的眼睛。有趣的是,在所有这些情况下,都有一只眼睛检测器几乎占据了整个图像区域。这是与YOLO-World(我们在本文后面的部分会讨论)相关的常见错误。

1.4 利用颜色优势

在这里插入图片描述

YOLO-World具有很强的颜色感。在上面的例子中,它能够区分绿色草莓和红色草莓。甚至错误率也最低(左下角)也是最“红”的绿色草莓。再次看到之前的例子中的相同错误:一个大的、高置信度的绿色草莓预测占据了屏幕大部分。

在这里插入图片描述

以一张 FIRST 机器人比赛 的图片为例,图中蓝色和红色队伍正在争夺中立的黄色目标。在检测对象是新奇且不太可能与其他提示一起被检测的情况下,颜色识别能力至关重要。
在这里插入图片描述

我们可以使用简单的颜色查询来检测这些对象,而无需关注实际的对象本身。这种方法在常规描述提示失败的情况下非常有用。

1.5 使用描述大小的词语

在这里插入图片描述

在这张图片中,我们正在检测YOLO-World中的两个类别:饼干和金属屑。即使置信度很低,金属缺陷也没有被检测到。

下面是同一张图片,但置信度相同,我们使用了小金属碎片的提示。现在金属屑就被检测出来了!

在这里插入图片描述

2. 后处理改进

YOLO-World有一些独特的特性,仅靠提示无法解决。到目前为止,在示例中我们已经看到了一些这样的情况。本节概述这些独特之处以及处理它们的方法。

2.1按类别调整置信度

正如上面我们在吹风机示例中所看到的,不同的类别的理想置信度阈值可能在相同的图像上有所不同。与流行的其他目标检测模型不同,这些区域可能会有很大的差异。

例如,当置信度超过 70% 时,人像检测可能会有最佳效果,但蓝色直升机在超过 0.5% 的置信度下可能会有更好的效果。如果你尝试为这两个类别设置相同的置信度阈值,那么要么会漏掉人像,要么会误报蓝色直升机。

作为解决方案,建议使用独特的类级置信度阈值过滤预测

2.2按大小过滤预测值

YOLO-World的一个最令人沮丧的挑战之一是,它经常除了识别单个对象之外还会预测一组对象。 更糟糕的是,这些组预测通常具有很高的置信度,因此无法通过传统方法进行过滤。

作为解决方案,我们建议过滤掉那些占整个图像一定比例以上的预测。这个值针对各个检测类别各不相同,并且可能不适用于某些您期望填充整个图像的类别。

3. 挑战

3.1 空间提示

在这里插入图片描述

YOLO-World中不知道左右,也很难识别其他方向参考。如果你想检测图像中不同物体的交互、移动或旋转,可能需要使用其他方法(比如后处理)。

3.2不同语境下的表现

YOLO-World令人印象深刻,因为对于给定的图像,您通常可以找到一组提示和参数来产生准确的结果。

然而,早期测试表明,在各种环境和语境中找到持久有效的提示更为困难。由于理想置信度阈值可能会因图像而异,因此在示例图像上有效的提示可能无法应用于整个生产数据集。

如果你发现自己在不同的环境中更改提示和参数设置,那么最好使用YOLO-World输出来训练一个自定义模型,该模型将在所有设置中表现得更好。


好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

登录解析(后端)

调试登录接口 进入实现类可以有 验证码校验 登录前置校验 用户验证 验证码校验 通过uuid获取redis 中存储的验证码信息,获取后对用户填写的验证码数据进行校验比对 用户验证 1.进入控制器的 /login 方法 2.进入security账号鉴权功能,经过jar内的流…

element plus el-date-picker type=“datetime“ 限制年月日 时分秒选择

如何限制el-date-picker组件的时分秒选中!!!!!!! 文档 文档在这里:DateTimePicker 日期时间选择器 | Element Plus 它提供的disabled-date给我们来限制日期选择 nice!&…

Linux的图形资源及指令

一、火车 1.切换到超级用户 su 2.下载资源 yum install -y sl 3.输入指令 sl,得到火车图形 如果没有得到该图形,就将2处改为yum install -y epel-release。 二、Linux的logo 1.在超级用户模式下下载资源 yum install -y linux_logo 2.输…

Microchip逆市扩张,接连收购2家公司

尽管年初传来降薪停工的消息,全球领先的半导体解决方案供应商Microchip并未因此停下扩张的脚步。相反,该公司在短短的一个月内,接连宣布收购两家公司,展现了其坚定的市场布局和前瞻的战略眼光。 4月11日,Microchip成功…

【JavaEE初阶系列】——网络原理之进一步了解应用层以及传输层的UDP协议

目录 🚩进一步讲应用层 🎈自定义应用层协议 🎈用什么格式组织 👩🏻‍💻xml(远古的数据组织格式) 👩🏻‍💻json(当下最流行得一种数据组织格式) 👩&…

1097 矩阵行平移(语文题,选做)

输入样例: 7 2 99 11 87 23 67 20 75 89 37 94 27 91 63 50 11 44 38 50 26 40 26 24 73 85 63 28 62 18 68 15 83 27 97 88 25 43 23 78 98 20 30 81 99 77 36 48 59 25 34 22 输出样例: 529 481 479 263 417 342 343 样例解读 需要平移的是第 1、…

ZYNQ-Vitis(SDK)裸机开发之(八)PS端QSPI读写flash操作(包括SPI、Dual SPI、Qual SPI的配置使用)

目录 一、Flash知识简介 二、SPI知识简介 1.SPI引脚介绍 2.SPI协议介绍 3.ZYNQ Quad SPI说明 三、Vivado工程搭建 四、编写Vitis程序 1.ZYNQ QSPI Flash操作的格式: 2.头文件:qspi_hdl.h 3.源文件:qspi_hdl.c 4.编写QSPI Flash读写…

已经下载了pytorch,但在正确使用一段时间后出现No module named torch的错误

问题描述 使用的是叫做m2release的虚拟环境,在此环境下使用conda list可以发现是存在pytorch的,但是运行代码时却报No module named torch的错误。 解决方案 想尝试卸掉这个pytorch重新装一次,但是想卸载会提示找不到,想重新…

redis写入和查询

import redis #redis的表名 redis_biao "Ruijieac_sta" #redis连接信息 redis_obj redis.StrictRedis(hostIP地址, port6379, db1, password密码) # keyytressdfg # value22 ##写入 # redis_obj.hset(redis_biao, key, value) #查询 req_redisredis_obj.hget(red…

Python面试十问

深浅拷贝的区别? 浅拷⻉: 拷⻉的是对象的引⽤,如果原对象改变,相应的拷⻉对象也会发⽣改变。 深拷⻉: 拷⻉对象中的每个元素,拷⻉对象和原有对象不在有关系,两个是独⽴的对象。 浅拷⻉(copy)…

selenium_定位tag_name

第一个input """需求:1. 使用tag_name定位方式,使用注册A.html页面,用户名输入admin方法:1. driver.find_element_by_tag_name("") # 定位元素方法2. send_keys() # 输入方法3. driver.quit() # 退出方…

最小生成树算法的实现c++

最小生成树算法的实现c 题目链接:1584. 连接所有点的最小费用 - 力扣(LeetCode) 主要思路:使用krusal算法,将边的权值进行排序(从小到大排序),每次将权值最小且未加入到连通分量中…

6、Lagent AgentLego 智能体应用搭建(homework)

基础作业 完成 Lagent Web Demo 使用,并在作业中上传截图。文档可见 Lagent Web Demo 0 环境准备 conda create -n agent conda activate agent conda install python3.10 conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda11.8 -c py…

【Linux】动态扩容根目录

Linux:解决centos-root 根目录磁盘空间不足,动态扩容,不删数据 默认安装的root分区只有50G,/home分区有大几百G,可以考虑重新挂载分配空间,不用删除数据,不需要停业务。 查看系统空间 df -h解…

【PDF技巧】PDF文件带有密码,该如何解密?

PDF文件带有打开密码、限制编辑,这两种密码设置了之后如何解密? 不管是打开密码或者是限制编辑,在知道密码的情况下,解密PDF密码,我们只需要在PDF编辑器中打开文件 – 属性 – 安全,将权限状态修改为无保护…

深入理解C语言结构体和位域

目录标题 1. **结构体基础**2. **结构体的定义和使用**3. **结构体内存布局**4. **结构体与函数**5. **位域的定义和使用**6. **位域的实际应用**7. **结构体与位域的混合使用**8. **注意事项和最佳实践**9. **结语** C语言中的结构体和位域是存储和管理数据的重要工具&#xf…

孟德尔随机化(三)—— 再也不用担心网络或其他各种报错啦 | 从数据库下载数据到本地的数据处理方法

前几天咱们分享了看完不会来揍我 | 孟德尔随机化万字长文详解(二)—— 代码实操 | 附代码注释 结果解读,很多小伙伴们反映在使用代码下载数据时会遇到各种网络或其他报错问题,令人头大的那种!不要慌!从数据…

每日一题---合并两个有序数组

文章目录 1.前言2.题目2,代码思路3.参考代码 1.前言 上次我们做了移除元素这道题,下来我们看一下合并两个有序数组 2.题目 2,代码思路 创建三个变量,创建三个变量,分别是n1,n2,n3,分别指向nums1[m-1],nums…

华为ensp中Hybrid接口原理和配置命令

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月19日14点03分 Hybrid接口是ENSP虚拟化中的一种重要技术,它既可以连接普通终端的接入链路,又可以连接交换机间的干道链路。Hybrid接口允许多…

排序算法。

***冒泡排序: 基本&#xff1a; private static void sort(int[] a){for (int i 0; i < a.length-1; i) {for (int j 0; j < a.length-i-1; j) {if (a[j]>a[j1]){swap(a,j,j1);}}}} private static void swap(int[] a,int i,int j){int tempa[i];a[i]a[j];a[j]temp…
最新文章