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

Detr论文精读

摘要:

作者提到,该方法将物体检测看做直接的集合预测,在传统的目标检测算法中,会先生成候选区域,然后对每个候选区域进行单独的预测(包括物体的分类和预测框的回归),集合预测就是直接基于原始图像生成一系列预测结果,避免了划分区域。(不知道我这样理解对不对)。这样能够简化流程。该模型基于二分匹配(我的理解是预测结果与真实结果之间的匹配)以及transformer机制(简单来说就是编码和解码过程)对目标进行检测的,并且是并行输出,(看来是直接拿transformer的结果来用啊,改都不改一点)。损失计算是全局损失,对预测集合和真实目标整体计算,(相比二阶段任务而言,损失也简化了好多流程)。最后还介绍了一下优势,在COCO数据集上取的了不错的效果,而且模型简单,泛化能力很强。

 

嗯嗯...,我来让ai读读文章来概括一下:(nonono,只是补充)。

二分强制匹配是一种特定的匹配机制,确保每个预测的物体都是唯一的,确实是是将预测结果和真实结果进行一对一的匹配,好处是模型被迫在输出的时候对每个物体生成唯一的预测,同一个物体不会被多次预测,(达到比非极大抑制更好的效果,但是如果图片中存在多个同一目标呢?),解决方案是detr中存在多个数量的预测。

基于集合的全局损失:损失关注的是预测集合和真实集合的整体损失,而不是逐个比较。

bd68f6603d5f47d286b7f6f99a3ce954.png

 

介绍:

第一段没什么很重要的信息,相当于是重复了一遍。第二段:自注意力机制精确的模拟了句子之中元素之间的相互关系,非常适应有限值的集合预测问题(所谓限制是指不能重复预测,看得出作者对非极大抑制方法有点瞧不起)。在这里科普一下自注意力机制:作用是在输入元素的时候,动态的关注其他的元素,计算查询与键之间的相似性,并为其赋予权重。第三段也是重复叙述,第四段,之前的检测器侧重于使用RNN的逻辑回归,我们的匹配机制直接分配预测框给真实框。第四段,重复叙述了优势之后指出对于小目标检测精度一般的问题。后面关于全景分割的部分不看,我们关注的只是目标检测,介绍部分还说,要在下文中寻找影响检测精度的重要因素。

相关工作:

(吐槽一下,内容很冗余,光是看到相关工作部分,我至少听他叙述了四五遍“我们的工作是直接预测,之前还没人做过”,“我们的模型在COCO数据集上表现很好”)。其实这些如果觉得必要,叙述三次就行了,没必要说这么多次。

2.1,这部分没有细讲,就是说传统的检测要避免重复检测,而我们的模型使用的是基于匈牙利算法的二分匹配,有效的避免了后处理,但是匈牙利算法是啥,没有具体叙述,具体数学计算不再赘述,匹配原理大概是这样的:789fc7467e6648289885f415cdb7b1c9.png

我们预测的目标有100个,但是图像中真实存在的只有3个,对于每一个真实目标,在所有目标框中选择唯一一个与之对应,但是不同真实目标不能选定同一个预测目标,使得损失最小化。

2.2主要是将transformer,其在自然语言处理中的地位,明显的优势是全局计算以及良好的记忆能力,本模型运用了transformer,并在算力成本以及全局计算能力之间折中。这里我再简要介绍一下transformer,0d38b50eeac64f6994ee5f5d00cc3821.png

将原始图像提取特征,然后与位置编码相加,再推倒(我喜欢用这个词,虽然不是很合适)成一维,放入encoder模块,得到的结果输出到decoder中,在decode之前初始化100个queries(随机初始化),进行解码,解码结果与真实图像进行二分匹配。

详细讲解一下encoder过程,跟着代码看如下:

e4faf51b88f443ca95bd506eb00cf71b.png

