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

校园门户网站开发需求个人宽带弄网站可以吗

校园门户网站开发需求,个人宽带弄网站可以吗,精灵代理ip,做的网站怎么上传图片目录 DETR 这篇论文#xff0c;大家为什么喜欢它#xff1f;为什么大家说它是一个目标检测里的里程碑式的工作#xff1f;而且为什么说它是一个全新的架构#xff1f; 1 题目 2摘要 2.1新的任务定义#xff1a;把这个目标检测这个任务直接看成是一个集合预测的问题 2.…目录 DETR 这篇论文大家为什么喜欢它为什么大家说它是一个目标检测里的里程碑式的工作而且为什么说它是一个全新的架构 1 题目 2摘要 2.1新的任务定义把这个目标检测这个任务直接看成是一个集合预测的问题 2.2贡献端到端的框架新的目标函数强制模型输出独一无二的预测、使用了transformer encoder decoder架构、learned object query、并行出框 2.3好处想法上和实践上都很简单、性能不是最优但是很简单就能拓展到其他任务上 3引言加长版的摘要 4模型架构 5 结果AP不高但是很简单而且好拓展 6 相关工作基于集合的目标函数和encoder decoder的形式去做目标检测 7 方法 7.1基于集合的目标函数到底是怎么做的二分图匹配匈牙利算法一对一匹配 7.1.1二分图匹配问题的一个高效的解决算法匈牙利算法 7.1.2对于目标检测来说这个 cost Matrix 里面的值应该放什么呢loss分类loss和出框loss 7.2 DETR 的这个具体模型架构 7.2.1补充材料中提到的细节object query 的这个自注意力操作、在decoder后面加了很多额外的这个目标函数 8伪代码 8.1我们来看首先就是说你可以去定义一个DETR这个模型 8.2那具体DETR的模型长什么样我们看一下它是怎么初始化的。 8.3前向过程 9实验 9.1DETR跟之前的方法比如说Fasterrcnn比到底是个什么水平 9.1.1那如果我们来对比一下这一行就是 fast RCN 的 DC 5 模型和这个 DETR 的这个 DC 5 模型 9.1.2那同样的道理我们再把这个 backbone 换成 Resnet 101再把这个 FPN 也加上然后去跟 DETR 的这个 101 去比 9.2消融实验和可视化 9.2.1transformer encoder的可视化使用 transformer  encoder 之后其实图片里的物体就已经分得很开了 9.2.2transformer encoder数值上的表现transfer 编码器这个层数越深这个编码器学到的这个全局特征也就越好 9.2.3transformer decoder的可视化即使在遮挡这么严重的情况下它还是能把这个轮廓分得非常清楚 9.2.4object query 的可视化 总结 DETR 这篇论文大家为什么喜欢它为什么大家说它是一个目标检测里的里程碑式的工作而且为什么说它是一个全新的架构 大家好今天我们来讲一篇 ECC V20 的关于目标检测的论文。它的名字想必大家都不陌生也就这两年火热的DETR其实就是 detection Transformer 的缩写。这篇论文当时在 2020 年5月第一次挂到 arxiv 上的时候就引起了 CV圈 的强烈反响网上很多人都觉得这篇论文应该是 ECCV 20 的最佳论文。而且也就是从 20 年5月到今年5月两年的时间 DETR 的引用就已经超过了2000而且它的官方代码也有将近 9000 个star。如果我们跟去年大火的 clip 相比 CLIP 的官方代码到现在也只有 8000 个star所以可见 DETR 的受欢迎程度。那今天我们就来精读一下DETR 这篇论文看看大家为什么喜欢它为什么大家说它是一个目标检测里的里程碑式的工作而且为什么说它是一个全新的架构 1 题目 文章的题目非常简单明了就是 end to end object detection with Transformers。那这篇文章的两个关键词一个就是 end to end 这种端到端的目标检测另外一个就是使用了最近大火的Transformer来做目标检测。 那如果对目标检测了解不多的同学来说可能并不能体会到这个端到端的意义究竟有多大。而事实上从深度学区开始火一直到DETR目标检测领域里都很少有端到端的方法大部分方法至少最后还需要一个后处理的操作也就是 NMS 这个操作。 NON maximum suppression 非极大值抑制不论你是proposal based 方法还是 Anchor based 方法还是 NON Anchor based方法你最后都会生成很多的这个预测框那如何去除这些冗余的框就是NMS 要做的事情。而因为有了NMS 的存在这个模型在调参上就比较复杂而且即使训练好了一个模型部署起来也非常困难因为 NMS 这个操作不是所有硬件都支持的。所以说一个简单的端到端的目标检测系统是大家一直以来梦寐以求的而 DETR 就解决了以上说的这些痛点它既不需要proposal也不需要anchor直接利用 transformer 这种能全局建模的能力而把目标检测看成了一个集合预测的问题。而且也因为有了这种全局建模的能力所以说DETR不会输出那么多冗余的框它最后出什么结果就是什么结果而不需要再用 NMS 去做这个后处理了一下就让模型的训练和部署都简单了不少。作者其实在他们的官方代码里也写到他们的目的就是不想让大家一直觉得目标检测是一个比图像分类难很多的任务他们其实都可以用一种简单的优雅的框架去把它做出来而不像之前目标检测那些框架一样需要很多的这个人工干预需要很多的先验知识而且还需要很多复杂的甚至普通的库或者普通的硬件不支持的一些算子。 作者团队全部来自 Facebook AI 其实现在应该叫 Meta AI一座 Nicholas 是 NYU 的博士生这应该是在Facebook实习的时候做出来的工作。二作 Francisco 其实应该是老熟人了只要你用Pytorch多多少少都会在 Pytorch 的 issue 里看到 Francisco 给别人答疑或者论坛里给别人答疑或者说看到 Francisco 的 pull request Francisco 是pytorch最重要的维护者之一。然后 Alexander 可能对做 CV 的人来说也不陌生他就是第一个提出全景分割这个任务的就是 Panoptic segmentation。接下来他又做了 panoptic FPN后来又和凯明一起合作了 point RAN 的这篇论文所以在分割领域里非常有经验。这也就难怪DETR 在最后做了一个全景分割的实验拓展。 那在文章精读之前。我们先来看一下整篇文章的一个结构整个 DETR 算上附录的话其实还是比较长的一共有 26 页。那上来先是摘要然后引言然后是相关工作 D E T R 的相关工作还是写得比较好而且铺垫做得也不错。接下来三页主要就是讲的 D E T R这个方法。然后从第八页开始一直到第 13 页都是在目标检测这个任务上的性能。然后最后两页是做了一下全景分割的实验然后附录里面上来先是对一些概念做了一些铺垫比如说 Transformer 的结构还有使用的这些目标函数。接下来两页就主要讲了一下这个模型的具体结构以及训练的时候这个超参的设置然后再接下来两页就是写了一些更多的这个消融实验和结果。最后一页就是把这个DETR 的这个伪代码放上来了其实这里也不是伪代码已经是真真实实的pytorch的代码了。作者在这篇文章里反复就强调DETR而是一个非常简单的方法能把目标检测做的跟这个图像分类一样简单。最后的这个代码不到 50 行但却把DETR整个从模型的建立和模型的前向以及整个的推理过程全都包括了所以非常适合大家去上手学习以及在它上面做一些相应的拓展。 2摘要 2.1新的任务定义把这个目标检测这个任务直接看成是一个集合预测的问题 那接下来。我们就来先读一下这个摘要部分那在摘要里作者一上来就把这篇文章干了什么事交代清楚他们说我们这篇文章就是把这个目标检测这个任务直接看成是一个集合预测的问题。因为你本来的任务就是给定一个图片然后你去预测一堆框然后每个框不光要知道它的坐标还要知道这个框里所包含的物体的类别。但是这些框其实就是一个集合对于不同的图片来说它里面包含的框也是不一样的也就是说每个图片对应的那个集合也是不一样的。那我们的任务就是说给定一个图片我要去把这个集合预测出来但是听起来这么直接的一个设置之前很少有人把它做work。 2.2贡献端到端的框架新的目标函数强制模型输出独一无二的预测、使用了transformer encoder decoder架构、learned object query、并行出框 然后这篇文章的贡献就是把这个目标检测做成了一个端到端的框架之前特别依赖于人的先验知识的部分都给删掉了。比如说最突出的这个非极大值抑制的这个部分还有就是生成 Anchor 的这个部分那一旦把这两个部分拿掉之后我们也不用费尽心思的去设计这种 Anchor 了而且最后也不会出这么多框也不会用到NMS也不会有那么多的超参需要去调所以说整个网络就变得非常的简单。 那作者接下来说那具体 detr 提出了什么呢 DeTR 提出了两个东西一个就是提出了一个新的这个目标函数它就通过这种二分图匹配的方式能够强制模型去输出一组独一无二的这个预测。意思就是说没有那么多冗余的框了每个物体理想状态下它就会生成一个框。 那另外一个贡献就是使用了这种 Transformer encoder decoder 的架构。 那具体来说还有两个小贡献或者说有两个小细节是在这个 consumer encoder decoder 这边的一个就是在 Transformer 解码器的时候我们还有另外一个输入也就本文中说的这个 learned object query这个其实也有点类似于 Anchor 的意思我们接下来会细讲。总之在给定了这些 object query 之后DETR就可以把这个 learned object query 和这个全局的图像信息结合在一起通过不停地去做这种注意力操作能够让模型直接输出最后的一组预测框。而且作者这里还强调了一下是 in parallel 就是一起出框了为什么要强调一下是并行出框其实有两个原因一个原因是在 Translora 原始的 2017 年那篇论文里它的那个 decoder 因为是用到自然语言处理的任务上所以它还有一个掩码机制就是它采用的是一种自回归的方式就一点一点把这个文本生成出来的。而这里我们是做视觉里的这个目标检测任务我们是一股脑就把这些目标检测框全都输出来的所以跟 NLP 那边是不一样的。而且第二点不论是从这个想法上还是从这个时效性上来说并行都比串行要更合适。因为首先这些框它是没有一个顺序的并不是说我检测一个大物体就要先依赖于检测小物体或者说检测图片右边的物体就要依赖于图检测图片左边的物体它没有一个先后的顺序所以说没法做这种自回归的预测。第二对于视觉尤其对于检测任务来说我们肯定是希望它越快越好越实时性越好那所以说并行一起出框肯定是要比顺序的一个个出框要时效性高很多的。 2.3好处想法上和实践上都很简单、性能不是最优但是很简单就能拓展到其他任务上 那说完了DETR具体干了个什么事情那作者接下来就要吹一下DETR有什么好处了那我们会发现作者这里头把这个简单性排到了第一位他说这个新的模型从想法上来看非常简单而且从实践上来看它也不需要一个特殊的 deep learning library那只要你这个库或者你这个硬件支持 CNN 和Transformer那你就一定能支持 D E T R。那卖完了这个简单性之后作者还提到了这个性能那在 Coco 这个数据集上 DETR 和一个训练的非常好的 fast RCN 的基线网络取得了差不多的这个结果。而且这个模型内存速度也和 fast RCN差不多那其实光从目标检测的这个性能上来说 DETR 在当时不是最强的甚至说它和当时最好的方法差了将近 10 个点。因为当时最好的方法在 Coco 这个数据集上已经有 52、53 的这个 AP 了。但是 DETR 只有44不过 DETR 实在是想法太好真的是解决了目标检测里很多的痛点而且写作也非常好所以说中稿肯定是没有问题的。不过即使如此可能作者也有点虚所以说他又试了一下别的任务结果发现了在全景分割这个任务上 DETR 的效果还是非常不错的。所以说最后作者又列了一下这个优点就是DETR能够非常简单的就能拓展到其他的任务上比如说就可以去做全景分割了模型的大半部分就是前半部分都不用动就是用detr只不过在后面加一个专用的分割头就可以了。那这个性质其实非常厉害了尤其是对于一个新的方法来说因为它本来就是挖了一个坑那你这个坑肯定是挖得越大越好这样接下来才会有更多的人来填坑嘛。所以反而从这个角度来说这个性能稍微差一点其实是好事因为接下来大家才会在你这个上面继续去做所以接下来我们会在结论里的时候也提到最近基于DETR的这个改进工作层出不穷光 CVPRR 中稿的我看可能都会有 10 篇左右了。然后最后作者说他们的这个代码全都在 Facebook research 下面这个 detr 的 repo 里感兴趣的同学可以去玩一玩。我其实也是非常建议去读一下代码的。Facebook research的这个代码库一般都写得非常好尤其是本来就是做开源的人写出来的这个代码库真的是看起来都是一种享受。 3引言加长版的摘要 接下来我们就直接来看引言部分 DETR 的引言其实就是它摘要的一个加长版然后加了很多细节我们一段一段来看。 作者上来先说其实这个目标检测任务就是对于每一个这个感兴趣的物体我们去预测一些框和这个物体的类别所以说白了它就是一个集合预测的问题。但是现在大多数好用的这个目标检测器都是用一种间接的方式去处理这个集合预测的问题的比如说 就是用这种 proposal 的方式就是 RCN 系列的工作 RS RCNN musk RCN cascade RCNN或者就是用anchor这种方式就 yellow for goloss。还有就是最近的一些 non anchor base 的方法比如说用物体的中心点 center net 或者 f cost 这种方法。 这些方法都没有直接地去做这个集合预测的任务而而是设计了一个替代的要么是回归要么是分类的任务去解决这个目标检测问题。但是所有之前提到这些方法就是这些应用特别广的检测器它们的性能很大程度上受限于后处理这步操作也就是N MS 这步操作。因为这些方法都会生成大量的这种冗余的框也就是他这里说的 near duplicate predictions就是接近重复的这种预测对于同一个物体会大大小小的左左右右的出来很多框所以最后就得用 NMS 去把这些框都抑制掉。但是也因为用了Anchor因为用了IMS所以导致这些检测器都非常的复杂而且非常的难以优化非常的难调参。 所以为了简化这个流程本文 DETR 就提出了一个直接的方式去解决这个集合预测的问题。从而巧妙地绕过了之前所有的这些代理任务也就绕过了人工设计的这些部分比如说生成Anker比如说使用NMs。然后作者说这种端到端的思想其实已经在很多别的任务里大范围的使用了而且能使这些任务都变得更加的简单更加的好用。但是在目标检测领域还没有人这么做过之前也有一些类似的尝试比如作者这里列的 learnable IMS 或者soft IMS。他们一定程度上简化了这个目标检测的流程但是要么就是融入了更多的这种先验知识要么呢就是在这些比较难的 Benchmark 数据集上取得不了很好的成绩。所以最后作者总结第一段我们的目的就是要把这个鸿沟弥补上就是我们不需要使用更多的这种先验知识我们就是端到端的一个网络同时还能在这些比较难的数据集上取得最好的结果。 4模型架构 那接下来作者又讲了几段话大概描述了一下 D E T r 是什么有什么好处那其实我们就看这个图一基本上就能知道。图一就是把 D E t r 整个的这个流程大概画了一下 其实就是分几步第一步就是先用一个卷积神经网络去抽一个特征 然后在拿到这个特征之后我们把它拉直送给一个 Transformer 的 encoder decoder那在这里 Transformer encoder 的作用就是去进一步的学习这个全局的信息这样为接下来的decoder也就是为了最后的这个出预测框做铺垫。作者后面也会用很多的这个实验和图来说明为什么我们要用Transformer encoder。但最直观最简单的理解就是如果使用了Transformer encoder那每一个点或者说每一个特征就跟这个图片里其他的特征都会有交互了那这样他大概就知道哪块是哪个物体哪块又是另外一个物体那对于同一个物体来说你就只应该出一个框而不是出好多个框所以说这种全局的特征非常有利于去移除这种冗余的框。然后在做完第二步这个全局建模也就是 Transformer encoder 之后 那接下来第三步就是用Transformer decoder 生成这个 框的输出。那这里作者其实没有画这个 object query但其实这个 object query 挺重要的。也就是说当你有了这个图像的特征之后你这里还会有一个object query这个 query 其实就是限定了你要出多少个框然后你通过这个 query 和这个特征不停地去做这个交互在这个 decoder 里去做这个自助力操作从而得到了最后的输出的这个框。在论文里作者选择的这个框数是100是一个固定的值所以就意味着不论你是什么图片你最后都会预测出来 100 个框。 那现在问题来了那你出的这 100 个框怎么去和 ground truth 这个框做匹配然后去算loss。那就是文章的第四部分也就是它最重要的一个贡献就是它把这个问题看成是一个集合预测的问题最后它就能用这种二分图匹配的方法去算这个loss。比如说这里 ground truth 其实就只有两个框那在训练的时候通过算这 100 个预测的框和这两个 ground truth 框之间的这种matching loss从而决定出在这 100 个预测中哪两个框是独一无二的对应到这个红色和黄色的ground truth 框的。一旦决定好这个匹配关系之后然后才会像普通的目标检测一样去算一个分类的loss再算一个 bonding box的loss而至于那些没有匹配到 ground truth 的框也就是剩下 98 个框。其实就会被标记成没有物体也就是所谓的这个背景类 所以总结一下其实就是四步第一步用卷积神经网络抽特征第二步用 Transformer encoder 去学全局特征帮助后面做检测。第三步就是用 Transformer decoder 去生成很多的这个预测框。第四步。就是把这个预测的框和 ground truth 的框做一个匹配然后最后在匹配上的这些框里面去算这个目标检测的loss这样整个模型就能训练起来了。 那推理的时候DETR是怎么做的同样的道理前三步都是一致的先用卷积神经网络去突出特征然后通过一个 transformer encoder decoder 去生成最后的输出。只有第四步不一样因为训练的时候你需要去算这个二分图匹配的loss但是在你做推理的时候其实第四步这个 loss 是不需要的你直接在你在最后的这个输出上你用一个阀值去卡一下这个输出的置信度那最后模型比较置信的也就是那些置信度大于0. 7 的预测就会被保留下来也就是所谓的前景物体那剩下所有的那些置信度小于0. 7 的就被当成背景物体了。所以说我们可以看到DETR这个框架不论是在训练的时候还是在做推理的时候都没有 Anchor 生成的这一步而且也都没有用到NMS。 5 结果AP不高但是很简单而且好拓展 说完了模型的架构作者最后就卖了一下结果而且还顺带提了几个细节。 第一个结果就是在 Coco 这个数据集上DETR取得了跟之前一个 fast RCN 的这个基线网络匹配的结果就是不论从 AP 这个性能上还是从模型大小和这个速度上都差不多。而且尤其值得一提的是虽然这个 AP 结果差不多。但是大物体的 AP 和小物体的 AP 差的还是非常远的。比如说DETR就对这个大物体表现特别的好作者就觉得这个应该归功于使用了Transformer所以你能做这种全局的建模了那这样不论这个物体有多大它应该都能检测出来而不像原来一样如果你使用 Anker 的话它就会受限于Anchor 的这个大小。 但是同时 DETR 也有缺陷比如说它的这个小物体上效果就不怎么样那作者觉得这个还好毕竟 DETR 是一个新的框架它也需要时间去进化那像之前的那些目标。检测器也都是通过了多年的进化才达到现在这个水平的。比如说 EULO V1V2V3。V4V5、还有RCN fast RCN mask RCN还要加 FBN 的 RCN 以及现在的Cascade RCN。所以作者这里就说接下来肯定是会有这个后续工作来提高这一点的。就像几年前 FBN 对fasterRCN 做的一样通过使用这种多尺度的特征能够提升这个小物体的检测。而事实上确实如此只不过这次不是像之前一样用了一年半的时间才从 fast RCN 到FPN。这次只用不到半年的时间。effective 第一条就出来了不仅很好地通过这种多尺度的特征解决了小物体这个问题同时也解决了作者接下来提到这个问题就是第一条训练太慢DETR确实训练特别慢想要达到很好的效果。作者训练了 500 个epoch其实对于 Coco 来说大家一般就训练几十个epoch所以 500 个 epoch 相当于是 10 倍于之前的这个训练时长。 但这里也是很值得我们学习的一点就是当你改变了这个训练setting使你这个方法跟之前的方法都没法去做公平对比的时候你怎样做才能让审稿人相信你的说法才能让审稿人放过你我们回头可以看一看D ETR 是怎么解决的。那最后作者就强调了一下 DETR 不光是做检测的一个方法它其实是一个框架它可以拓展到很多别的任务上这也就是作者这里说的这个 DETR 的这个设计理念就是为了能够适应于更多的这种复杂的任务的从而让这些复杂任务都变得简单而且甚至有可能用一个unified一个统一的框架去解决所有的这些问题。而事实上作者也确实做到了不光是在这篇论文里它能验证出DETR 对这个全景分割有用而接下来在很多别的后续工作里也验证了 DETR 的有效性很快就把 DETR 拓展到这个目标追踪还有视频里的姿态预测视频里的语义分割等等各种任务。所以DETR真的是遍地开花也难怪那么多人觉得 DETR 有拿这个最佳论文的潜质。 6 相关工作基于集合的目标函数和encoder decoder的形式去做目标检测 那接下来我们看一下相关工作。在相关工作这一节作者其实讲了三个部分。作者先讲了一下集合预测这个问题以及之前大家一般都是用什么方法去解决这种集合预测的问题。因为视觉这边用这个集合预测去解决问题的不多所以作者觉得有必要来科普铺垫一下然后第二条相关工作作者就介绍一下 Transformer 以及这种 parallel decoding就是如何不像之前的那些 Transformer decoder 一样去做那种自回归的预测而是一股脑一口气把这个预测全都给你返回来。然后第三条路就是介绍了一下目标检测之前的一些相关工作我们这里就着重讲一下第三个方向 那我们直接来看相关工作的 2. 3 节目标检测。作者上来说现在的大部分的这个目标检测器都是根据已有的一些初始的这些猜测然后去做这些预测的。 比如说对于这种 two stage 的目标检测方法来说它们的初始猜测就是中间的这个proposal。那对于这种 single stage 的目标检测方法来说它们的初始猜测就是anchor或者说是这种物体的中心点。 但是最近的一篇论文做了详细的比较他发现之前的这些方法它们的性能跟刚开始的这个初始的猜测非常相关。那所以说你怎么去做这个后处理得到最后的这个预测其实对这最后的性能的影响是至关重要的所以作者这里就从两个方面来阐述了这件事情 第一个就是用这种集合的思想来做就是 set based loss。那之前有没有类似的工作用这种基于集合的目标函数去做目标检测其实肯定是有的那比如说作者这里说的这种可以学习的NMS 的方法或者说这种关系型的网络它都可以利用这种类似于自注意力的方法去处理物体之间的这种联系从而导致最后能得出这种独一无二的预测这样就不需要任何的这个后处理的步骤了。但是这些方法的这个性能往往都比较低那为了跟当时那些比较好的方法这个性能对齐那这些方法往往又用了一些人工干预比如他这里说的用手工设计的这种场景特征去帮助模型进行学习。但是DETR的目标是想让这个目标检测做的尽可能的简单所以他不希望这个过程特别复杂他也不希望用到过多的这种人工先验的知识所以这就是 DETR 和之前的方法的区别。那除了目标函数之外第二个作者想讲的就是这个 recurrent detector就是之前有没有类似的工作用这种 encoder decoder 的形式去做目标检测其实也是有的不光是有做这种目标检测而且还要做这种实例分割的工作还是蛮多的。但是这些工作全都是 1516 年的时候的工作那个时候大家去做这种 recurrent detector 全都是用的是RNN那因为你用了RNN所以说你肯定是自回归的模型所以你这个时效性就会比较差而且你这个性能也会比较差。而 DETR 因为用了 Transformer 的 encoder decoder所以我们后面可以看到不光是利用了Transformer encoder 以后我们能得到更全局的信息从而这个目标检测更容易做了。而且用了这种 Transformer 不带掩码机制的decoder。DETR 最后能够一起把这些目标框全都输出来从而达到这种parallel decoding所以时效性大大增强了。 但其实当我们看了这些相关工作之后我们发现其实让 DETR 工作的最主要的原因还是因为使用了Transformer因为之前大家也试过基于集合的这种目标函数也利用匈牙利算法去做过这个二分图匹配但是因为你这个 backbone 出来的特征不够强所以最后的性能不好你还得依赖一些先验知识或者人工的干预从而让你达到更好的性能。 那第二个方向也一样之前也有人已经用 RNN 去做过这种 encoder decoder 的方式了只不过因为没有用Transformer所以说它的结果不够好它跟当时的别的那些基线模型比不过所以说白了 DETR 的成功还是Transformer的成功。 7 方法 那接下来我们就来看一下文章的主体部分就是 DETR 这个方法。那在主体方法部分其实主要分了两块第一块就是 3. 1 节主要说了一下基于集合的目标函数到底是怎么做的作者是如何通过一个二分图匹配把这个预测的框和这个 ground truth 的框连接在一起从而算得这个目标函数的。然后第二个章节 3. 2主要就是讲了一下 DETR 的这个具体模型架构。也就我们刚才在图一里说过的那四步作者这里也分了四小段去分别说明这四步在干什么。 7.1基于集合的目标函数到底是怎么做的二分图匹配匈牙利算法一对一匹配 我们回到正文我们可以看到这个第三章一开始作者就是说我们这一章节主要就讲了两个东西一个就是基于这种集合的目标函数另外一个就是这个 DETR 的这个结构。那之所以把这目标函数放在前面而把这个结构放在后面其实是因为这个结构相对而言还是比较标准的你用一个 CNN 去抽一个特征然后再用一个 Transformer encoder decoder 去做这种特征的强化然后最后出这个预测框相对而言还是比较好理解而且比较标准的没什么太多可以讲的。就算是这个object query 是一个比较新的东西但就是非常小的一个东西它可能几句话就解释清楚了反而是基于集合的这种目标函数是比较新的东西正是因为有了这个目标函数所以我们才能达到这种一对一的这个出框方式所以才能不需要NMS。所以作者这里就先说了这个目标函数那具体来说这个目标函数是怎么回事为什么我们之前说了好多遍这个二分图匹配什么匈牙利算法什么一对一匹配这到底都是什么意思读完这个章节之后可能大家就会有一个更清晰的了解作者这里说 DETR 这个模型最后的输出是一个固定的集合就是说不论你这个图片是什么你最后都会输出 n 个输出。那在这篇论文里 n 就是100也就是说任何一张图片进来最后都会给你扔出来 100 个框那一般而言这个 n 也就100应该是比这个一张图片中所包含的物体个数要多很多的那普通的一张图片可能里面就含有几个或者十几个物体。尤其是对于Coco 这个数据集而言 Coco 里一张图片里包含的最大个体数也没有超过100所以说作者这里把 n 设成 100 就足够用了。但是现在问题就来了你这个 DETR 每次都会出 100 个输出但是实际上像我们刚才说的一样一个图片的这个 ground truth 的 bonding box 可能只有几个那你如何去做这种匹配你如何去算loss你怎么知道哪个预测框就对应那个 ground truth 框所以这里作者就把这个问题转化成了一个二分图匹配的问题。 7.1.1二分图匹配问题的一个高效的解决算法匈牙利算法 那接下来我们就来先说一下这个二分图匹配到底是个什么问题。那如果你去上网搜或者去看这个维基百科大部分的讲解都是给了这么一个例子就是如何分配一些工人去干一些活儿从而能让最后的这个支出最小。就比如说现在我有三个工人就是a、b、c然后我要去完成三个工作也就是分别是x、y、z然后因为每个工人他各自有各自的长处和短处所以说他完成这些工作他需要的时间或者需要的工钱也不一样所以最后就会有这么一个矩阵每个矩阵里就有他完成这项任务所需要的时间或者说完成需要任务所需要的钱。然后这个矩阵就叫 cost Matrix也就叫损失矩阵。那这个最优二分图匹配的意思就是说最后我能找到一个唯一解能够给每个人都去分配它对应最擅长的那项工作然后使得把这三个工作完成最后的这个价钱最低。那其实说的更直白一点我就是用遍历的算法我也可以把这个做出来我所有的这个排列组合我都跑一遍我最后看哪个花的钱最少我就选哪个就好了但是这样这个复杂度肯定就非常高了那就有很多的算法来解决这个问题。那像这个匈牙利算法就是其中一个比较有名而且比较高效的算法。那其实一般遇到这个问题大家都有成熟的解决方案了比如说大家一般就会用 CYPI 这个包里提供的一个函数叫做 linear sum assignment去完成这个 linear sum assignment 这个函数它的输入其实就是这个 cost Matrix你只要把这个 cost Matrix 给它就能给你算出来一个最优的排列告诉你哪个人应该干哪个活。其实在DETR这篇论文里它的代码里也用的是这个函数为什么呢其实你仔细一想目标检测这里其实也是一个二分图匹配的问题那你可以把这个 ABC 看成它 100 个预测的框然后把这个xy z 看成是 ground truth 的框当然了这个 cost Matrix 不一定是个正方形它也可以是长方形总之你都是可以扔到这个函数里去得到一个最优匹配的。 7.1.2对于目标检测来说这个 cost Matrix 里面的值应该放什么呢loss分类loss和出框loss 那既然我们已经知道可以用这种方法去解决现在的这个问题那对于目标检测来说这个 cost Matrix 里面的值应该放什么呢其实你从 cost Matrix 里就可以看出来它里面就应该放的是cost也就是损失那损失是什么其实就是loss。那 loss 是什么那对于一般目标检测来说 loss 就可以用来算它其中包含两个部分一个就是你分类对不对有一个分类的loss另外就是有一个这个出框的这个准确度你这个框预测的准不准。所以说也就是遍历所有的这些预测的框然后拿这些预测的框去和 ground truth 的框去算这两个loss然后把这个 loss 放到这个 cost Matrix 里就可以了。一旦你有了这个loss你就可以用 scipy的这个 Linear sum assignment也就这个匈牙利算法去得到最后的这个最优解。 那作者这里其实也给了一些注释。他说其实这个找最优的这种匹配跟原来利用人的这个先验知识去把预测和之前的这种 proposal 或者 anchor 做匹配的这种方式是差不多的都是一个意思只不过这里的约束更强就是我一定要得到一个一对一的这个匹配关系而不是像原来一样是一对多的。也就是说我现在我只会有一个框跟 ground truth 的框是对应的这样我后面才不需要去做那个后处理NMS。 那一旦你做完了这个匹配这一步骤也就是说你一旦知道了这 100 个预测框中有哪几个框跟这个 ground truth 框是对应的那接下来你就可以算一个真正的目标函数然后用这个 loss 去做梯度回传去更新模型的参数了。 准确地说最后的目标函数其实就是 那乍一看还是两个loss一个是这个分类的loss一个是这个出框的loss那DETR这里作者做了两个跟普通的目标检测不太一样的地方。 第一个一般大家在做这种分类的 loss 的时候都是用这个 log 去算的但是作者这里为了让这个 loss 和后面这个 loss 大概在同样的这个取值空间所以作者把这个 log 给去掉了作者发现了这样的结果最后会稍微好一些。那第二个改动就是在这个 bonding box 这块之前的工作一般都是用一个 L1 loss 就可以了。但是对于 DETR 来说用L1 loss 可能就有点问题因为 L1 loss 跟这个出框的大小有关系你这个框越大你最后算出来那个 loss 就容易越大。那因为DETR 我们之前也说过它用了transformer这种全局的特征所以它对这种大物体很友好所以它经常会出大框那出大框它这个 loss 就会大所以就不利于优化。那所以作者在这里不光是使用了一个L1loss它还用了一个 generalized i o u loss。那这个 generalize io u loss 就是一个跟框大小无关的一个目标函数。 所以作者这里就用了 io one loss 和 generalized i o u loss 的一个合体来算最后这个 bonding box 的loss但这就属于是小的实验细节了。总之最后的这个目标函数跟普通的目标检测来说也是差不多的只不过是先去算了一个最优匹配然后在最优匹配的上面再去算这个loss这个就是 DETR 的 基于集合预测的目标函数从而能做到出的框和 ground truth 能够做到一一匹配而不需要 NMS。 7.2 DETR 的这个具体模型架构 那主体方法的第二部分就是 DETR 的这个整体网络框架文字里其实有很多的细节但是其实我们只用看这个图 2 就已经基本知道DETR 在干什么了。 这个图 2 也就是图一的一个升级版图一画的很简单就是让大家看清楚这个第一条的这个 flow 是什么样这里面的图 2 就把每个步骤画得更清晰了一些。接下来我还是会走一遍这个前线过程从而让大家更清晰的知道这个DETR是怎么运作的。那在DETR 的这个官方代码库里作者也提供了一些Notebook所以大家可以去玩。那在其中一个 notebook 里作者就给了一个做推理的例子那在那个例子里 这个输入图片的大小就是 3 * 800 * 10663就是 RGB channel对这个图片而言还是相当大的做检测分割一般这个输入图片都会大一些而不像分类那边是 224 * 224。 那第一步就是通过这个卷积网络去得到一些特征那走到卷积网络的这个最后一层走到 CONv 5 的时候其实你就会得到这么一个特征就 2048 * 25 * 34那这个 25 和 34 就分别是之前的 800 和 1066 的 1/ 32然后 2048 就是这个对应的通道数。 然后接下来因为你要把这个特征扔给一个Transformer所以说作者这里就做了一次 1 * 1 的降维操作就把这个 2048 变成了256所以说从这个卷积神经网络出来的这个特征维度就是 256 * 25 * 34。 那接下来因为要进transform而 Transformer 是没有这个位置信息的所以说我们要给它加入这个位置编码那在这里面这个位置编码其实是一个固定的位置编码它的维度大小也是 256 * 25 *34。那目的很简单就是因为这两个东西是要加在一起的所以说它的这个维度必须得一致。那好了现在这两个东西加到一起之后其实就是 Transformer 的输入了这时候你只需要把这个向量拉直的意思也就是说把这个 h 和 w 拉直变成一个数值也就是变成了这个 850 * 256那 850 就这个序列长度那 256 就是这个 Transformer 的 hidden dimension。 那接下来就跟一个普通的 Transformer encoder或者跟我们之前讲过的 vision Transformer 是一样的了那你这个输入是 850 * 256那你不论过多少个这个 Transformer encoder block你最后的输出还是 850 * 256那在 DETR 里作者这里使用了 6 个encoder也就是说这里会有 6 个 Transformer encoder 这样叠起来那这第二步其实也就算走完了。 那第三步就是进入一个decoder然后去做这个框的输出。那这里面就有一个新东西了也就我们之前反复提到过的这个 object query这个 object query 其实是一个 learnable 的embedding就它其实是可以学习的而且准确的说它是一个 learnable 的 positional embedding那它的维度是 100 * 256那 256 是为了和之前这个 256 对应这样子大家才好在一起做乘法。然后 100 的意思也就是说告诉这个模型我最后要得到 100 个输出其实你也可以把它理解成是一种 anchor 的机制或者是一种condition就是一个条件我给你这个条件之后你这个模型基于我这个条件最后做出什么样的判断。 然后在这个 Transformer decoder 里头其实就做的是一个 cross attention就是说我的输入是这个object query 是 100 * 256。然后我还有另外一个输入是从这个图像端拿来的全局特征是 850 * 256这时候我拿 850 * 256 和这个 100 * 256 去反复的做这种自制力操作最后就得到了一个 100 * 256 的特征。同样的道理 DETR 里也用了 6 层decoder也就是说这里是有 6 个 transformer decoder 叠加起来的那这个每层的输入和输出的维度也都是不变的始终是 100 * 256 进 100 * 256出。 那第三步其实也就说完了那你拿到这个100 * 256 的这个最终特征之后其实最后就是要做这个预测了就是要在上面加一个这个检测头那检测头其实是比较标准的就是加一个 feed forward network就是一些MLP。那准确的说就是你把这个特征给这些全连接层然后这个全连接层就会给你做两个预测一个是做物体类别的预测一个是做出框的预测那类别如果是 Coco 就是 91 类。然后框其实就是四个值分别对应的是x、y就是这个出框的中心点以及这个框的这个高度和宽度。 那一旦我们用了这 100 个预测框我们就可以去和这个 ground truth 里的这两个框去做这种最优匹配然后用匈牙利算法然后去算得最后的这个目标函数然后梯度反向回传然后来更新这个模型这样一个端到端的可以学习的 DETR 模型就实现了。 7.2.1补充材料中提到的细节object query 的这个自注意力操作、在decoder后面加了很多额外的这个目标函数 当然了模型这里还有很多的细节比如说在补充材料里作者就强调说在这个 transformer decoder 里在每一个 decoder 里都会先做一次这个 object query 的这个自注意力操作。但其实在第一层这个 decoder 里它可以不做是可以省掉但是后面那些层都不能省掉。这个 object query做这个自助力的操作主要就是为了移除这种冗余框因为它们之间互相通信之后就知道你每个 query 可能得到什么样一个框我们尽量不要去做重复的框。 另外还有一个细节就是在最后算 loss 的时候作者发现为了让这个模型收敛的更快或者训练的更稳定所以它在这个 decoder 后面加了很多叫 auxiliary loss就是加了很多额外的这个目标函数。其实这是一个很常见的 trick 了之前。在这个检测分割里尤其是分割里是用得非常常见的。就是说我不光在最后一层去算这个loss我在之前的这些 decoder 层里也去算loss因为其实你每个 decoder 最后出来的输出都是 100 * 256你都可以在这个 100 * 256 上去做这个FFN然后得到这个输出所以作者这里就是在每一个 decoder 后面就是123456在六个 decoder 后面都加了这个 FF n而去得到了这个目标检测的输出然后去算了这个loss。当然这里面这些 FFN 全都是共享参数。 8伪代码 那其实到这儿就把DETR整个方法已经说完了那为了巩固一下我们再过一遍这个伪代码顺便来看一下 DETR 到底有多简单。作者这里说他用不到 50 行的代码就是这是完全可以跑的其实不是伪代码是直接可以跑的 Pytorch 代码那这个版本其实是经过了一些简化的所以说最后的结果没有那么高那在文章里其实 DETR 的基线模型有42那这个版本训练出来其实就只有 40 的准确率但是就已经可以整个完全反映出 DETR 的结构了。 8.1我们来看首先就是说你可以去定义一个DETR这个模型 然后像 Coco 的话就有 91 个类你这个 Transformer 里的 hidden dimension 就是256然后你多头自注意力用了8然后你用了 6 个这个 encoder layer然后你 decoder layer 也是6所以你就创建了一个DETR的这个模型。 8.2那具体DETR的模型长什么样我们看一下它是怎么初始化的。 那首先第一步他需要一个卷积神经网络的backbone对吧那所以说这里面他就去找了一个 预训练好的 res 50然后把这个 backboon 抽出来所以 backbone 有了然后接下来有一个投射层也就把这个 2048 变成256也就是这层 conv投射层。接下来它就需要这个transformer encoder decoder 了也就是这个函数就定义好了那 decoder 最后就会给你一个 100 * 256 的特征那基于这个特征你就可以做预测了。那预测的时候你就需要有两个FFN一个 FFN 就是做这种类别的预测那另外一个 FFN 就是做这个框的预测。那接下来这个 query positioning embedding其实就是 object query我们可以看到这里设的是100最最后会出 100 个框然候这个 positioning embedding row embedding 和 column embedding 其实就是最开始跟这个卷积神经网络出来的特征加在一起的那个固定的embedding。 8.3前向过程 OK那现在模型定义完了我们就来看一下这个前向过程那前向过程很简单给一个输入我们过一下backbone得到一个 2048 的特征过一下这个投射层就得到了 256 的特征然后得到 256 的特征之后我们要把它拉直所以 h 就 flatten 了就拉直了就变成 850 * 256 那个特征了。然后这时候因为你给了transformer你需要位置信息所以说你就自己先设了一个位置信息编码你把这个位置信息编码和这个 H一加这就是 Transformer 的输入了。那同时这个 Transformer 里不光是有encoder还有decoder那 decoder 输入你就还需要有一个 object query所以这时候你就要把这个 query positioning embedding 也传进去所以说 Transformer 它收到了两个输入一个是图像那边来的这个全局特征输入一个是这个 object query 的输入。那最后经过这个 transformer 的 encoder decoder最后我就得到了一个 100 * 256 的这个特征h那基于这个h我做一次 FFN 就得到了这个物体类别的判断然后再做一次 FFN 就得到了这个框的判断所以最后就得到了这个 Logis 和bonding boxes 所以在这里完全没有 NMS 这个后处理操作而且整体结构非常的简单直白大家立马就对 DETR 这个结构爱不释手。 9实验 那讲完了文章的主体方法部分接下来我们就来看一下实验我们主要就是看一下几个表格和图。从而心里能得到一个感受就是DETR跟之前的方法比如说Fasterrcnn比到底是个什么水平以及为什么要用 Transformer encoder 到底好在哪里还有就是通过可视化看看 object query 到底学到了什么。 9.1DETR跟之前的方法比如说Fasterrcnn比到底是个什么水平 那首先我们直接来看表一里。就是对比了一下 DETR 和之前的这个 fast RCN 的方法这个性能上到底如何。 这个表里的上半部分其实是 detectron two 里的 fast RCN 的实现 因为在这篇论文里 DETR 还用了一些别的技巧比如说使用 GLU loss比如说使用了更多的数据增强而且训练了更长的时间所以说作者又在中间把这些同样的模型又重新训练了一遍就是用这些更好的训练策略去把上面这三个模型又训练了一遍。 所以我们也可以看到其实模型都是一个模型只不过在后面用这个加号来表示是它这个提升版。所以这也就是为什么对于这个gflops、 FPS 还有这个模型参数量它们其实都是一样的因为它本来就是一个模型只不过是训练的策略不一样。然后但是我们也可以看出来这个训练的策略非常重要你就把这个训练策略改一改这个性能就提升蛮大的 39- 41、40- 42、42- 44基本稳健的都能提升两个点。 那作者这里接下来做对比其实就是做这个中间和下面的对比因为他们的训练的设置差不多所以相对而言比较公平但毕竟一个是用CNN一个是用Transformer所以说也很难强求他们什么都保持一致。在目前这种情况下其实他们的这个训练设置已经差不多了 9.1.1那如果我们来对比一下这一行就是 fast RCN 的 DC 5 模型和这个 DETR 的这个 DC 5 模型 我们就可以看到虽然它的这个 FPS 就是跑起来的这个速度差不多当然这个 fast RCN 跑得更快一些但是它的这个 Flops 会小187只有 320 的差不多一半。所以这也就牵扯到另外一个问题了就与现在大多数论文里经常汇报的都是 g Flops 这个参数好像你觉得这个 g flops 越小行这个模型就越小跑起来就越快其实不尽然如果你更关心的是速度的话那你还是要比较一下每个模型跑的最后的这个 FPSgflops 跟这个没有什么关系。同样的道理如果你对比这个参数量 41 也比这个 166 小很多很多了但是DETR还是在推理的时候跑得更慢一些。那如果从 AP 这个角度上来看fasterR CN 只有41但DETR有 43. 3高了两个多点还是相当不错的。 9.1.2那同样的道理我们再把这个 backbone 换成 Resnet 101再把这个 FPN 也加上然后去跟 DETR 的这个 101 去比 我们会发现他们的这个参数量一样都是 60 兆而这个 g Flops 也都是 250 左右。但是DETR 还是慢了一倍FasterRCN 是 22 P SDETR就只有 10 了。但是虽然它跑得慢但是它的效果还是高一些的它最后 AP 能达到44.9而发 CRC 只有44。但这一个点的差距其实没什么。而作者更希望大家意识到的是这个细分类的比较就是说到底对这个小物体APs和这个大物体APL而言这个 DETR 和 fast RCN 差在哪里我们可以看到对于这种小物体APs而言 fast RCN 表现得非常好比这个 DETR 要高 4 个AP但是在大物体这边 DETR 反而比这个FasterrCnN 高了6个AP。这个结果就非常有意思了作者这里觉得是因为使用了 Transformer 这个全局建模而且没有用这个Anchor所以说 DETR 想检测多大的物体就可以检测多大的物体。所以对大物体比较友好。但是因为DETR 这个框架实在是太简单了它也没有使用多尺度的特征它也没有用FPN他也没有用一个非常复杂的这个目标检测头所以说在这个小物体的处理上就不是很好。 9.2消融实验和可视化 那因为对于目标检测来说大部分情况就只有 Coco 一个数据集所以说做完这个实验之后就没什么实验好做了。而且因为DETR 的这个性能跟当时最好的那些检测器比也比不过所以作者这里需要的其实是更多的这个消融实验用更多的这种公平的对比来体现出DETR的优势。还有就是通过可视化通过一些分析来证明DETR为什么好所以这也就是写论文的另一个技巧就是说当一个想法在数据集 a 上不 work 的时候它有可能在数据集 b 上work它有可能在这个设置下不 work 的时候它在那个设置下work。如果你觉得你的想法真的很好但是就是刷分刷不过的话其实有时候是你这个切入点没有找对找到一个合适的切入点找到一个合适的研究动机做起研究或者写起论文来就容易很多了。 9.2.1transformer encoder的可视化使用 transformer  encoder 之后其实图片里的物体就已经分得很开了 那言归正传,我们来看看作者这里放的第一个这个可视化图就这个图 3 到底在讲一个什么事情 在图 3 里它其实是把这个 transformer encoder 就这个编码器的这个自注意力给可视化出来了。比如说在现在这个图里有几个牛然后如果我们在这些牛身上点一些点就是以这些点作为基准点比如说这块这一块这块然后我们用这个基准点去算这个点和这个图像里所有其他点的这个自注意力然后我们看看这个自注意力是怎么分布的我们就会惊奇的发现这个自注意力已经做得非常非常好了。你在这头牛上做这个自注意力它其实基本已经把这头牛的形状给你恢复出来了甚至已经有一点实例分割出来的那个 Mask 的形状了。而且即使对于遮挡这么严重的情况这头小牛在这头大牛身子下面它还是能把这两头牛分得相当清楚所以这也就是使用 transformer  encoder 的威力。当你已经使用 transformer  encoder 之后其实图片里的物体就已经分得很开了那你这个时候再在上面去做这个decoder去做目标检测或者做这种分割那相对而言这个任务就简单很多。 9.2.2transformer encoder数值上的表现transfer 编码器这个层数越深这个编码器学到的这个全局特征也就越好 那接下来我们再看一看这个 transformer  编码器这个数值上的表现。 表 2 里就是分析一下当这个 transformer  encoder 从 0 层到 3 层、 6 层、 12 层的时候这个最后的这个目标检测的结果到底有多好。我们可以发现随着这个层数的增加这个性能一直都是在增加的也并没有饱和的现象但是当然了你这个层数的增加就会带来这个参数的增长和这个速度的变慢所以说有的时候也是要取一些 trade off 的总体而言其实我觉得大概取个 3 层就差不多了那在这篇文章里作者取的是 6 层。总之结论就是说你这个 transfer 编码器这个层数越深这个编码器学到的这个全局特征也就越好你有可能看到的那个可视化就会越清晰物体和物体之间就会分得越开而这样对你最后的这个目标检测就会容易很多。 9.2.3transformer decoder的可视化即使在遮挡这么严重的情况下它还是能把这个轮廓分得非常清楚 那看完了transformer  编码器那我们来看一看 transformer  解码器因为它也是一个 transformer  block所以你也有这个自注意力可以去可视化。所以我们来看一看在经过了 transformer  encoder 之后我们为什么还需要一个decoder然后这个 decoder 它到底在学什么呢 这个图其实非常有意思而且把DETR的好处展现的是淋漓尽致它这里面是把每个物体的这个自助力用不同的颜色表示出来了。比如说对于这两头大象小的这头像用的是黄色大的这头像用的是蓝色。我们可以发现即使在遮挡这么严重的情况下比如说这个蹄子这一块后面那个大象的蹄子还是可以显示出蓝色。还有比如说这个蹄子这块也是蓝色遮挡非常严重还有这么细的尾巴也是蓝色。而对于小象来说其实象的这个皮肤这大象小象的皮肤都是非常接近的但是它还是能把这个轮廓分得非常清楚。同样的道理对于右图这个斑马来说其实斑马本身这个背上的花纹就已经很吸引人眼球了是一个很强的一个特征而且遮挡又这么严重。但即使是在这种情况下DETR还是能准确地分出这个蓝色斑马的这边界还有它的蹄子还有绿色的斑马的边界和蹄子还有黄色的斑马的这个轮廓。 所以作者这里说这个 transformer encoder 和 decoder 一个都不能少。 encoder 在学什么呢 encoder 在学一个全局的特征它是尽可能的让这些物体和物体之间分得开但是光分开还是不够的。对于这些头尾巴这些极值点最外围的这些点该怎么办这个就交给 decoder 去做了因为 encoder 已经把这个物体都分好了所以 decoder 接下来就可以把所有的注意力都分到去学这个边缘了去怎么更好地区分物体以及解决这种遮挡问题。其实这也就有点像之前做分割的时候我们用这种 unit 的结构就是说 encoder 去抽一个更有语义的特征然后 decoder 这边一边一点儿一点儿把这个图片大小恢复出来另外一边把更多的细节加进去从而能导致最后的这个分割效果很好或者说图片重建的效果很好。 总之 DETR 用这种 encoder decoder 的方式它的目的其实跟之前 CNN 里面用 encoder decoder 的这个目的差不多是一致的最后达成的这个效果也是差不多一致的。只不过换成 transformer 之后这个效果就更拔群了。 9.2.4object query 的可视化 那另外一个比较有意思的图就是这个 object query 的可视化。作者这里就把 Coco 这个 validation set 里所有的图片得到最后的所有的这个输出框全都可视化了出来。 虽然说 n 是100但这里它只画了20也就说这里有 20 个这个正方形每个正方形就代表一个 object query。作者其实就想看看这个 object query 到底学了什么。然后我们从这个图 7 的这个屏幕里也可以看出来图里这些绿色的点代表这些小的 bonding box然后红色的点代表大的横向的这个 bonding box然后蓝色这些点代表竖向的大的bonding box。 然后你看完这些分布之后你就会发现原来 object query 其实跟 Anchor 还是有一些像的 anchor 只不过是你提前先去定义好了一些 bonding box然后你最后把你的预测跟这些提前定好的这个 bonding box 去做对比。而 object query 其实是一个可以学习的东西 那比如说拿第一个这个 object query 来说 它学到最后就相当于每次给它一个图片这个第一个 object query 都会去问这个图片的左下角那你有没有看到一些小的物体然后如果有的话你告诉我或者说你有没有看到中间有一个大的这个横向的物体如果有的话你告诉我。所以说第一个 object query 是负责这些的。 然后比如说我们再换一个 object query比如说我们换到这个 object query 那这个 object query 每次看到一张图片它就会去问你右边有没有一些小的物体然后或者说你的中间有没有一些大的物体不论是横向还是竖向都可以那如果有的话你告诉我。 总之这 100 个 query 就相当于是 100 个不停的问题的人一样每个人都有自己问题的方式每当一个图片来的时候他们就按照各自己的方式去问这个图片各种各样的问题如果找到了合适的答案他就把这个答案返回给你而这个答案其实就是对应的那个 bonding box如果他没找到他就返回给你什么也没有。 然后作者这里还发现他发现所有的这些这个 object query它中间都有这种就是红色的这个竖线它意思就是说每个 object query 它都会去问你这个图片中间有没有一个大的横向物体它觉得之所以学出来了这个模式是因为 Coco 这个数据集的问题。因为 Coco 这个数据集往往在中心都有一个大物体就跟 image net 一样它经常有一个大物体是占据整个空间的所以模型最后就学出来了这个pattern。那从这个角度讲其实 DETR 又是一个非常深度学习的模型就是说它很简单它什么参数也不用你调它一切都是端到端。在你训练之前你也不知道 object query 是个什么东西那反正我给你数据你就学去结果最后发现诶学的还挺好。这个 object query 学的还有模有样直接就把生成 anchor 这一步给取代了。 总结 那最后我们来总结一下这篇论文作者说他们提出了 DETR 这个框架这样是一个全新的做目标检测的框架主要就是利用了这个Transformer而且用了这个二分图匹配所以最后导致了这个框架是一个端到端可以学习的网络非常的简单。 然后在 Coco 这个数据集上这个简单的 DETR 跟之前的这个 fast RCN 的基线模型打成了平手。然后在另外一个任务上全景分割上反而取得了更好的结果。而且因为它的这种简单易用性它还有很大的潜力去应用到别的任务上。最后因为在 Coco 这个数据集上 44 这个 AP 实在是有点低所以作者不去强调这件事情他反而却强调了另外一件事就是 DETR 在什么上面做的最好 DETR 是在这个大物体上做的最好。所以说作者这里又强调了一下 DETR 作为这种大物体的效果特别好原因就是因为用了这个自助运力所带来的这种全局信息。所以总之就是什么好你卖什么这样读者就能更容易的知道你这个方法的优点了。 那最后因为这篇文章是一个比较新的想法也是一个比较新的结构肯定不可能是完美的所以说与其让大家去挑刺作者这里说还不如我自己就把我的缺点展示一下。那我的缺点就是说我的这个训练时间太长了而且因为用 transformer在所以可能不好优化然后我们的性能也不是很好尤其是在小物体上的性能那就更不行了。那这个没关系他说你说现在的这些特别好的这些检测器全都是用了好几年的这个提升才把这些问题一一解决的。我们觉得因为我们这个框架特别好特别容易用肯定会有很多后续工作立马就把 DETR 的这些问题来成功地解决了。事实上也的确如此就在那一年的晚些时候 10 月份 i clear 的一篇投稿 deformableDETR出来了。成功地使用 deformable attention还有这种多尺度的特征把 detr 里两个最头疼的问题就这个训练的时长和这个小物体上的性能全都给提升上来了。 deformableDETR 就只需要普通了这个目标检测训练的时间比如说 3X6X9X 就可以了而且它的性能也跟之前最好的一些目标检测器打成了平手它也有 50 多的AP。而且deformableDETR现在我看在另外一个网页上评价 i clear 那一年里中的论文里把这个影响力排第二的论文相当有影响力的工作而这也就证明了 DETR 其实是一个更有影响力的工作因为deformableDETR只不过是它上面的一个改进而已而且同时又能体现出 DETR 的另外一个好处也就是第一条的这个简单性。DETR在摘要里就说过我们这个方法任何一个这个深度学习库只要你支持 CNN 和Transformer然后你就可以做但是deformableDETR它就需要有 CUDA 自己写的代码它就需要自己写这么 deformable 这个算子。所以说不论是训练的时候这个平台的适配还是说你在部署的时候都会带来不小的麻烦。所以说 DETR 真的是一个非常值得学习的论文。而在DETR 之后涌现了一大批的这个后续工作。比如说就用 Omni DETR up DETRPNPDETR Smack DETR Deformal DETR DABDETR Sam DETR DNDETROWDETROVDETR 还有好多可能我不知道的论文。那之前有这种待遇的论文可能也就是Resnet、Vit 这种做模型骨干网络的才会有这么多后续工作直接用它的名字然后在上面去做这种更改了。那当然还有clip。 所以说DETR真的是目标检测领域乃至是整个计算机视觉领域里一个里程碑式的工作。 DETR 其实跟之前的目标检测的各种方法也有千丝万缕的联系那其实就是使用 object query 去替代了原来这种生成Anchor 的机制然后又用二分图匹配去替代了原来的Nms这一步所以说就是把之前那些不可学的东西变成了可以学习的东西从而得到了一个简单有效的端到端的网络。 而且也因为它使用了这个Transformer所以接下来在它上面做这种多模态的工作也多了很多。然后也在它的推动之下那后续的还有 Pixel to sequence 这篇论文把输入输出一股脑全都搞成序列这种形式从而能和 NLP 那边完美兼容。 如果在你的研究工作中你还没有尝试过detr其实不妨试一试。哪怕不用它整个的模型结构试一试Transformer或者试一试这个 learnable 的 object query可能都会很有帮助。
http://www.w-s-a.com/news/180761/

