目标检测-Faster RCNN算法学习笔记

本文详细介绍了Faster R-CNN目标检测算法,包括RPN、感受野、Anchors和Loss函数。Faster R-CNN通过网络训练替换传统目标提取方法,提高检测速度。文章阐述了Anchors的作用、Loss函数的计算以及Region Proposal Network的训练过程,帮助理解目标检测的核心概念。
摘要由CSDN通过智能技术生成
个人微信公众号:AI研习图书馆,欢迎关注~

深度学习知识及资源分享,学习交流,共同进步~

1. 引言

Faster R-CNN是目标检测界的大神Ross Girshick 2015年提出的一个很经典的检测结构,它将传统的Selective Search提取目标的方法替换成网络训练来实现,使得全流程的检测、分类速度大幅提升。

图1是Faster R-CNN的基本结构,由以下4个部分构成:
在这里插入图片描述
1、特征提取部分:用一串卷积+pooling从原图中提取出feature map;
2、RPN部分:这部分是Faster R-CNN全新提出的结构,作用是通过网络训练的方式从feature map中获取目标的大致位置;
3、Proposal Layer部分:利用RPN获得的大致位置,继续训练,获得更精确的位置;
4、ROI Pooling部分:利用前面获取到的精确位置,从feature map中抠出要用于分类的目标,并pooling成固定长度的数据。

目标检测的思想是,首先在图片中寻找“可能存在物体的位置(regions)”,然后再判断“这个位置里面的物体是什么东西”,所以region proposal就参与了判断物体可能存在位置的过程。

2. Faster RCNN关键词解析

2.1 感受野

在这里插入图片描述
卷积神经网络CNN中,某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野receptive field。感受野的大小是由kernel size,stride,padding , outputsize 一起决定的。
在这里插入图片描述
output field size = ( input field size - kernel size + 2*padding ) / stride + 1

2.2 Anchors

1. Anchors介绍

字面上可以理解为锚点,位于之前提到的nn的sliding window的中心处。对于一个sliding window,我们可以同时预测多个proposal,假定有k个。k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定。所以,我们在后面说一个anchor,你就理解成一个anchor box 或一个reference box。作者在论文中定义k=9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应的9个reference boxes, 4k个reg-layer的输出和2k个cls-layer的score输出。对于一幅WH的feature map,对应WHk个锚点。所有的锚点都具有尺度不变性。

2. anchor可以做什么?

在faster rcnn里面,anchor(或者说RPN网络)的作用是代替以往rcnn使用的selective search的方法寻找图片里面可能存在物体的区域。当一张图片输入resnet或者vgg,在最后一层的feature map上面,寻找可能出现物体的位置,这时候分别以这张feature map的每一个点为中心,在原图上画出9个尺寸不一anchor。然后计算anchor与GT(ground truth) box的iou(重叠率),满足一定iou条件的anchor,便认为是这个anchor包含了某个物体。

2.3 Loss functions

在计算Loss值之前,作者设置了anchors的标定方法。正样本标定规则:

  1. 如果Anchor对应的reference box与ground truth的IoU值最大,标记为正样本;

  2. 如果Anchor对应的reference box与ground truth的IoU>0.7,标记为正样本。事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference box与groud truth的IoU不大于0.7,可以采用第一种规则生成。

  3. 负样本标定规则:如果Anchor对应的reference box与ground truth的IoU<0.3,标记为负样本。

  4. 剩下的既不是正样本也不是负样本,不用于最终训练.

  5. 训练RPN的Loss是有classification loss (即softmax loss)和regression loss (即L1 loss)按一定比重组成的.

计算softmax loss需要的是anchors对应的groundtruth标定结果和预测结果,计算regression loss需要三组信息:

i. 预测框,即RPN网络预测出的proposal的中心位置坐标x,y和宽高w,h;

ii. 锚点reference box:

之前的9个锚点对应9个不同scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a和宽高w_a,h_a;

iii. ground truth:标定的框也对应一个中心点位置坐标x*,y和宽高w,h*。因此计算regression loss和总Loss方式如下:

RPN训练设置:

(1)在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的(?),其中正负样本的比例为1:1。

(2)如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然。

(3)训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化。

2.4 Region Proposal

1.Region Proposal介绍

在feature map上的每个特征点预测多个region proposals。具体作法是:把每个特征点映射回原图的感受野的中心点当成一个基准点,然后围绕这个基准点选取k个不同scale、aspect ratio的anchor。

2. Region Proposal有什么作用?
(1)COCO数据集上总共只有80类物体,如果不进行Region Proposal,即网络最后的classification是对所有anchor框定的Region进行识别分类,会严重拖累网络的分类性能,难以收敛。原因在于,存在过多的不包含任何有用的类别(80类之外的,例如各种各样的天空、草地、水泥墙、玻璃反射等等)的Region输入分类网络,而这些无用的Region占了所有Region的很大比例。换句话说,这些Region数量庞大,却并不能为softmax分类器带来有用的性能提升(因为无论怎么预测,其类别都是背景,对于主体的80类没有贡献)。

(2)大量无用的Region都需要单独进入分类网络,而分类网络由几层卷积层和最后一层全连接层组成,参数众多,十分耗费计算时间,Faster R-CNN本来就不能做到实时,这下更慢了。

3. 区域生成网络 ( Region Proposal Networks )

网络模型整体训练过程:
在这里插入图片描述
分析:

