深度学习之检测、分类及分割(二)

十一. ResNet

论文作者博客:http://kaiminghe.com/

参考学习博客:https://blog.csdn.net/sunny_yeah_/article/details/89430124

在VGG中,卷积网络达到了19层,在GoogLeNet中,网络史无前例的达到了22层。那么,网络的精度会随着网络的层数增多而增多吗?在深度学习中,网络层数增多一般会伴着下面几个问题

  1. 计算资源的消耗
  2. 模型容易过拟合
  3. 梯度消失/梯度爆炸问题的产生

残差网络

1.1 残差块

残差网络是由一系列残差块组成的(图1)。一个残差块可以用表示为:

 

残差块分成两部分直接映射部分和残差部分。 [公式] 是直接映射,反应在图1中是左边的曲线; [公式] 是残差部分,一般由两个或者三个卷积操作构成,即图1中右侧包含卷积的部分。

图1:残差块

图1中的Weight在卷积网络中是指卷积操作,addition是指单位加操作。

在卷积网络中, [公式] 可能和 [公式] 的Feature Map的数量不一样,这时候就需要使用 [公式] 卷积进行升维或者降维(图2)。这时,残差块表示为:

其中 [公式] 。其中 [公式] 是 [公式] 卷积操作,但是实验结果 [公式] 卷积对模型性能提升有限,所以一般是在升维或者降维时才会使用。

图2:1*1残差块

一般,这种版本的残差块叫做resnet_v1,keras代码实现如下:

def res_block_v1(x, input_filter, output_filter):
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(x)
    res_x = BatchNormalization()(res_x)
    res_x = Activation('relu')(res_x)
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
    res_x = BatchNormalization()(res_x)
    if input_filter == output_filter:
        identity = x
    else: #需要升维或者降维
        identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
    x = keras.layers.add([identity, res_x])
    output = Activation('relu')(x)
    return output

 

十二. SSD

参考论文博客:

https://zhuanlan.zhihu.com/p/33544892

https://blog.csdn.net/thisiszdy/article/details/89576389

在SSD之前,目标检测的主流方法主要分为两大类:

  • two-stage:以R-CNN系列为代表,这类方法通常包括两个部分,第一部分先使用selective search、卷积神经网络等筛选出一些proposal boxes,然后第二部分再对这些proposal boxes进行分类和回归。这就相当于进行了两次分类和回归,因此检测的准确率较高,但是可想而知检测的速度也就比较慢了。
  • one-stage:以YOLO为代表,这类方法的主要思路就是在图片的不同位置进行密集采样,然后使用CNN网络提取特征并直接进行分类和回归,整个过程只要一步就可完成。这种方法的优势是检测速度快,但是检测的准确率却不是很高。

于是为了让检测过程又快又准确,SSD就被提出来了。SSD借鉴了YOLO的one-stage的思想,直接对bbox进行回归和分类,同时也参考了Faster R-CNN中的anchor机制来提升准确率。通过将两种方法的优点结合,并加以改进,SSD保持了很快的检测速度,同时还提高了检测的准确率。

和YOLO类似,SSD也是one-stage的检测方法,即使用一个神经网络直接进行分类和回归,但是为了提高准确率,SSD做了以下改进:

  • Multi-scale feature map:使用多尺度的feature map来进行检测。在base network之后加了几层卷积,这些卷积层会逐渐减小feature map的size,然后在不同size的feature map上进行检测,进而实现了一个多尺度的检测。因为不同size的feature map的感受野不同,因此可以检测不同大小的物体,比较大的特征图,感受野较小,适合检测相对较小的物体,而较小的特征图,感受野较大,适合检测相对较大的物体。如下图中, [公式] 的feature map中蓝色框更适合来检测猫,而 [公式] 的feature map中红色的框更适合来检测狗。

 

