zoukankan      html  css  js  c++  java
  • NMS—卷积神经网络

    1-传统的NMS

    NMS,非极大值抑制,在很多计算机视觉问题中有着重要应用,尤其是目标检测领域。

    以人脸检测为例,通常的流程为3步:

    (1)通过滑动窗口或者其它的object proposals方法产生大量的候选窗口;

    (2)用训练好的分类器对候选窗口进行分类,该过程可以看做是一个打分的过程;

    (3)使用NMS对上面的检测结果进行融合(因为一个目标可能被检测出多个窗口,而我们只希望保留一个)。

    如下图是(2)分类检测之后的结果: 

    以此图为例,传统的NMS,首先选定一个IOU阈值,例如为0.25。然后将所有4个窗口(bounding box)按照得分由高到低排序。然后选中得分最高的窗口,遍历计算剩余的3个窗口与该窗口的重叠面积比例(IOU),如果IOU大于阈值0.25,则将窗口删除。然后,再从剩余的窗口中选中一个得分最高的,重复上述过程。直至所有窗口都被处理。

    假如0.25是一个不错的阈值,那么我们可以得到比较好的结果,如下图:

    如果,我们的IOU阈值设定的特别小,比如说0.1。那么2个人的窗口会被归为一个人而被融合。得到下面的错误结果:

    如果,我们的IOU阈值设定的特别大,比如说0.6。那么又可能得到下面的错误结果: 
     

    由上可知,对于传统的NMS算法选择一个好的阈值是多么重要的一件事,但又是一件很困难的事。传统的NMS是一种硬判决,是一种贪心算法。因此在文章中,作者称传统的NMS算法为:GreedyNMS

    2-NMS-ConvNet

    再提及一下,传统的NMS在判决融合的时候,只利用到了2个信息:Score 和 IOU ,即每个框的得分和框与框之间的重叠比例。

    文章用神经网络去实现NMS,所利用的同样也是这2个信息。如下图的整个流程图: 

    由网络结构图中的红色框可以得到,输入data层有2个,一个是Score map,一个是 Iou layer.下面我们讲述一下,如何由最初的bounding box去得到这两个data层。

    2-1 映射——制作score map

    假定原图像尺寸为W×H,那么我们要制作的score map大小为w×h,其中w=W/4, h=H/4,则score map上的一个点对应着原图的4×4的区域: 

    对于一个bounding box ,我们计算其中心然后判断其属于哪个区域,然后将该box的score填入score map对应的位置。如下图: 

    如果有多个bounding box的中心落入同一区域,则只记录最高得分。

    到此,我们已经得到了w×h×1的score map.

    文章提到,传统的NMS需要排序,但在卷积神经网络中,很难用各种线性组合和非线性激活去模拟排序。因此,文章先用传统的NMS处理一遍bounding boxes, 然后再生成一张同样大小的score map,记作S(T),T为NMS的阈值。

    最终,我们得到了w×h×2的score map. 记作S(1,T)

    2-2 制作IOU层

    IOU,intersection-over-union。因此IOU层描述的也就是bounding box之间的相交关系。

    IOU层大小为w×h×121,其中121=11×11,即描述的是相应中心点11×11范围内存在的box的相交关系。 
    如下图所举出的例子,左侧的图是score map S(1),粉色表明有值,则每个粉色处也对应着一个bounding box。以红色为中心划一个11×11的范围,则可以依次计算每一个位置对应的box与中心点对应box的IOU,其值记作I,如右侧所示。 同理,易知 I(7,8,i)一定为0。

    2-3 网络解析

    我们再来看一下网络结构: 

    注意2点:

    (1): IOU层的kernel size 为1,stride也为1。 
    Score map层的kernel size 为11×11,这是为了呼应IOU层;stride 为1 ,pad 为5,这是为了获得和输入同样尺寸的输出:

    (2): Layer 2将之前的2个输出拼接,之后所有的卷积都是1×1。最终的输出仍然是一个尺寸一致的score map .

    2-4 输出及Loss

    理想的输出是一个同输入尺寸完全一致的score map 图,在该图中,每一个目标只拥有一个score,相应地也只对应了一个bounding box。

    因此训练的目标就是保留一个,抑制其它。如下图: 

    (1)上图a的score map 是我们的输入,由图易知,这里面一共有5个有效的score,则也对应着5个bounding box。

    (2) 假设5个bounding box都是同一个目标的检测结果。则我们的训练目的则是保留最好的一个,抑制其余4个。 
    为此,我们首先分配标签:5个bounding box 中满足与ground truth 的IOU大于0.5且得分最高的box作为正样本,其余均为负样本,如上图b所示。

    (3)显然正负样本的数量严重不均衡,因此计算loss之前,我们要分配一下权重用于权衡这种失衡。权重的分配很简单,如图c所示,正样本的权重总和与负样本的权重总和相等。

    (4)上右侧的图为理想的输出。综上,我们的Loss Function就可以很容易得出了(类似于pixel级别的分类): 

    其中,p属于G,表示score map 中有值的点。

    文章转自: https://blog.csdn.net/shuzfan/article/details/50371990

  • 相关阅读:
    tornado之运行第一个tornado程序
    Django之QuerySet 查询
    openstack之路:KVM/Libvirt 安装
    【原创】Linux基础之SSH隧道/端口转发
    【原创】运维基础之keepalived
    【原创】数据库基础之Mysql(2)主从库配置
    【原创】Linux基础之iptables
    【原创】大叔经验分享(28)ELK分析nginx日志
    【原创】算法基础之Anaconda(1)简介、安装、使用
    【原创】大数据基础之Airflow(1)简介、安装、使用
  • 原文地址:https://www.cnblogs.com/zongfa/p/9006051.html
Copyright © 2011-2022 走看看