难例挖掘分析
看了很多的博客,但还是没有发现更好的难例挖掘问题的解释。于是自己查看源码,最后终于是知道了整个过程。写个博客记录下。
首先说明一下,什么是困难负样本?说白了就是对分类器迷惑性大的样本,这类样本的实际标签是负的,但是分类器往往预测为正的。
在目标检测中我们会事先标记好ground_truth,接下来在图片中随机提取一系列sample,与ground_truth重叠率IoU超过一定阈值的(比如0.5),大于则认为它是positive sample,否则为negative sample,(注意:这里的positive sample中也会包含有负样本(即,假阳),而这里的negative sample组成的集合就是之后说的负样本集合)。
考虑到实际负样本数>>正样本数,我们为了避免network的预测值少数服从多数而向负样本靠拢,取正样本数:负样本数大约为1:3,显而易见,用来训练网络的负样本为提取的负样本的子集,那么,我们当然选择负样本中容易被分错类的困难负样本来进行网络训练啰。
然后使用positive sample这个样本集合去训练我们的网络,再用训练好的网络去预测negative sample,选择其中得分最高的前k个negative sample,也就是k个hard negative sample。再将这k个加入到负样本集中,重新训练网络,循环往复,然后就会发现网络的分类性能更好了。