在DETR之前,目标检测领域里很少有端到端的方法,大部分方法至少最后还需要后处理的操作。——nms(non-maximum suppresion)非极大值抑制。
无论是proposal based 还是 anchor based 还是 non anchor based ,最后都会生成很多预测框。如何去除冗余的框,就是 nms 需要做的事情。因为nms的存在,模型存在较复杂的调参。而且即使部署好了一个模型,部署起来也比较困难,因为nms,不是所有硬件都支持的。
DETR解决了以上痛点,直接利用transformer这种全局建模能力,将目标检测看做一个集合预测的问题。同时由于全局建模的能力,最后不会输出冗余的框,不需要nms做后处理。
本文将 目标检测 看做是 集合预测问题。即任务是:给定一个图片,去预测一堆框。需要知道每个框的坐标以及框中包含物体的类别。
这些框其实就是一个集合,对于不同的图片,包含的框也是不同的。
DETR提出了两个创新点:
1. 新的目标函数。通过二分图匹配的方式强制模型输出独一无二的预测。即不再有冗余的框。 ----每个物体理想状态下只生成一个框。
2. 使用Transformer encoder- decoder架构。具体来说,还有个小细节。在Transformer 解码器的时候,还有另外一个输入,learned object query。 DETR将 其与全局图像信息结合在一起,通过不停的做注意力操作,从而让模型直接并行输出最后一组预测框。这里并行输出导致目标检测时效性很好。
步骤:先用卷积神经网络抽取特征,拿到特征后,拉直,送入Transformer encoder-decoder。encoder :进一步学习全局信息,为decoder 也就是出预测框做铺垫。
使用Transformer encoder,图片中每个点或者说每一个特征 跟该图片中其他的特征都会有交互。这样大概可以知道哪块是哪个物体,对于同一个物体来说,只出一个框,而不是多个框。
之后通过Transformer decoder生成框的输出。这里少画了 object query,query限定了出框的数量。通过query和特征不断的做交互,在decoder中做自注意力操作,从而得到最后的输出框。论文中使用的是固定值。100,无论如何,最后预测出来都是100个框。
如何将这100个框 与 Ground Truth 这个框做匹配,计算loss?就是文章第四部分的内容。---将其看做集合预测问题。最后使用二分图匹配方法计算loss。
这里如上图所示,Ground Truth 只有两个框,在训练时,通过计算这100个预测的框和这两个Ground Truth框之间的 matching loss,决定哪两个框是独一无二的对应到 红色和黄色的 Ground Truth框。决定好匹配关系后,就像普通的目标检测一样,算一个分类的loss和一个banding box 的loss。对于剩下的98个框,被标记为没有物体(no object)即背景类
DETR与Fast R-CNN效果差不多,但是在大物体上得益于Transformer的全局建模信息,DETR效果好很多,小物体上由于DETR模型过于简单所以效果不好。同时DETR训练太慢,想要达到较好的效果COCO训练集作者训练了500个Epoch,一般几十个就够了。
DETR主体方法
l 基于集合预测的目标函数是如何做的?如何通过二分图匹配,将预测的框和Ground Truth框连接在一起的,从而算得目标函数的?
这里是通过匈牙利算法解决的。目标loss=分类loss+出框准确度。遍历所有预测的框,和Ground Truth框计算这两个loss,然后将loss放入cost matrix中,匈牙利算法得到最优解。得到一对一的匹配关系。也就是说现在只有一个框与Ground Truth框对应,所以后面不需要做后处理nms。接下来,可以计算一个真正的目标函数,使用这个loss做梯度回传,更新模型的参数。
Ppt3
如图所示,有分类的loss和出框的loss构成。
一般分类采用的loss使用的是log来计算的,但是这里为了让两个loss在同样的取值空间,作者将log去掉了。
在banding box这块之前的工作一般是使用一个L_1 loss,但是对于DETR来说,由于L_1 loss与出框大小有关,框越大,算出的loss容易越大,DETR更容易出大框,不利于优化。这里作者使用了the generalized IoU loss,是与框大小无关的一个目标函数。the generalized IoU loss和L`1 loss的合体来计算 banding box loss。
二分图匹配---使得损失矩阵得到的损失最小,linear-sum-assignment函数
l DETR的具体模型架构
可视化
该图将 Transformer encoder这个编码器的自注意力进行可视化。在牛上点一些点作为基准点,计算基准点与该图中其他点的自注意力,可以看出自注意力是如何分布的?由图可知,自注意力已经做的十分好的。已经基本把牛的形状恢复出来了,甚至有些实例分割出来的mask的形状了。对于遮挡很严重的情况,也能区分的很清晰。
接下来是Transformer解码器,该图将每个物体的自注意力使用不同颜色表示出来。可以发现,对于遮挡很严重的情况,也能将轮廓区分的很清晰。
所以说两者均不能少,encoder在学习全局的特征,尽可能让物体之间分的开,但是对于头、尾巴等极值点,最外围的这些点就需要交给decoder来做。Decoder将注意力被放到学习边缘信息,如何更好的区分物体以及解决遮挡问题
Object query的可视化
绿色点代表小的banding box,红色的点:大的横向的banding box。蓝色的点:竖向的大的banding box。可知object query与anchor其实是有些像的。Anchor是提前定义好一些banding box,最后将预测与提前预定好的banding box作对比。
而object query是可以学习的,以第一个子图为例,他学到最后 相当于每次给他一张图片,他会去询问图片的左下角:你有没有看到一些小的物体啊?如果有,告诉我。或者说 问中间,有没有看到大的横向的物体啊?如果有答案,则返回答案,即对应的banding box。没找到则返回什么也没有。