神经网络
Last updated
Was this helpful?
Last updated
Was this helpful?
参考资料:
ResNet:
Inception(第二篇还未看完):
【
DenseNet:
Xception:
RCNN:
Faster_RCNN:、
Mask RCNN:
RPN:、
ROI pooling:
ROI:
FPN:
上采样:
两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),其目的主要就是为了降低参数的数目。
ResNetV2比ResNetV1表现更好的原因:
1)反向传播基本符合假设,信息传递无阻碍;2)BN层作为pre-activation,起到了正则化的作用;
当数据训练过程中,数据的尺寸发生变化时,可以使用卷积层调整identity部分的数据,使两者shape相同,然后相加
使用0填充
对于shortcut的方式,作者提出了三个选项:
A. 使用恒等映射,如果residual block的输入输出维度不一致,对增加的维度用0来填充;
B. 在block输入输出维度一致时使用恒等映射,不一致时使用线性投影以保证维度一致;
C. 对于所有的block均使用线性投影。
我还以为这两种方式是同一种,如果是第一种方式的话,感觉调整的是长和宽,而第二种方式调整的是深度
需要注意的是,在论文中提到的当输入输出尺寸发生增加时(图4中的虚线的快捷连接),会考虑两个策略:(a)快捷连接仍然使用自身映射,对于维度的增加用零来填补空缺。此策略不会引入额外的参数;(b)投影捷径(公式2)被用来匹配尺寸(靠1×1的卷积完成)。
第一张图是论文中提出的最原始的版本,所有的卷积核都在上一层的所有输出上来做,那5×5的卷积核所需的计算量就太大了,造成了特征图厚度很大。为了避免这一现象提出的inception具有如下结构,在3x3前,5x5前,max pooling后分别加上了1x1的卷积核起到了降低特征图厚度的作用,也就是Inception v1的网络结构。
注意这里的网络结构是从下往上的,也是够奇怪的构图。
一方面了加入了BN层,减少了Internal Covariate Shift(内部neuron的数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯; 另外一方面学习VGG用2个3x3的conv替代inception模块中的5x5,既降低了参数数量,也加速计算;
这里没什么好说的,但是新加入的BN层,我怎么没看到呢?还有其实我一直不是很清楚所有的分支最后是如何处理为一条线的?concatenate的具体内容是什么呢?
使用3×3的已经很小了,那么更小的2×2呢?2×2虽然能使得参数进一步降低,但是不如另一种方式更加有效,那就是Asymmetric方式,即使用1×3和3×1两种来代替3×3的卷积核。这种结构在前几层效果不太好,但对特征图大小为12~20的中间层效果明显。
v3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块。
v4研究了Inception模块结合Residual Connection能不能有改进?发现ResNet的结构可以极大地加速训练,同时性能也有提升,得到一个Inception-ResNet v2网络,同时还设计了一个更深更优化的Inception v4模型,能达到与Inception-ResNet v2相媲美的性能。
需要注意的是,关于不同的版本有不同的观点
在《Rethinking the Inception Architecture for Computer Vision》中认为:基于inception v1进行结构的改进是inception v2;在inception v2上加上BN是inception v3;
在《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中将《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》认为是inception v2(即inception v1 上进行小改动再加上BN);《Rethinking the Inception Architecture for Computer Vision》认为是inception v3
优点:
1、减轻了vanishing-gradient(梯度消失)
2、加强了feature的传递
3、更有效地利用了feature
4、一定程度上较少了参数数量
为什么每一层会有多个输出呢?难道指的是深度?不然就是存在分支
答:k个输出,k是图片的通道,也就是说k是深度,是卷积核的个数的意思
生长率(Growth rate):如果每个复合函数都产生K个feature map作为输出,那么第l层有k × (l-1)+ k0个输入feature maps,k0是输入图片的通道。为了防止网络生长的太而且为了提升参数效率,我们把k限制到很小的数字,例如k=12,我们将k参数叫做生长率(growth rate)
根据描述来看看,Xception是结合了depthwise separable convolution和ResNet 的结构。
首先它是由Inception V3(在这里认为5×5变成3×3的是V3版本)变化来的,将普通的卷积变成了depthwise separable convolution,其次结构上采用了ResNet的结构。
该模块称之为extreme version of Inception module,这个思想和depthwise separable convolution非常相似。
操作顺序不同:
depth wise separable convolutions:先进行channel-wise 空间卷积,然后1x1卷积进行融合
Inception:先进行1x1卷积,然后进行channel-wise空间卷积
非线性激励函数:
depthwise separable convolution:两个操作之间没有激励函数
Inception:两个操作之间,添加了ReLU非线性激励
这里很奇怪啊,inception两个操作之间好像也没有激活函数的作用吧?难道有,我怎么没有在之前的的图片中看到呢 ?
确实有,激活函数并非单独一层,而是嵌在卷积层内的
RCNN算法分为4个步骤
1、候选区域生成: 一张图像生成1K~2K个候选区域(采用Selective Search 方法)
2、特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
3、类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
4、位置精修: 使用回归器精细修正候选框位置
几个名词:
Selective Search
有监督预训练,迁移学习,
IOU(重叠度):两个bounding box的重叠度,(A∩B)/(A∪B)
非极大值抑制(NMS):算两个框的重叠度,大于阈值,舍弃小的,结果只剩下局部最大值
首先对每一个输入的图片产生近2000个不分种类的候选区域(region proposals),然后使用CNNs从每个候选框中提取一个固定长度的特征向量(4096维度),接着对每个取出的特征向量使用特定种类的线性SVM进行分类。也就是总个过程分为三个程序:a、找出候选框;b、利用CNN提取特征向量;c、利用SVM进行特征向量分类。
1、候选框搜索阶段:
各向异性缩放,各向同性缩放
2、CNN特征提取阶段:
网络结构设计阶段
使用Alexnet
网络有监督预训练阶段
物体标签训练数据很少,如果采用随机初始化CNN参数的方法,那么训练的数据量不够,所以采用“有监督的预训练”,
fine-tunning基本上就是把已经训练好的参数直接拿过来初始化自己的网络,然后用自己的数据继续训练,进行微调
为什么最后不用softmax做分类,而是训练svm分类器?因为cnn训练的结果较宽松(>0.5),而svm的训练较严格(>0.7)
fine-tunning 阶段
将cnn的最后一层替换掉,换成n+1个输出,多的是背景,
然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了
恩?不是说好要进入svm训练分类器了吗?
使用sgd去优化整个cnn,然后确定全连接层可以提取到对应特定任务(物品)的特征,然后进入分类器
位置精修:虽然在图片中产生了近2000个框,但是可能最后目标也并不在其中,所以需要用回归器来做位置优化,而参数就是iou
测试阶段
使用selective search的方法在测试图片上提取2000个region propasals的 ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制(NMS)去除相交的多余的框。再对这些框进行canny边缘检测,就可以得到bounding-box(then B-BoxRegression)。
反思:看过很多博客之后,确实感觉学到了很多,但是当我发现自己并不能重复出那些的时候,我意识到自己并没有完全理解,许多细节依旧是不清楚的,而且很重要的是,我看到很多博客下面都有许多人留言,他们所提的问题让我觉得惭愧,因为我并没有往哪个方向考虑,虽然也是因为我急于掌握这些概念,但这依旧在提醒我思考在学习中是最重要的事情。
http://nooverfit.com/wp/机器视觉目标检测补习贴之r-cnn系列-r-cnn-fast-r-cnn-faster-r-cnn/
依作者看来,如图1,Faster RCNN其实可以分为4个主要内容:
Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals。
Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
2、RPN层:
生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals
3、ROI pooling层
Feature maps + proposal boxes = proposal feature maps
ROI pooling具体操作如下:
(1)根据输入image,将ROI映射到feature map对应位置;
(2)将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
(3)对每个sections进行max pooling操作;
这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps。值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小。ROI pooling 最大的好处就在于极大地提高了处理速度。
4、classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
PoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:
1、通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
2、再次对proposals进行bounding box regression,获取更高精度的rect box
5、训练
Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:
在已经训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
第二训练RPN网络,对应stage2_rpn_train.pt
再次利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt
第二次训练Fast RCNN网络,对应stage2_fast_rcnn_train.pt
为什么我看到有的Mask RCNN用的是FCN,而不是FPN,难道Mask RCNN和Mask R-CNN是不同的???
ResNet-FPN+Fast RCNN+Mask = Mask RCNN
1、ResNet-FPN(Feature Pyramid Network):多尺度检测方法
结构:自下而上 + 自上而下 + 横向连接
实际上,上图少绘制了一个分支:M5经过步长为2的max pooling下采样得到 P6,作者指出使用P6是想得到更大的anchor尺度512×512。但P6是只用在 RPN中用来得到region proposal的,并不会作为后续Fast RCNN的输入。
总结一下,ResNet-FPN作为RPN输入的feature map是 [P2,P3,P4,P5,P6] ,而作为后续Fast RCNN的输入则是 [P2,P3,P4,P5] 。
2、ResNet-FPN+Fast RCNN
基本上又回到RPN的结构上来了,只不过在Faster RCNN中只产生一个feature map,而这里产生了多个,之后每个都会经过RPN的处理得到许多proposal,这里proposal的选择也会根据情况而定,然后得到ROI。
3、ResNet-FPN+Fast RCNN+mask
最后的mask指的是roi align,而并非是roi pooling
focus loss
问题起源于如何更好地从图片中提取patches,最初的方式是sliding window,也就是滑窗遍历整张图片,缺点是效率低耗时,那么后来有人提出了selective search的策略性区域选择算法,该算法将图片作为输入,讲bounding box作为输出,这些边界框最有可能包含所需要检测的物体,所以只需要对这些边界框进行识别就好了。
selective search
核心是通过颜色、纹理、形状或者大小来做图像过分割,因为要让分割后的区域尽可能覆盖所有原始图像中的物体
步骤:
step 1:根据论文[1]分割的图片画出多个框,把所有框放入列表Region中
step 2:根据相似程度(颜色,纹理,大小,形状等),计算Region中框之间的俩俩形似度,把相似度放入列表A中
step 3:从列表A中找出相似度最大的俩个框a,b并且合并
Step 4:把合并的框加入列表Region中,从A中删除和a,b相关的相似度,重复步骤2,直至清空A
效果就是降低了时间的消耗,提升了候选框的质量
R-CNN
对输入的图片进行区域提取,文中用selective search。然后对每一块提取出来的区域缩放到统一的大小,输出CNN特征向量,用分类器(SVM,讨论了softmax的可行性)判断该区域是不是某类物体,接着对选出的区域做了框回归(bounding box regression)处理得到最后的结果:物体种类和框的位置。
bouding box regression
selective search选出了候选框与实际上目标框的位置其实还是有偏差的,
CNN输出的特征向量里包含了信息,所以在CNN输出的特征向量上做了一个loss计算,调整原来框的位置(相当于对原来的框加上缩放和平移操作)
这里其实一直不是很懂位置精修是怎么做的,按道理来讲,位置精修属于回归,定义loss函数来进行优化,但是这样的操作应该放在模型训练中,可我并没有看到这样的做法,也就是我不知道训练方面是怎样的思路。
Regions proposal network(RPN)
关键在于anchors,以anchors为中心会有9个框,最后RPN会输出对每一个锚点框的种类(fg/bg)置信度和位置偏移量
Faster R-CNN的训练方法有好几种,主要分为拆分训练和端到端训练。
拆分训练:先训练RPN,从所有anchor box中随机挑选256个,保持正样本负样本比例1:1(正样本不够时用负样本补);再从RPN的输出中,降序排列所有anchor box的前景置信度,挑选top-N个候选框叫做proposal, 做分类训练。
端到端训练:理论上可以做端到端的训练,但是由于anchor box提取的候选框中负样本占大多数,有的图中负样本和正样本的比例可以是1000:1, 导致直接训练难度很大。真正的端到端的目标检测网络还是有的,例如one-stage中代表的YOLO、SSD算法。速度很快,但是精度差了点。
Faster R-CNN最核心的工作在于在提取特征的过程中完成候选框提取的操作,大大加快了物体检测的速度。
另一份文档中
所以我们通过滑动窗口和anchor,成功得到了 51x39x9 个原始图片的proposal。接下来,每个proposal我们只输出6个参数:每个 proposal 和 ground truth 进行比较得到的前景概率和背景概率(2个参数)(对应图上的 cls_score);由于每个 proposal 和ground truth 位置及尺寸上的差异,从 proposal 通过平移放缩得到 ground truth 需要的4个平移放缩参数(对应图上的 bbox_pred)。
bounding box regression
候选框,预测框,真值框
难道预测框是候选框滑动生成的吗?不可能!或者说预测框就是目标生成的框?
目标检测的两个阶段:
1、候选区域:给定一张图片尽可能地找出物体可能存在的位置,输出的称为region proposal或者ROI
2、分类:确定上面的ROI属于某一类物体或者属于fg/bg
问题:
1、会产生大量的region proposal导致效率较低
2、处理速度方面是suboptimal
3、无法做到端对端训练
ROI pooling的效果加速训练和测试,提升准确度
具体操作:
(1)根据输入image,将ROI映射到feature map对应位置;
(2)将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
(3)对每个sections进行max pooling操作;
这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps。值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小。ROI pooling 最大的好处就在于极大地提高了处理速度。
我只看到了一些基本操作,不能理解为何“极大地提高了处理速度”。
总结:(1)用于目标检测任务;(2)允许我们对CNN中的feature map进行reuse;(3)可以显著加速training和testing速度;(4)允许end-to-end的形式训练目标检测系统。
其实最大的作用是固定长度输出,不是吗?
回忆RPN网络生成的proposals的方法:对foreground anchors进行bounding box regression,那么这样获得的proposals也是大小形状各不相同,即也存在上述问题。所以Faster R-CNN中提出了RoI Pooling解决这个问题。
这个好像不对吧,在roi pooling之后并没有CNN的操作了,后面是全连接层在处理,如何会联系到CNN?当然也可以说全连接层也需要固定长度输入,但感觉已经出现偏差了。
ROI Pooling的缺陷:
由于预选框通常是由模型回归得到的,一般来讲是浮点数。但是在roi pooling存在两次整数化的操作
将候选框边界量化为整数点坐标值。
将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。
也就是不匹配问题(misalignment)
为了解决ROI Pooling的上述缺点,作者提出了ROI Align这一改进的方法(如图2)。ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。值得注意的是,在具体的算法操作上,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套比较优雅的流程,如 图3 所示:
遍历每一个候选区域,保持浮点数边界不做量化。
将候选区域分割成k x k个单元,每个单元的边界也不做量化。
在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测测任务中将 ROI Pooling 替换为 ROI Align 可以提升检测模型的准确性。
多尺度检测:之前很多目标检测的算法都是利用顶层特征做预测,但
低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文不一样的地方在于预测是在不同特征层独立进行的。
4种利用特征的形式
其余在Mask R-CNN中都有介绍了
缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。
放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。对图像的缩放操作并不能带来更多关于该图像的信息, 因此图像的质量将不可避免地受到影响。然而,确实有一些缩放方法能够增加图像的信息,从而使得缩放后的图像质量超过原图质量的。
下采样原理:对于一幅图像I尺寸为M*N,对其进行s倍下采样,即得到(M/s)*(N/s)尺寸的得分辨率图像,当然s应该是M和N的公约数才行,如果考虑的是矩阵形式的图像,就是把原始图像s*s窗口内的图像变成一个像素,这个像素点的值就是窗口内所有像素的均值:
上采样原理:图像放大几乎都是采用内插值方法,即在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的元素。
无论缩放图像(下采样)还是放大图像(上采样),采样方式有很多种。如最近邻插值,双线性插值,均值插值,中值插值等方法。在AlexNet中就使用了较合适的插值方法。各种插值方法都有各自的优缺点。
Recall:召回率
召回率也叫查全率,是你预测的样本中实际的正样本数 / 所有的正样本数,所以为了提高召回率,可以多预测。eg:有128个样本,其中32个正,96个负。我可以说,我预测有128个正样本。所以recall= 32/32 = 100%
Precision:准确率
准确率也叫查准率,是你预测的样本中实际的正样本数 / 预测的样本数,为了提高准确率,可以少预测。eg:还是上面的例子,上面的precision = 32/128 = 25%。我为了提高precision,我可以只预测一个样本。这样就有1/4的概率能预测到。假设恰好预测到了正样本,此时precision = 1/1 = 100%
*往往召回率越高,准确率越低。
AP衡量的是学出来的模型在每个类别上的好坏,mAP衡量的是学出的模型在所有类别上的好坏,得到AP后mAP的计算就变得很简单了,就是取所有AP的平均值。
定义:卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域,如图1所示。
1、conv层