DETR二分图匹配

DETR模型以固定集合输出目标检测结果,每个图像都有100个框。为解决预测框与真实框的匹配问题,文章提出了将其转化为二分图匹配问题,利用匈牙利算法进行优化。损失函数包括分类损失和框的准确率损失,通过线性sum分配函数计算最优匹配,并据此更新模型参数。

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

DETR基于集合的目标函数,也正是因为有目标函数,所以我们才可以进行一对一的出框方式,才可以不需要NMS。

DETR最后模型的输出是一个固定的集合。无论图片是什么,我们最后都会输出N个输出。在论文里,任何一个图片进来,最后都会有N=100个输出框。这对于一般的图片来讲,框数是远多于真实的。例如,COCO数据集中一张图片里包含的最大物体数也没有超过100。所以,设置为100对于论文中是完全够用的。

问题便是:DETR每次都会输出100个,但是,一张图片的ground truth的bounding box可能只有几个。我们如何进行匹配?如何计算loss?如何知道哪个预测框对应ground truth框呢?在此,作者便把这个问题转换成了一个二分图匹配问题。

二分图匹配到底是个什么问题呢?

我们看百度或者维基百科,大多都是举得这样一个例子,如何使用一些工人去干一些活儿?从而让我们的支出是最小的。

例如我们有三个工人abc,我们需要完成三个工作xyz,因为每个工人有各自的长处短处,所以,完成工作所需要的时间和工钱也不一样。

那列出的矩阵里就可以填写每个工人完成每个任务所需要的时间或者完成任务所需要的钱数,这个矩阵叫做Cost Matrix(损失矩阵)。Cost Matrix不要求必须是正方形。

最优二分图匹配的意思,便是最后我们可以找到一个唯一解,每个人都可以分配到他最擅长的那项工作。然后使得这三个工作完成,使用的价钱最低。

其实,我们使用遍历的算法也可以将这项工作做出来。但是这样的话,成本较高。

所以有很多算法对此进行改进。其中,匈牙利算法是比较有名且高效的。

现在,一般遇到这种问题,大家会使用Scipy包里提供的一个函数,叫做Linear sum assignment去完成。

Linear sum assignment的输入便是Cost Matrix。我们只需要将Cost Matrix输入进去便可以得到一个最优序列。

DETR这篇论文使用的也正是这个函数。

我们可以把abc看作这100个预测框,将xyz看作是ground truth框,以此,我们可以得到一个最有匹配。

我们知道了可以使用这方法来解决问题,那我们矩阵里的值应该填什么呢?即损失loss。对于一般的目标检测来说,我们可以使用以下损失公式进行计算。

 其包含两部分,一个是分类损失,一个是框的准确率损失。

即遍历所有预测框,将预测框和所有真实框计算loss,然后将loss放入cost matrix,有了loss,我们便可以使用Linear sum assignment(匈牙利算法)得到最优解。

我们知道这100个框中哪几个框和ground truth框是对应的,接下来,我们可以算真正的目标函数,然后用这个loss做梯度回传。来更新我们的参数。

最后目标函数是:

 

 

### DETR模型中匈牙利匹配的实现与应用 #### 1. 匈牙利匹配的作用 在DETR (Detection Transformer) 中,为了有效地关联预测的目标框和实际的真实标签,采用了基于二分图的最大加权匹配方法——即匈牙利算法。该算法能够找到一组最优配对方案,在这些配对里每一对都由一个预测对象和它最接近的一个真实物体组成[^2]。 #### 2. 成本矩阵构建 对于每一个图像内的所有可能的对象检测结果(假设数量为N),以及对应的实际标注目标M(通常情况下N>M),会计算两者之间的IoU交并比或者其他形式的距离度量作为代价c[i][j], 形成大小为NxM的成本矩阵C。这里需要注意的是,尽管有时提到成本值来源于损失函数,但实际上二者并无直接联系;成本仅用于指导最佳匹配的选择过程[^3]。 #### 3. Python代码示例 下面是一个简化版的Python代码片段来展示如何利用`scipy.optimize.linear_sum_assignment`库执行上述描述的任务: ```python import numpy as np from scipy.optimize import linear_sum_assignment def compute_cost_matrix(pred_boxes, gt_boxes): """Compute the cost matrix between predicted boxes and ground truth.""" num_preds = len(pred_boxes) num_gts = len(gt_boxes) # Initialize a zero-filled array of shape (num_preds, num_gts). C = np.zeros((num_preds, num_gts)) for i in range(num_preds): for j in range(num_gts): # Calculate IoU or other distance metric here. c_ij = calculate_iou_or_distance(pred_boxes[i], gt_boxes[j]) C[i,j] = -c_ij if isinstance(c_ij,float) else float('inf') return C # Assume pred_boxes and gt_boxes are predefined lists containing bounding box coordinates. cost_matrix = compute_cost_matrix(pred_boxes, gt_boxes) row_ind, col_ind = linear_sum_assignment(cost_matrix) matched_pairs = list(zip(row_ind.tolist(), col_ind.tolist())) print("Matched Pairs:", matched_pairs) ``` 此段程序首先定义了一个辅助函数`compute_cost_matrix()`用来创建表示预测边界框同真值间差异程度的成本矩阵。接着调用了SciPy提供的线性指派问题求解器`linear_sum_assignment()`, 它内部实现了高效的Kuhn-Munkres算法(也称为Hungarian algorithm),最终返回了一组索引对,指示哪些预测应该被分配给哪个真实的实例[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值