前言
DETR提出了基于Query的端到端目标检测算法,把目标检测看成了一个集合预测问题,大大简化了模型的训练和部署。(详见DETR的学习与分析)其中,DETR模型实现的创新点之一就是基于集合的目标函数,那么具体来说这个目标函数是如何设计的呢?二分图匹配、匈牙利算法、一对一匹配都是什么意思?
1. 二分图匹配问题
DETR模型最后的输出是一个固定的集合,即不论输入图片中包含多少目标,最后都会输出N个框(一般N远大于图片中的目标数目)。问题来了,一张图片中Ground Truth(真值)的bounding box(边界框)可能只有几个,那么如何匹配预测框与Ground Truth框呢?
作者将这个问题转化为了二分图匹配的问题。
例子:有abc三个工人,去干xyz三种工作,由于每个工人各有所长,所以完成每种工作的开销不同,如何分配工人做这三种工作,可以使开销最小?
最优二分图匹配即最后可以找到一个唯一的解,能够给每个人对应分配最擅长的工作,使得开销最小。
2.匈牙利算法
对于上述问题,可以直接暴力穷举,遍历所有可能,找出其中最小开支,但是算法的复杂度会很高。而匈牙利算法则是可以用较低的复杂度解决这一问题的算法。
在用python进行实现时,一般使用Scipy包种提供的linear-sun-assignment函数。
scipy.optimize.linear_sum_assignment(cost_matrix, maximize=False)
参数:
cost_matrix: 数组
二分图的成本矩阵。
maximize: 布尔(默认值:假)
如果为真,则计算最大权重匹配。
返回:
row_ind, col_ind: 数组
一组行索引和一个对应的列索引,给出最佳分配。
3. DETR中的实现
目标检测其实也是一个二分图匹配的问题,将abc看成N个预测的框,xyz看成ground truth的框,使用linear-sun-assignment函数得到最优匹配。而cost matrix中的值其实就是目标检测中的loss。
loss中包含两个部分,一个是分类的loss,一个是出框的准确度。即 遍历所有预测的框,让预测的框和ground truth的框去计算两个loss,然后将loss放到cost matrix中,利用匈牙利算法得到最后的最优解。
总结
其实二分图最优匹配求解,与原来目标检测使用的利用人的先验知识,把预测和之前的proposal或Anchor做匹配的方式相差不多。只不过此处约束更强,一定要得到一个“一对一”的匹配关系,而不是像之前一样得到“一对多”的。最后只有一个框与ground truth框做对应,这样就不需要再进行NMS后处理。
最终知道N个框中有哪几个框是与ground truth框对应的,就可以计算真正的目标函数,然后用这个loss做梯度的反向传播,更新模型的参数。最终的目标函数如下式:
实验细节:
- 为了使分类的loss和出框的loss大概在同样的取值空间,计算时去掉了log
- 在出框的loss处,由于L_1 loss出框越大损失越大,而DETR对大物体检测友好,经常出大框。所以使用了L_1 loss与generalized IOU loss的结合,使得loss与框大小无关。