这篇博客记录我在学习《深度学习之PyTorch物体检测实战》一书中关于Faster RCNN这一算法的理解,以及pytorch代码的解读。
pytorch复现代码链接:https://github.com/dongdonghy/Detection-PyTorch-Notebook/tree/master/chapter4/faster-rcnn-pytorch
当然pytorch官方已经在torchvision 模块集成了 FasterRCNN代码。如果对官方源码感兴趣的话,这里有一篇文章介绍的很不错:捋一捋pytorch官方FasterRCNN代码
Faster RCNN总览
纵观整个网络,其结构如下论文所描述的图,可以分为四个部分:特征提取网络模块、 RPN模块、 RoI(Region of Interest)Pooling 模块与区域分类模块。Faster RCNN延续了RCNN系列的思想, 即先进行感兴趣区域RoI的生成, 然后再把生成的区域分类, 最后完成物体的检测, 这里的RoI使用的即是RPN模块, 区域分类则是RCNN网络。
- 特征提取网络:Faster RCNN使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。以VGGNet为例, 假设输入图像的维度为3×600×800, 由于VGGNet包含4个Pooling层(物体检测使用VGGNet时, 通常不使用第5个Pooling层) , 下采样率为16, 因此输出的feature map的维度为512×37×50。
- RPN模块:这一模块用于生成region proposals,作用是生成较好的建议框, 即Proposal, 这里用到了强先验的Anchor,其可以分为五个子模块:Anchor生成、RPN卷积网络、计算RPN loss、生成Proposal、筛选Proposal得到RoI,后面会详细介绍这5个子模块。
- Roi Pooling:该层收集输入的feature maps和proposals,输出送到RCNN网络中。 由于RCNN模块使用了全连
接网络, 要求特征的维度固定, 而每一个RoI对应的特征大小各不相同, 无法送入到全连接网络, 因此RoI Pooling将RoI的特征池化到固定的维度, 方便送到全连接网络中。
4.区域分类模块:将RoI Pooling得到的特征送入全连接网络, 预测每一个RoI的分类, 并预测偏移量以精修边框位置, 并计算损失, 完成整个Faster RCNN过程。整个模块可以分为三个部分:RCNN全连接网络部分、计算RCNN的真值,计算RCNN loss。
整个Faster RCNN的流程图如下图所示,虚线表示仅仅在训练时有的步骤。
从上面的过程中,我们可以看出为什么Faster RCNN是一个两阶的算法, 因为整个过程中RPN与RCNN, 这两步都需要计算损失, 只不过前者还要为后者提供较好的感兴趣区域。