DETR(DEtectionTRansformer)的初步摸索
DETR是FIR提出的基于Transformers的端到端⽬标检测,没有NMS后处理步骤、没有anchor,结果在coco数据集上效果与Faster RCNN相当,且可以很容易地将DETR迁移到其他任务例如全景分割。
引⽤知乎⼤佬的话来说,这种做⽬标检测的⽅法更合理。
优点:
1、提出了⼀种⽬标检测新思路,真正的end-to-end,更少的先验(没有anchor、nms等);
decoder2、在coco上,准确率、运⾏效率与⾼度优化的faster R-CNN基本持平。在⼤⽬标上效果⽐faster R-CNN好。
3、与⼤多数现有的检测⽅法不同,DETR不需要任何⾃定义层,因此复现容易,涉及到模块都能在任何深度学习框架中到。
项⽬地址:github/facebookresearch/detr
快速查看detr效果:github/plotly/dash-detr
⽬标检测效果如下:
可见确实在⼤⽬标上检测较为准确。
DETR原理:
DETR总体思路是把检测看成⼀个set prediction的问题,并且使⽤Transformer来预测box的set。DETR 利⽤标准 Transformer 架构来执⾏传统上特定于⽬标检测的操作,从⽽简化了检测 pipeline。
DETR的流程⼤为简化,可以归结如下:Backbone -> Transformer -> detect header。
DETR模型架构:
DETR的整体结构Transformer类似:Backbone得到的特征铺平,加上Position信息之后送到⼀堆Encoder⾥,得到⼀些candidates的特征。Candidates⼜被Decoder并⾏解码得到最后的检测框。
⾸先是encoder,DETR Encoder⽹络⼀开始是使⽤Backbone(⽐如ResNet)提取⼀些feature,然后降维到d×HW。Feature降维之后与Spatial Positional Encoding相加,然后被送到Encoder⾥。为了体现图像在x和y维度上的信息,作者的代码⾥分别计算了两个维度的Positional Encoding,然后Cat到⼀起。FFN、LN等操作也与Transformer类似。Encoder最后得到的结果是对N个物体编码后的特征。
然后是decoder。DETR Decoder的结构也与Transformer类似,每个Decoder有两个输⼊:⼀个是Object Query(或者是上⼀个Decoder的输出),另⼀个是Encoder的结果,区别在于这⾥是并⾏解码N个object。与原始的transformer不同的地⽅在于decoder每⼀层都输出结果,计算loss。另外⼀个与Transformer不同的地⽅是,DETR的Decoder和encoder⼀样也加⼊了可学习的positional embedding,其功能类似于anchor。最后⼀个Decoder后⾯接了两个FFN,分别预测检测框及其类别。
最后是FFN,最终预测是由具有ReLU激活功能且具有隐藏层的3层感知器和线性层计算的。FFN预测框标准化中⼼坐标,⾼度和宽度,输⼊图像,然后线性层使⽤softmax函数预测类标签。它预测了⼀组固定⼤⼩的N个边界框,其中N通常⽐图像中感兴趣的对象的实际数量⼤得多,因此使⽤了⼀个额外的特殊类标签∅来表⽰在未检测到任何对象。此类在标准对象检测⽅法中与“背景”类具有相似的作⽤。(这⾥N被设计为固定的100个,100个完全够⽤且存在⼀些冗余输出的,这可能会是⼀个改进模型的改进点。当然,定长的输出有利于显存对齐,训练的时候会⽅便⼀些。⼀般实验环境是⽆法达到这么
⼤的显存条件的,可以修改为不并⾏⽣成100个)。
bipartite matching loss:
其中IoU 简单来讲就是模型产⽣的⽬标box和正确box的交叠率,即检测结果(DetectionResult)与 Ground Truth 的交集⽐上它们的并集。
所谓⼆分最⼤匹配,即保证预测值与真值实现最⼤的匹配,保证预测的N的实例(包括∅)按照位置与真值对应起来。实现⼀⼀对应之后,便能够利⽤分类Loss以及boundingbox Loss进⾏优化。
代码理解可参考:
blog.csdn/feng__shuai/article/details/106625695

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。