首先对基础网络VGG16进行了修改,其中Conv5_3之前的卷积层保持不变,而原来的FC6和FC7分别变成 [公式] 和 [公式] 的卷积层Conv6和Conv7,去掉了原来的dropout和FC8层。此外,还将池化层pool5由原来的 [公式] 的 [公式] 变成 [公式] 的 [公式] ,为了配合这种变化,Conv6的卷积采用的是 [公式] 的空洞卷积(空洞卷积可参考:Jacqueline:【目标检测】R-FCN)。在基础网络之上SSD又添加了新的卷积层,例如图中的Conv8_2,Conv9_2,Conv10_2,Conv11_2。其中,Conv4_3,Conv7,Conv8_2,Conv9_2,Conv10_2和Conv11_2层输出的特征图用于检测。因为Conv4_3比较靠前,norm会比较大,因此会对Conv4_3输出的特征图先进行了一个L2 normalization,减少其和后边检测层的差异。最终一共有6个特征图,大小分别为(38,38),(19,19),(10,10),(5,5),(3,3),(1,1)。然后在不同size的特征图上设置不同大小和个数的default boxes(anchors),Conv4_3特征图上有4个anchor,Conv7有6个,Conv8_2有6个,Conv9_2有6个,Conv10_2有4个,Conv11_2有4个,所以最终anchor的数量为:

得到检测结果之后,再进行非极大值抑制(NMS)来删除掉多余的boxes,便得到最终的检测结果。NMS的具体过程可以参考我这篇文章:Jacqueline:【目标检测】基础知识:IoU、NMS、Bounding box regression

 

十三. YOLO

参考作者博客:

https://zhuanlan.zhihu.com/p/25236464

https://blog.csdn.net/guleileo/article/details/80581858

YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。从网络设计上,YOLO与rcnn、fast rcnn及faster rcnn的区别如下:

[1] YOLO训练和检测均是在一个单独网络中进行。YOLO没有显示地求取region proposal的过程。而rcnn/fast rcnn 采用分离的模块(独立于网络之外的selective search方法)求取候选框(可能会包含物体的矩形区域),训练过程因此也是分成多个模块进行。Faster rcnn使用RPN(region proposal network)卷积网络替代rcnn/fast rcnn的selective
search模块,将RPN集成到fast rcnn检测网络中,得到一个统一的检测网络。尽管RPN与fast rcnn共享卷积层,但是在模型训练过程中,需要反复训练RPN网络和fast rcnn网络(注意这两个网络核心卷积层是参数共享的)。

YOLO将物体检测作为一个回归问题进行求解,输入图像经过一次inference,便能得到图像中所有物体的位置和其所属类别及相应的置信概率。而rcnn/fast rcnn/faster rcnn将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)。

YOLO检测网络包括24个卷积层和2个全连接层,如下图所示。

 

其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。

YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception
module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。

每个格子输出B个bounding box(包含物体的矩形区域)信息,以及C个物体属于某种类别的概率信息。

Bounding box信息包含5个数据值,分别是x,y,w,h,和confidence。其中x,y是指当前格子预测得到的物体的bounding box的中心位置的坐标。w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。

confidence反映当前bounding box是否包含物体以及物体位置的准确性,计算方式如下:

因此,YOLO网络最终的全连接层的输出维度是 S*S*(B*5 + C)。YOLO论文中,作者训练采用的输入图像分辨率是448x448,S=7,B=2;采用VOC 20类标注物体作为训练数据,C=20。因此输出向量为7*7*(20 + 2*5)=1470维。作者开源出的YOLO代码中,全连接层输出特征向量各维度对应内容如下:

 

YOLO模型训练分为两步:

1)预训练。使用ImageNet
1000类数据训练YOLO网络的前20个卷积层+1个average池化层+1个全连接层。训练图像分辨率resize到224x224。

2)用步骤1)得到的前20个卷积层网络参数来初始化YOLO模型前20个卷积层的网络参数,然后用VOC 20类标注数据进行YOLO模型训练。为提高图像精度,在训练检测模型时,将输入图像分辨率resize到448x448。