这里头是d_model是512,nhead是8(源码中),首先进入到多头注意力机制函数中......,有点不适合写进博客(上次写博客两万字都卡的要命,原代码内容量大,可能会影响博客原本的布局美感,在此只是截取一段):68b5eb9d66cb4b01927b4e443a48830c.png

有点丑,直接问AI吧还是:

多头注意力机制先随机初始化三个权重矩阵,对应Q,K,V。使用随机初始化数值,满足Xavier 均匀分布,偏置是可以选择的,在源代码中默认存在偏置。

好像不对,自注意力机制是QKV都是x,也就是代码中的原始输入加上位置编码但是这样也就没有了学习的空间,没有从输入转化为合适的QKV部分(这个非常适合学习)。为了使之具有一定的自由度,我们生成了3个权重矩阵,将其与X相乘得到QKV。7b8694004000479e8c62d0829f73c015.png

 

直接看forward过程:

    def forward_post(self,src,src_mask: Optional[Tensor] = None,src_key_padding_mask: Optional[Tensor] = None,pos: Optional[Tensor] = None):q = k = self.with_pos_embed(src, pos)src2 = self.self_attn(q, k, value=src, attn_mask=src_mask,key_padding_mask=src_key_padding_mask)[0]src = src + self.dropout1(src2)src = self.norm1(src)src2 = self.linear2(self.dropout(self.activation(self.linear1(src))))src = src + self.dropout2(src2)src = self.norm2(src)return srcdef forward_pre(self, src,src_mask: Optional[Tensor] = None,src_key_padding_mask: Optional[Tensor] = None,pos: Optional[Tensor] = None):src2 = self.norm1(src)q = k = self.with_pos_embed(src2, pos)src2 = self.self_attn(q, k, value=src2, attn_mask=src_mask,key_padding_mask=src_key_padding_mask)[0]src = src + self.dropout1(src2)src2 = self.norm2(src)src2 = self.linear2(self.dropout(self.activation(self.linear1(src2))))src = src + self.dropout2(src2)return srcdef forward(self, src,src_mask: Optional[Tensor] = None,src_key_padding_mask: Optional[Tensor] = None,pos: Optional[Tensor] = None):if self.normalize_before:return self.forward_pre(src, src_mask, src_key_padding_mask, pos)return self.forward_post(src, src_mask, src_key_padding_mask, pos)

可选择的forward方法有两种,根据初始化在自注意力机制和前馈网络的顺序,分为post和pre,分别表示在自注意力和前馈网络之前进行归一化以及在自注意力和前馈网络之后进行归一化。

以post为例,首先先将位置嵌入,将q,k,v放入自注意力机制中,对于每个q,分别计算其与所有k相乘的结果,激活后乘以对应的v,得到对于每一个序列的output,将所有的output相加得到结果,(也就是输出),当然使用矩阵计算会更加方便。(保持形状相同)。

然后将dropout之后的finnaloutput与原始输入相加,再经过正则化处理。然后经过的一些列操作源码都很清晰的表示出来了,我将从图像输入到经过第一个encoder layer的过程绘制出来如下:(这里是单头的)。b2499fad3d504864a5915e992acb3c92.png事实上,我们采用的是多头注意力机制,原理如下:cedf667218324607a3b34beec3474fce.png

总结而来就是执行多个单头,然后将得到的结果按权重相加,这个权重也是学习来的,从讲故事的角度来说(当然,我认为作者是为了圆自己的说法,没有事实依据的胡扯):每个头会注意到不同的信息。

这里我使用的是forward_post:,在源码中是这样的:bca268a15a98439dbe1d5c7090a77d1e.png

整体是将6个encoder layers层上下接连起来,有意思的是,得到的输出本来就是在最后一个layer层里面归一化过了,但是仍要选择是否要进行进一步的归一化。最后得到输出。

为了清晰明了,作者还将最后一层的输出命名为memory。

编码部分算是过了,然后来看解码部分:

