R-CNN是所有提到的算法的“父算法”,它为研究人员构建更复杂、更好的算法提供了路径。我正在尝试解释R-CNN及其变体。
R-CNN或基于区域的卷积神经网络
R-CNN由以下3个简单步骤组成:
- 使用称为Selective Search的算法扫描输入图像以查找可能的对象,并生成约2000个区域提议
- 在每个这些区域提议上运行卷积神经网络(CNN)
- 获取每个CNN的输出,并将其馈入a) SVM对区域进行分类,b)线性回归器来收紧对象的边界框(如果存在这样的对象)。
![A pictorial description of R-CNN](https://istack.dev59.com/nwVF6.webp)
快速 R-CNN:
快速 R-CNN 紧随 R-CNN 之后。由于以下几点原因,快速 R-CNN 更快更好:
- 在提出区域之前对图像进行特征提取,因此只需在整个图像上运行一个 CNN,而不是在 2000 个重叠区域上运行 2000 个 CNN。
- 用 softmax 层替换 SVM,从而扩展神经网络以进行预测,而不是创建新模型。
![A pictorial description of Fast R-CNN](https://istack.dev59.com/sCtsK.webp)
直觉上,删除2000个卷积层并取代一个卷积层,在其之上制作框,这个想法非常有道理。
更快的R-CNN:
Fast R-CNN 的缺点之一是慢速选择性搜索算法,而 Faster R-CNN 引入了称为区域建议网络(RPN)的东西。
以下是 RPN 的工作原理:
在初始 CNN 的最后一层,一个 3x3 的滑动窗口沿着特征图移动并将其映射到较低的维度(例如 256-d)。对于每个滑动窗口位置,它基于 k 个固定比例的锚定框(默认边界框)生成多个可能的区域。
每个区域提案包括:
- 那个区域的“目标度”得分
- 表示该区域边界框的 4 个坐标
换句话说,我们查看最后特征图中的每个位置,并考虑围绕它的 k 个不同的框:一个高框,一个宽框,一个大框等等。
对于这些框中的每一个,我们输出我们是否认为它包含对象以及该框的坐标。在一个滑动窗口位置上看起来像这样:
![Region Proposal Network](https://istack.dev59.com/66ppU.webp)
2k分数代表k个边界框被认为是“物体”的softmax概率。请注意,尽管RPN输出边界框坐标,但它不会尝试对任何潜在的对象进行分类:它的唯一工作仍然是提出对象区域。如果一个锚点框具有高于某个阈值的“物体性”得分,则该框的坐标将作为区域建议向前传递。
一旦我们有了区域建议,我们直接将它们馈送到基本上是Fast R-CNN的模型中。我们添加了一个池化层,一些完全连接的层,最后是一个softmax分类层和边界框回归器。在某种意义上,Faster R-CNN = RPN + Fast R-CNN。
![Faster R-CNN](https://istack.dev59.com/SQVbf.webp)
链接一些Tensorflow实现:
https://github.com/smallcorgi/Faster-RCNN_TF
https://github.com/CharlesShang/FastMaskRCNN
你可以在Github上找到很多实现。
P.S. 我从Joyce Xu的Medium博客中借用了很多材料。