论文阅读YOLO-World: Real-Time Open-Vocabulary Object Detection

核心:

在这里插入图片描述

  • 开放词汇的实时的yolo检测器。
  • 重参数化的视觉语言聚合路径模块Re-parameterizable VisionLanguage Path Aggregation Network (RepVL-PAN)
  • 实时核心:轻量化的检测器+离线词汇推理过程重参数化

方法

在这里插入图片描述
预训练方案:将实例注释重新定义为区域-文本对,通过大规模检测、定位和图像-文本数据进行预训练。
模型架构:YOLO-World由YOLO检测器、文本编码器和RepVL-PAN组成,利用跨模态融合增强文本和图像表示

基础结构

  • Yolo detectorV8, darknet+PAN+head
  • Text Encoder. CLIP+n-gram
  • Text Contrastive Head.两个3x3回归bbox框以及object embedding。object embedding与文本embedding计算相似度求对比loss
  • Inference with Offline Vocabulary.prompt提前确定好,提前计算好embedding。再重参数化到PAN模块。
    在这里插入图片描述

3.3. Re-parameterizable Vision-Language PAN

在这里插入图片描述
RepVL-PAN由多尺度图像特征{C3, C4, C5}形成,利用了自顶向下和自底向上的路径来加强图像特征和文本特征之间的交互。

  • Text-guided CSPLayer(文本->图像).文本embedding经过max-sigmoid加权到neck特征后与原始特征concat。
  • Image-Pooling Attention.(图像->文本)。多层图像特征和文本attention再加到文本embedding中

结果

在这里插入图片描述
又快又好!V100上达到了52FPS!!!
在这里插入图片描述

核心代码:

class RepConvMaxSigmoidAttnBlock(BaseModule):"""Max Sigmoid attention block."""def __init__(self,in_channels: int,out_channels: int,embed_channels: int,guide_channels: int,kernel_size: int = 3,padding: int = 1,num_heads: int = 1,use_depthwise: bool = False,with_scale: bool = False,conv_cfg: OptConfigType = None,norm_cfg: ConfigType = dict(type='BN',momentum=0.03,eps=0.001),init_cfg: OptMultiConfig = None,use_einsum: bool = True) -> None:super().__init__(init_cfg=init_cfg)conv = DepthwiseSeparableConvModule if use_depthwise else ConvModuleassert (out_channels % num_heads == 0 andembed_channels % num_heads == 0), \'out_channels and embed_channels should be divisible by num_heads.'self.num_heads = num_headsself.head_channels = out_channels // num_headsself.use_einsum = use_einsumself.embed_conv = ConvModule(in_channels,embed_channels,1,conv_cfg=conv_cfg,norm_cfg=norm_cfg,act_cfg=None) if embed_channels != in_channels else Noneself.bias = nn.Parameter(torch.zeros(num_heads))self.num_heads = num_headsself.split_channels = embed_channels // num_headsself.guide_convs = nn.ModuleList(nn.Conv2d(self.split_channels, guide_channels, 1, bias=False)for _ in range(num_heads))self.project_conv = conv(in_channels,out_channels,kernel_size,stride=1,padding=padding,conv_cfg=conv_cfg,norm_cfg=norm_cfg,act_cfg=None)def forward(self, x: Tensor, txt_feats: Tensor = None) -> Tensor:"""Forward process."""B, C, H, W = x.shapeembed = self.embed_conv(x) if self.embed_conv is not None else xembed = list(embed.split(self.split_channels, 1))# Bx(MxN)xHxW (H*c=C, H: heads)attn_weight = torch.cat([conv(x) for conv, x in zip(self.guide_convs, embed)], dim=1)# BxMxNxHxWattn_weight = attn_weight.view(B, self.num_heads, -1, H, W)# attn_weight = torch.stack(#     [conv(x) for conv, x in zip(self.guide_convs, embed)])# BxMxNxHxW -> BxMxHxWattn_weight = attn_weight.max(dim=2)[0] / (self.head_channels**0.5)attn_weight = (attn_weight + self.bias.view(1, -1, 1, 1)).sigmoid()# .transpose(0, 1)# BxMx1xHxWattn_weight = attn_weight[:, :, None]x = self.project_conv(x)# BxHxCxHxWx = x.view(B, self.num_heads, -1, H, W)x = x * attn_weightx = x.view(B, -1, H, W)return x

ImagePoolingAttentionModule