c3013a85b8184b739243b7e2791f2bd3.png

还是以forward_post为例,q和k为原始输入加上位置编码,然后将qk以及不包含位置信息的原始特征输入(其实是随机初始化的tgt),放进自注意力机制中去(代码后面使用了一个multihead_attn)可能会让人觉得自注意力机制不是多头的,其实不然,自注意力机制也是多头的。cf0e4bba5d1f413ba7490c420d749b0f.png

自注意力机制得到的结果经过一个残差连接之后,进行归一化,然后再经过一个多头注意力机制模块儿(这个注意力机制中的q为正则化结果再进行一次位置编码,k为encoder得到的输出经过位置编码之后的结果,v为encoder得到的输出)。

多头注意力机制得到的结果进行残差相加...光是叙述不够清晰明了,我还是作图吧。

等下,容我找找tgt在哪。

fa3be6d4eae64f62bc99c93518c5aa14.png

当然,这只是一层的输出,源码中是将每个层的输出都记录下来,得到6个输出后同样将第6层的结果再归一化,且记录下来,总的来说有7个输出。

4e59a89a4b9741a7870d7e1a1ee00f8a.png

有源码可知,最后通过一个线性层来预测得到种类:95d0aadb42bf4cd7931542cc9fc74bf2.png

运用三层感知机来预测边界框:

7411379bc24245f28d0d01e7f776c76b.png

 

相关文章:

Detr论文精读

摘要: 作者提到,该方法将物体检测看做直接的集合预测,在传统的目标检测算法中,会先生成候选区域,然后对每个候选区域进行单独的预测(包括物体的分类和预测框的回归),集合预测就是直…...

找寻孤独伤感视频素材的热门资源网站推荐

在抖音上,伤感视频总是能够引起观众的共鸣,很多朋友都在寻找可以下载伤感视频素材的地方。作为一名资深的视频剪辑师,今天我来分享几个提供高清无水印伤感素材的网站,如果你也在苦苦寻找这些素材,不妨看看以下推荐&…...

大模型~合集13

我自己的原文哦~ https://blog.51cto.com/whaosoft/12302606 #TextRCNN、TextCNN、RNN 小小搬运工周末也要学习一下~~虽然和世界没关 但还是地铁上看书吧, 大老勿怪 今天来说一下 文本分类必备经典模型 模型 SOTA!模型资源站收录情况 模型来源论文 RAE ​​ht…...

【Next.js 项目实战系列】04-修改 Issue

原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js 项目实战系列】03-查看 Issue 修改 Issue 添加修改 Button​ 本节代码链接 安装 Radix UI 的 Ra…...

【Linux】并行与并发(含时间片)

简单来说 并发:多个进程轮流使用同一个CPU,在逻辑层面上,一段时间内推进完成了多个进程 并行:机器中有多个CPU可以使用,在物理层面上,做到同一时间会有多个进程同时在运行 举个例子:一群人需要…...

【Flutter】页面布局:弹性布局(Flex)

在 Flutter 开发中,布局是非常重要的部分。布局系统允许开发者控制和管理界面上的组件如何排列和展示。弹性布局(Flex)是其中一个非常强大且常用的布局组件,它能够在水平方向或垂直方向上灵活调整子组件的空间分配比例。Row 和 Co…...

深入解析 Go 语言接口:多接口实现与接口组合的实际应用

文章目录 一、引言二、一个类型实现多个接口1. 定义多个接口2. 类型实现多个接口3. 使用多个接口 三、接口的组合1. 接口嵌套2. 实现复合接口 四、实际开发中的应用场景1. 多态与模块化设计2. 松耦合系统设计3. 测试与依赖注入4. 事件驱动架构中的应用 五、小结 一、引言 在 G…...

Eclipse——Java开发详解

