Atten4Vis / MS-DETR

[CVPR 2024] The official implementation for "MS-DETR: Efficient DETR Training with Mixed Supervision"
Apache License 2.0
82 stars 5 forks source link

关于代码中one-to-many部分不太理解 #11

Closed yuanqianguang closed 3 months ago

yuanqianguang commented 3 months ago

作者您好: 在O2M代码中有一些内容我有点不太理解,https://github.com/Atten4Vis/MS-DETR/blob/main/models/matcher_o2m.py sample_topk_per_gt这个函数中通过 scores, pr_inds2 = cost_matrix[gt_inds2].topk(k, dim=1) 获取了每个GT的topk个索引跟文中内容对应,能够理解,但是在后面的代码中:

# filter to as many matches that gt has
pr_inds3 = torch.cat([pr[:c] for c, pr in zip(counts, pr_inds2)])
gt_inds3 = torch.cat([gt[:c] for c, gt in zip(counts, gt_inds2)])
scores = torch.cat([s[:c] for c, s in zip(counts, scores)])

# assign query to gt with highest match score
score_sorted_inds = scores.argsort(descending=False)
pr_inds3 = pr_inds3[score_sorted_inds]
gt_inds3 = gt_inds3[score_sorted_inds]

为什么会变成了分配得分最高的查询给GT?这样好像就变成了O2O的标签分配方式。 按我的理解,不应该是每个GT获取得分最高的topk个查询作为其匹配查询,然后用于计算损失么? 望回复,谢谢

jacksonsc007 commented 3 months ago

“为什么会变成了分配得分最高的查询给GT?这样好像就变成了O2O的标签分配方式”

这应该是个理解错误, 不是为gt分配得分最高的query,而是为query分配得分最高的gt。每个query只能有一个gt。

yuanqianguang commented 3 months ago

“为什么会变成了分配得分最高的查询给GT?这样好像就变成了O2O的标签分配方式” 这应该是个理解错误, 不是为gt分配得分最高的query,而是为query分配得分最高的gt。每个query只能有一个gt。

谢谢大佬,确实是一开始我理解错误了,后来认真读了一下搞懂了~