ECCV2020-DETR-End to End Object Detection with Transformers

arxiv

[打开本地pdf](eccv2020-DETR-End to End Object Detection with Transformers.pdf)

github仓库

DETR的卖点是End-to-End, 它没有复杂的后处理,把目标检测问题当作集合预测问题,直接输出框(只是转换cxcywh和乘宽高)。大致的流程为

  1. cnn抽取特征

  2. 把特征送入transformer encoder-decoder, 输出N(本文N=100)个预测

  3. 训练时把这N个预测和gt做二分图匹配,匹配上的"预测-gt对",计算loss

  4. 预测时输出置信度大于阈值的框

    稍微细节一点的流程举例如下

  5. 如输入是3x800x1066的图片,经过cnn backbone后,输出2048x25x34的图像特征, 宽高降采样为1/8

backbone = nn.Sequential(*list(resnet50(pretrained=True).children())[:-2])
x = backbone(inputs)  # bx2048x25x34
  1. 这里需要一个transformer做encoder, decoder, 设置隐藏层维度hidden_dim为256,encoder, decoder内有6层,8头
transformer = nn.Transformer(256, 8, 6, 6)
  1. 图像特征需要transformer隐藏层保持一个维度, , 输出的图像特征维度是256x25x34
conv = nn.Conv2d(2048, 256, 1)
h = conv(x)  # bx256x25x34
  1. 图像特征要被拉平为序列,序列本身缺乏位置信息,需要给他们加上位置编码,位置编码其实就是一组维度和序列相同的向量,每个位置唯一即可(这里是根据论文的伪代码改编的,实际的代码里还是用的sine和learned), 维度须和图像特征一致
