赞
踩
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
https://github.com/facebookresearch/Detectron (首推!Faster RCNN原班人马复现代码,模型有很多,Faster RCNN、端到端的Faster RCNN、Mask RCNN以及keypoint net。但是基于caffe2实现,可读性差)
https://github.com/tensorflow/models/tree/master/research/object_detection (由google实现,专人维护,同样有可选多模型。基于tensorflow实现,使用了tensorflow各种特性,对tensorflow没有一定掌握程度的同学,很难读懂代码)
https://github.com/smallcorgi/Faster-RCNN_TF (python2,tensorflow,最大的亮点是类函数链式调用实现网络结构,可读性强超强。唯一缺点就是roi pooling的代码没有开源)
https://github.com/endernewton/tf-faster-rcnn (tensorflow,slim,有全部实现代码,可读性较强)
(您的点赞是对知识分享的最大认可,谢谢)
Faster R-CNN是截止目前,RCNN系列算法的最杰出产物,two-stage中最为经典的物体检测算法。推理第一阶段先找出图片中待检测物体的anchor矩形框(对背景、待检测物体进行二分类),第二阶段对anchor框内待检测物体进行分类。
R-CNN系列物体检测算法的思路都是,先产生一些待检测框,再对检测框进行分类。Faster R-CNN使用神经网络生成待检测框,替代了其他R-CNN算法中通过规则等产生候选框的方法,从而实现了端到端训练,并且大幅提速。如果不了解R-CNN、Fast R-CNN,建议不必深究,不影响读懂Faster R-CNN。
前文中推荐的几篇解读,在各种Faster R-CNN文章中算是比较出类拔萃的,本文同样将其作为参考。Faster R-CNN实现细节相对复杂,论文以及论文解读,都无法百分之百还原算法全貌,透彻理解需要同时阅读代码。
整个Faster R-CNN可以分为三部分:
第一部分backbone就是普通的卷积网络,输出特征图供后续两阶段共用。第三部分中的分类网络,通过两个全连接层,再通过两个姊妹全连接层(论文中用词,指相同尺寸,不共享权值的两个全连接层),分别输出坐标微调回归信息与检测框分类信息。下面重点解释RPN与RoI pooling。
论文中这张图,说实话有点难理解,sliding window很容易误导人理解为anchor框。更清晰的结构图,继续引用《一文读懂Faster RCNN》中的RPN结构图:
原来图三中的sliding window,是一个kernal size为3*3的卷积层。再通过两个姊妹1*1的卷积层,输出两个特征图,也就是图三中的2k scores、4k coordinates。
对应的标签
其中,
也就是说,anchor框事先人为设定的宽高,全部蕴含在对应位置中,比如特征图上具体某一个点,一共输出36维数值,前4维,就固定按照进行anchor框1事先设定的
4. Proposal层:
Proposal层一共有5个输入参数:
Proposal层所做的事情有:
所以整个RPN的作用就是:
RoI pooling源自Fast RCNN,原文中对RoI pooling定义如下:
RoI max pooling works by dividing the h × w RoI window into an H × W grid of sub-windows of approximate size h/H × w/W and then max-pooling the values in each sub-window into the corresponding output grid cell. Pooling is applied independently to each feature map channel, as in standard max pooling.
解释一下这里的具体操作:
对于一个
RPN在特征图中会产生尺寸不一致的Proposal区域,而在Faster RCNN中,之后的分类网络输入尺寸固定为7*7,所以对于任意大小的输入,都用7*7的网格覆盖原区域。在7*7中每个格子上,取当前格子覆盖区域内的最大值(max pooling)。任意大小的Proposal,就这样都pooling成了7*7的尺寸。
回顾一下Faster RCNN的两个stage,RPN与之后的分类网络,输出都是坐标回归数值与分类数值,所以两个网络的Loss函数都可以用如下式子表达:
其中,
这里重点说下标签:原文中提到会指派一个二分类标签(是待检测物体or not),指定一个正例标签有两种情况:(1)IoU最高的anchor box;(2)IoU数值大于0.7。一般来说,条件(2)已经可以找到很多的正例框,(1)是用来防止一些IoU很小的罕见的检测框。
论文中所述,Faster R-CNN的训练一共有四个步骤:
In the first step, we train the RPN as described in Section 3.1.3. This network is initialized with an ImageNet-pre-trained model and fine-tuned end-to-end for the region pro- posal task. In the second step, we train a separate detection network by Fast R-CNN using the proposals generated by the step-1 RPN. This detection network is also initialized by the ImageNet-pre-trained model. At this point the two networks do not share convolutional layers. In the third step, we use the detector network to initialize RPN training, but we fix the shared convolutional layers and only fine-tune the layers unique to RPN. Now the two networks share convolutional layers. Finally, keeping the shared convolutional layers fixed, we fine-tune the unique layers of Fast R-CNN.
注:如图二所示,以下统一将特征提取部分卷基层称为backbone,RPN和Fast RCNN网络则指两个网络独有的网络结构部分。
其实在代码实现中,从backbone到RPN,再到Fast RCNN分类网络,每一步计算都不丢弃变量的导数传递,那么可以实现整个网络的端到端训练。只需要用ImageNet预训练backbone,之后的RPN与Fast RCNN部分,同时产生loss,同时反向传播更新,backbone部分也一直在共享。端到端的训练方式更容易普及,更加便于工程化实现。
Faster R-CNN第一阶段的RPN,简单修改之后,就成了一年之后的Yolo v1。
RPN、RoI pooling原理直观,但是编程实现,比Yolo系列要难很多,不断的数据shape对齐,并且在这些操作中不能丢弃参数之间的导数传递(例如不能使用tf.py_func),是非常考验深度学习编程功底的。
检测系列最经典的两个算法,R-CNN与Yolo,一个开创了区域检测思路,另一个开创了使用回归做物体检测。引用朋友的一句话,R-CNN与Yolo相对天才,而SSD就比较平庸了。
参考:
一文读懂Faster RCNN
完,欢迎指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。