目标检测之DETR

目标检测之DETR

  • 前言
  • 网络结构

前言

《End-to-End Object Detection with Transformers》
论文地址:https://arxiv.org/pdf/2005.12872.pdf
DEtection with TRansformers是在2020年ECCV上发表的,性能虽然不是很能打,尤其是在小目标上的精度不太行;但是作为Transformer用在目标检测领域的开山之作,还是有很多可以借鉴的地方。
在这之前建议可以先看一下ViT的工作,Vision Transformer(ViT)及后续工作,关于之前的细节就不会赘述,把内容放在这篇新的方法上。

网络结构

目标检测之DETR_第1张图片
前面就是一个ViT的结构(不过这里不需要[CLS] Token),位置编码稍微不一样,作者做了如下实验:
目标检测之DETR_第2张图片

后面decoder细节如下:
decoder的输入是100个queries,这里作者认为一张图片里的物体不会超过100个,所以设置为100,区别于之前产生大量候选框或者anchor(因此在训练的时候,可以不用NMS)。在decoder中,K和V的值来自于encoder,Q是decoder自己产生的
目标检测之DETR_第3张图片

目标检测之DETR_第4张图片

考虑到参数量和计算量,作者选择6个transformer和6个decoder layers of width 256 with 8 attention
heads。

训练:上面我们介绍了decoder会生成100个预测框,那怎么和GT对应呢?
假如GT有两个物体,此时预测出了100个结果,这个时候就会用匈牙利算法(匈牙利算法多用于指派问题中,保证实现最优分配)来选择2个接近GT的预测框作为正样本,其他的98个作为背景。如何衡量找到了合适的分配方案?这里需要一个cost函数,满足cost最小时即为合适的分配方案。cost函数如下:
目标检测之DETR_第5张图片
这里选择正负样本就没有用到NMS。接下来就是计算神经网络的损失函数Loss:
目标检测之DETR_第6张图片
目标检测之DETR_第7张图片
值得注意的是,这里并没有像YOLO那样取预测偏移,直接的回归坐标位置。
推理测试:在测试的时候当然也可以用NMS做后处理

def filter_boxes(scores, boxes, confidence=0.7, apply_nms=True, iou=0.5):
    #筛选出真正的置信度高的框
    keep = scores.max(-1).values > confidence
    scores, boxes = scores[keep], boxes[keep]

    if apply_nms:
        top_scores, labels = scores.max(-1)
        keep = batched_nms(boxes, top_scores, labels, iou)
        scores, boxes = scores[keep], boxes[keep]

    return scores, boxes

上一篇:Vision Transformer(ViT)及后续工作
下一篇:Swin-Transformer

你可能感兴趣的:(目标检测,目标检测,transformer,深度学习)