为提高物体定位精准性和召回率,YOLO作者提出了YOLO9000,提高训练图像的分辨率,引入了faster rcnn中anchor box的思想,对各网络结构及各层的设计进行了改进,输出层使用卷积层替代YOLO的全连接层,联合使用coco物体检测标注数据和imagenet物体分类标注数据训练物体检测模型。相比YOLO,YOLO9000在识别种类、精度、速度、和定位准确性等方面都有大大提升。(yolo9000详解有空给出)

YOLO 对相互靠的很近的物体,还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。

同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。

由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。

YOLO 一代有很多缺点,作者希望改进的方向是改善 recall,提升定位的准确度,同时保持分类的准确度。 

目前计算机视觉的趋势是更大更深的网络,更好的性能表现通常依赖于训练更大的网络或者把多种模型综合到一起。但是 YOLO v2 则着力于简化网络。具体的改进见下表:

YOLOV3改进之处:

1.多尺度预测 (类FPN)

2.更好的基础分类网络(类ResNet)和分类器 darknet-53,见下图

3.分类器-类别预测:

YOLOv3 不使用 Softmax 对每个框进行分类,主要考虑因素有:

 

十四. FCN

学习参考博客:

https://blog.csdn.net/qq_36269513/article/details/80420363

https://zhuanlan.zhihu.com/p/31428783

全卷积网络(FCN)是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。
FCN将传统CNN中的全连接层转化成一个个的卷积层。如下图所示,在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。 

注:

虚线上半部分为全卷积网络。(蓝:卷积,绿:max pooling)。对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。 
这部分由深度学习分类问题中经典网络AlexNet1修改而来。只不过,把最后两个全连接层(fc)改成了卷积层。

论文中,达到最高精度的分类网络是VGG16,但提供的模型基于AlexNet。此处使用AlexNet便于绘图。
最后的输出是21张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素地求其在21张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如下图右侧有狗狗和猫猫的图。

整个FCN网络基本原理如图5(只是原理示意图)

  1. image经过多个conv和+一个max pooling变为pool1 feature,宽高变为1/2
  2. pool1 feature再经过多个conv+一个max pooling变为pool2 feature,宽高变为1/4
  3. pool2 feature再经过多个conv+一个max pooling变为pool3 feature,宽高变为1/8
  4. ......
  5. 直到pool5 feature,宽高变为1/32。

                                                                           图5 FCN网络结构示意图

那么:

  1. 对于FCN-32s,直接对pool5 feature进行32倍上采样获得32x upsampled feature,再对32x upsampled feature每个点做softmax prediction获得32x upsampled feature prediction(即分割图)。
  2. 对于FCN-16s,首先对pool5 feature进行2倍上采样获得2x upsampled feature,再把pool4 feature和2x upsampled feature逐点相加,然后对相加的feature进行16倍上采样,并softmax prediction,获得16x upsampled feature prediction。
  3. 对于FCN-8s,首先进行pool4+2x upsampled feature逐点相加,然后又进行pool3+2x upsampled逐点相加,即进行更多次特征融合。具体过程与16s类似,不再赘述。

作者在原文种给出3种网络结果对比,明显可以看出效果:FCN-32s < FCN-16s < FCN-8s,即使用多层feature融合有利于提高分割准确性

什么是上采样?

说了半天,到底什么是上采样?

实际上,上采样(upsampling)一般包括2种方式:

  1. Resize,如双线性插值直接缩放,类似于图像缩放(这种方法在原文中提到)
  2. Deconvolution,也叫Transposed Convolution

什么是Resize就不多说了,这里解释一下Deconvolution。

对于一般卷积,输入蓝色4x4矩阵,卷积核大小3x3。当设置卷积参数pad=0,stride=1时,卷积输出绿色2x2矩阵,如图6。

图6 Convolution forward示意图

