DETR-二分图匹配 & 匈牙利算法

DETR通过将目标检测转化为二分图匹配问题,利用匈牙利算法找到最佳框匹配,降低了复杂度。线性_sum_assignment函数用于计算最小成本匹配,其中cost_matrix包含了分类和定位loss。这种方法避免了NMS后处理,直接得到一对一匹配,简化了目标检测模型的训练和部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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做梯度的反向传播,更新模型的参数。最终的目标函数如下式:
在这里插入图片描述
实验细节:

  1. 为了使分类的loss和出框的loss大概在同样的取值空间,计算时去掉了log
  2. 在出框的loss处,由于L_1 loss出框越大损失越大,而DETR对大物体检测友好,经常出大框。所以使用了L_1 loss与generalized IOU loss的结合,使得loss与框大小无关。

参考

  1. DETR论文精读
  2. 匈牙利算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值