文章目录
一. 卷积神经网络
conv+relu+pooling(卷积、非线性、池化)用于特征提取,全连接用于分类。
卷积层:学习特征
非线性层:如果用线性的激励函数,其实输出就是输入乘上一个大的矩阵,就没有体现出隐藏的作用。输出信号仅是一个简单的线性函数。
池化层:
(1)权重参数的数目减少到了75%(在池化层是2x2的前提下),因此降低了计算成本。
(2)控制过拟合。(原有数据保留太完整,当然很有可能造成过拟合)
(3)池化操作可以看做是一种强制性的模糊策略。当然和之前的卷积一样,池化也是层层递进的,底层的池化是在模糊底层特征,如线条等,高层的池化模糊了高级语义特征,如猫耳朵。所以,一般的CNN架构都是三明治一样,卷积池化交替出现,保证提取特征的同时也强制模糊增加特征的旋转不变性。
全连接层:因为卷积层的作用只是提取特征,但是很多物体可能都有同一类特征,比如猫、狗、鸟都有眼睛。如果只用局部特征的话不足与确定具体类别。这时就需要使用组合特征来判别了。
计算卷积后的大小: N = ( W − F + 2 P ) / S + 1 N=(W-F+2P)/S+1 N=(W−F+2P)/S+1其中N:输出大小; W:输入大小; F:卷积核大小; P:填充值的大小 ;S:步长大小
池化以后得大小:(W - F)/ S + 1
二. 感受野
博客参考
感受野:在卷积神经网络CNN中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野receptive field。
r是感受野;k是卷积核大小,s是步长。
三. 激活函数
- sigmoid
把值映射到0—1之间
(1)在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
(2)Sigmoid 的 output 不是0均值,收敛会变慢
(3)其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间
- tanh函数
它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
- Relu函数
ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了gradient vanishing问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。
- Leaky ReLU函数(PReLU)
- ELU (Exponential Linear Units) 函数
四. BN层
1. BN层问题
深度神经网络之所以如此难训练,其中一个重要原因就是网络中层与层之间存在高度的关联性与耦合性。网络中层与层之间的关联性会导致如下的状况:随着训练的进行,网络中的参数也随着梯度下降在不停更新。
一方面,当底层网络中参数发生微弱变化时,由于每一层中的线性变换与非线性激活映射,这些微弱变化随着网络层数的加深而被放大(类似蝴蝶效应);
另一方面,参数的变化导致每一层的输入分布会发生改变,进而上层的网络需要不停地去适应这些分布变化,使得我们的模型训练变得困难。
导致的问题:
(1)上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低。
(2)网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度。
2. BN层思想
BN层:
在深度学习中,由于采用full batch的训练方式对内存要求较大,且每一轮训练时间过长;我们一般都会采用对数据做划分,用mini-batch对网络进行训练。因此,Batch Normalization也就在mini-batch的基础上进行计算。
即在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1.
横着的是样本,竖着的是维度。样本为8个,特征维度是4。
对维度进行BN层变换,而不是样本。假设选择了第1个维度:
求出:平均值:(1+1.5+1.2+0.9+1.7+2.1+3.1+1.7)/8 = 1.65
在求方差为0.44,然后更新这一维度的参数:
[-0.98, -0.23, -0.68, -1.13, 0.08, 0.68, 2.19, 0.08]
同理可以求出其他维度的新的参数。
通过上面的变换,我们解决了第一个问题,即用更加简化的方式来对数据进行规范化,使得第 l l l 层的输入每个特征的分布均值为0,方差为1。
如同上面提到的,Normalization操作,让每一层网络的输入数据分布都变得稳定,但却导致了数据表达能力的缺失。也就是我们通过变换操作改变了原有数据的信息表达(representation ability of the network),使得底层网络学习到的参数信息丢失。另一方面,通过让每一层的输入分布均值为0,方差为1,会使得输入在经过sigmoid或tanh激活函数时,容易陷入非线性激活函数的线性区域。
因此,BN又引入了两个可学习(learnable)的参数
α
\alpha
α与
γ
\gamma
γ。这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换,
通过上面的步骤,我们就在一定程度上保证了输入数据的表达能力。
3. BN层训练阶段
gamma和beta是一个可学习的参数,和权重w一样,一个batch 修正一次,很多地方的结论都是gamma和beta的加入是为了一定程度上接近原始数据的取值,毕竟我们本来是要通过正常层输出的结果然后最终反向传播更新当前层的权重的,而gamma和beta的可学习性又使得加入BN之后的层的最终的输出结果可以在保证了一定的表达能力的同时,均值与方差能够稳定,给我的感觉就像是滤波器一样,原始数据的大体特征保留同时数据分布变得更加稳定。
4. BN层测试阶段
五. AlexNet
包含5层卷积网络(11,5,3, 3,3),其中一些含有max pooling,还有3层全连接层,最后一层采用softmax分类。
六. VGG
参考
(1)使用了更小的
3
∗
3
3*3
3∗3卷积核,和更深的网络。
两个3x3卷积核的堆叠相对于5x5卷积核的视野,三个3x3卷积核的堆叠相当于7x7卷积核的视野。而且减少了参数个数。
(2)在VGGNet的卷积结构中,引入 1 ∗ 1 1*1 1∗1的卷积核,在不影响输入输出维度的情况下,引入非线性变换,增加网络的表达能力,降低计算量。
(3)全卷积层
这也是VGG的一个特点,在网络测试阶段将训练阶段的三个全连接替换为三个卷积,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入,这在测试阶段很重要。
七. ResNet
1. 网络加深的问题
(1)网络深度加深,会产生梯度消失和爆炸。利用规范化的初始化和Batch Normalization解决,使得具有数十层的网络通过随机梯度下降(SGD)方法可以开始收敛。
(2)会产生网络退化(degradation)的现象,即随着深度的增加,网络的性能会越来越差,直接体现为在训练集上的准确率会下降。不是由于过拟合导致,训练误差也会越大。
其实当batch normalization出现之后,梯度消失和爆炸的问题已经基本上被解决了,但是网络层数加深之后还是会出现效果差的情况。残差网络ResNet文章解决的就是网络的退化问题,而且在这个问题解决之后,网络的深度上升了好几个量级。
2. ResNet三个优点:
residual模块将输出分成 F ( x ) + x F ( x ) + x F(x)+x 两部分,其中 F F F依然是 x x x 的函数,也就是说 F F F实际上是对于 x x x的补充,是对于 x x x的fun-tuning,这样就把任务从根据 x x x 映射成一个新的 y y y转为了根据 x x x求 x x x和 y y y之间的差距,这明显是一个相对更加简单的任务。
举个例子,假设不加residual模块的输出为
H
(
x
)
H(x)
H(x),
x
=
10
x=10
x=10,
H
(
x
)
=
11
H(x)=11
H(x)=11,H简化为线性运算
W
h
W_h
Wh ,
W
h
W_h
Wh 明显为1.1,加了redidual模块后,由于
H
(
x
)
=
F
(
x
)
+
x
H(x)=F(x)+x
H(x)=F(x)+x所以
F
(
x
)
=
1
F(x)=1
F(x)=1 ,F也简化为线性运算,对应的
W
F
W_F
WF为0.1。
当标签中的真实值为21,所以H中的真实系数实际上是:2.1(因为
10
∗
2.1
=
21
10*2.1=21
10∗2.1=21)。F中的真实系数实际上是:1.1(因为
1.1
∗
10
+
10
=
21
1.1*10+10=21
1.1∗10+10=21)
反向传播的损失为11。对于F的参数就从0.1到1.1扩大了十倍多,这种变化是很大的。而h的参数是从1.1到2.1扩大不到2倍。
因此redidual模块会明显减小模块中参数的值(从H(x)=10减小到F(x)=1)从而让网络中的参数对反向传导的损失值有更敏感的响应能力(2倍到10倍),虽然根本上没有解决回传的损失小得问题,但是却让参数减小,相对而言增加了回传损失的效果。
x=10
H(x)预测 = 11 ; H(x)真实=21
H(x) = F(x)+x------->F(x)预测=1 ; F(x)真实=11
x=10----->H(x)预测 = 11 : W = 1.1
H(x)真实=21 ; W = 2.1
从1.1 到2.1 变化了2倍
x=10----->F(x)预测 = 1 : W = 0.1
F(x)真实=11 ; W = 1.1
从0.1 到1.1变化了10倍
让网络中的参数对反向传导的损失值有更敏感的响应能力(2倍到10倍)
(1)在前向过程中,当浅层的输出已经足够成熟(optimal),让深层网络后面的层能够实现恒等映射的作用。换句话说,相对于浅层网络更深的网络至少不会有更差的效果。
(2)任务从根据x映射成一个新的y转为了根据x 求x和y之间的差距,这明显是一个相对更加简单的任务,同时redidual模块会明显减小模块中参数的值从而让网络中的参数对反向传导的损失值有更敏感的响应能力,虽然根本上没有解决回传的损失小得问题,但是却让参数减小,相对而言增加了回传损失的效果。
(3)参数量减少了。
八. YOLO系列
1. YOLO (Darknet)
YOLO 系列用了一个自创的网络结构,叫做 darknet。在 YOLOv1 中,它有 24 层卷积层(加上 4 个池化层和 2 个全连接层)。
实际上,YOLO并没有真正去掉候选区,而是采用了预定义的候选区(准确点说应该是预测区,因为并不是Faster RCNN所采用Anchor)。也就是将图片划分为
7
∗
7
=
49
7*7=49
7∗7=49个网格(grid),每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 49x2=98 个bounding box。可以理解为98个候选区,它们很粗略的覆盖了图片的整个区域。
算法首先把输入图像划分成SxS的格子,然后对每个格子都预测B个bounding boxes,每个bounding box都包含5个预测值:x,y,w,h和confidence。
在本文中作者取 S = 7 , B = 2 , C = 20 S=7,B=2,C=20 S=7,B=2,C=20(因为PASCAL VOC有20个类别),所以最后有 7 ∗ 7 ∗ 30 − − ( 20 + 2 ∗ 5 x y w h c ) 7*7*30--(20+2*5xywhc) 7∗7∗30−−(20+2∗5xywhc)个tensor。(每个格子产生2个bounding box,每个bounding box产生5个数,2x5=10,每个格子再产生20个分类的分数,加一起,一个格子产生了30个数。)
损失函数:
缺陷:
虽然每个格子可以预测B个bounding box,但是最终只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
2. YOLOv2(Darknet19)
- 添加了BN(Batch Normalization)层,map提高了2%。在每个卷积层之后都加了 BN 层,网络不再需要 Dropout 层。
- 用448x448的输入分辨率在ImageNet上进行参数微调,map提高了4%。
- 采用聚类的方法设置了anchor box,每个格子设置了5个anchor。之前每个格子只预测一次类别,这实际上是对 BBox 的一种限制,现在需要 每一个anchor预测一种类别。所以对每个 Anchor 都预测一组类别,它们的意义没变。
- darknet19:含有 19 个卷积层和 5 个最大值池化层,不再有全连接层。
也没有特征融合,只有一个13x13的输出支路作为预测。
3. YOLOv3(Darknet53)
参考
(1)新的网络结构Darknet-53
(2)9种尺度的先验框
(3)跨尺度的预测,通过上采样,多尺度特征融合的方式分三个支路预测。
九. NMS
(1)接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0
(2)然后再按得分从高到低排序。
(3)最后再用NMS算法去掉重复率较大的bounding box
(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复以上过程直到最后)。
(4)最后每个bounding box的20个score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体,跳过即可。
十一. SSD (VGG)
观察上述两幅图,我们可以初步得到SSD网络预测过程的基本步骤:
- 输入一幅图片(300x300),将其输入到预训练好的分类网络(改进的传统的VGG16 网络)中来获得不同大小的特征映射;
- 抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的feature map,然后分别在这些feature map层上面的每一个点构造6个不同尺度大小的Default boxes。然后分别进行检测和分类,生成多个初步符合条件的Default boxes;
- 将不同feature map获得的Default boxes结合起来,经过NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的Default boxes,生成最终的Default boxes 集合(即检测结果);
SSD设计理念优点:
- 采用多尺度特征图用于检测:比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标
- 设置Default boxes
十二. RCNN系列
1. RCNN(AlexNet)
RCNN算法训练阶段:
- 生成候选区:
首先用selective search方法在每张图像上选取约2000个region proposal,一张图像生成1K~2K个候选区域 - 准备正负样本:
如果某个region proposal和当前图像上的所有ground truth(标记)重叠面积最大的那个的IOU大于等于0.5,则该region proposal作为这个ground truth类别的正样本,否则作为负样本(认为是背景)。 - 预训练:
这一步主要是因为检测问题中带标签的样本数据量比较少,难以进行大规模训练。训练(或者下载)一个分类模型(比如AlexNet)(5层卷积层,3层全连接层)。使用ILVCR 2012的全部数据进行训练,输入一张图片,输出1000维的类别标号。 - 微调 fine-tuning:
AlexNet预训练好的网络,继续训练,由于ILSVRC 2012是一个1000类的数据集,而本文的数据集是21类(包括20个VOC类别和一个背景类别),所以将最后一个全连接层的输出由1000改成21,另外,其他结构不变。 训练结束后保存f7的特征!!!!我理解的就是一张图片有2000个候选框,抽出来32个正样本(Iou>0.5)以及96个负样本(随机抽取)——然后将这些样本变换到227x227——送入网络,将网络最后一个全连接层由1000变为21——学习率=0.001训练网络
- 针对每个类别训练一个SVM的二分类器:
输入是f7的特征,f7的输出维度是2000x4096,输出的是是否属于该类别,训练结果是得到SVM的权重矩阵W,W的维度是4096x20(其实每一列4096个元素就是一个SVM的二分类,一共20列,也就是20个分类器。),最终得到2000X20,这个20实际上是每个候选框在每一类上的分数。。这里负样本的选定和前面的有所不同,将IOU的阈值从0.5改成0.3,即IOU<0.3的是负样本,正样本是Ground Truth。IOU的阈值选择和前面fine-tuning不一样,主要是因为:前面fine-tuning需要大量的样本,所以设置成0.5会比较宽松。而在SVM阶段是由于SVM适用于小样本,所以设置0.3会更严格一点。
- 回归:
用pool5的特征6x6x256维和bounding box的ground truth来训练回归,每种类型的回归器单独训练。输入是pool5的特征,以及每个样本对的坐标和长宽值。另外只对那些跟ground truth的IOU超过某个阈值且IOU最大的proposal回归,其余的region proposal不参与。
2. fast RCNN(VGG)
R-CNN网络的主要问题有:
1.使用selective search产生proposal,操作耗时,且不利于网络的整体训练和测试;
2.产生的proposal需要经过warp操作再送入后续网络,导致图像的变形和扭曲;
3.每一个proposal均需要单独进行特征提取,重复计算量大;
4.R-CNN的训练都包含多个单独步骤:先预训练、fine tuning、存储CNN提取的特征;再训练SVM;再训练回归器。
时间长:需要用CNN提取所有训练样本的特征
占用存储空间大:所有样本的特征需要存储到磁盘上
5.检测速度慢
- 候选框提取:
候选框的提取与RCNN相同,使用Selective Search算法,该算法会提供一系列候选区域框,而不是遍历各种大小的子图,所以速度快于滑动框,Selective Search的具体说明参看RCNN笔记。需要指出的是,该部分是整个网络的速度瓶颈。 - CNN特征提取:
网络的基本结构是VGG-16网络,相对于原网络,做了以下调整:
最后一个最大值池化层用RoI池化层代替,该池化层可将不同大小的输入池化为统一大小输出。ROI Pooling的加入,相对于R-CNN网络来说,至少有两个改善:
1.由于ROI Pooling可接受任意尺寸的输入,warp操作不再需要,这有效避免了物体的形变扭曲,保证了特征信息的真实性
2.不需要对每个proposal都提取特征,采用映射方式从整张图片的feature map上获取ROI feature区域 - 分类器与回归器
R-CNN中在获取到最终的CNN特征后先采用SVM进行类别判断,再进行bounding-box的回归得到位置信息。整个过程是个串行的流程。这极大地影响了网络的检测速度。Fast R-CNN中则将Classification和regression的任务合二为一,变成一个multi-task的模型,实现了特征的共享与速度的进一步提升。分类和回归损失函数合并到一起。
3. faster RCNN
Faster-rcnn主要包括4个关键模块,特征提取网络、生成ROI、ROI分类、ROI回归。
(1)特征提取网络:它用来从大量的图片中提取出一些不同目标的重要特征,通常由conv+relu+pool层构成,常用一些预训练好的网络(VGG、Inception、Resnet等),获得的结果叫做特征图feature map;
(2)生成ROI(RPN):在获得的特征图的每一个点上(一共的点数时feature map的大小)做多个候选ROI(这里是9),然后利用分类器将这些ROI区分为背景和前景,同时利用回归器对这些ROI的位置进行初步的调整;
(3)ROI分类:在RPN阶段,用来区分前景(于真实目标重叠并且其重叠区域大于0.5)和背景(不与任何目标重叠或者其重叠区域小于0.1);在Fast-rcnn阶段,用于区分不同种类的目标(猫、狗、人等);
(4)ROI回归:在RPN阶段,进行初步调整;在Fast-rcnn阶段进行精确调整;
十三. FPN
低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文不一样的地方在于预测是在不同特征层独立进行的。
FPN是采用这种方式,顶层特征通过上采样和低层特征做融合,而且每层都是独立预测的。
个人总结:
创新点:
其实FPN就是小的特征图进行上采样变大,然后和大的特征图进行相加。这个相加是对应位置相加。其实yolov3中也用到上采样然后融合的思想,但是yolov3中是将上采样后的特征图和大的特征图进行拼接而不是对应相加。
比如上采样以后是 26 ∗ 26 ∗ 256 26 ∗ 26 ∗ 256 26∗26∗256 ,横向经过 1 ∗ 1 1 ∗ 1 1∗1卷积以后也是 26 ∗ 26 ∗ 256 26 ∗ 26 ∗ 256 26∗26∗256 ,FPN是:对应位置相加求和,结果是 26 ∗ 26 ∗ 256 26 ∗ 26 ∗ 256 26∗26∗256。yolov3中是:直接拼接,也就是yolov3中认为是 26 ∗ 26 ∗ 512 26 ∗ 26 ∗ 512 26∗26∗512
十四. FCN(全卷积)
不含全连接层(fc)的全卷积(fully conv)网络。可适应任意尺寸输入。
十五. RetinaNet: Focal loss
作者认为两阶段算法精度高于一阶段算法的原因就是因为:一阶段算法类别不平衡问题。所以提出了交叉熵来平衡类别。
十六. Mask RCNN
个人总结:
在我看来这篇论文最主要的目的并不是提高目标检测,目标检测只是其中一部分,这个主要创新点在于不仅可以进行目标检测同时可以实例分割。
- 对于目标检测而言,最大的创新点在于使用了ROIalign来替代ROI Pooling。
- 另外,所添加的mask分支主要作用也是为了实例分割,Mask rcnn之所以在目标检测的时候也优于Faster R-CNN+ROIAlign,是因为多任务训练的提升,由于加入了mask分支,带来的loss改变,间接影响了主干网络的效果。