Faster R-CNN精读笔记

Faster R-CNN笔记

我的总结

感觉Faster R-CNN的整个过程可以理解为:现在图像上进行正常的卷积运算,最后得到一个特征图,特征图上的每个点都反推回到原始图像中对应的某个中心位置生成锚框,这样一套下来就会在原图上面得到密密麻麻的锚框。

因为这样得到的边界框非常不准确,所以这时就要依靠所输出的两个类别:背景和非背景类别的得分结合模型对边界框进行调整。调整后的边框就可以丢进Fast R-CNN中进行检测,其实就是相当于将Fast R-CNN中的SS得到候选区域建议边界框的换成了本文中的RPN来进行获取。

摘要

最先进的目标检测网络依赖于区域建议的算法来完成目标的定位,一些先进的目标检测算法减少了这些检测算法的运行时间,并且将建议区域的计算作为时间提升的瓶颈。

在本文中,作者提出了一种RPN方法使得检测部分的网络可以共享整张图片的卷积特征。RPN是完全由卷积组成的网络,可以同时对每个位置完成目标边界框和目标类别得分的预测。同时RPN是端对端训练的,可以生成高质量的区域建议(也被用在Fast R-CNN中)。

通过简单的优化,RPN和Fast R-CNN在训练后可共享卷积特征,文章中的代码可以在https://github.com/ShaoqingRen/faster_rcnn中找到。

Introduction

作者再次指出目标检测发展的瓶颈仍然在于区域建议中。并且认为本文中提出的RPN(Region Proposal Network),即计算区域建议的神经网络是优雅且高效的,并且通过在测试阶段卷积共享,得到了非常小的运行时间。

目标检测所使用的卷积特征图可以用在生成区域建议中,作者在现有的卷积特征上增加两个额外的卷积层:

  • 一个将每个卷积图的位置编码为一个256维的特征向量
  • 另一个对于每个卷积图的位置输出其对应所有类别的得分,同时回归输出k个区域建议边界框(这些建议的区域具有不同的比例和长宽比),而这个k通常取值为9

所以RPN是一种完全由卷积组成的网络,并且可以被训练用于生成目标检测的区域建议,为了将RPN和Fast R-CNN统一起来使用,作者提出一个简单的训练方法,可以在区域建议任务和目标检测任务中进行选择性微调,同时可以保证建议的区域是相对固定的。这种训练方法可以快速收敛并且产生统一的可以在两个任务中共享的卷积特征。

Faster R-CNN

Faster R-CNN由两个模块组成:

  • 一个是由卷积层所组成的较深的网络,该网络提供区域建议
  • 另一个是使用所提供的区域建议进行检测的Fast R-CNN

这整个用于目标检测的网络是一体的、融合的,使用最近比较流行的“注意力”机制,RPN告诉Fast R-CNN去看哪里

Region Proposal Networks

RPN以一张图像作为输入,输出一堆长方形的区域建议(也就是边界框)和对应的类别得分。

因为最终目标是与Fast R-CNN目标检测网络共享计算,所以这里假设卷积层是共用的。而在实验中,作者参考了ZFNet和VGG,因为他们的卷积层是共享的。(这里的共享指的是共用卷积部分得到的结果)

为了得到区域建议,作者使用了一个小网络(应该是卷积核)滑过最后一个共享卷积层输出的卷积特征图,每个滑动窗口被映射到一个较低维度的特征,这个特征向量将被丢入两个并行的(兄弟的?)全连接层中:

  • 一个是可以线性回归得到锚框相对于边界框的偏移量
  • 一个是用于判断对应锚框内是背景或非背景

本文中使用的滑动窗口的大小是3x3,因为这样选了之后它的感受野也是很大的。同时,这个结构是由1x1的卷积核的卷积层实现的。

这部分的任务是判断锚框内是否有物品以及如何调节锚框得到建议区域的边界框。

Anchors

每个滑动窗口同时预测区域建议的边界框和类别,每个位置最多预测k个边界框,所以预测边界框的层输出4k个值(用以表示边界框的位置及大小,同时输出2k个得分(这里2k个得分中,每两个得分就有一个得分表示这里是背景的概率,另一个得分表示这里不是背景的概率)

Translation-Invariant Anchors

作者在这部分里面介绍了自己的方法对于图像的处理是不会影响比例之类的,并且大大减少了计算的消耗,并且所使用的参数量也得到了减少

Loss function

在训练RPN时,将为每个锚框分配一个二分类器,用以分类该锚框内是否为背景类别。并且对以下两种锚框赋予正标签:

  • 与数据集里的边界框有最大IoU
  • 与边界框有大于0.7的IoU

通常来说第二种方法可以充分的检测到正样本,但是作者仍然采用第一种方法,因为第二种个方法有可能会找不到目标(应该是指没有锚框与边界框的IoU达到0.7,虽然发生的概率很少,但还是有可能)。

同时,对IoU小于0.3的锚框赋予负标签,其余既不是正标签也不是负标签的锚框将不会对训练目标产生影响。

本文中所使用的的损失函数与Fast R-CNN中的损失函数十分类似。

这部分好像都是介绍这个损失函数,太复杂了不想看了。

Training RPNs

调整损失函数来计算所有锚框的损失是有可能的,但是有可能会导致最终预测阶段模型倾向于将锚框内容预测为负样本(即预测为背景),所以作者对每个mini-batch中的锚框随机抽取256个来计算损失函数,其中所选取的256个锚框内正负样本的比例为1:1,如果图像内少于128个正样本,则使用负样本进行填充。

所有层的初始化都使用以0为均值,标准差为0.01的高斯分布,而卷积层的初始化则使用基于ImageNet的预训练模型。

Sharing Features for RPN and Fast R-CNN

RPN和Fast R-CNN的训练是相互独立的,他们会以自己的方式对卷积层进行修改。所以作者需要寻找一个技巧使得卷积层可以在两个网络内实现共享,而不是分别为这两个网络训练不同的卷积网络。作者提出了三个方法:

  • 交替训练:首先训练RPN,再用训练得到的区域建议训练Fast R-CNN,Fast R-CNN训练得到的网络再作为初始化去训练RPN,这种操作迭代进行(这篇论文的所有试验==实验用的都是这个方法)
  • 联合训练:将RPN和Fast R-CNN联合在一个网络里面共同进行训练,在使用SGD训练Fast R-CNN的每次迭代中,前向传播过程中产生的区域建议被视为是固定、预先计算的。反向传播则和往常一样,会结合RPN和Fast R-CNN的损失(与交替训练得到的结果相似,但减少了25-30%的训练时间)

4-Step Alternating Training

  • 使用Training RPNs中的方法训练RPN,其中网络初始化基于ImageNet预训练模型
  • 使用步骤一中的RPN生成的区域建议训练Fast R-CNN,网络初始化同样基于ImageNet预训练模型(注意:这一步所使用的卷积层是和RPN中所使用的卷积层是分开的,不一样的)
  • 使用目标检测的网络(即第二步里得到的网络)作为初始化训练RPN,但是我们会固定部分层,只调整对RPN有影响的部分(这时两部分的卷积部分实现共享)
  • 固定卷积部分,只训练对Fast R-CNN独有的部分

完成上面步骤后,两部分网络就实现了对卷积部分的共享,并且作者指出同样的交替训练可以进行多次,但是只得到一点点提升。

这篇论文剩下的部分就是拿自己的方法进行实验并得出了这个方法是当时最高效最准确的方法,不想看了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值