DETR 是 Detection Transformer的缩写, 是Facebook 提出的主要用于目标检测领域的新模型,
Facebook AI 的研究者把 Transformer 用到了目标检测任务中,还取得了媲美 Faster R-CNN 的效果。该研究推出的 Transformer 视觉版本——Detection Transformer(DETR),可用于目标检测和全景分割。与之前的目标检测相比,DETR 的架构有了根本上的改变,也是第一个将 Transformer 成功整合为检测 pipeline 中心构建块的目标检测框架。基于 Transformer 的端到端目标检测,没有 NMS 后处理步骤、真正的没有 anchor,且对标超越 Faster R-CNN, 这里大胆推测一下基于 Transformer 结构的目标检测模型和语义分割会越来越多。
论文下载:https://arxiv.org/abs/2005.12872
代码地址:https://github.com/facebookresearch/detr
DETR,即DEtection TRansformer,将目标检测任务转化成序列预测任务,使用transformer编码器-解码器结构和双边匹配的方法,由输入图像直接预测得到预测结果序列,整个过程就是使用CNN提取特征后编码解码得到预测输出。基于Transformers的端到端目标检测,没有NMS后处理步骤、真正的没有anchor,DETR达到了与Faster RCNN基线相当的准确性和运行时间性能。
主要贡献:
然而它也有两个明显的缺点:
论文中模型结构
DETR 使用常规的 CNN 主干来学习输入图像的 2D 表示。模型将其展平并传递到 transformer 编码器之前进行位置编码补充。然后,transformer 解码器将少量固定数量的位置嵌入作为输入,称为目标查询,并另外参与编码器的输出。将解码器的每个输出嵌入传递到预测检测(类和边界框)或无目标类的共享前馈网络(FFN)。
主干网络
首先将图片(3,H,W)
输入到由CNN网络构成的backbone,得到特征图 feature map, shape=(C,H/32,W/32) 论文中 C=2048
然后将该feature map输入到一个1∗1卷积,输出(embed_dim,H/32,W/32),论文中embed_dim=256。由于transformer的encoder希望的输入是一个序列,因此将feature map的reshape成(embed_dim,H/32,W/32),还需要 特征和位置编码 结合起来,为了体现图像在x和y维度上的信息,作者的代码里分别计算了两个维度的Positional Encoding 然后Cat到一起。然后,将CNN骨干网的输出转换为一维特征图,并将其作为输入传递到Transformer编码器。该编码器的输出是N个固定长度的嵌入(向量),其中N是模型假设的图像中的对象数。
先用 1 × 1 卷积将输入降至较小的维度d, d=256,得到新特征图 ,再将新的特征图 空间维度折叠成1维,转换为 (d,WH) 的序列化输入。DETR包含多个encoder,每个encoder都为标准结构,包含mullti-head self-attention模块和前向网络FFN。由于transformer是排序不变的,为每个attention层补充一个固定的位置encoding输入。
decoder也是transformer的标准结构,使用multi-head self-attention模块和encoder-decoder注意力机制输出 N 个大小为 d,d=256 的embedding,唯一不同的是DETR并行地decode N个目标,不需要自回归的机制,此外 decoder将 N 个object queries转换为 N 个输出embedding,然后独立地解码成box坐标和class标签,得到 N 个最终的预测结构
这里有两个FFNs, 分类采用了一层的感知机,而预测采用带ReLU激活的3层感知机以及线性映射层来解码得到最终的预测结果,
FFN预测 N个 归一化的中心坐标、高度、宽度以及softmax后的类别得分,由于 N一般大于目标个数,所以使用特殊的类别 ∅ 来标记无预测目标,类似于背景类。需要注意,最后用于输出的FFN与encoder和decoder里的FFN是不一样的.
DETR的一个loss计算是一个主要的创新点
分类输出的通道为num_classes+1,类别从0开始,背景类别为num_classes。
基于CNN的方法会计算每个anchor的预测结果,然后利用预测结果和ground truth box之间计算iou,挑选iou大于一定阈值的那些anchors作为正样本,来回归它们的class和box deltas。类似的,DETR也会计算每个object query的prediction,但DETR会直接计算box的四个角的归一化值,而不再基于box deltas。为了移除anchor,作者将预测框和gt框直接进行匹配。首先,作者设置了一个N,远大于图片的GT框数量,代表预测框的数量(也就是代码中的num_query)。然后将这N个预测框与gt框一对一进行匹配,
如何和gt bbox计算loss?这就需要用到经典的双边匹配算法了,也就是常说的匈牙利算法,该算法广泛应用于最优分配问题,在bottom-up人体姿态估计算法中进行分组操作时候也经常使用。detr中利用匈牙利算法先进行最优一对一匹配得到匹配索引,然后对bx100个结果进行重排就和gt bbox对应上了(对gt bbox进行重排也可以,没啥区别),就可以算loss了。
匈牙利算法是一个标准优化算法,具体是组合优化算法,在scipy.optimize.linear_sum_assignmen函数中有实现,一行代码就可以得到最优匹配,网上解读也非常多,这里就不写细节了,该函数核心是需要输入A集合和B集合两两元素之间的连接权重,基于该重要性进行内部最优匹配,连接权重大的优先匹配。
优化对象是 ,其是长度为N的list,
,
表示无序gt bbox集合的哪个元素和输出预测集合中的第i个匹配。其实简单来说就是找到最优匹配,因为在最佳匹配情况下l_match和最小即loss最小。
前面说过匈牙利算法核心是需要提供输入A集合和B集合两两元素之间的连接权重,这里就是要输入N个输出集合和M个gt bbox之间的关联程度,如下所示
参考文献: https://www.cnblogs.com/Glucklichste/p/14057005.html https://www.cnblogs.com/SpicyWonton/p/15310929.html https://blog.csdn.net/zjuPeco/article/details/107209584?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163296639116780264098848%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163296639116780264098848&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-107209584.first_rank_v2_pc_rank_v29&utm_term=DETR&spm=1018.2226.3001.4187