Bootstrapping Face Detection with Hard Negtive Examples

最近在做一个detection的项目,所以找了很多相关的文章。其中这篇文章提到的Hard Negtive Mining能够解决在实际工程里面出现误检的现象,另外文章中使用的resNet准备后面也尝试一下,感觉性能会比现在修改了的googleNet更强。

文章内容

文章一共就7页,主要讲的就是基于faster rcnn做的一个人脸检测的方法, faster rcnn分成rpn和fast rcnn两个部分。

Faster-RCNN

文章介绍的Hard Negtive Mining可以理解为一种训练方法,在faster rcnn正常训练的过程中,rpn输出了预测的一系列框和打分(proposals),在这些proposals中,有正确的框和错误的框(positive samples和negtive samples)。
有了这些proposals,fast rcnn的训练就应该可以进行了呗。但是细节上处理的时候,正样本和负样本的比例被设置成1:3,这里应该是防止训练过程中出现太多负样本导致训练出问题(比如proposals里面有一个正样本,剩下全是负样本,训练的时候提的特征都会是和你需要检测的目标没有关系的特征)。
这样就有一个选择负样本的问题了,在rbg的py-faster-rcnn中是随机选择一些负样本的。这篇文章就希望在这个地方做点改进,通过修改负样本让训练的网络更加具有判别性(deterministic)。

Hard Negtive Mining

reddit上有个讲解通俗易懂Hard Negtive Mining。大致意思就是说:训练完之后,在训练样本中有那么一些训练数据输入网络中输出的proposal和score是有问题的
(比如在行人检测中,提取的proposal没有框到人,但是打分却很高),这样的proposal被称为false positive,可以保存下来作为训练的时候的负样本。
所以整个改进的训练流程就变成这样子:1.第一次训练和之前一样,得到一个模型;2.用训练好的模型以及测试网络,对每张训练图片跑一边,会得出一系列的proposal,拿这些proposal和gt对比,如果proposal的打分大于一定值而且和gt的IoU又小于一个阈值,
就把这个proposal看作false positive;3.修改训练的网络,把保存的false positive放到训练的时候用的negtive samples里面去,完成训练。

总结

总体来说方法比较简单,修改的文件内容也不是很多,提取false positive用到demo.py,修改网络修改roi_data_layer/minibatch.py和roi_data_layer/layer.py还有rpn/proposal_target_layer.py三个文件。最后说一下实验结果
实验结果
可以看到左上角的两条线分别是resNet和resNet with HNM,提高是有的,不过基础的resNet就已经比faster rcnn文章里面用的VGG16好了很多了(VGG16应该是最后高了70%一点吧),所以说resNet和这个比起来还是更直接一点。


Bootstrapping Face Detection with Hard Negtive Examples
http://yoursite.com/2016/08/18/Bootstrapping-Face-Detection-with-Hard-Negtive-Examples/
Author
John Doe
Posted on
August 18, 2016
Licensed under