1简介
目标检测作为一项基本的视觉任务,几十年来一直受到研究人员的广泛关注。目前最先进的检测器大多通过使用一组预定义的Anchor来预测类标签和回归偏移量来执行密集检测。
Anchor作为检测器训练的基本单元,需要分配适当的分类(cls)和回归(reg)标签来监督训练过程。这种标签分配(LA)过程可以看作是为每个Anchor分配损失权重的任务。Anchor的cls损失(reg损失可以类似定义)通常可以表示为:
其中,和分别为正样本和负样本权重,s为预测的分类得分。根据和的设计,LA方法大致可以分为2类:Hard Label Assignment和Soft Label Assignment。
Hard Label Assignment假设每个Anchor都是pos或neg,这意味着并且。该策略的核心思想是找到一个合适的除法边界,将Anchor分成一个正集和一个负集。沿着这一研究方向的划分规则可以进一步分为静态规则和动态规则。静态规则采用预定义的度量标准,如IoU或从Anchor中心到GT中心的距离,以匹配对象或背景到每个Anchor。
这种静态匹配策略忽略了具有不同大小和形状的对象的划分边界可能会有所不同的事实。
近年来,人们提出了许多动态匹配策略。例如,ATSS根据目标的IoU分布来分割目标的训练Anchor。预测感知分配策略将预测的置信度得分作为估计Anchor质量的可靠指标。
但是,静态和动态匹配策略都忽略了样本不同样重要这一事实。目标检测的评价指标表明,最优预测不仅应该具有较高的分类分数,还应该具有准确的定位,这意味着在训练中,分类头和回归头之间具有较高一致性的Anchor应该更为重要。
基于上述动机,研究人员选择了为Anchor分配Soft权重。GFL和VFL是基于IoU定义Soft Label目标,然后通过乘以一个调制因子将其转化为损失权重的2种典型方法。
其他一些工作是通过联合考虑reg分数和cls分数来计算样本权重。现有的方法主要集中于pos加权函数的设计,而负样本权重仅由pos权重推导出来,由于负样本权重提供的新监督信息很少,可能会限制检测器的学习能力。作者认为,这种耦合加权机制不能在更精细的水平上区分每个训练样本。
图1为一个例子。4个Anchor有不同的预测结果。然而,GFL和VFL分别为(B、D)和(C、D)分配了几乎相同的(pos、neg)权重对。GFL还将零pos和负样本权重分配给Anchor A和C,因为每个权重都有相同的cls分数和IoU。由于现有Soft LA方法中的负样本加权函数与pos 1高度相关,具有不同属性的Anchor有时可以被分配几乎相同的(pos,neg)权重,这可能会损害训练后的检测器的有效性。
为了给检测器提供更多的具有判别性的监督信号,作者提出了一种新的Label Assignment方案,称为双加权(DW),从不同的角度指定正负样本的权重,并使它们相互互补。
具体来说,pos的权重是由置信度分数(cls head获得)和reg分数(reg head获得)的组合动态决定的。每个Anchor的负样本权重被分解为2项:
- Anchor为一个负样本的概率
- 当Anchor为负样本时,Anchor的重要性
pos权重反映了cls head和reg head之间的一致性程度,它将推动一致性较高的Anchor在Anchor List中向前移动,而负样本权重反映了不一致程度,并将不一致的Anchor推到Anchor List的后面。
通过这种方法,在推断中,cls得分越高、位置更精确的边界框在NMS之后会有更大的概率保存下来,而那些位置不精确的边界框会排在后面并被过滤掉。如图1所示,DW通过分配不同的Anchor(pos、neg)权重对来区分4种不同的Anchor,从而为检测器提供更细粒度的监督训练信号。
为了给权重函数提供更准确的reg分数,作者进一步提出了一个box细化操作。具体来说,设计了一个学习过的预测模块,基于粗回归图生成4个边界位置,然后将它们的预测结果进行聚合,得到当前Anchor的更新边界框。这个轻量级的模块使能够通过引入适度的计算开销,就可以为DW提供更精确的reg分数。
通过对MSCOCO的综合实验,证明了提出的DW方法的优势。特别是,它在单尺度训练方案下,将基于ResNet-50的FCOS检测器在COCO验证集上的结果提升到了42.2AP,超过了其他LA方法。
2相关方法
2.1 Hard Label Assignment
将每个Anchor标记为pos或neg样本是训练检测器的关键一步。经典的基于Anchor的目标检测器通过用GT目标测量其IoU来设置Anchor的标签。近年来,Anchor-Free检测器因其简洁的设计和性能而引起了广泛的关注。
FCOS和Foveabox都通过中心采样策略来选择pos样本:靠近GT中心的Anchor被采样为正样本,其他Anchor在训练过程中为负样本或被忽略。上述LA方法对不同形状和大小的GT box采用了固定的规则,这是次优的。
很多学者也提出了一些先进的Label Assignment策略来为每个GT动态选择pos样本:
- ATSS从特征金字塔的每一层中选择top-k Anchor,并采用这些top-Anchor的mean+std IoU作为pos/neg划分阈值。
- PAA根据cls和reg损失的联合状态,自适应地将Anchor分离为pos/neg Anchor。
- OTA通过将分配过程定义为一个最优的运输问题,从全局的角度来处理Label Assignment问题。
- 基于Transformer的检测器采用一对一的分配方案,为每个GT寻找最佳的pos样本。
Hard Label Assignment平等地对待所有样本,但这与目标检测中的评价指标不太兼容。
2.2 Soft Label Assignment
由于预测的box在评价中有不同的质量,所以在训练时应该对样本进行不同的处理。许多工作已经被提出来解决训练样本的不平等问题。
Focal Loss对交叉熵损失增加了一个调制因子,以减少分配给分类良好的样本的损失,这将推动检测器专注于困难样本。
Generalized focal loss通过联合考虑cls分数和reg质量,给每个Anchor分配一个Soft weight。
Varifocal loss利用IoU感知的cls标签来训练cls head。
上面提到的大多数方法都集中于计算pos权重,并简单地将负样本权重定义为的函数。
在本文中解耦这个过程,并分别为每个Anchor分配pos和负样本损失权重。大多数Soft Label Assignment方法都会为损失分配权重。有一种特殊的情况下,权重被分配给分数,它可以表述为。
典型的方法包括FreeAnchor和Auto assign。
应该注意的是,本文方法与它们有所不同。为了以完全差分的方式匹配Anchor,自动分配中的和仍然接收梯度。然而,在本文的方法中,损失权重是精心设计的,并且完全脱离了网络,这也是加权损失的常用做法。
3本文方法
3.1 动机在哪?
为了与NMS兼容,一个良好的Dense Detector应该能够预测同时具有较高分类得分和精确位置的一致边界框。然而,如果所有的训练样本都被同等处理,2个head之间就会出现错位:类别得分最高的位置通常不是回归目标边界的最佳位置。这种失调会降低检测器的性能,特别是在高IoU指标下。Soft Label Assignment是通过加权损失来以Soft的方式处理训练样本,是一种试图增强cls和reg head之间的一致性。对于Soft Label Assignment,Anchor的损失可以表示为:
式中,s为预测cls得分,b、b’分别为预测边界框和GT目标的位置,为Smooth L1 Looss、IoU Loss、GIoU Loss等回归损失。可以通过将较大的和分配给具有较高一致性的Anchor,来减轻cls和reg head之间的不一致性问题。因此,这些训练有素的Anchor能够同时预测高cls分数和在推断时的精确位置。
现有的工作通常将设置为等于,主要集中在如何定义一致性并将其整合到损失权重中。
表1总结了在最近的代表性方法中,pos Anchor的和的公式。可以看出,目前的方法通常定义一个度量t来表示2个head在Anchor水平之间的一致性程度,然后将不一致性度量设计为1−t的函数。通过分别添加一个比例因子或,最终将一致和不一致的度量值集成到pos和neg损失权重中。
与上述的和高度相关的方法不同,作者建议以预测感知的方式分别设置pos和neg权重。
具体来说,pos加权函数以预测的cls得分s和预测框与GT目标之间的IoU作为输入,并通过估计cls与reg head之间的一致性程度来设置pos权重。
neg加权函数采用与pos加权函数相同的输入,但将负样本权重表示为以下2项的乘法:Anchor是负样本的概率以及其为负样本时的重要性。这样,具有相似pos权值的模糊Anchor可以接收到具有不同负样本权值的更细粒度的监督信号,这是现有方法中是没有的。
DW框架如图2所示。作为一种常见的实践,首先通过选择GT中心附近的Anchor(中心先验),为每个GT目标构建一个候选正样本集合。候选集合外的Anchor被认为是负样本,不会参与加权函数的设计过程,因为它们的统计数据(如IoU,cls分数)在早期训练阶段非常混乱。候选集内的Anchor将被分配到、和三个权重上,以更有效地监督训练过程。
3.2 正样本加权函数
pos权重应该反映其在分类和定位中准确检测对象的重要性。作者试图通过分析目标检测的评价指标来找出影响这一重要性的因素。在进行COCO测试期间,对一个类别的所有预测都应该通过一个排名指标进行适当的排名。现有的方法通常使用cls评分或cls评分与预测的IoU的组合作为排名指标。每个边界框的正确性将从排名列表的开头开始检查。一个预测将被定义为一个正确的预测的条件如下:
- 预测的边界框与其最近的GT之间的IoU大于一个阈值θ;
- 当前框前面没有满足上述条件的框。
总之,只有预测列表中IoU大于θ的第1个边界框才会被定义为pos检测,而所有其他边界框都应该被视为同一GT的假阳性。
可以看出,高排名分数和高IoU是pos预测的充分必要条件。这意味着同时满足这2个条件的Anchor在测试过程中更有可能被定义为pos预测,因此它们在训练过程中应该具有更高的重要性。
从这个角度来看,位置权重应该与IoU和排名得分呈正相关,即和。为了指定pos函数,首先定义一个一致性度量,记为t,来度量这2个条件之间的对齐程度:
其中,β被用来平衡这2个条件。为了促进不同Anchor之间的pos权重拉开距离,这里作者添加了一个指数调制因子:
其中,µ是一个控制不同pos权重的相对间隙的超参数。最后,每个实例的每个Anchor的pos权值由候选集内的所有pos权值之和进行归一化。
p_loc = torch.exp(-reg_loss*5) p_cls = (cls_score * objectness)[:, gt_labels] p_pos = p_cls * p_loc p_pos_weight = (torch.exp(5*p_pos) * p_pos * center_prior_weights) / (torch.exp(3*p_pos) * p_pos * center_prior_weights).sum(0, keepdim=True).clamp(min=EPS) p_pos_weight = p_pos_weight.detach()
3.2 负样本加权函数
虽然pos权重可以强制一致Anchor具有高的cls分数和大的IoUs,但不一致Anchor的重要性不能用pos权重来区分。如图1所示,Anchor D的位置更好(IoU大于θ),但cls得分较低,而Anchor B的位置较粗(IoU小于θ),但cls得分较高。它们可能具有相同的一致性度t,因此将以相同的pos强度向前推进,这不能反映它们的差异。为了为检测器提供更多的鉴别监督信息,我们建议通过为它们分配更明显的负权重来忠实地表明它们的重要性,这定义为以下2项的乘法。
1、为负样本的概率
根据COCO的评价指标,小于θ的IoU是一个错误预测的充分条件。这意味着一个不满足IoU度量的预测边界框将被视为一个负样本检测,即使它有一个很高的cls分数。也就是说,IoU是确定成为一个负样本的概率的唯一因素,用表示。由于COCO采用了0.5~0.95的IoU区间来估计AP,因此边界框的概率应满足以下规则:
在区间[0.5,0.95]内定义的任何单调递减函数都适用于。为简单起见,将实例化为以下函数:
它通过点(0.5,1)和(0.95,0)。一旦确定,参数k和b可以用未确定系数的方法得到。图3绘制了 vs.IoU。具有不同值的IoU。
图3 vs.IoU
2、为负样本时的重要性
在推理时,Rank列表中的负样本预测不会影响召回率,但会降低精度。为了延迟这一过程,负样本边界框的Rank应该尽可能落后,也就是说,它们的Rank分数应该尽可能小。基于这一点,Rank得分较高的负样本预测比Rank得分较低的负样本预测更重要,因为它们是网络优化的困难样本。
因此,用表示的负样本的重要性应该是Rank分数的函数。为简单起见,将其设置为:
其中,是表明对重要的负样本应该给予多少优先考虑的一个因素。
最后,负样本权重为:
它与IoU呈负相关,但与s呈正相关。可以看出,对于2个pos权重相同的Anchor,IoU较小的Anchor的neg权重较大。的定义与推理过程很好地兼容,它可以进一步区分具有几乎相同pos权重的模糊Anchor。
p_neg_weight = torch.ones_like(joint_conf) neg_metrics = torch.zeros_like(ious).fill_(-1) alpha = 2 t = lambda x: 1/(0.5**alpha-1)*x**alpha - 1/(0.5**alpha-1) if num_gts > 0: def normalize(x): x_ = t(x) t1 = x_.min() t2 = min(1., x_.max()) y = (x_ - t1 + EPS ) / (t2 - t1 + EPS ) y[x<0.5] = 1 return y for instance_idx in range(num_gts): idxs = inside_gt_bbox_mask[:, instance_idx] if idxs.any(): neg_metrics[idxs, instance_idx] = normalize(ious[idxs, instance_idx]) foreground_idxs = torch.nonzero(neg_metrics != -1, as_tuple=True) p_neg_weight[foreground_idxs[0], gt_labels[foreground_idxs[1]]] = neg_metrics[foreground_idxs] p_neg_weight = p_neg_weight.detach() neg_avg_factor = (1 - p_neg_weight).sum() p_neg_weight = p_neg_weight * joint_conf ** 2
3.4 Box Refinement
由于pos和neg加权函数都以IoU作为输入,更准确的IoU可以促使更高质量的样本,有利于学习更强的特征。作者提出一个Box Refinement操作,基于预测偏移图,其中分别表示从当前Anchor中心到最左边的l、最上面的r、最右边的r和最下面的b边的预测距离,如图4所示。由于靠近物体边界的点更有可能预测准确的位置,所以作者设计了一个可学习的预测模块基于粗边界框为每边生成一个边界点。
图4
参照图4,4个边界点的坐标定义为:
其中,是Refinement模块的输出。
Refine的偏移图O'更新为:
if self.with_reg_refine: reg_dist = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) points = self.prior_generator.single_level_grid_priors((h,w), self.strides.index(stride), dtype=x.dtype, device=x.device) points = points.repeat(b, 1) decoded_bbox_preds = distance2bbox(points, reg_dist).reshape(b, h, w, 4).permute(0, 3, 1, 2) reg_offset = self.reg_offset(reg_feat) bbox_pred_d = bbox_pred / stride reg_offset = torch.stack([reg_offset[:,0], reg_offset[:,1] - bbox_pred_d[:, 0],\ reg_offset[:,2] - bbox_pred_d[:, 1], reg_offset[:,3], reg_offset[:,4], reg_offset[:,5] + bbox_pred_d[:, 2], reg_offset[:,6] + bbox_pred_d[:, 3], reg_offset[:,7],], 1) bbox_pred = self.deform_sampling(decoded_bbox_preds.contiguous(), reg_offset.contiguous()) bbox_pred = F.relu(bbox2distance(points, bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4)).reshape(b, h, w, 4).permute(0, 3, 1, 2).contiguous())
3.5 损失函数
所提出的DW方案可以应用于大多数现有的Dense Detectors。这里采用具有代表性的Dense Detectors FCOS来实现DW。如图2所示,整个网络结构由Backbone、FPN和检测Head组成。按照约定将中心度分支和分类分支的输出乘以最终的cls分数,网络的最终损失是:
其中β是一个平衡因子
其中N和M分别是Anchor的总数,FL是Focal Loss,GIoU回归损失,s时预测的cls得分,b和b'分别是预测框和GT的位置。