Faster-RCNN 和 Mask-RCNN详解

news/2024/7/10 1:49:08 标签: 计算机视觉, 深度学习, 目标检测

Faster-RCNN ,Mask-RCNN原理

  • 一、摘要
    • 1.1 图像分割
    • 1.2 语义分割与实例分割
  • 二、Faster-RCNN
    • 2.1 Faster-RCNN模型架构
    • 2.2 🍊深度卷积网络(backbone)
    • 2.3 🍎RPN(Region Proposal Network)
    • 2.4 🍉RoI Pooling
    • 2.5 🍈分类与回归
    • 2.6 Faster-RCNN总结
  • 三、Mask-RCNN

一、摘要

1.1 图像分割

图像分割:图像分割是对图像中属于特定类别的像素进行分类的过程叫图像分割,属于pixel-wise即像素级别的下游任务。简单来说,图像分割就是按像素进行分类的问题。

传统的图像分割算法是基于灰度值的不连续性和相似的性质来进行分割,而深度学习则是利用卷积神经网络,来理解图像中的每个像素所代表的含义。

基于深度学习的图像分割技术主要分为这两类:语义分割及实例分割。

1.2 语义分割与实例分割

语义分割:语义分割会为图像中的每个像素分配一个类别,但是同一个类别之间的对象不会进行区分。具体来说,语义分割的目的是为了从像素级别理解图像的内容,并为图像中的每个像素分配一个类。

实例分割:实例分割只对特定的物体进行分类,这看起来和目标检测类似,不同的是目标检测输出目标的最小外界矩阵和类别,而实例分割输出的目标的Mask和类别。

概括来说,语义分割只能划分类别,而同类无法划分,因此部分场景在语义分割之后还需要进一步用实例分割来划分同类别的不同实例,如fig.1中的bc所示。

Fig.1 语义分割,实例分割与全场景分割

Fig.1. 语义分割,实例分割与全场景分割


二、Faster-RCNN

2.1 Faster-RCNN模型架构

Faster-RCNN可以大致分成四个模块,如Fig.2所示,细节如图Fig.3所示:
🍊深度卷积网络(backbone):即特征提取网络,用于特征提取。通过若干卷积+池化+激活层等组成来提取图像的feature maps,用于后续的RPN层和提取proposal。

🍎RPN(Region Proposal Network):即区域候选网络,该部分代替了RCNN与Fast RCNN的SS算法来生成候选框,该部分有两个任务,一个是分类,判断所有预设anchor是属于positive还是negative(即anchor内是否有目标,二分类),还有一个任务就是边界框回归,修正anchors来得到较为准确的proposals。

🍉RoI Pooling :即兴趣域池化,用于收集RPN生成的Proposals(每个框的坐标),并从1中提取出来,生成Proposals feature maps送入全连接层来判断类别和回归。

🍈分类与回归 :利用Proposals feature maps计算出具体类别,同时再做一次边界框回归获得最终的检测位置。

下面将围绕这四块分别展开:

在这里插入图片描述

Fig.2. Faster-RCNN整体结构

在这里插入图片描述

Fig.3. Faster-RCNN模型可视化

2.2 🍊深度卷积网络(backbone)

需要注意的是,这里我们以VGG为骨干网络作为例子来讲解(如Fig.4所示),实际情况中我们可以根据需要选择Resnet50,101或者mobilenet来作为特征提取网络。

输入:先将图像resize成M*N的输入尺寸,一般在VGG中,输入图像的尺寸为224×224。

特征提取网络:可以从图中看到,特征提取网络包含了13个conv层,13个relu激活层,以及4个池化层(原VGG网络中包含了5个池化层,这里舍弃了最后一层池化层)。在VGG网络中,采用的是3×3的卷积核,以及2×2的池化核,池化后的特征图尺寸减半。因此,经过特征提取网络之后,输处特征图的尺寸为输入的1/16,即M/16×N/16。
在这里插入图片描述

Fig.4. 特征提取网络-backbone

2.3 🍎RPN(Region Proposal Network)

首先,在讲RPN之前,我们需要明确的一点是,RPN的作用是提取候选框,RPN结构如Fig.5所示。

经过上一步,我们已经得到了M/16×N/16大小的特征图,可以看到我们将会对我们得到的特征图并行的进行两步操作,分别是沿着路径1的RPN操作以及沿着路径2的ROI Pooling操作。这一部分我们讲RPN操作。

我们会使用一个3×3的滑动窗口来遍历刚刚得到的特征图,然后计算出滑动窗口中心点坐标对应的原始图像上的中心点坐标,最后在原始图像上的每个中心点或者叫像素点绘制9中不同尺度的anchor boxes。

上一部分讲到了在得到的特征图上使用一个3×3的模板遍历特征图,这对应了图中的3×3的卷积操作,其中padding=1,stride=1。那么问题来了,如何将特征图的中心点坐标对应原图的中心点呢,前面我们讲到了VGG网络输入图像与输出特征图的尺寸关系是1/16,因此我们只需要将特征图上的中心点坐标乘以16即可。下一步就是在原图上画出基于中心点的9个锚框了,论文中给出的是三种尺度(128,256,512),每种尺度对应的比例是(1:1,1:2,2:1),这个尺度其实是一种经验设计,可以根据实际项目的需求来调整大小,如图Fig.6。

在3×3的卷积核遍历完特征图之后,原图会产生许多许多的anchor,其中大部分的anchor都是我们不需要的,后面的操作会对这些anchor进行取舍,如Fig.7。