Eclipse 1、配置JDK2、设置编译版本2.1、全局编译版本2.2、项目编译版本2.3、Web项目编译版本 3、设置工作目录4、创建Java项目5、配置Tomcat6、创建Web项目7、配置Maven8、创建Maven项目8.1、普通Maven项目8.2、Maven Web项目 9、创建SpringBoot项目10、设置字体11、设置代码提…...

练手小项目推荐

以下是一些练手项目推荐,我可以给你一些适合学生毕业设计的小项目建议,既可以锻炼技能,也能完成学术要求。以下是一些可行的毕业设计项目建议: 校园导航APP 功能:为校园内的新生和访客提供导航,标记教室、…...

一图秒懂色彩空间和色彩模型

色彩空间和色彩模型 想必学过图像处理或者摄影的小伙伴都知道这两个词,看了一些博客,发现很少有人把这两个概念说清楚的,大多数都是混在一起,色彩模型和色彩空间的概念混为一谈,很让人疑惑。   这里我们用一张图来解…...

控制Stable Diffusion生成质量的多种方法

在Stable Diffusion绘图中,控制AI生成图像的质量可以通过多种方法来实现。以下是几种常见的方法: 1. 从底模控制(Checkpoint) 使用不同的模型检查点(Checkpoints)可以显著影响生成图像的质量和细节。选择一…...

递归算法笔记

根据b站视频整理的 **视频地址:**https://www.bilibili.com/video/BV1S24y1p7iH/?spm_id_from333.788.videopod.sections&vd_source6335ddc7b30e1f4510569db5f2506f20 最常见的一个递归例子: 斐波那契数列:1,2,3…...

Android——发送彩信

