天天看点

难例挖掘思想

概念:对于分类来说:

正样本:我们想要正确分类出的类别所对应的样本,例如,我们需要对一张图片分类,确定是否属于猫,那么在训练的时候,猫的图片就是正样本。

负样本:根据上面的例子,不是猫的其他所有的图片都是负样本

难分正样本(hard positives):错分成负样本的正样本,也可以是训练过程中损失最高的正样本

难分负样本(hard negatives):错分成正样本的负样本,也可以是训练过程中损失最高的负样本

易分正样本(easy positive):容易正确分类的正样本,该类的概率最高。也可以是训练过程中损失最低的正样本

易分负样本(easy negatives):容易正确分类的负样本,该类的概率最高。也可以是训练过程中损失最低的负样本。

困难负样本采样步骤:

固定模型,在一个 mini batch 中,首先根据设置的阈值将 prior box 或者 anchor 分为正负样本

计算所有样本的 confidence loss

将正样本的 confidence loss 置零

对 confidence loss 降序排序

根据正样本的数量,选择 confidence loss 前 top-k 的负样本作为困难负样本(一般正负样本比例为1:3)

选择所有正样本和 top-k 负样本计算 confidence loss

选择所有正样本计算 location loss

正负样本阈值设置

在 SSD 中,一个 gt box 是有可能匹配到大于 1 的 prior box的,在一个 mini-batch 内,具体匹配策略为:

简单的说法是这样(先从 groudtruth box 出发,为每个 groudtruth box 找到最匹配的一个 prior box 放入候选正样本集;然后再尝试从剩下的每个 prior box 出发,寻找与 groundtruth box 满足 IoU≥0.5 )

详细的说法是这样

对于每个 prior box 计算与每个 gt 的 IOU,选择最大 IOU 对应的 gt 作为与此 prior box 匹配的 gt(每个 prior box 匹配到一个 gt),根据设置的阈值(一般为 0.5),如果与 prior box 匹配的 gt 的 IOU 小于阈值,则这个 prior box 为负样本,否则为正样本

对于每个 gt 计算与每个 prior box 的 IOU,选择最大 IOU 对应的 prior box 作为与此 gt 匹配的 prior box(每个 gt 匹配到一个 prior box,不管阈值设置为多少,这个 prior box 都是正样本)

在 S3FD 中,采用了一种两阶段 prior box 匹配策略来补偿小脸匹配到的 prior box 不足的情况(正样本):

第一阶段:降低设置的阈值(从 0.5 降到 0.35,这样可以提高所有 gt 匹配到的 prior box 的数量

第二阶段:第一阶段之后,可能还有一些小脸和 prior box 设计尺度之间的脸没有匹配到足够的 prior box。此时,对这些脸,继续降低设置的阈值到 0.1,选择 top-N 的 IOU 作为匹配到的 prior box,N 的大小是第一阶段所有脸的平均值。

难例挖掘与非极大值抑制 NMS 一样,都是为了解决目标检测老大难问题(样本不平衡+低召回率)及其带来的副作用。

SSD中难例挖掘的做法:

先将每一个物体位置上对应 predictions(prior boxes)loss 进行排序。 对于候选正样本集:选择 loss 最高的几个prior box集合与候选正样本集进行匹配(box索引同时存在于这两个集合里则匹配成功),匹配不成功则删除这个正样本(因为这个正样本不在难例里已经很接近ground truth box了,不需要再训练了);对于候选负样本集:选择 loss 最高的几个 prior box 与候选负样本集匹配,匹配成功则作为负样本。这就是一个难例挖掘的过程,举个例子,假设在这8732个prior box里,经过 FindMatches 后得到候选正样本 P 个,候选负样本那就有 8732−P 个。将 prior box 的 prediction loss 按照从大到小顺序排列后选择最高的 M 个prior box。如果这 P 个候选正样本里有 a 个box不在这 M 个prior box里,将这 a 个box从候选正样本集中踢出去。如果这 8732−P 个候选负样本集中包含的8732−P 有 b 个在这 M 个prior box,则将这 b 个候选负样本作为最终的负样本。总归一句话就是:选择 loss 值高的难例作为最后的负样本参与 loss 反传计算。

在目标检测中我们会事先标记好ground_truth,接下来在图片中随机提取一系列sample,与ground_truth重叠率IoU超过一定阈值的(比如0.5),则认为它是positive sample,否则为negative sample,考虑到实际负样本数>>正样本数,我们为了避免network的预测值少数服从多数而向负样本靠拢,取正样本数:负样本数大约为1:3,显而易见,用来训练网络的负样本为提取的负样本的子集,那么,我们当然选择负样本中容易被分错类的困难负样本来进行网络训练。

为了解决正负样本不均衡的问题(负例太多了), 我们应该剔除掉一些容易分类负例, 那么与 ground truth 的 IOU 在 [0, 0.1)之间的由于包含物体的特征很少, 应该是很容易分类的, 也就是说是 easy negitive, 为了让算法能够更加有效, 也就是说让算法更加专注于 hard negitive examples, 我们认为 hard negitive examples 包含在[0.1, 0.5) 的可能性很大,所以训练时, 我们就在这里 随机选取样本训练。

我们先验的认为 IOU 在[0, 0.1)之内的是 easy example, 但是, [0, 0.1) 中包含 hard negitive examples 的可能性并非没有, 所以我们需要对其做 hard negitive mining, 找到其中的 hard negitive examples 用于训练网络.。

按照常理来说 IOU 在[0, 0.1)之内 会被判定为真例的概率很小, 如果这种现象发生了, 可能对于我们训练网络有很大的帮助, 所以 Fast RCNN 会对与 ground truth 的 IoU 在 [0, 0.1)之内的是 example 做 hard negitive examples(难例).

继续阅读