接下来我们来看一下3×3的卷积后,特征图的变化,由于我们采用的是3×3尺寸的卷积核,padding=1,stride=1的卷积,因此卷积后的特征图尺寸并没有变化(scale+2×padding-kernelsize/stride + 1 = 14),因此可以看出,卷积后的特征图尺寸没有变化。512则是指VGG网络的最后一层的通道数为512(由卷积核的个数决定),如Fig.8所示。
在这里插入图片描述

Fig.5. RPN

在这里插入图片描述

Fig.6. 先验框

在这里插入图片描述

Fig.7. 先验框在原图

在这里插入图片描述

Fig.8. 路径1的3×3卷积

首先,来讲路径3,路径3设置了一个11的卷积核,卷积核个数为18,经过这一层的卷积之后,得到的特征图尺寸没变,但是通道数变成了18,这18个通道的作用就是用于区分每个中心点对应的9个anchor是前景还是背景,对每一个anchor进行一个二分类,即29=18。
我们以特征图上的一个位置为例,将其展开,可以将18个通道分为两两一组,每一组的第一个值为第一个anchor的前景概率,第二个值为第一个anchor的背景概率,以此类推,如Fig.10所示。

在这里插入图片描述

Fig.9. 路径3的1×1卷积

在这里插入图片描述

Fig.10. 路径3卷积后的结果含义

了解了前面的正负样本匹配的问题,现在我们来看路径4,同样是一个1×1的卷积核,卷积核个数为36,这里的36=4×9,即对应了9种不同尺度anchor的对应的坐标调整参数(dx,dy,dh,dw)。

在这里插入图片描述

Fig.11. 路径4的1×1卷积

在这里插入图片描述

Fig.12. 路径4卷积后的结果

最后,便是RPN部分的损失函数:
分类损失用的是softmax损失函数。
位置误差损失需要强调的是对先验框与GT box的回归值和预测框与GT box的回归值之间的L1范数构建损失函数。
在这里插入图片描述

在这里插入图片描述

Fig.13. RPN损失函数

2.4 🍉RoI Pooling

ROI Pooling层的输入由两个:原始的feature maps和RPN输出的Proposals。
需要说明的是,我们传入ROI Pooling层的输入为原始特征图和RPN输出的的候选框对应到原始特征图的不同部分,然后将这些部分裁剪下来传入到ROI Pooling层中。

每一块ROI区域都将被采用池化的方式resize成同样的尺寸(7*7),最后送入softmax进行分类以及box的预测。
在这里插入图片描述

Fig.14. RoI Pooling图示

2.5 🍈分类与回归

通过两层relu激活函数和全连接层,将我们的ROI Pooling后的区域展平,送入到Softmax分类器中分类,以及box_pred中微调预测框的位置,其中损失函数如下图所示,分为分类损失和回归框损失:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6 Faster-RCNN总结

  1. 将完整的图像输入特征提取网络得到特征图

  2. 使用RPN结构生成候选框信息,将RPN生成的候选框位置投影到原始的特征图的对应位置,得到对应的特征矩阵。

  3. 使用ROI Pooling层将输入的候选区域通过池化的方式resize成一个尺寸,并将特征图送入全连接层中展平进行预测框的微调以及分类。
    (Mask-RCNN未完待续,今天先休息了)。

三、Mask-RCNN


http://www.niftyadmin.cn/n/5364550.html

相关文章

Qt之connect函数使用

在Qt中,connect函数用于连接信号和槽,它有五个参数。 以下是connect函数的五个参数及其含义: 第一个参数:发送信号的对象第二个参数:发送信号的信号名第三个参数:接收信号的对象第四个参数:接…

【从0上手Cornerstone3D】如何使用CornerstoneTools中的工具之工具介绍

简单介绍一下在Cornerstone中什么是工具,工具是一个未实例化的类,它至少实现了BaseTool接口。 如果我们想要在我们的代码中使用一个工具,则必须实现以下两个步骤: 使用Cornerstone的顶层addTool函数添加未实例化的工具 将工具添…

代码随想录day16 Java版 二叉树部分

404.左叶子之和 感觉就是遍历,遇到叶子结点就累加,试了下居然过了 class Solution {int sum 0;public int sumOfLeftLeaves(TreeNode root) {add(root);return sum;}void add(TreeNode root){if (root null) return;if (root.left ! null &&…

【C++】类中的6个默认成员函数详解

文章目录 前言1. 类的六个默认成员函数2. 构造函数2.1 概念2.2 特性 3. 析构函数3.1 概念3.2 特性 4. 拷贝构造4.1 概念4.2 特征 5. 赋值运算符重载5.1 运算符重载5.2 赋值运算符的重载 6. 日期类的实现(综合练习)7. const修饰的成员7.1 const修饰类的成…

DFS——连通性和搜索顺序

dfs的搜索是基于栈,但一般可以用用递归实现,实际上用的是系统栈。有内部搜索和外部搜索两种,内部搜索是在图的内部,内部搜索一般基于连通性,从一个点转移到另一个点,或者判断是否连通之类的问题&#xff0c…

专业课130+总分420+南京大学851信号与系统考研经验南大电子信息与通信系统

经过一年的复习,顺利上岸,被南京大学录取,今年专业课130,总分420,回忆这一年的复习还是有很多经验分享,希望对大家复习有帮助。 专业课: 南京大学851信号与系统难度这几年无论是范围还是难度都…

数据结构之希尔排序

希尔排序又称为“缩小增量排序”,它是对直接插入排序方法的改进。   希尔排序的基本思想是:先将整个待排记录序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接…

C#中检查空值的最佳实践

C#中检查空值的最佳实践 在C#编程中,处理空值是一项基础且重要的任务。正确地检查变量是否为null可以帮助我们避免NullReferenceException,这是C#最常见的运行时错误之一。本文将探讨为什么使用is关键字进行空值检查是一种优于使用的做法。 操作符&…