row_embed = nn.Parameter(torch.rand(25, 256 // 2))
col_embed = nn.Parameter(torch.rand(34, 256 // 2))
pos = torch.cat([col_embed.unsqueeze(0).repeat(25, 1, 1),    # bx25x34x128row_embed.unsqueeze(1).repeat(1, 34, 1)     # bx25x34x128
], dim=-1)                                      # bx25x34x256
  1. 将图像特征和位置编码融合(detr实际代码中,位置编码加在qk上, 这里的伪代码是在qkv都加了)。
pos = pos.flatten(0, 1).unsqueeze(1) # 850x1x256
h = h.flatten(2).permute(2, 0, 1)    # 850xbx256
encoder_input = pos + h              # 850xbx256
  1. transformer输出100个预测(设置的),decoder需要100个query, 维度也是256
object_query = nn.Parameter(torch.rand(100, 256))  # 100x256
object_query = object_query.unsqueeze(1)           # 100x1x256
tout = transformer(encoder_input, object_query)    # 100xbx256
  1. 全连接把100个预测转化为置信度和框坐标, 就是上图中的FFNs(Prediction Feed-forward networks)
linear_class = nn.Linear(256, 91)
linear_bbox = nn.Linear(256, 4)
logits = linear_class(tout)   # 100xbx91
bboxes = linear_bbox(tout)    # 100xbx4

DETR使用scipy.optimize.linear_sum_assignment来做预测和gt的匹配,它的输入是cost matrix,对于一张图就是100xnum_gt的矩阵,i行j列的值为第i个预测与第j个gt的loss, 它返回的是一组匹配的索引,这组匹配的总loss是所有可能的匹配中最小的。

在这之前需要计算每个预测和每个gt的loss,它包含

  • 分类loss: -prob[target_class]

  • L1loss: torch.cdist(out_bbox, target_bbox, p=1)

  • giou loss:

为了好收敛吧,它在每层decoder的输出都算了loss, 辅助loss是一种常见的trick。

它最好的DETR-DC5-R101的AP=44.9,不如当时最好的检测网络(coco ap=58 huawei 2020-06-11), 他达到了detectron2中 Faster RCNN的水平,下表第一组是detectron中 Faster RCNN,第二组是使用了和DETR一样的训练策略,loss的Faster RCNN. 最后一组为DETR. 注意DETR-DC5-R101和Faster RCNN-R101-FPN+, 参数量相同,gflops相近,但是fps却只有faster rcnn一半,说明相同参数量和计算量下是比faster rcnn慢的。也说明参数量,gflops和速度fps没有直接的关系。DETR和第二栏的faster rcnn+比较,APL要高6个点,APS要低4个点,说明DETR对小物体表现差,对大物体表现好,毕竟没有加FPN之类的结构,也没有针对小物体做针对处理。

它对encoder的层数做了消融实验,层数越多,精度越高

对decoder的层数也做了实验,decoder层数越多,就越接近使用nms的性能

他们可视化了encoder中的自注意力,就是选择下图中4个参考点,并绘制出整图各位置和参考点的自注意力(应该是softmax(qk)),自注意力高的位置接近牛的分割mask了,他想说明encoder的自注意力学到了目标物的区域。

还可视化了decoder中object_query的注意力,表明decoder更关注物体的边缘区域。

下面这个消融实验非常有意思,spatial pos表示encoder部分的位置编码,output pos其实是object_query, 就是那100个query, 这是必须要使用的. encoder中spatial pos加在qk上,decoder中加在k上,output pos加在decoder的q上。

  • sine表示使用sin cos的位置编码

  • learned表示使用位置序号乘以可学习的weight作为位置编码

  • at input表示只加在输入上 (标准的transfomer)

  • at attn表示加在输入和encoder或decoder所有中间层上

  • none表示不使用位置编码


不使用spatial pos也有32的ap, 使用了spatial pos有明显提升(AP32->39), 最好的结果来自于每层都加位置编码,比标准的transformer(只加在输入)好1.4(AP39.2->40.6), spatial pos用sine at attn比用learned at attn好1.0(AP39.6->40.6)

在loss中,giou loss的提升最大, 下表AP35.8->39.9

DETR给了一份可读性很高的伪代码,很好滴帮助理解detr,前面的详细步骤也是照这个伪代码改的。过去也有人用集合预测做过目标检测,但是不work,detr 能work的主要原因还是在transfomer上. DETR给端到端的目标检测做了一个很好的示范。

ECCV2020-DETR笔记相关推荐

  1. ECCV2020超分辨率方向论文整理笔记

    ECCV2020超分辨率篇 ECCV的全称是European Conference on Computer Vision(欧洲计算机视觉国际会议) ,是计算机视觉三大顶级会议(另外两个是ICCV]和C ...

  2. [论文笔记] DETR 论文笔记

    DETR 论文笔记 End-to-End Object Detection with Transformers(ECCV 2020) 摘要 引言 相关工作 集合预测 DETR 模型 集合预测损失(Ob ...

  3. DN-DETR: Accelerate DETR Training by Introducing Query DeNoising阅读笔记

    DN-DETR阅读笔记 (一) Title (二) Summary (三) Problem Statement (四) Methods (五) Experiments 5.1 实验设置 5.2 实验结 ...

  4. DAB-DETR:Dynamic Anchor Boxes Are Better Queries for DETR阅读笔记

    DAB-DETR阅读笔记 (一) Title (二) Summary (三) Problem Statement (四) Method 4.1 为什么位置先验能够加速训练? 4.2 本文的主要工作 4 ...

  5. [论文笔记 ECCV2020] Learning to Count in the Crowd from Limited Labeled Data

    [论文笔记 ECCV2020] Learning to Count in the Crowd from Limited Labeled Data 摘要 Abstract 贡献 Contribution ...

  6. DEFORMABLE DETR学习笔记

    DEFORMABLE DETR学习笔记 DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION ABSTRAC ...

  7. eccv2020 目标检测笔记

    带方向目标的检测 PIoU Loss: Towards Accurate Oriented Object Detection in Complex Environments 作者 | Zhiming ...

  8. ECCV 2020 DETR:《End-to-End Object Detection with Transformers》论文笔记

    目录 简介 动机 贡献 方法 实验 简介 本文出自FaceBook AI,方法很新颖,不同于已有的R-CNN一系列,也不同于Yolo一系列,也不同于FCOS.CenterNet等最新的Anchor F ...

  9. 【论文笔记 - NeRFs - ECCV2020】NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 0背景介绍 用神经辐射场来表征场景,用于新视角图像生成任务 ...

  10. Deformable 可变形的DETR

    Deformable 可变形的DETR This repository is an official implementation of the paper Deformable DETR: Defo ...

最新文章

  1. js图片懒加载的第二种方式
  2. 20、Power Query-数据合并、拆分
  3. java shiro登录实例_Shiro安全框架入门篇(登录验证实例详解与源码)
  4. 搭建jenkins+gitlab+tomcat+maven步骤
  5. Bugtags 2016-06-16 更新内容
  6. 不为人知的 35 个 More Effective C++ 改善编程与设计的最佳方法 | 原力计划
  7. Android给scrollView截图超过屏幕大小形成长图
  8. ehlib的DBGridEh控件中使用过滤功能的方法
  9. 软件开发生命周期及文档
  10. UAC白名单解决每次启动都弹出UAC对话框(不用关闭UAC)
  11. HDU 1097 JAVA
  12. VScode使用element-ui插件准备
  13. 机器学习10大经典算法
  14. 今天零晨的大雨好厉害呀
  15. vtkPropPicker拾取功能
  16. osd 显示 png格式图片水印
  17. JAVA动态网页开发:框架
  18. 共享单车蓝牙锁方案phy6222系列蓝牙芯片
  19. 怎样配置修改hosts文件(学习篇)
  20. 三国杀显示服务器登录错误,三国杀登录超时怎么办 应变篇登录失败问题怎么解决...

热门文章

  1. 数据可视化 | Tableau从入门到高手 入门联接关系数据预处理
  2. html5 在线签名,html5手写签名
  3. 超卓航科上市:募资9亿市值超60亿 成襄阳首家科创板企业
  4. C语言程序设计精髓 第13周——原来内存也可以这么玩,我是指针我怕谁 练兵区——编程题
  5. html之div中id和class的区别
  6. 什么是天灾人祸,天灾是智商比较低,什么是人祸,人祸就是自己还不努力
  7. Pytorch基于卷积神经网络的猫狗识别
  8. JDE910笔记2--OMW项目建立及简单使用
  9. 【WordNet】词典——omw-1.4下载
  10. 考研英语(一)——简单句