您的位置:首页 > 移动开发 > Objective-C

论文阅读:RCNN[Rich feature hierarchies for accurate object detection and semantic segmentation]

2017-08-17 20:52 627 查看
文章的突出点

可以利用大容量(high capacity)的卷积神经网络去定位分割物体

当我们训练数据很少的时候,我们可以使用迁移学习的方法来fine-tuning现成的网络

文章的重点当然是我们怎么去定位一个物体,在这里,我们以人脸识别为例,在一张图片中检测出人脸。

数据集:FDDB人脸检测库FDDB

流程:

从一张图像中选取许多个bounding box,文中说明了使用selective search 的方法去选择bounding box。

针对训练数据的bounding box,我们可以利用该图像的annotation data去给每一个图像计算一个IoU值,这个值就是我们该bounding box的得分。

我们可以设置一个阈值,如果bounding box的得分大于该阈值,则为face,否者该bounding box为background。这样我们就有了label,就可以利用VGG16去对他进行分类。

将上述得到训练集的bounding box作为训练集,去微调我们的VGG16网络,在这里我是固定的卷积层的参数,只是训练了全连接层的参数。

训练好分类模型以后,我们怎么去检测呢?

首先我们需要提取出所有的训练集,怎么提取呢?我们计算训练集的所有bounding box的全连接层输出,即就是一个bounding box对应一个4096维度的特征,由于我计算GPU显存不够,我就以一个batch的数组作为我的训练集。batch的组成:128个,64个正样本,64个人负样本组成。

我们同样将测试图像的bounding box提取出来

然后计算出每一个bouning box的全连接层输出,作为该bounding box的特征,即就是4096维度的一个特征。

然后我们针对每一个bounding box用SVM去做回归运算,算出每一个bounding box的得分。

然后我们再指定一个阈值,得分大于该阈值的则会face,否则会background

针对所有预测为face的bounding box,我们再利用非最大抑制(non-maximum suppression)的方法去合并、删除冗余的bounding box。

最后得到的便是我们检测的结果。

下图为例:左边的是输入,中间的未进行非最大抑制的结果,右边是进行非最大抑制的结果。





下面是我们训练的一个结果,我们将FDDB中的两折作为我们微调的数据集,一折作为验证集。Batch组成:[100:60negative, 40positive]



其中涉及的知识:

selective search:这是一种Region proposals的方法

具体的方法没有研究,有兴趣的话,可以阅读一下这篇论文。我感觉大意就是,随机出来一些框,然后按照纹理特征,将一些框框合并。

实现:我直接调用Github上一位大神写的库,地址如下:selective search

IoU:根据字面意思理解,I代表的是交集,U代表的是并集,o在这里代表的是除法。

两个矩阵的IoU值代表的就是两个矩阵的交集面积处于两个矩阵并集之后的面积。下图进行了形象的描述:



之前还看到过另一种定义的方式:size(A交B)/min(size(A), size(B)),我们可以通过实验来选择一种合适的,在这里我选择的是第一种。

非最大抑制(non-maximum suppression):总体来说就是将不同的框框合并。

具体算法流程如下:

输入:N个矩阵R1..RN,N个得分S1..Sn

算法流程:

按照得分从高到低将N个矩阵排序,假设排序好的最高得分的是R1,并且得分依次递减,Rn的得分最低。

从前往后找到第一个未被确定的矩阵x

从该位置往后遍历,计算每一个矩阵y与矩阵x的IoU值,如果该值大于阈值,则删除矩阵y,否则继续该步骤。直到遍历完成整个矩阵集合。

重复步骤2,直到集合中的所有元素都已经确定。

输出:确定的m个矩阵

效果如下图所示,左边的是未进行非最大抑制的结果,右边是进行非最大抑制的结果。



本次实验代码:Upcoder/FaceDetection

欢迎大家mark,有问题一起探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