class ImagePoolingAttentionModule(nn.Module):def __init__(self,image_channels: List[int],text_channels: int,embed_channels: int,with_scale: bool = False,num_feats: int = 3,num_heads: int = 8,pool_size: int = 3,use_einsum: bool = True):super().__init__()self.text_channels = text_channelsself.embed_channels = embed_channelsself.num_heads = num_headsself.num_feats = num_featsself.head_channels = embed_channels // num_headsself.pool_size = pool_sizeself.use_einsum = use_einsumif with_scale:self.scale = nn.Parameter(torch.tensor([0.]), requires_grad=True)else:self.scale = 1.0self.projections = nn.ModuleList([ConvModule(in_channels, embed_channels, 1, act_cfg=None)for in_channels in image_channels])self.query = nn.Sequential(nn.LayerNorm(text_channels),Linear(text_channels, embed_channels))self.key = nn.Sequential(nn.LayerNorm(embed_channels),Linear(embed_channels, embed_channels))self.value = nn.Sequential(nn.LayerNorm(embed_channels),Linear(embed_channels, embed_channels))self.proj = Linear(embed_channels, text_channels)self.image_pools = nn.ModuleList([nn.AdaptiveMaxPool2d((pool_size, pool_size))for _ in range(num_feats)])def forward(self, text_features, image_features):B = image_features[0].shape[0]assert len(image_features) == self.num_featsnum_patches = self.pool_size**2mlvl_image_features = [pool(proj(x)).view(B, -1, num_patches)for (x, proj, pool) in zip(image_features, self.projections, self.image_pools)]mlvl_image_features = torch.cat(mlvl_image_features,dim=-1).transpose(1, 2)q = self.query(text_features)k = self.key(mlvl_image_features)v = self.value(mlvl_image_features)q = q.reshape(B, -1, self.num_heads, self.head_channels)k = k.reshape(B, -1, self.num_heads, self.head_channels)v = v.reshape(B, -1, self.num_heads, self.head_channels)if self.use_einsum:attn_weight = torch.einsum('bnmc,bkmc->bmnk', q, k)else:q = q.permute(0, 2, 1, 3)k = k.permute(0, 2, 3, 1)attn_weight = torch.matmul(q, k)attn_weight = attn_weight / (self.head_channels**0.5)attn_weight = F.softmax(attn_weight, dim=-1)if self.use_einsum:x = torch.einsum('bmnk,bkmc->bnmc', attn_weight, v)else:v = v.permute(0, 2, 1, 3)x = torch.matmul(attn_weight, v)x = x.permute(0, 2, 1, 3)x = self.proj(x.reshape(B, -1, self.embed_channels))return x * self.scale + text_features

参考:https://github.com/AILab-CVC/YOLO-World/blob/master/yolo_world/models/layers/yolo_bricks.py

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

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

相关文章

【24医学顶刊】GANDALF:主动学习 + 图注意力变换器 + 变分自编码器,改善多标签图像分类

GANDALF:主动学习 图注意力变换器 变分自编码器,改善多标签图像分类 提出背景子解法1:多标签信息样本的选择子解法2:生成信息丰富且非冗余的合成样本 例子:胸部X射线图像分析传统方法的操作和局限GaNDLF方法的优势 工…

超级会员卡积分收银系统小程序源码系统 前后端完整分离 带完整的安装代码包以及搭建教程

系统概述 超级会员卡积分收银系统小程序源码系统是专为各类商业场景设计的综合性平台。它旨在为商家提供一站式的解决方案,涵盖了会员管理、积分体系、收银操作以及数据统计等多个重要方面。 该系统的前后端分离架构确保了系统的灵活性和可扩展性。前端负责用户界…

如何用程序批量下载小红书的图片?

如何使用MediaCrawler快速下载图片 作为一名图像算法工程师,怎么能没有图片资源呢?今天,我要介绍一个能快速下载图片的方法,仅供学习使用,请勿用于其他用途。 下载项目 首先,从GitHub下载项目&#xff1…

强化学习的数学原理:贝尔曼公式

大纲 这一节课程的大纲: 重点 对于这次课,重点是两个东西: Motivating examples(为什么需要贝尔曼公式) 首先要明白,为什么 return 是重要的? 之前其实就说过,return 能够帮助我们评价一个策略是好还是坏…

LVGL实现字库的下载和使用

1 字库 字库的概念:相应文字或字符的合集。 点阵字库:按字库顺序排列的字符/汉字字模的合集。 LVGL中字库使用Unicode编码,Unicode 是全球文字统一编码。它把世界上的各种文字的每一个字符指定唯一编码,实现跨语种、跨平台的应…

大数据开发助手:Coze平台上一款致力于高效解决大数据开发问题的智能Bot!