相关文章:

  • 互联网信息服务小红书seo是什么意思
  • 深圳市南山区建设局网站公司简介网页
  • 免费小程序制作软件爱站网站seo查询工具
  • 承接电商网站建设缔烨建设公司网站
  • 网站运营介绍十大国外室内设计网站
  • 网站建设完毕后怎么加后台电影购买网站怎么设计
  • 空间ip地址访问网站音乐分享 wordpress
  • 做网站一单能挣多少wordpress主题文件夹在哪
  • 视频社区app源码台州优化网站
  • 保定高端网站建设做微商好还是开网站好
  • 有什么方法在淘宝发布网站建设设计wordpress评分
  • 自己做的网站怎么爬数据库酷播wordpress
  • 广州哪家做网站还可以黑龙江省建设厅网站的电话
  • 青海省高等级公路建设管局网站国内做led灯网站有
  • 做网站成功建设银行网站网址
  • 自动生成网站上海十大活动策划公司
  • 企业网站建设源码HTML论述市场营销对网站设计的影响
  • 网站设计常见问题建设工程网上质检备案网站
  • 网站怎样优化文章关键词建设网站需要钱吗
  • 加强网站建设和管理的通知重庆网站推广产品
  • 网站建设术语解释百度发布信息的免费平台
  • 情公司做的网站seo与网站优化 pdf
  • 做一个购物网站多少钱江阴市住房和城乡建设局网站
  • 网站建设都包括哪些ps怎么做网站首页和超链接
  • 怎样低成本做网站推广编辑网站教程
  • 邯郸网站建设信息网站开发报价人天
  • 王店镇建设中心小学网站酷玛网站建设
  • 网站需求方案wordpress博客主题推荐
  • 网站安全证书过期怎么办那个视频网站最好最全网址
  • 外贸上哪个网站开发客户建行个人网上银行登录入口