从CNN到RCNN,再到MaskRCNN
1. CNN(Convolutional Neural Network)卷积神经网络,卷积网络
卷积神经网络同样属于神经网络的一种,一般用于机器视觉技术中。
其结构可以按照不同的作用功能和特点划分为:卷积层(convolutional layer)、
池化层(pooling layer)、全连接层(fully connected layer)。
-
卷积层(convolutional layer)
首先要理解什么是卷积操作,所谓卷积操作,即卷积运算,指的是矩阵的一种运算规则,举例来说,假设有两个3×3的矩阵A和B。它们之间的卷积运算就是相应位置元素相乘,最后再将相乘所得的结果相加。如下图所示(图片来自于)
对于图片的卷积操作也是类似,如上图所示,卷积操作的对象是图像,首先可以对原始图进行卷积,需要设计“另一个矩阵”(我们称之为卷积核),也就是图中的convolution filter,通过卷积核对图像进行卷积操作这样就可以将原本的图像中的特征进行抽取,而之后进行的一系列操作和任务比如分类、语义分割、实例分割、目标检测等都需要基于这一步抽取的特征进行后续处理。
卷积核定义了一种模式,而之后的卷积运算可以看作是对原图中的不同位置(不同部分与该模式进行匹配,我们想将图中能匹配上的部分保留,其他部分忽略,通过对模式进行分析得到预期的结果,减少了其他条件的干扰。)
以边缘检测为例,对于图像中不同物体不同对象的边缘,由于材质纹理等不同,因此在图像中显现的也会不同。边缘检测可以分为垂直边缘检测以及水平边缘检测。比如垂直边缘检测,如下图,可以使用这样的卷积核进行卷积操作得到特征图。想要提取不同的特征(边缘,材质,光泽,纹理等等)只需要去设计不同的卷积核对原图像进行卷积操作即可。
一般对于简单的黑白图像,比如说MNIST数据集,其通道数为1,而RGB图像通道数为3,这一点需要注意。 -
池化层(pooling layer)
参考链接的说法,池化层可以置于连续的多个卷积层之间,池化层最大的作用就是降采样,所谓降采样,可以理解为减少参数的数量,假设原图为1024×1024px的大小,对于每一张图,仅仅是图中参数就有3,145,728个(1024×1024×3),假设是RGB三通道,最好的方法是逐步提取特征,同时在保留提取到的特征的同时尽可能减少参数的数量,提高模型的效率。
其中池化也有诸多方法,最为常用的是最大池化法(Max pooling),其思想是将原图像进行分割,切割为若干个矩形区域,对于这些矩形区域内的数据取最大的值“代表”这一区域的值。这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。比如池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。
为什么可以进行池化?因为池化通俗理解,可以理解为将原图像进行缩放,缩小一定的范围,图像的主体特征还是得到保留的,举例而言,如果想在一幅街拍风景中识别马路上不同的人,那么缩小一定的比例也可以完成这个任务,但是如果想识别远处一家店的店面招牌上的电话号码可能就比较困难了。
下图展示的是最大池化的原理,图片来源于此
- 全连接层(fully connected layer)
作为神经网络中的一种,当然需要最后进行分类操作。那么问题来了,之前我们进行卷积以及池化操作都是特征提取的工作,将需要识别的对象的特征进行抽象识别。而且通常来说,全连接层需要的参数量会比较大,因此在全连接层之前的卷积层需要用多个卷积核提取多个特征。
举例来说,假设我们要搭建一个识别狗的CNN模型,那么在卷积层提取的若干个特征中,可能第一个是识别狗头的狗耳朵的形状、第二个可能是识别狗头的狗耳朵的毛的走向(纹理)…等等,诸多特征用以检测某个对象是不是狗。如下图所示(用的是猫):
同时使用全连接层的好处之一就是可以增加模型的非线性表达方式,所以这也是为什么CNN的全连接层网络结构的层数一般大于2,可以用数学中的泰勒展开进行类比,f(x)=sinx这种非线性函数可以用若干线性函数进行拟合,随着展开项数逐渐增加,会越来越接近原函数。
用识别狗的例子来说,该问题可能比较复杂,但是识别不同的部分还是比较简单的工作,先看耳朵、鼻子、眼睛、嘴巴、皮肤的形状、纹理、颜色等等特征判断是不是一个狗的头;同理可以判断四肢,躯干,尾巴,等等,综合起来看就可以实现识别目标到底是不是一条狗狗。