如何训练出一个网络来替代selective search相类似的功能呢?论文借鉴SPP和ROI中的思想 在feature map中提取proposal。 先通过对应关系把feature map的点映射回原图,在每一个对应的原图设计不同的固定尺度窗口(bbox),根据该窗口与ground truth的IOU给它正负标签,让它学习里面是否有object,这样就训练一个网络(Region Proposal Network)。

由于我们只需要找出大致的地方,无论是精确定位位置还是尺寸,后面的工作都可以完成,作者对bbox做了三个固定:固定尺度变化(三种尺度),固定scale ratio变化(三种ratio),固定采样方式(只在feature map的每个点在原图中的对应ROI上采样,反正后面的工作能进行调整)。如此就可以降低任务复杂度。

可以在特征图上提取proposal之后,网络前面就可以共享卷积计算结果(SPP减少计算量的思想)。这个网络的结果就是卷积层的每个点都有有关于k个achor boxes的输出,包括是不是物体,调整box相应的位置。
在这里插入图片描述
在这里插入图片描述

具体过程:

  1. 得到最终用来预测的feature map:图片在输入网络后,依次经过一系列conv+relu (套用ImageNet上常见的分类网络即可 本论文实验了5层的ZF,16层的VGG-16)得到的feature map,额外添加一个conv+relu层,输出5139256维特征(feature map)。准备后续用来选取proposal,并且此时坐标依然可以映射回原图。
  2. 计算Anchors: 在feature map上的每个特征点预测多个region proposals。具体作法是:把每个特征点映射回原图的感受野的中心点当成一个基准点,然后围绕这个基准点选取k个不同scale、aspect ratio的anchor。论文中3个scale(三种面积),3个aspect ratio( {1:1,1:2,2:1} )
    在这里插入图片描述

关于正负样本的划分: 考察训练集中的每张图像(含有人工标定的ground true box) 的所有anchor(NMk)

  1. 对每个标定的ground true box区域,与其重叠比例最大的anchor记为 正样本 (保证每个ground true 至少对应一个正样本anchor)

  2. 对a)剩余的anchor,如果其与某个标定区域重叠比例大于0.7,记为正样本(每个ground true box可能会对应多个正样本anchor。但每个正样本anchor 只可能对应一个grand true box);如果其与任意一个标定的重叠比例都小于0.3,记为负样本。

  3. 对于1,2中剩余的anchor,弃去不用。

  4. 跨越图像边界的anchor弃去不用。

在这里插入图片描述
定义损失函数:对于每个anchor,首先在后面接上一个二分类softmax,有2个score 输出用以表示其是一个物体的概率与不是一个物体的概率,然后再接上一个bounding box的regressor 输出代表这个anchor的4个坐标位置,因此RPN的总体Loss函数可以定义为 :
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中L(reg)为:
在这里插入图片描述

4. 感受野的计算

公式化一下:
在这里插入图片描述
上面只是给出了 前一层在后一层的感受野,如何计算最后一层在原始图片上的感受野呢? 从后向前级联一下就可以了(先计算最后一层到倒数第二层的感受野,再计算倒数第二层到倒数第三层的感受野,依次从后往前推导就可以了)

卷积神经网络物体检测之感受野大小计算:用如下核心代码计算 Alexnet zf-5和VGG16网络每层输出feature map的感受野大小。

net_struct = {'alexnet': {'net':[[11,4,0],[3,2,0],[5,1,2],[3,2,0],[3,1,1],[3,1,1],[3,1,1],[3,2,0]],
                   'name':['conv1','pool1','conv2','pool2','conv3','conv4','conv5','pool5']},
       'vgg16': {'net':[[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],
                        [2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0]],
                 'name':['conv1_1','conv1_2','pool1','conv2_1','conv2_2','pool2','conv3_1','conv3_2',
                         'conv3_3', 'pool3','conv4_1','conv4_2','conv4_3','pool4','conv5_1','conv5_2','conv5_3','pool5']},
       'zf-5':{'net': [[7,2,3],[3,2,1],[5,2,2],[3,2,1],[3,1,1],[3,1,1],[3,1,1]],
               'name': ['conv1','pool1','conv2','pool2','conv3','conv4','conv5']}}

imsize = 224

def outFromIn(isz, net, layernum):#从前向后算输出维度
    totstride = 1
    insize = isz
    for layer in range(layernum):
        fsize, stride, pad = net[layer]
        outsize = (insize - fsize + 2*pad) / stride + 1
        insize = outsize
        totstride = totstride * stride
    return outsize, totstride

def inFromOut(net, layernum):#从后向前算感受野 返回该层元素在原始图片中的感受野
    RF = 1
    for layer in reversed(range(layernum)):
        fsize, stride, pad = net[layer]
        RF = ((RF -1)* stride) + fsize
    return RF

在这里插入图片描述
感受野上面的坐标映射

通常,我们需要知道网络里面任意两个feature map之间的坐标映射关系(一般是中心点之间的映射),如下图,我们想得到map 3上的点p3映射回map 2所在的位置p2(橙色框的中心点)
在这里插入图片描述

计算公式
在这里插入图片描述
上面是计算任意一个layer输入输出的坐标映射关系,如果是计算任意feature map之间的关系,只需要用简单的组合就可以得到,下图是一个简单的例子:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
SPP-net的ROI映射做法详解

SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的两个对应点。 有了feature map上的两队角点就确定了 对应的 feature map 区域(下图中橙色)。

在这里插入图片描述
如何映射?
在这里插入图片描述
对应点之间的映射公式是啥?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

您的支持,是我不断创作的最大动力~

欢迎点赞关注留言交流~

深度学习,乐此不疲~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI研习图书馆

您的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值