而对于反卷积,相当于把普通卷积反过来,输入蓝色2x2矩阵,卷积核大小还是3x3。当设置反卷积参数pad=0,stride=1时输出绿色4x4矩阵,如图7,这相当于完全将图4倒过来(其他更多卷积示意图点这里)。

图7 Deconvolution forward示意图

传统的网络是subsampling的,对应的输出尺寸会降低;upsampling的意义在于将小尺寸的高维度feature map恢复回去,以便做pixelwise prediction,获得每个点的分类信息。

图8 Subsampling vs Upsampling

上采样在FCN网络中的作用如图8,明显可以看到经过上采样后恢复了较大的pixelwise feature map(其中最后一个层21-dim是因为PACSAL数据集有20个类别+Background)。这其实相当于一个Encode-Decode的过程。

在这里我们要注意的是FCN的缺点:

  1. 是得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。

  2. 是对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

 

十五. U-NET

https://zhuanlan.zhihu.com/p/90418337

https://zhuanlan.zhihu.com/p/31428783

 

语义分割网络在特征融合时也有2种办法:

  1. FCN式的逐点相加,对应caffe的EltwiseLayer层,对应tensorflow的tf.add()
  2. U-Net式的channel维度拼接融合,对应caffe的ConcatLayer层,对应tensorflow的tf.concat()

记得划重点哦。

 

十六、Segnet

参考学习博客:https://blog.csdn.net/Freeverc/article/details/83309714

2015年,Segnet模型由Vijay Badrinarayanan, Alex Kendall, Roberto Cipolla发表, 在FCN的语义分割任务基础上,搭建编码器-解码器对称结构,实现端到端的像素级别图像分割。

Segnet作为我接触的第一个网络,其模型框架和思路都比较简单,应用当年很火的VGG16框架,去掉全连接层,搭建对称模型,但是这在各种框架还没有大肆兴起的2014年,基于Caffe实现端到端的像素级别网络模型也是很不容易的。之后在MATLAB2016中,Segnet成为内置的用于语义分割的深度学习算法。2016年,Segnet研究组在原有网络框架基础加入了跳跃连接,算是有了进一步发展。不过之后兴起的各种规模更大层次更深的深度网络(以Resnet为主要框架)已经基本把Segnet碾压。

 Decoder解码器

使用最大池化的索引进行上采样

 

  • 在解码器处,执行上采样和卷积。最后,每个像素送到softmax分类器。

     

    在上采样期间,如上所示,调用相应编码器层处的最大池化索引以进行上采样。

    最后,使用K类softmax分类器来预测每个像素的类别

参考博客:https://tech.ifeng.com/c/7kx5uizAx5u

2. DeconvNet 和U-Net的不同

DeconvNet和U-Net具有与SegNet类似的结构。

2.1. DeconvNet 与 SegNet不同之处

 

  • Similar upsampling approach called unpooling is used.使用了类似的上采样方法,称为unpooling 反池化。

     

    不同,有完全连接的层,这使模型规模更大。

2.2. U-Net 与 SegNet不同之处

 

  • 用于生物医学图像分割。

     

    整个特征映射不是使用池化索引,而是从编码器传输到解码器,然后使用concatenation串联来执行卷积。

    这使模型更大,需要更多内存

https://zhuanlan.zhihu.com/p/36525939

 

十七. FPN

参考学习博客

https://zhuanlan.zhihu.com/p/42745788

https://www.jianshu.com/p/5a28ae9b365d

FPN会使用CNN网络中每一层的信息来生成最后的表达特征组合。下图是它的基本架构。从中我们能看到FPN会模型每个CNN层的特征输出进行处理以生成反映此维度信息的特征。而自上至下处理后所生成出的特征之间也有个关联关系,即上层high level的特征会影响下一层次的low level特征表达。最终所有的特征一起用来作为下一步的目标检测或类别分析等任务的输入。


十八. Mask-RCNN

参考博客:

https://zhuanlan.zhihu.com/p/42745788

 

 

Guess you like

Origin blog.csdn.net/jiugeshao/article/details/106745736