文章目录
MASK R-CNN调研报告
阅读摘要:
计算机视觉课程的作业需要对某一个某个感兴趣的计算机视觉领域进行调研并用自己的语言进行总结。刚好最近了解了下物体检测相关的一些知识,所以就想把常见物体检测算法用大白话讲明白,希望看完之后能够知道常见的物体检测是怎么样一个流程?其算法的重要原理是怎么实现的?
本文主要介绍当前物体检测领域很出名的MASK R-CNN算法,并且介绍该算法是怎么由其他基础算法演变过来的。
同时为了让大家能够对复杂的算法原理有着清晰的理解,所以对于论文中复杂的公式,文字描述,我都用一张小猫和小狗的照片进行形象的图解,希望能够用最简单的语言讲清楚复杂的公式原理。
1.Introduction
1.1 MASK R-CNN简介
-
MASK R-CNN是2017年提出来的一个算法框架,旨在解决图像或者视频中的实例分割。
-
该算法框架的应用领域十分广泛,下面举几个例子:
- 医学领域:识别细胞核数目以及类型
- 农业领域:识别一片地区的农作物的生长情况
- 建筑领域:通过卫星拍图定位一座城市的建筑数目
-
该算法的核心在于实例分割,所以首先要说一下什么是实例分割:
图像来源:https://arxiv.org/abs/1704.06857
- 上图含有四张图像,其实现难度逐渐递增。
- a图实现了图像分类,能告诉我们图中有哪些物体,用普通的卷积神经网络即可做到。
- b图实现了物体检测,能够标识出哪个物体在哪里。
- c图实现了语义分割,能够将每个物体具体的位置细化表现出来,实现了前后景分离,但同类型物体如图中的cude会认为是同一种类型。
- d图实现了实例分割,在c图的基础上能够将同类型的不同物体分割开来。如图中的蓝色和绿色正方体,能够将其前后关系分割开来。
1.2 直觉理解MASK R-CNN
上面介绍了MASK R-CNN的基本信息,可能介绍得有点生硬,下面我举一个形象的例子来进行说明。
MASK R-CNN算法框架在近两年被应用地非常多,其主要实现了物体检测与实例分割,下面以一个形象的例子表明该算法做了什么:
-
比如给定一张关于小狗和小猫的图片,能够告诉我们图像中含有小狗和小猫。
-
能够将小狗和小猫的大概位置用正方形框出来并显示其预测的概率,如右图的两个黄色框。
-
能够将小猫和小狗在像素级别上表示出来,如右图中的绿色和粉色部分。
-
对于小猫和小狗重叠的部分,能够正确区分重叠部分是小猫而不是小狗。
2.Algorithm
实际上Mask R-CNN是在先前的模型进行改进得到的一个算法框架。所以首先我们需要了解先前一些较出名的框架模型。下面将通过R-CNN,SSP-net,Fast R-CNN进行大致的解释,然后再介绍Mask R-CNN在它们的基础上做了哪些改进。
2.1已有物体检测算法概述
2.1.1 R-CNN算法(2014年)
-
这个算法能够实现物体检测的功能,一共分成三步:
-
1.对于输入图像,利用Selective Search算法选择出可能是物体的候选框
-
Selective Search算法是一个根据图像的纹理线条等信息寻找出潜在的候选框(效率低,只能在CPU中运行),如下图所示:选出原图中可能是物体的若干区域,并用正方形框出来。
-
-
图片来源:https://www.udemy.com/course/dl-paper/learn/lecture/18959812#questions
-
2.将每个候选框放入神经网络进行特征提取(每个框都单独用一个网络),得到特征图。
- 因为卷积没有大小限制,但是全连接层的输入有尺寸大小限制。
- 因此运行时间非常慢。
-
3.对于每一张特征图,放入SVM进行分类判断,放入回归模型进行回归判断(距离真实框的距离)。
-
下图表示R-CNN的算法框架:
2.1.2 SSP-net(解决全连接层尺寸不一的问题)
-
对于不同的候选框其尺寸大小未必都是相同的。
- 对于卷积和池化来说,其对输入图像没有尺寸大小的限制。而对于全连接层的输入来说,其输入是有大小限制的。因此R-CNN算法才需要对不同的特征图使用不同的全连接层训练。
-
SSP-net的提出是为了解决上面所述的问题。**通过对最后的特征图进行不同大小的池化,然后将池化后的结果进行拼接。**下面对详细过程进行讲解:
- 对于下图来说,输入图像可能是各种各样的尺寸,我们暂且认为是N*M的大小,N和M都是随机的。
- 对该图像进行不同尺寸的池化,得到多个不同尺寸的图。
- 下图中进行了三个不同的池化,分别得到了2X2,4X4,8X8的结果,池化的尺寸根据输入图像的尺寸决定。所以该方法能够保证输入图像不同的情况下也能得到相同的全连接层的输入。
- 对上述的多个池化后的结果进性扁平化,然后合并起来,作为全连接层的输入。
- 全连接后跟R-CNN一样,进行分类和回归的操作。
2.1.3 Fast R-CNN
Fast R-CNN可以说是物体检测中的一个里程碑的算法,后续的很多算法都是基于此进行改进的。如SSD,以及后面要说的Mask R-CNN。
-
先前算法的不足:
- 对于R-CNN算法来说,其整个流程不是一般深度学习中端到端的概念。通俗来说,就是不能根据输入图像直接一步到位,检测出它是什么物体。而是分成多阶段来做的。
- 对于加入SSP-net改进后的算法,解决了不同候选框需要进行不同的全连接层,但是仍然存在两个问题:
- 大量的时间花在了寻找候选框上面。(Selective Search算法)
- 每个候选框都需要进行一次卷积,时间复杂度的优化上升空间较大
-
基于上面的不足,Fast R-CNN主要提出了共享卷积的思想达到时间复杂度的优化,同时加入了ROI Pooling层:
- 1.**共享卷积的思想,即抛弃先前对每一个特征图进行卷积的方法,先对原图进行卷积提取特征,再在特征图上进行全连接层,分类,回归等操作。
- 2.加入ROI Pooling层使得特征图上的候选框(下面会说到)映射到大小一样的新特征图,以便后续的分类回归。
- ROI Pooling主要实现了下图所示的过程:
- 比如我们需要在一张8X8的特征图上,根据给出了红色部分感兴趣区域(ROI),通过最大池化映射到2X2的空间中
- 首先需要在红色的感兴趣区域里面划分出2X2的区域(可以不是平均分割)
- 然后找到每个区域的最大值,合并起来作为最终结果
- ROI Pooling主要实现了下图所示的过程:
-
Fast R-CNN整体步骤:
- 1.将原图通过卷积层得到特征图
- 2.在原图中运用Selective Search算法寻找若干候选框
- 3.将原图的候选框映射到卷积后的特征图上
- 4.对卷积后的特征图上的每一个候选框进行ROI Pooling操作,映射到新特征图
- 5.对新特征图进行全连接层,分类,回归等操作
-
Fast R-CNN框架图如下:
2.2Mask R-CNN算法介绍
好了,上面花了很长的篇幅介绍了之前的一些物体检测算法,看到这里你可能会觉得“哇!前面的算法都这么多这么复杂,那这个Mask R-CNN不就看得更加晕,更加看不懂了?”
别着急!实际上Mask R-CNN的大体框架还是Fast R-CNN,只是在它的基础上加入了一些新的东西,让整个模型速度更快,效果更好!
对的就是这样!下面来介绍一下Mask R-CNN加入了哪些新的东西吧。相信看完之后会有很大的收获(反正我是收获巨大>_<)
- Mask R-CNN整体流程:
- 使用FPN层生成特征图
- 通过anchor generator对特征图生成候选框
- 使用RPN层对候选框进行分类判断是前景还是背景,进行回归得到候选框与真实框之间的差异。
- 对若干候选框筛选出N个最终的候选框
- 使用ROI Align解决先前的ROI Pooling中两次浮点数向下取整带来的区域不匹配的问题:
- 原图的候选框映射到特征图
- 特征图映射到新特征图
- 采用FCN层进行语义分割
2.2.1 FPN层(选取候选框时融合了不同卷积层的特征)
在先前算法的介绍中,从原图到特征图的转换我用了卷积两个字一概而论,实际上中间经过了好几个卷积层才把原图映射到特征图。
而先前的算法都是用最后一层特征图进行候选框的生成,以及后续的回归分类等操作,中间层的卷积特征图我们并没有使用。
由于每一层的卷积实际上是一个特征提取的过程,比如第一次卷积可能是从原图上提取出猫和狗的边框,纹理等基本信息。第二次第三次卷积可能就能提取出猫的眼睛,狗的鼻子等更高级更抽象的特征。
因此如果只使用最后一层卷积输出得到的卷积层可能会漏掉前面几层提取出来的边框、纹理等图像的基本信息。实验表明对于一些小尺寸物体的检测会十分困难。
FPN层采取了特征图融合的方式,并引入了ResNet101残差网络架构,通过把每一层的特征图合并在一起,解决了小尺寸物体检测困难的问题。
- 下图是FPN层的流程框架:
- 1.将原图通过RESNet101残差网络(这里就不细说啦,毕竟内容太多了),得到五个阶段的特征图C1~C5
- C1~C5理论上说越往上特征图数目越来越多,特征图尺寸越来越小
- 2.将C5放入一个1X1的卷积层,得到256张P5特征图,同时将P5进行一次卷积得到P6(尺寸比P5小)
- 3.对于P5~P4的过程,实际上是融合P5和C4的过程。由于特征图融合需要满足两个条件:特征图数目相等,特征图尺寸相等。因此该步骤有两个操作:
- 将P5进行上采样,扩大其尺寸与C4一样(C4本身的尺寸大于P5)
- 将C4进行1X1的卷积,得到与P5一样数目的特征图(256张)
- 4.同理P4 ~ P3,P3 ~ P2的过程与步骤3一样
- 5.对P2~P6的所有特征图进行一次共享卷积,得到最终的特征图,用于后续生成框
2.2.2 anchor generator对特征图生成候选框
对于FPN层生成的若干尺寸不一的特征图,我们需要在上面生成许多特征图。那么怎么生成,生成多少呢?
对于某一张特征图,上面有很多个像素点。每一个像素点都对应了原图像的某一个位置,如果我们以该位置作为中心点,做出若干个长方形作为候选框,则能够完成候选框的生成。
具体画多少个框,每个框长宽比例如何,这些都是我们需要设置的参数。
- 下图为特征图生成的整体流程:
- 对特征图上的某一个点,产生出若干个大小不一的候选框,然后将这些框映射到原图里面得到原图的候选框。
- 对于每一张特征图中的每个像素,都生成几个候选框。
- 每张特征图都需要生成候选框。
2.2.3 RPN层(对候选框进行分类、回归) 与候选框的筛选
上面得到了若干个候选框,下面需要通过这些候选框完成一些操作。
RPN层主要完成了两件事。
1.计算出这些候选框框的是背景还是物体的概率。
2.计算这些候选框与距离最近的真实框的偏差信息。
RPN层完成之后则需要对这若干个候选框进行筛选,得到N个最有可能的候选框。
-
RPN层实际上是通过前面生成的候选框,通过分类判断出该候选框对应的原图的位置上是背景还是物体,通过回归算出了该候选框与真实框的相对位置。
- 若判断为前景(物体),打上标签1,背景则打上标签0
- 回归得到了四个结果,对应dx,dy,dw,dh
- dx,dy分别表示这个候选框左上角的点在与真实框的差值
- dw和dh表示这个候选框与真实框的宽度和高度的差异
-
RPN后对框的筛选:
上面的步骤得到了非常多的框,但实际上我们不需要那么多,所以通过下面的方法进行筛选:
- 对于超过边界的框,直接去除掉
- 计算每个框与真实图像中最近的一个物体的重叠率IOU,并设置阈值r,筛选掉小于r的一部分框
- 按照分类得到的判断是背景还是物体的概率值进行降序排序,取得值最高的前N个框
-
RPN层以及筛选框流程大致框架:
2.2.4 ROI Align
在Fast R-CNN中,我们通过ROI Pooling完成了从原图的候选框映射到特征图的过程以及从特征图映射到新特征图的过程。
但是对于某些特殊情况,如映射的倍数不是整数倍,ROI Pooling会把倍数向下取整。这导致了映射后的候选框与原图的候选框存在一定的偏差值。
对于语义分割任务来说,是需要精确到像素级别的。而该偏差值可能会对最终结果造成影响,导致算法效果不好。
基于此,ROI Align通过倍数为小数的情况不取整的方法,采用双线性插值解决了上面所说的问题。
- 下面通过一个例子来说明:
- 对于原图来说,要得到新特征图,需要经过两次映射。
- ROI Align的核心在于映射之后的每一个小框框的值,是通过双线性插值法来算得的。
- 例如从特征图的ROI区域(7X5)映射到新特征图(2X2),需要将特征图的ROI区域分成四部分ABCD。
- 对于ABCD的每一部分,再单独均分出四个小区域(0.625 X 0.875),下面讲解AMax如何计算:
- A区域中有四个小区域(0.625 X 0.875),A1,A2,A3,A4,由于特征图中原本的每个像素点都有对应的值,所以会发现有的像素分布在两个区域(例如第一行第二列的0.27位于A1和A2之间)
- 这时候通过双线性插值算法(高等数学知识,这里不再赘述)就可以得到每一个小区域的值。
- 对A1,A2,A3,A4进行最大池化得到AMax。
2.2.5 FCN生成掩膜
Mask R-CNN与Fast R-CNN的一个不同点在于前者在像素级别进行物体的检测,比如前文说到的把小狗和小猫用不同颜色的掩膜区分开来。FCN层是在Fast R-CNN做分类和回归两个任务的基础上加多了掩膜生成的第三个任务。
- FCN层实际上是通过卷积后的特征图再进行反卷积操作,返回一张与原图大小一样的图,最后对每一个反卷积后的像素点进行分类,判断其是属于什么类别(背景OR某一物体)
3.Evaluation
- MASK R-CNN的损失函数一共有三部分,如下图所示:
-
首先需要明确损失函数的作用,当模型在训练时,需要经过很多次迭代,以训练出一个精度高的模型。由于模型会通过反向传播的方式进行梯度下降的优化,所以损失函数其实是衡量当前模型的性能的一个标准。
-
第一部分是Lcls,表示分类损失,该损失函数在两个地方用到:
- 第一个是判断RPN层的候选框是不是物体。
- 第二个是判断该框是什么物体。直觉上理解就是假如一共有十个类别,当模型判断该物体属于哪个类别时,需要对每一个类别计算其损失值(损失值越小表示越接近正确结果)
-
第二部分是Lbox,表示回归损失,该损失函数在两个地方用到:
-
第一个是在RPN层计算候选框跟物体的真实位置的偏差(dx,dy,dw,dh)。需要注意的是,如果被打上是背景的标签,则不参与该损失的计算
-
dx,dy:左上角的x,y坐标偏差
-
dw宽度偏差
-
dh高度偏差
-
-
-
第二个是后面对特征图通过神经网络进行微调预测后,通过模型微调后的候选框与真实位置的偏差,回归损失就是衡量这个偏差大小的量。
-
**第三部分是Lmask,表示掩膜损失。**由于我们需要计算出物体的具体位置在哪,如用粉色填充小狗。而该损失对应的是像素级别的任务。需要对每一个像素进行判断,判断其为背景还是物体,然后与图像的真实情况进行比较,得到其损失值。
4.Results and analysis
-
从Mask R-CNN的论文中得知该算法远远超越了当时存在的所有物体检测算法,可以说把物体检测领域向前推进了一大步。
-
对于小任务物体检测的效果得到了很好的改善,解决了之前很多小尺寸物体检测不到的问题。
-
下图是将ROIPooling与ROIAlign的比较,可见使用ROIAlign得到的最终结果IOU(重叠率)比ROIPooling高出好几个百分点。
-
下图是将Mask R-CNN与其他算法在COCO数据集上面的比较,可以看到在掩码准确性(AP)上面也是达到了非常好的效果。
5.Conclusion
Mask R-CNN融合了先前物体检测算法的优点,并在其基础上加入了下面几个改进点,达到了识别更准,训练速度更快,效果更好的结果,在许多领域都被得到应用:
- 将ROI Pooling改成了ROI Align
- 引入RESNet残差网络+FPN的特征提取结构解决了小尺寸物体检测困难的问题
- 在Fast R-CNN的二任务架构上加入了FCN层,对掩膜的生成进行了处理
6.Reference
1.https://blog.csdn.net/qq_36342854/article/details/87376048
2.https://arxiv.org/pdf/1703.06870.pdf
3.https://github.com/matterport/Mask_RCNN
4.https://luckmoonlight.github.io/2019/03/12/Maskrcnn/