跳转到相册选择图片 btn_jump.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {// 跳转到系统相册选择图片并返回Intent intent new Intent(Intent.ACTION_GET_CONTENT);// 设置图片类型为图片类型intent.setType("image/*&quo…...

对比迁移项目的改动

文章目录 对比迁移项目的改动场景背景解决方案 对比迁移项目的改动 场景背景 同源定制化项目,同一套代码扩展出来的项目(从领导口中得知) A项目的有三维地图展示,项目B跑起来却加载不出来,但是本地运行A项目代码&…...

数据结构-复杂度

复杂度 1.数据结构1.1算法 2.算法效率2.1复杂度的概念 3.时间复杂度3.1大O渐进表示法3.2时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例5:3.2.6 示例63.2.7 示例7 4.空间复杂度4.1.1 示例14.1.2 示例2 5.常见复杂度对比6.复杂度算法题6…...

无人机之放电速率篇

无人机的放电速率是指电池在一定时间内放出其储存电能的能力,这一参数对无人机的飞行时间、性能以及安全性都有重要影响。 一、放电速率的表示方法 放电速率通常用C数来表示。C数越大,表示放电速率越快。例如,一个2C的电池可以在1/2小时内放…...

免费开源AI助手,颠覆你的数字生活体验

Apt Full作为一款开源且完全免费的软件,除了强大的自然语言处理能力,Apt Full还能够对图像和视频进行一系列复杂的AI增强处理,只需简单几步即可实现专业级的效果。 在图像处理方面,Apt Full提供了一套全面的AI工具,包…...

VMware虚拟机三种网络模式详解

主要内容 1. 桥接模式2. NAT模式VMware Network Adapter VMnet8虚拟网卡的作用 3. 仅主机模式VMware Network Adapter VMnet1虚拟网卡的作用设置虚拟机联通外网 4. 总结 参考资料: 1.Vmware虚拟机三种网络模式详解 VMware虚拟机三种网络模式详解之Bridged&#xff0…...

【算法篇】动态规划类(4)——子序列(笔记)

目录 一、Leetcode 题目 1. 最长递增子序列 2. 最长连续递增序列 3. 最长重复子数组 4. 最长公共子序列 5. 不相交的线 6. 最大子序和 7. 判断子序列 8. 不同的子序列 9. 两个字符串的删除操作 10. 编辑距离 11. 回文子串 12. 最长回文子序列 二、动态规划总结 …...

【图解版】力扣第162题:寻找峰值

注意 题目只要求找到一个峰值就可以了。nums[-1]和nums[n]这两个位置是负无穷,也就是说,除了数组的位置之外,其它地方都是负无穷。对于所有有效的 i 都有 nums[i] ! nums[i 1] 方法一 遍历整个数组,找到最高的那个点。时间复杂…...

Windows电脑桌面如何弄个好用的提醒备忘录?

在这个充满挑战的时代,每个人都渴望成为更好的自己。然而,随着生活节奏的加快,我们时常发现自己陷入了各种琐事之中,难以脱身。为了不让重要的事情被遗漏,一款好的提醒备忘录工具就显得尤为关键。那么,Wind…...

Windows API 一 ----起步

目录 1.介绍主函数入口参数。 2. 简单介绍 Windows.h 这个头文件 小结,也聊一聊 1.介绍主函数入口参数。 第一个参数: HINSTANCE 类型的 参数, 称为“实例句柄“,这个参数唯一标志了我们写的这个程序。 第二个参数: HINSTANCE…...

音视频入门基础:H.264专题(19)——FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现

一、引言 从《音视频入门基础:H.264专题(18)——AVCDecoderConfigurationRecord简介》中可以知道,avcC跟AnnexB不一样,avcC包装的H.264码流中,每个NALU前面没有起始码。avcC通过在每个NALU前加上NALUnitL…...

【uniapp】设置公共样式,实现公共背景等

目录 1、 全局渐变背景色 2.1 创建common目录 2.2 在common下新建style和images等目录 2.3 在style下新建common-style.scss 2.4 common-style输入全局渐变颜色 2.5 引入样式 2.6 业务页面引入 2.7 展示 2、全局字体颜色 2.1 新建base-style.scss文件 2.2 设置base-…...

Node.js学习笔记

回顾: javascript 可以在浏览器运行 (js代码会JavaScript的解析引擎执行)chrome 》V8 (性能最好)FireFox 》 奥丁猴safri 》JSCoreIE浏览器 》查克拉JavaScript可以在浏览器端操作DOM 和BOM每一个浏览器都内置了B…...

resnetv1骨干

# 普通的卷积残差块 def apply_basic_block( x, filters, kernel_size3, stride1, conv_shortcutTrue, nameNone ): # 预设块名称前缀 if name is None: name f"v1_basic_block_{keras.backend.get_uid(v1_basic_block_)}" # 设置残差连接前…...

设计模式,面试级别的详解(持续更新中)

设计模式,面试级别的详解(持续更新中) 软件的设计原则 常⽤的⾯向对象设计原则包括7个,这些原则并不是孤⽴存在的,它们相互依赖,相互补充。 开闭原则(Open Closed Principle,OCP)单⼀职责原则…...

第9篇:网络访问控制与认证机制

目录 引言 9.1 访问控制策略概述 9.2 认证机制的使用 9.3 密钥分发与证书机制 9.4 访问控制与认证在网络安全中的应用 9.5 网络访问控制与认证的挑战 9.6 总结 第9篇:网络访问控制与认证机制 引言 随着计算机网络的不断普及,安全问题日益受到关…...

CentOS安装NVIDIA驱动、CUDA以及nvidia-container-toolkit

0.提前准备 0.1.更新yum源(以阿里为例) 0.1.1 备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 0.1.2 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base…...

STM32调试,发现HAL_Init();之后无法调试,甚至无法让程序停下来

参考文档: STM32调试,发现HAL_Init();之后无法调试,甚至无法让程序停下来 - asml - 博客园 症状 最近开始学习STM32Cube,发现新建工程后无法正常调试,过了HAL_Init();之后就无法继续调试了. 无法进行让程序暂停以及停止等操作.并在输出窗口不断刷出 ERROR: Can n…...