大数据开发助手:Coze平台上一款致力于高效解决大数据开发问题的智能Bot 核心技术揭秘1. **自然语言处理(NLP)**2. **知识图谱构建**3. **个性化推荐算法** 功能特色概览1. **即时问题解答**2. **最佳实践分享**3. **个性化学习路径**4. **社区…

哪个牌子的超声波清洗器好?精选四大超强超声波清洗机力荐

生活中戴眼镜的人群不在少数,然而要维持眼镜的干净却不得不每次都需要清洗,只是通过手洗的方式实在太慢并且容易操作不当让镜片磨损更加严重!所以超声波清洗机就诞生了!超声波清洗机能够轻松清洗机眼镜上面的油脂污渍,…

synchronized 锁优化原理

目录 一、轻量级锁 二、锁膨胀 三、自旋优化 四、偏向锁 五、锁消除 一、轻量级锁 1. 会创建一个锁记录 Lock Record(保存在线程栈中),尝试 CAS 修改 Mark Word 中的对象头,是一种乐观锁的思想,而不是将 Java 对…

机器学习——强化学习状态值函数V和动作值函数Q的个人思考

最近在回顾《西瓜书》的理论知识,回顾到最后一章——“强化学习”时对于值函数部分有些懵了,所以重新在网上查了一下,发现之前理解的,包括网上的大多数对于值函数的描述都过于学术化、公式化,不太能直观的理解值函数以…

macos Automator自动操作 app, 创建自定义 应用程序 app 的方法

mac内置的这个 自动操作 automator 应用程序,可以帮助我们做很多的重复的工作,可以创建工作流, 可以录制并回放操作, 还可以帮助我们创建自定的应用程序,下面我们就以创建一个自定义启动参数的chrome.app为例&#xff…

cube-studio 开源一站式云原生机器学习/深度学习/大模型训练推理平台介绍

全栈工程师开发手册 (作者:栾鹏) 一站式云原生机器学习平台 前言 开源地址:https://github.com/tencentmusic/cube-studio cube studio 腾讯开源的国内最热门的一站式机器学习mlops/大模型训练平台,支持多租户&…

绘图黑系配色

随便看了几篇小论文,里面的黑配色挺喜欢的,虽然平时SCI系配色用的多,但看到纯黑配色与黑加蓝配色,那就是我最心上的最优style。

一文了解IP地址冲突的起因与解决方案

IP 地址冲突是困扰网络管理员影响网络的正常运行的常见因素。深入理解并有效解决 IP 地址冲突故障对于维护网络的高效稳定运行具有重要意义。 一、IP 地址冲突的原因 (一)人为配置错误 网络用户在手动配置 IP 地址时,对网络配置了解不多用户…

OpenGL3.3_C++_Windows(23)

伽ga马校正 物理亮度 光子数量 线性空间:光子数(亮度)和颜色值的线性关系人眼感知的亮度:对比较暗的颜色变化更敏感,感知亮度基于人的感觉非线性空间:光子数(亮度)和 颜色值^2.2,恰好符合屏幕…

为什么我学个 JAVA 就已经耗尽所有而有些人还能同时学习多门语言

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!我的入门语言是C&#xff0c…

互联网场景下人脸服务基线方案总结

1.简介 1.1目的 在过去的一段时间里,因为听见业务对人脸服务方案的需求,针对网络视频中关键人物定位的检索任务,完成了基于互联网场景的人脸基线服务的构建。本文档是对当前基线服务以后之后解决方案的优化进行总结。 1.2范围 本文档描述的人…

c++读取文件时出现中文乱码

原因:UTF-8格式不支持汉字编码 解决:改成ANSI,因为ANSI编码支持汉字编码

Python学习路线图(2024最新版)

这是我最开始学Python时的一套学习路线,从入门到上手。(不敢说精通,哈哈~) 一、Python基础知识、变量、数据类型 二、Python条件结构、循环结构 三、Python函数 四、字符串 五、列表与元组 六、字典与集合 最后再送给大家一套免费…

KVB App:中国制造业数据支撑澳元,分析师预计挑战0.6750阻力

摘要: 中国6月财新制造业PMI上升至51.8,反映出制造业生产经营活动的持续扩张。这一数据不仅高于预期,还为澳元提供了强有力的支撑。技术分析显示,澳元/美元可能会在短期内挑战0.6750阻力水平。 中国制造业数据解析 6月&#xff0…

python异常、模块与包

目录 了解异常异常的捕获方法python模块python包安装第三方包 了解异常 什么是异常 当检测到一个错误时,python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG bug单词的诞生 早期…