写在前面的话:
在前段时间自己开启了找工作的阶段,对于自己所接触的目标检测总体进行了一段总结,自己是写在笔记中上传到这无法显示图片,就直接分享笔记连接,又想看的就去看一下吧。以及下面是常问到的知识:
1、roi pooling和roi algin的区别
2、F1 score
p: tp/(tp+fp)
r:tp/(tp+FN)
F1-score : 2(PR)/(P+R)
3、优化器
4、网络结构:
Faster Rcnn
inception
5、dropout和BN
6、传统图像处理
对于下面的总结全部来源于网上
目录
①、局部连接:在全连接层中,每个输出通过权值和所有输入相连。在视觉识别中,关键性的图像特征、边缘、角点等只占据了整张图像的一小部分,图像中相聚很远的两个像素之间有相互影响的可能性很小。因此,在卷积层中,每个输出神经元在通道方向保持全连接,而在空间方向上只和一小部分输入神经元相连。
②、共享参数:如果一组权值可以在图像中某个区域提取出有效的表 示,那么它们也能在图像的另外区域中提取出有效的表示。因此,卷积层不同空间位置的神经元共享权值,用于发现图像中不同空间位置的模式。共享参数在减少网络参数的同时仍能保持很高的网络容量。卷积层在空间方向共享参数,而循环神经网络在时间方向共享参数。
③、卷积层的作用:通过卷积,捕获图像的局部信息。通过多层卷积层的堆叠,各层提取到特征逐渐由边缘、纹理、方向等低层级特征过渡到文字、车轮、人脸等高层级特征。
④、描述卷积的四个量:
a、滤波器个数。使用一个滤波器对输入进行卷积会得到一个二维的特征图。可以使用多个滤波器对输入进行卷积, 以得到多个特征图。
b、感受野(receptive field)F,即滤波器空间局部连接大小。
c、零填补(zero-padding)p。随着卷积的进行,图像大小将缩小,图像边缘的信息将逐渐丢失,因此,在卷积前,我们在图像上下左右填补一些0,使得我们可以控制输出特征图的大小。
d、步长(stride)S。滤波器在输入每移动S个位置计算一个输出神经元。
⑤、尽量使用小的滤波器,通过堆叠多层小的滤波器,可以取得与大滤波器相同的感受野,eg:三层33卷积等效于一层77卷积的感受野。但使用小的滤波器有以下好处:
a、更少的参数量。假设通道数为D,三层33卷积的参数量为3(DD33)=27D2,而一层7*7卷积的参数量为D*D*7*7=49D2。
b、更多非线性。由于每层卷积层后都有非线性激活函数,三层33卷积一共经过三次非线性激活函数,而一层7*7卷积只经过一次。
⑥、11 卷积:其旨在对每个空间位置的D维向量做一个相同的线性变换。通常用于增加非线性、或者降维,这相当于在通道数方向上进行了压缩。11卷积是减少网络计算量和参数的重要方式。
⑦、全连接层的卷积层等效:由于全连接层和卷积层都是做点乘,这两种操作可以相互等效。全连接层的卷积层等效只需要设定好卷积层的四个量:滤波器的个数等于原全连接层输出神经元的个数、感受野等于输入空间大小,没有零填补、步长为1。
将全连接层等效为卷积层的原因为:全连接层只能处理固定大小的输 入,而卷积层可以处理任意大小的输入,假设训练图像大小是224224,而当测试图像大小是256256。如果不进行全连接层的卷积层等效,就需要从测试图像中裁剪出多个224224区域分别前馈网络。而进行等效后,只需要将256256输入前馈网络一次,即可达到多次前馈224224区域的效果。
⑧、卷积结果的两种视角:卷积结果为DHW的三维张量。其可以被认为是有D个通道,每个通道是一个二维的特征图,从输入中捕获了某种特定的特征,也可以被认为是有HW个空间位置,每个空间位置是一个D 维的描述向量,描述了对应感受野的图像局部区域的语义特征。
(2)、池化层
池化层是根据特征图上的局部统计信息进行下采样,在保留有用信息的同时减少特征图的大小。和卷积层不同的是,池化层不包含需要学习的参数。
池化层的作用:
①、增加特征平移不变性。池化可以提高网络对微小位移的容忍能力
②、减小特征图大小
汇合层对空间局部区域进行下采样使下一层需要的参数量和计算量减少,并降低过拟合的风险。
③最大池化可以带来非线性。
2、图像分类
给定一张输入图像,图像分类任务旨在判断该图像所属类别。
(1)图像分类经典网络结构
①、基本架构
常见的网络结构顺序为:conv->bn->relu->pool,其中卷积层用于提取特征,池化层用于减小空间大小。随着网络深度的进行,图像的空间大小将越来越小,而通道数会越来越大。
②、LeNet-5 60K参数。网络基本架构为:conv1(6)->pool1->conv2(16)->pool2->fc3(120)-fc4(84)->fc5(10)->softmax,LeNet用于ATM以对支票中的手写数字进行识别。
③、AlexNet 60M参数,网络的基本架构为:conv1 (96) -> pool1 -> conv2 (256) -> pool2 -> conv3 (384) -> conv4 (384) -> conv5 (256) -> pool5 -> fc6 (4096) -> fc7 (4096) -> fc8 (1000) ->softmax。
AlexNet和LeNet-5网络结构相似,但是有更深、更多参数。conv1使用1111的滤波器、步长为4使空间大小迅速减小(227227–>5555),其关键点为:
a、使用了ReLu激活函数,使之有更好的梯度特性、训练更快。
b、使用随机失活(dropout)
c、大量使用数据扩充技术。
④、VGG-16/VGG-19 138M参数,其基本架构为:conv1^2 (64) -> pool1 -> conv2^2 (128) -> pool2 -> conv3^3 (256) -> pool3 -> conv4^3 (512) -> pool4 -> conv5^3 (512) -> pool5 -> fc6 (4096)-> fc7 (4096) -> fc8 (1000) -> softmax。 ^3代表重复3次。
其关键点为:
a、结构简单煤制油33卷积核22池化两种配置,并且重复堆叠相同的模块组合。卷积层不改变空间大小,每经过一次池化层,空间大小减半。
b、参数量大,而且大部分的参数集中在全连接层中。
c、合适的网络初始化和使用批量归一层对训练深层网络很重要。
⑤、GoogLeNet 5M参数,其网络试图回答在设计网络时究竟应该选多大尺寸的卷积或者应该选择池化层,提出了Inception模块,同时使用 11、33、55卷积核33池化,并保留所有结果。网络基本架构为: conv1 (64) -> pool1 -> conv2^2 (64, 192) -> pool2 -> inc3 (256, 480) -> pool3 -> inc4^5 (512, 512, 512, 528, 832) ->pool4 -> inc5^2 (832, 1024) -> pool5 -> fc (1000)。关键点为:
a、多分支分别处理,并级联结果
b、为了降低计算量,使用了11卷积降维。该网络使用了全局平均池化替代全连接层,使网络参数大幅减少。
⑥、Inception v3/v4 在GoogLeNet 的基础上进一步降低参数。其和GoogLeNet有相似的Inception模块但将77和55卷积分解为若干等效的33卷积,并在网络中后部分把33卷积分解为13和31卷积。这使得在相似的网络参数下网络可以部署到42层。此外,Inception v3使用了批量归一层,Inception v4在在Inception基础上结合了residual模块。
⑦、ResNet,该网络旨在解决网络加深后训练难度增大的现象。其提出了residual模块,包含两个3*3卷积和一个短路连接(左图)。短路连接可以有效环节反向传播时由于网络深度过深导致的梯度消失现象,这使得网络加深之后性能不会变差。短路连接是深度学习有一重要思想。此外,具有短路连接的ResNet可以看做是不同深度而共享参数的网络的集成,网络数目随层数指数增加,其关键点为:
a、使用短路连接,使训练深层网络更容易,并且重复堆叠相同的模块组合
b、ResNet大量使用了批量归一层c、对于很深的网络(超过50层),ResNet使用了更高效的瓶颈结构(右图)
⑧、preResNet ResNet的改进,preResnet整了residual模块中各层的顺序。相比较经典的residual模块,a、b将BN共享会更加影响信息的短路传播,使网络更难训练、性能也更差。c直接将ReLU移到BN后会使该分支的输出始终非负,使网络表示能力下降。d将ReLU提前解决了e的非负问题但ReLU无法享受BN的效果。e将ReLU和BN都提前解决了d的问题。preResNet的短路连接e能更加直接的传递信息,进而取得了比ResNet更好的性能。
⑨、ResNeXt Resnet的另一改进。传统的方法通常是靠加深或加宽网络来提升性能,但计算开销也会随之增加。Resnet旨在不改变模型复杂度的情况下提升性能,受Inception模块的启发,ResNeXt将Resnet中非短路的那一分支变为多个分支。和Inception不同的是,每个分支的结构都相同。ResNeXt关键点是:
a、沿用ResNet的短路连接,并且重复堆叠相同的模块组合。
b、多分支分别处理。
c、使用1*1卷积降低计算量。其综合了ResNet和Inception的优点。此外,ResNeXt巧妙的利用分组卷积进行实现。ResNeXt发现,增加分支数是比加深或加宽更有效地提升网络性能的方式。
⑩、随机深度 ResNet的改进。旨在缓解梯度消失和加速训练。类似随机失活(dropout),其以一定概率将residual模块失活。失活的模块直接由短路分支输出,而不经过有参数的分支。在测试时,前馈经过全部模块,随机深度说明residual模块是有信息冗余的。
⑪、DenseNet 其目的也是避免梯度消失。和residual模块不同,dense 模块中任意两层之间均有短路连接。也就是说,每一层的输入通过级联(concatenation)包含了之前所有层的结果,即包含由低到高所有层次的特征。和之前方法不同的是,DenseNet中卷积层的滤波器数很少。DenseNet只用ResNet一半的参数即可达到ResNet的性能。
⑫、SENet,SENet通过额外的分支(gap-fc-fc-sigm)来得到每个通道的[0,1]权重,自适应地校正原各通道激活值响应。
3、目标定位
基本思路:多任务学习,网络带有两个输出分支。一个分支用于做图像分类,即全连接+softmax判断目标类别,和单纯图像分类区别在于这里还需要一个“背景”类。另一个分支用于判断目标位置,即完成回归任务输出四个数字标记包围盒位置(例如中心点横纵坐标和包围盒长宽),该分支输出结果只有在分类分支判断不为“背景”时才使用。 人体位姿定位/人脸定位 目标定位的思路也可以用于人体位姿定位或人脸定位。这两者都需要我们对一系列的人体关节或人脸关键点进行回归弱监督定位 由于目标定位是相对比较简单的任务。基本思路是从卷积结果中找到一些较高响应的显著性区域,认为这个区域对应图像中的目标 。
4、目标检测
在目标定位中,通常只有一个或固定数目的目标,而目标检测更一般化,其图像中出现的目标种类和数目都不顶。
目标检测可以分为以下几个部分:input、backbone、neck 和 head.
(1)基于候选区域的目标检测算法
①、基本思路:
使用不同大小的窗口在图像上滑动,在每个区域,对窗口内的区域进行目标定位。即,将每个窗口内的区域前馈网络,其分类分支用于判断该区域的类别,回归分支用于输出包围盒。基于滑动窗的目标检测动机 是,尽管原图中可能包含多个目标,但滑动窗对应的图像局部区域内通常只会有一个目标(或没有)。因此,我们可以沿用目标定位的思路对窗口内区域逐个进行处理。但是,由于该方法要把图像的所有区域都滑动一边,而且滑动窗大小不一,这会带来很大的计算开销。
②、R-CNN
先利用一些非深度学习的类别无关的无监督方法,在图像中找到一些可能包含目标的候选区域,之后,对每个候选区域前馈网络,进行目标定位,即两分支(分类+回归)输出。其中,我们仍然需要回归分支的原因是,候选区域只是对包含目标区域的一个粗略的估计。需要有监督地利用回归分支得到更精确的包围盒预测结果。R-CNN的重要性在于当时目标检测已接近瓶颈期。
候选区域,候选区域生成算法通常基于图像的颜色、纹理、面积、位置等合并相似的像素,最终可以得到一系列的候选矩阵区域。这些算法,如selective search 或 edgeBoxes,
③、Fast R-CNN
R-CNN 的弊端是需要多次前馈网络,这使得R-CNN的运行效率不高。Fast R-CNN 同样基于候选区域进行目标检测,受到SPPNet的启发,在Fast R-CNN中,不同候选区域的卷积特征提取部分是共享的。也就是说,先将整副图像前馈网络,并提取conv5卷积特征。之后,基于在原始图像上运行候选区域生成算法的结果在卷积特征上进行采样,这一步称为兴趣区域汇合,最后,对每个候选区域,进行目标定位,即两分支分类+回归)输出。
兴趣区域汇合,兴趣区域汇合旨在由任意大小的候选区域对应的局部卷积特征提取得到固定大小的特征,这是因为下一步的两分支网络由于有全连接层,需要其输入大小固定。其做法,先将候选区域投影到卷积特征上,再把对应的卷积特征区域空间上划分成固定数目的网格(数目根据下一步网络希望的输入大小确定,例如VGGNet需要7*7的网格),最后在每个小的网格区域内进行最大池化,以得到固定大小的池化结果。和经典的最大池化一致,每个通道的兴趣区域池化是独立的。
④、Faster R-CNN
对于Faster R-CNN这种two stage模型,第一阶段的RPN可以过滤掉很大一部分负样本,最终第二阶段的检测模块只需要处理少量的候选 框,而且检测模块还采用正负样本固定比例抽样(比如1:3)或者OHEM 方法(online hard example mining)来进一步解决正负样本不平衡问题。
Fast R-CNN测试时每张图像前馈网络只需0.2秒,但瓶颈在于提取候选区域需要2秒。Faster R-CNN不再使用现有的无监督候选区域生成算法,而利用候选区域网络从conv5特征中产生候选区域,并且将候选区域网络集成到整个网络中端到端训练。Faster R-CNN的测试时间是0.2 秒。
候选区域网络(region proposal networks,RPN):在卷积特征上的通过两层卷积(33和11卷积),输出两个分支。 其中,一个分支用于判断每个锚盒是否包含了目标,另一个分支对每个锚盒输出候选区域的4个坐标。候选区域网络实际上延续了基于滑动窗进行目标定位的思路,不同指出在于候选区域网络在卷积特征而不是原图上进行滑动。由于卷积特征的空间大小很小而感受野很大,即使使用33的滑动窗, 也能对应于很大的原图区域。Faster R-CNN使用了3组大小(128128、256256、512512)、3组长宽比(1:1、1:2、2:1)共计9个锚盒,这里的锚盒的大小已经超过conv5特征感受野的大小。对于一张1000*600 的图像,可以得到20k个锚盒。
为什么要使用锚盒(Anchor box):锚盒是预先定义形状和大小的包围盒。使用锚盒的原因包括:a:图像中的候选区域大小和长宽比不同,直接回归比锚盒坐标修正训练起来更困难。b:conv5特征感受野很大,很可能该感受野内包含了不止一个目标,使用对个锚盒可以同时对感受野内出现的多个目标进行预测。c:使用锚盒也可以认为这是向神经网络引入先验知识的一种方式。可以根据数据中包围盒通常出现的形状和大小设定一组锚盒。锚盒之间是独立的,不用的锚盒对应不同的目标。
该网络:
首先将图像缩放至固定大小MN,然后将MN图像送入网络,而conv layer中包含了13个conv层+13个relu层+4个Pooling层,RPN网络首先经过33卷积,在分别生成positive anchor和对应bounding box regress 偏移量,然后计算proposals。而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)
a:Conv layers
Conv layers包含了conv,Pooling,relu三中层。以python版本中的VGG16模型中的网络结构为例。Conv layer部分共有13个conv层,13 个relu层,4个Pooling层。在Convlayer 中:所有的conv层都是: kernel_size= 3,pad=1,stride=1,所有的Pooling层都是kernel_size=2,pad=0,stride=2在所有卷积中都做了扩边处理(pad=1,即填充一圈0),导致原图变为(M+2)(N+2))再做33卷积后输出M*N。这种设置导致Conv layers中的conv层不改变输入和输出矩阵大小。
类似的是,Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。
综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!这样Conv layers生成的feature map中都可以和原图对应起来。
b:Region Proposal Network(RPN)
Faster R-CNN抛弃了传统的滑动窗口和SS(Selective Search)方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
RPN网络实际分为2条线,上面一条通过softmax分类Anchor获得positive和negative分类,下面一条用于计算对于Anchor的Bounding box regression偏移量,以获得精确的proposal。而最后的proposal层负责综合positive Anchor和对应Bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
b.a 多通道图像卷积基础
如上图,输入有3个通道,同时有2个卷积核,对于每个卷积核,先在输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出。所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量。
b.b Anchor
实际通过Anchor就引入了检测中常用到的多尺度方法。Anchor结构如下图所示:
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断那些Anchor是里面有目标的positive Anchor,哪些是没有目标的negative Anchor。所以仅仅是个二分类而已。
b.c softmax判定positive与negative
一幅MN大小的矩阵送入Faster R-CNN网络后,到RPN网络变成
(M/16)(N/16),设W=M/16,H=N/16。在进入reshape与softmax之前, 先做1*1卷积
RPN网络中利用Anchor和softmax初步提取出positive Anchor作为候选区域。
b.d Bounding box regression原理
b.e 对proposals进行Bounding box regression
b.f Proposal Layer Proposal Layer负责综合所有
变换量和positive Anchor,计算出精准的proposal,送入后续RoI Pooling Layer。
c RoI pooling
RoI pooling层负责收集proposal,并计算出proposal feature
maps,送入后续网络。
1 layer {
2 name: "roi_pool5"
3 type: "ROIPooling"
4 bottom: "conv5_3"
5 bottom: "rois"
6 top: "pool5"
7 roi_pooling_param {
8 pooled_w: 7
9 pooled_h: 7
10 spatial_scale: 0.0625 # 1/16
11 }
12 }
由于proposal是对应MN尺度的,所以首先使用spatial_scale参数将其映射会(M/16)(N/16)大小的feature map尺度在将每个proposal对应的feature map区域水平分为pooled_w*pooled_h 的网格 对网格的每一份都进行max pooling处理。
d Classification
classification部分利用已经获得proposal feature maps,通过full connect层与softmax计算每个proposal具体属于哪个类别,输出cls_prob概率向量,同时再次利用Bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。e Faster R-CNN训练
⑤、R-FCN
Faster R-CNN在Roi pooling之后, 需要对每个候选区域单独进行两分支预测。R-FCN旨在使几乎所有的计算共享,以进一步加快速度。由于图像分类任务不关心目标具体在图像位置,网络具有平移不变性。但目标检测中由于要回归出目标的位置,所以网络输出应当受目标平移的影响。为了缓和这两者的矛盾,R-FCN显式地给予深度卷积特征各通道以位置关系。在ROI汇合时,先将候选区域划分成3*3的网格,之后将不同网格对应于候选卷积特征的不同通道,最后每个网格分别进行平均汇合。R-FCN同样采用了两分支(分类+回归)输出。
⑥、小结
基于候选区域的目标检测算法通常需要两步:第一步是从图像中提取深度特征,第二步是对每个候选区域进行定位(包括分类和回归)。其中,第一步是图像级别计算,一张图像只需要前馈该网络一次,而第二步是区域级别计算,每个候选区域都分别需要前馈该部分网络一次。因此,第二步占用了整体主要的计算开销。R-CNN、Fast R-CNN、Faster R-CNN、R-FCN这些算法的演进思路是逐渐提高网络中图像级别计算的比例,同时降低区域级别计算的比例。R-CNN中几乎所有的计算都是区域级别计算,而R-FCN中几乎所有的计算都是图像级别计算。
(2)基于直接回归的目标检测算法
基本思路:基于候选区域的方法由于有两步操作,虽然检测性能比较好,但速度上离实时有一些差距。基于直接回归的方法不需要候选区域,直接输出分类/回归结果。这类方法由于图像只需前馈网络一次, 速度通常更快,可以达到实时。
YOLO和SSD,其主要思路是均匀地在图片的不同位置进行密集抽样, 抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归。
①、YOLO
将图像划分成7*7的网格,其中图像中的真实目标被其划分到目标中心所在的网格及其最接近的锚盒。对每个网格区域,网络需要预测:每个锚盒包含目标的概率(不包含目标时应为0,否则为锚盒和真实包围盒的IoU)、每个锚盒的4个坐标、该网格的类别概率分布。每个锚盒的类别概率分布等于每个锚盒包含目标的概率乘以该网格的类别概率分 布。相比基于候选区域的方法,YOLO需要预测包含目标的概率的原因 是,图像中大部分的区域不包含目标,而训练时只有目标存在时才对坐标和类别概率分布进行更新,YOLO的优点在于a:基于候选区域的方法的感受野是图像中的局部区域,而yolo可以利用整张图像的信息。b:有更好的泛化能力。YOLO的局限在于:a:不能很好处理网格中目标数超过预设固定值,或网格中有多个目标同时属于一个锚盒的情况。b:对小目标的检测能力不够好。c:对不常见长宽比的包围盒的检测能力不强。d: 计算损失时没有考虑包围盒大小。大的包围盒中的小偏移和小的包围盒中的小偏移应有不同的影响。
核心思想:将整张图片作为网络的输入(类似Faster R-CNN),直接在输出层对BBox的位置和类别进行回归。
实现方法:
a:将一幅图像分成SS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责检测这个object。
b:每个网络需要预测B个BBox的位置信息和confidence(置信度)信息,一个BBox对应着四个位置信息和一个confidence信息。
c:每个bounding box要预测(x,y,w,h)和confidence共5个值, 每个网格还要预测一个类别信息,记为C类。则SS个网格,每个网格要预测B个Bounding box还要预测C个categories。输出就是SS(5B+C) 的tensor。(注意class信息是针对每个网格,confidence信息是针对每个Bounding box的)
d:在test的时候,每个网格预测的class信息和Bounding box 预测的confidence信息相乘,就得到每个Bounding box的class-specific confidencescore:
e:得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
总结:
给定一个输入图像,首先将图像划分成77的网格,对于每个网格, 都预测两个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率),根据上一步可以预测出772个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可。
损失函数:
最后2层是全连接层,其它使用了大量的卷积层,网络逐渐变宽,是非常
标准化的操作。为什么都是卷积,图上要分开画出来,不写在一起?答案是:按照feature map的分辨率画出来。
YOLOV1 中 没 有 Neck,Backbone 是 GoogLeNet, 属 于 Dense Prediction。1阶段检测器属于Dense Prediction,而2阶段的检测器既有Dense Prediction,又有Spare Prediction
YOLO V2
采用一种新的训练方法–联合训练算法,这种算法使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来,其基本思路是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors),用检测数据集的数据学习物体的准确位置,用分类数据集来增加分类的类别量、提升健壮性。
改 进 :
a:使用Bstch Normalization(批量归一化)
b:High resolution classifier(高分辨率图像分类器)
YOLOv2在采用224224图像进行分类模型预训练后,再采用448448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应448448的分辨率。然后再使用448448的检测样本进行训练,缓解了分辨率突然切换照成的影响。
c: Convolution with Anchor boxes(使用先验框)
YOLOv2尝试采用先验框。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度。
d:Dimension clusters(聚类提取先验框的尺度信息) e:Direct location prediction(约束预测边框的位置) f:Fine-Grained Features(passthrough层检测细粒度特征) g:Multi-ScaleTraining(多尺度图像训练)
h:Hi-res detector(高分辨率图像的对象检测)
i:Hierarchicalclassification(多层分类) Backbone:
为了进一步提升性能,Yolov2重新训练了一个darknet-19:如下图所示:
三个问题:
a:为什么没有77卷积了?只剩下33和11卷积?
vgg net论文中得到一个结论,77卷积可以使用更小的卷积代替, 而且33的卷积更加节约参数,使模型更小。以及增加了非线性能力。
33卷积负责扩大感受野,1*1卷积负责减少参数量。b:为什么没有FC层?
使用了GAP(Global Average Pooling)层,把100077映射为10001,满足了输入不同尺度的image的需求,你不管输入图片是
224224还是256256,最后都给映射为10001
对于小目标的检测,之前输入图片是固定大小的,小目标很难被检测准确;现在允许多尺度输入图片,只要吧图片放大,小目标就变成了大目标,提高检测精度。
c:为什么最后一层是softmax?
因为backbone网络darknet-19是单独train,是按照分类网络去train的,用的数据集是ImageNet,是1000个classes,所以最后加了softmax层,使用cross entropy loss。
YOLOv3
a:多尺度预测:更好地对应不同大小的目标物体,检测头采用3个分支32倍、16倍、8倍下采样。
b:ResNet残差结构:更好地获取物体特征
c:替换softmax层:对应多重label分类 softmax层被替换为一个1*1的卷积层+Logistic激活函数的结构。改进之处:
a:多尺度预测(引入FPN)
c:更好的基础分类网络(darknet-53,类似ResNet引入残差结构)
d:分类器不再使用Softmax。分类损失采用binary cross-entropy loss(二分类较差损失熵)
YOLOv3不再使用softmax对每个框进行分类,主要因素为:softmax使得每个框分配一个类别(score最大的一个),而对于open image这种数据集,目标可能有重叠的类别标签,因此,softmax不适用于多标签分类。softmax可被独立的多个Logistic分类器替代,且准确率不会下降。
损失函数如上:loss分为3部分组成:第一行是geo_loss,S代表 13、26、52就是grid是几乘几。第二行代表confidence_loss。第三行代表class_loss
在yolov3中没有Pooling layer用的是conv(stride=2)进行下采样, 为什么?
因为Pooling layer,不管是MaxPooling还是Average Pooling,本质上都是下采样减少计算量,本质上就是不更新参数的conv,但是他们会损失信息,所以用的是conv(stride=2)进行下采样。
YOLO V4
技巧:
用于backbone的BoF:CutMinx和Mosaic数据增强,DropBlock正则化, Class label smoothing用于backbone的BoS:Mish激活函数,CSP,MiWRC用于检测器的BoF:CIoU-loss,CmBN,DropBlock正则化,Mosaic数据增强,Self-Adversarial训练,消除网络敏感性,对单个ground-truth 使用多个Anchor,Cosine annealing scheduler,最佳超参数,Random training shapes用于检测器的Bos:Mish激活函数,SPP,SAM,PAN,DIoU-NMS 改进:
检测头的改进:
a:Using multi-anchors for single ground truth
使用多个Anchor去负责一个GT。相当于Anchor框的数量没变,但是选择的正样本的比例增加了,就缓解了正负样本不均衡的问题。
b:Eliminate_grid sensitivity
c:CioU-loss
在YOLOv2、YOLOv3中计算geo_loss是使用MSE Loss之后人们开始使用IoU Loss。
它可以反映预测检测框与真实检测框的检测效果。
但是问题也很多:不能反映两者的距离大小(重合度)。同时因为
loss=0,当GT和Bounding box不挨着时,没有梯度回传,无法进行学习训练,
所以接下来改进是:
C为同时包含了预测框和真实框的最小框的面积。
GIoU Loss可以解决上面IoU Loss对距离的不敏感问题。但是GIoU Loss存在训练过程中发散等问题。
接下来改进
其中,b,bgt分别代表了预测框和真实框的中心点,且ρ代表的是计算两个中心点的欧氏距离,c代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。
DIoU loss可以直接最小化两个目标框的距离,因此比GIoU loss收敛快得多。
DIou loss虽然有收敛快(需要的epochs少)、缓解了Bounding box 全包含GT问题。但是DIoU loss只是缓解了Bounding box全包含Gt问
题,依然没有撤掉解决包含问题。接下来改进:
惩罚项如下:
YOLOv4使用CSPDarknet53作为backbone,加上SPP模块,PANET作为
neck,以及YOLOv3的head。
Yolov4 的 五 个 基 本 组 件 :
a:CBM:YOLO4网络中最小的组件,由Conv+Bn+Mish激活函数三者组成
b:CBL:有Conv+Bn+Leaky_relu激活函数组成
c:Res unit:借鉴ResNet网络中的残差结构,让网络可以构建的更深
d:CSPX:借鉴CSPNet网络结构,由三个卷积层和X个Res Unint模块concate 组 成
e:SPP:采用11、55、13*13的最大池化方式,进行多尺度融合其中:
Concate:张量拼接,维度会扩充,和YOLOv3中的解释一样,对应于
cfg文件中的route操作
add:张量相加,不会扩充维度。对应cfg文件中的shortcut操作 输 入 端 改 进 :
YOLOV4在输入端进行了数据增强Mosaic、cmBN 、SAT自对抗训练。
YOLO v5
head部分没有任何改动,但是采用了自适应Anchor
Yolov5的基本组件:
a:Focus:基本上就是YOLO v2的passthrough。
b:CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
c:CSP1_X:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块 Concate 组 成 。
d:CSP2_X:不再用Res unint模块,而是改为CBL。
e:SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合
②、SSD
相比YOLO,SSD采用CNN来直接进行检测,而不是像Yolo那样在全连接层之后进行检测。另外两个改变,一是SSD提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体。二是SSD采用不同尺度和长宽比的先验框(Prior boxes,Default boxes,在Faster R- CNN中叫做锚,Anchors)。
此外SSD和YOLO的检测值也不是一样的,SSD第一部分检测各个类别的置信度或者评分。第二部分就是边界框的location。
相比YOLO,SSD在卷积特征后加了若干卷积层以减小特征空间大小, 并通过综合多层卷积层的检测结果以检测不同大小的目标。此外类似于Faster R-CNN的RPN,SSD使用3*3卷积取代了YOLO中的全连接层,以对不同大小和长宽比的锚盒进行来进行分类/回归。SSD取得了比YOLO更 快,接近Faster R-CNN的检测性能。
YOLOv3和SSD的区别:
a:Anchor的设置
YOLOv3和SSD都是基于预设Anchor,也就是在feature map每个像素位置都放置一定数量的参考boxes, 然后网络预测时不直接预测目标的坐标值,而是预测相对于这些Anchor的offset。最终根据预测的offset,在计算出真正的目标坐标值。这就会涉及几个问题:
–如何设置这些Anchor,它们的大小和数量
–如何定义一个box相对于Anchor的offset
–训练时过程中gt boxes是如何和Anchor做匹配,那些Anchor与gt boxes匹 配成正样本。
在YOLOv3上面涉及的问题都和SSD不一样。对Anchor有三个分支,每个分支是一样的。它放置Anchor是以feature map为中心,每个cell(每个cell就是特征图上的某个像素)放置3个不同大小的,以宽w 和高h来定义,而w和h不是随便确定的。是通过聚类的方式确定的。YOLO在每个尺度下选择了3个Anchor,但是有3个尺度,所以实际上是9 个Anchor。
而SSD处理方式是依靠数据分布人工确定。对于offset:
yolov3首先以中心点加w,h的方式描述(c_x,c_y,pw,ph)。对于网络输出的tx,ty,tw,th。其对应的真正的box坐标值转换如下:
可以看到box的中心值tx,ty是经过sigmoid函数的,也就是说预测的box的中心坐标始终是在该一个cell的范围内,不会超过该cell的范围。
而SSD是将tx,ty值分别乘以Anchor的宽高在cx,cy相加的,也就是SSD允许预测box在偏移到cell以后的位置。对于预测的宽和高的offset,tw=log(bw/pw),th=log(bh/ph),p是相对于Anchor的宽ph,高ph做了归一化,这样保证了预测的offset范围比较小,也有利于模型的收敛。
在YOLOv3中:一个box可以和多个Anchor进行匹配。如果有box在各个尺度feature map都找不到满足的匹配Anchor,那就退而求其次,在所有feature map的Anchor里寻找一个最大匹配就好
而SSD的的匹配过程是:分两个阶段,阶段一维每个gt box找IOU值最大的gt box匹配,阶段二对于Anchor与gt IOU大于0.5也进行匹配。
b: 损 失 函 数
YOLOv3损失分为三类。一类是关于bbox reg的损失,区别于SSD利用smooth L1计算,YOLO利用GIoU计算,而且在计算bbox reg损失时,SSD 的target是经过编码,即offset值,而YOLO计算损失(GIoU损失的方 式)是使用原图的坐标值来计算iou;第二类是关于Anchor预测的是背景还是目标的损失,也就是前面提高的置信度有关。第三类是分类损 失,这里的分类损失不是SSD中的交叉熵,而是多分类的sigmoid损失, 即每个类别单独的作二分类。
③、FPN
之前的方法都是取高层卷积特征,但由于高层特征会损失一些细节信息,FPN融合多层特征,以综合高层、低分辨率、强语义信息和底层、高分辨率、弱语义信息来增强网络对小目标的处理能力。此外,和通常用多层融合的结果做预测的方法不同,FPN在不同层独立进行预测。FPN既可以与基于候选区域的方法结合,也可以与基于直接回归的方法结合。FPN和Faster R-CNN结合后,在基本不增加原有模型计算量的情况下,大幅提高对小目标的检测性能。
④ 、 Retinanet
Retinanet认为,基于直接回归的方法性能通常不如基于候选区域方法的原因是,前者会面临极端的类别不平衡现象。基于候选区域的方法可以通过候选区域过滤掉大部分的背景区域,但基于直接回归的方法需要直接面对类别不平衡。因此,Retinanet通过改进经典的交叉熵损失以降低对已经分的号的样例的损失值,提出了焦点(focal)损失函数,以使模型训练时更加关注到困难的样例上。Retinanet取得了接近基于直接回归方法的速度,和超过基于候选区域的方法的性能。
(3)目标检测常用技巧
①、非最大抑制(non-max suppression,NMS)目标检测可能会出现的一个问题是,模型会对同一目标做出多次预测,得到多个包围盒。NMS旨在保留最接近真实包围盒的哪一个预测结果,而抑制其它的预测结果。NMS的做法是,首先对每个类别,NMS先统计每个预测结果输出的属于该类别概率,并将预测结果按该概率由高到低进行排序。其次, NMS认为对应概率很小的预测结果并没有找到目标,所以将其抑制。然后,NMS在剩余的预测结果中,找到对应概率最大的预测结果,将其输出,并抑制和该包围盒有很大的重叠(如IOU大于0.3)的其它包围盒。重复上一步骤,直到所有的预测结果均被处理。
②、在线苦难样例挖掘(online hard example mining,OHEM)目标检测的另一个问题就是类别不平衡,图像中大部分的区域是不包含目标的,而只有小部分区域包含目标,此外,不同目标的检测难度也有很大差异,绝大部分的目标很容易被检测到,而又一小部分目标却十分苦难。OHEM和Boosting的思路类似,其根据损失值将所有候选区域进行排序,并选择损失值很高的一部分候选区域进行优化,使网络更关注与图像中更苦难的目标。此外,为了避免宣导相互重叠的候选区域,OHEM对候选区域根据损失值进行NMS,
(三)、语义分割(semantic segmentation)
语义分割是目标检测更进阶的任务,目标检测只需要框处每个目标的包围盒,语义分割需要更进一步判断图像中那些像素属于那个目标。
①、语义分割基本思路:逐像素进行图像分类,将整张图像输入网络,使输出的空间大小和输入一致,通道数等于类别数,分别代表了各空间位置属于各类别的概率,即可以逐像素的进行分类。
②、全卷机网络+反卷积网络:为使得输出具有三维结构,全卷积网络中没有全连接层,只有卷积层和池化层。但是随着卷积核池化的进 行,图像通道数越来越大,而空间大小越来越小。要想使输出和输入有相同的空间大小,全卷积网络需要使用反卷积和反池化来增大空间大 小。
③、反卷积(deconvolution)/转置卷积(transposeconvolution)
标准卷积的滤波器在输入图像中进行滑动,每次和输入图像局部区域点乘得到一个输出,而反卷积的滤波器在输出图像中进行滑动,每个由一个输入神经元乘以滤波器得到一个输出局部区域,反卷积的前向过程和卷积的反向过程完成的是相同的数学运算。和标准卷积的滤波器一样,反卷积的滤波器也是从数据中学到的。
④、反最大池化(max-unpooling)
通常全卷机网络是对称的结构,在最大池化时需要记下最大值位置所处局部区域位置,在对反最大池化时将对应位置输出置为输入,其余位置补零。反最大池化可以弥补最大池化时丢失的空间信息。反最大池化的前向过程和最大池化的反向过程完成的是相同的数学运算。
⑤、常用技巧
扩张卷积(silated convolution)经常用于分割任务以增大有效感受野的一个技巧。标准卷积操作中每个输出神经元对应的输入局部区域是连续的,而扩张卷积对应的输入局部区域在空间位置上不连续。扩张卷积向标准卷积运算中引入了一个新的超参数扩张量(dilation),用于描述输入局部区域在空间位置上的间距。当扩张量为1时,扩张卷积退化为标准卷积。扩张卷积可以在参数量不变的情况下有效提高感受 野。
条件随机场(conditional random field,CRF)条件随机场是一种概率图模型,常被用于微修全卷积网络的输出结果,使细节信息更好。其动机是距离相近的像素、或像素值相近的像素更可能属于相同的类 别。
利用底层信息,综合利用底层结果可以弥补随着网络加深丢失的细节和边缘信息,利用方式可以是加和(FCN)火沿通道方向拼接(U-Net)
(四)实例分割(instance segmentation) 语义分割不区分属于相同类别的不同实例。
基本思路 目标检测+语义分割。先用目标检测方法将图像中的不同实例框出,再用语义分割方法在不同包围盒内进行逐像素标记。
①、Mask R-CNN 用FPN进行目标检测,并通过添加额外分支进行语义分割(额外分割分支和原检测分支不共享参数),即Mask R-CNN有三个输出分支(分类、坐标回归和分割)。此外,Mask R-CNN的其它改进有:a、改进了RoI池化,通过双线性插值使候选区域和卷积特征的对齐不因量化而损失信息b、在分割时,Mask R-CNN将判断类别和输出模板这个两个任务解耦合,用sigmoid配合对率(Logistic)损失函数对每个类别的模板单独处理。
(五)常见的架构:
1、 FCN
主要贡献:
①使端到端的卷积语义分割网络变得流行起来
②通过deconvolutional layers进行上采样
③通过skip connection改善了上采样的粗糙度概要:
①全卷积化(fully Convolutional):用于解决逐像素(pixel- wise)的预测问题。通过将基础网络最后面几个全连接层换成卷积层, 可以实现任意大小的图像输入,并且输出图像大小与输入相对应。
②反卷积(deconvolution):上采样操作,用于恢复图片尺寸,方便后续进行逐像素预测
③跳跃结构(ship architecture):用于融合高低层特征信息。通过跨层连接的结果,结合了网络浅层的细(fine-grain)粒度信息以及很层的粗糙(coarse)信息,以实现精准的分割任务。
2、Segnet 主要贡献:
使用Maxpooling indices来增强位置信息
FCN的upconvolution层+shortcut connections产生的分割图比较粗
糙,因此segNet增加了更多的shortcut connections。SegNet并不是直接将encode的特征进行直接复制,而是对maxpooling中的indices进行复 制 。 FCN和SegNet都是encoder-decoder架构 SegNet的benchmark表现差 3、Dilated convolution
创新点
① 使用空洞卷积用来进行稠密预测(dense prediction)
② 提出上下文模块(context module)使用空洞卷积(dilated convolutions)来进行多尺度信息的整合。
pooling操作可以增大感受野,对于图像分类任务来说这有很大好处, 但由于pooling操作降低了分辨率,这对语义分割来说很不利。因此作者提出一种叫做dilated convolution的操作来解决这个问题。dilated 卷积(在deeplab中称为atrous卷积)。可以很好地提升感受野的同时可以保持空间分辨率。
网络架构有两种,一种是前端网络,另外一种是前端网络+上下文模块,分别介绍如下:
将VGG网络的最后两个pooling层给拿掉了,之后的卷积层被dilated 卷积取代。并且在pool3和pool4之间空洞卷积的空洞率
=2,pool4之后的空洞卷积的空洞率=4。作者将这种架构称为前端
(front-end)。
除了前端网络之外,作者还设计了一种叫做上下文模块(context module)的架构,加在前端网络之后。上下文木块中级联了多种不同空洞率的空洞卷积,使得多尺度的上下文信息可以得到整合,从而改善前端网络预测的效果。需要注意的是前端网络和上下文木块是分开训练的,因为作者在实验中发现,如果是联合在一起进行端对端的训练并不能改善性能。
4、DeepLab(V1V2)
主要贡献
①使用atrous卷积,也就是后来的空洞卷积,扩大感受野,保持分辨率
②提出了atrous spatial pyramid pooling(ASPP),整合多尺度信息
③使用全连接条件随机场(fully connected CRF)进行后处理,改善分割结果
5、RefineNet 主要贡献
①:精心设计encoder-decoder架构中的decoder部分,使得性能提升。
②:整个网络的设计都遵循residual connections,网络表达能力更强,梯度更容易反向传播。
简要概述:
本文提出使用encoder-decoder架构。encoder部分是RESNET-101。decoder具有RefineNet blocks,它将此前的RefineNet blocks的低分辨率特征和encoder部分高分辨率特征进行concatenate/fuse。
6、PSPNet 主要贡献:
①使用pyramid pooling整合context
②使用auxiliary loss 概要:
骨架网络使用ResNet,并在此基础上加pyramid pooling module。该模块用到了很多kernel大小不一的pooling。将pooling的结果再进行上采样,经过concatenate进行融合。
在ResNet的第四阶段(即输入到金字塔池模块)之后,应用auxiliary loss。这种方法也被称为intermediate supervision。
AlexNet的参数和结构图: 卷积层:5层
全连接层:3层深度:8层
参数个数:60M
神经元个数:650k 分类数目:1000类
由于当时的显卡容量问题,AlexNet的60M个参数无法全部放在一张显卡上操作,所以采用了两张显卡分开操作的形式,其中在C3、R1、R2、R3 层上出现交互,所谓的交互就是通道的合并,是一种串接操作。
2、VGG
VGG给出一个结论:卷积神经网络的深度增加和小卷积核的使用对网络的最终分类识别效果有很大的作用。
11卷积核:降维,增加非线性
33卷积核:多个卷积核叠加,增加空间感受野,减少参数
Q1:为什么3个33卷积可以替代77的卷积
3个3*3的卷积,使用了3个非线性激活函数,增加了非线性表达能力,使得分割平面更具有可分性。
减少参数个数。对于C个通道的卷积核,77含有参数7²C²,3个33 的参数个数为33²C²,参数大大减少。
Q2:11卷积核的作用
在不影响感受野的情况下,增加模型的非线性
11卷积相当于线性变换,非线性激活函数起到非线性作用
Q3:网络深度对结果的影响:
XGG与GoogleNet模型都很深都采用了小卷积
VGG只采用33,而GoogleNet采用11、33、5*5,模型更加复杂
(模型开始采用了很大的卷积核,来降低后面卷积层的计算)
模型框架:
① 正则化方法:
a:增加了权重的正则化
b:对FC全连接层进行dropout正则化,dropout ratio = 0.5
② 初始化策略:
a:首先,随机初始化网络结构A(A的深度较浅)
b:利用A的网络参数,给其它的模型进行初始化(初始化前4层卷积
+全连接层,其他的层采用正态分布随机初始化,mean=0,var=10-2, biases=0
③ 训练输入:
采用随机裁剪的方式,获取固定大小224224的输入图像。并采用随机水平镜像和随机平移图像通道来丰富数据
Training image size:令S为图像的最小边,如果最小边S=224,则直接在图像上进行224224区域随机裁剪,这时相当于裁剪后的图像能够
几乎覆盖全部的图像信息,如果最小边S>>224, 那么做完224224区域随机裁剪后,每张裁剪图,只能覆盖原图的一小部分内容。
注:因为训练数据的输入为224224,从而图像的最小边S,不应该小于224
④ 数据生成方式:
首先对图像进行放缩变换,将图像的最小边缩放到S大小,然后:
方法1:在S=224和S=384的尺度下,对图像进行224224区域随机裁剪方法2:令S随机在[Smin,Smax]区间内值,放缩玩图像后,在进行随机裁剪(其中Smin=256,Smax=512)
⑤ 预测方式
a:multi-crop,即对图像进行多样本的随机裁剪,然后通过网络预测每一个样本的结构,最终对所有结果平均 b:dendely,利用FCN的思想,将原图直接送到网络进行预测,将最后的全连接层改为11的卷积,这样最后可以得出一个预测的score map,在对结果求平均。
3、GoogleLeNet
(1) Inception网络
获得高质量模型最保险的做法就是增加模型的深度(层数)或者其宽度
(层核或者神经元数) 但这里会出现如下缺陷:
① 参数太多,若数据集有限,容易过拟合
② 网络越大计算复杂度越大,难以应用
③ 网络越深,梯度越往后越容易消失,难以优化模型
解决上述缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连 接。为了打破网络对称性和提高学习能力,传统的网络都使用了随机稀疏连接。
(2) Inception模块介绍
Inception架构的主要思想是如何用密集成分来近似最优的局部稀疏结
对上图做以下说明:
① 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合
② 之所以卷积核大小采用11、33和55,主要是为了方便对齐,设定卷积步长stride=1之后,只要分别设定padding=0、1、2,采用same卷积可以得到相同维度的特征,然后将这些特征拼接一起
③ Inception嵌入pooling
④ 网络越到后面特征越抽象,且每个特征涉及的感受野也更大,随着层数的增加,33和5*5卷积的比例也要增加。
Inception的作用:代替人工确定卷积层中的过滤器类型或者确定是否需要创建卷积层和池化层,即:不需要认为的决定使用哪个过滤器,是否需要池化层的等,由网络自行决定这些参数,可以给网络添加所有可能值,将输出连接起来,网络自己学习它需要什么样的参数。
4 、 ResNet
ResNet 提出两种mapping:一张是identity mapping,指的是下图中弯弯的曲线,另一种residual mapping,指的是处除了弯弯曲线的部分, 所以最后的输出是y=F(x)+x。
identity mapping顾名思义,就是指本身,也就是公式中的x,而residual mapping指的是差,也就是y-x,所以残差指的就是F(x)部分。
真正使用ResNet模块不是那么单一,在论文中提到了两种方式:
左图ResNet34,右图ResNet50/101/152,一般称整个结构为一个building block,右图又称为bottleneck design,目的是为了降低参数的数目,第一个11的卷积是把256维channel降到64维,然后在最后通过11卷积恢复。
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量。
5 、 Xception
Xception是Google继Inception后提出的对Inception v3的另一种改进,主要是采用depthwise separable Convolution来替换原来的Inception v3的卷积操作
6、DenseNet
文章从feature入手,通过对feature的极致利用达到更好的效果和更少的参数。
优点:
①减轻了vanishing-gradient(梯度消失)
②加强了feature的传递
③更有效的利用了feature
④一定程度上减少了参数数量
enseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,后面有提到在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有 效,网络也就更加容易训练。原文的一句话非常喜欢:Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.直接解释了为什么这个网络的效果会很好。前面提到过梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题。
三、卷积
见https://blog.csdn.net/weixin_43218120/article/details/111028555 卷积部分
四、正则化
1、batch normalization、group normalization
(1)为什么需要Normalization
在机器学习中,在把数据喂给机器学习模型之前,“白化”是一个重要的数据预处理步骤,白化一般有两个目的:
①去除特征之间的相关性–独立
②使得所有特征具有相同的均值和方法–同分布白化最典型的方法就是PCA
(2)深度学习中的Internal Convariate Shift
Internal Convariate Shift是:深度神经网络涉及到很多层的叠加, 而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。
ICS会导致,每个神经元的输入数据不再是“独立同分布”
①上层参数需要不断适应新的输入数据分布,降低学习速度。
②下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止
③每层的更新会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
Normalization通用公式:
其规范化针对单个神经元进行,利用网络训练时一个mini-batch的数据来计算该神经元xi的均值和方差,因而称为Batch Normalization。
其中M是mini-batch的大小
按照上图所示,相对于一层神经元的水平排列,BN可以看做一种纵向的规范化。由于BN是针对单个维度定义的,因此标准公式中的计算均为element-wise的。
BN独立地规范化每一个输入维度xi,但规范化的参数是一个mini-batch 的一阶统计量和二阶统计量。这就要求每一个mini-batch的统计量是整体统计量的近似估计,或者说每一个mini-batch彼此之间,以及和整体数据,都是近似分布的。分布差距较小的mini-batch可以看做是为规范化操作和模型训练引入噪声,可以增加模型的鲁棒性,但如果每个min-
batch的原始分布差别很大,那么不同mini-batch的数据将会进行不一样的数据变换,这就增加了模型训练的难度。
因此,BN比较适用的场景是:mini-batch比较大,数据分布比较接近。在进行训练之前要做好充分的shuffle,否则效果会差很多。
另外,由于BN需要在运行过程中统计每个mini-batch的一阶动量和二阶动量,因此不适用于动态的网络结构和RNN网络。
(4) Layer Normalization–横向规范化
层规范化就是针对BN的上述不足而提出的。与BN不同,LN是一种横向的规范化。它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
其中i枚举了该层所有的输入神经元。
LN针对单个训练样本进行,不依赖其它数据,因此可以避免BN中受mini-batch数据分布影响的问题,可以用于小mini-batch场景、动态网络场景和RNN,特别是自然语言处理。此外LN不需要保存mini-batch的均值和方差,节省额外的存储空间。
2 、 dropout
dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
3、L1、L2
L1、L2正则化可以看做是损失函数的惩罚项,所谓的惩罚是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型叫Lasso回归,使用L2正则化的模型叫Ridge(岭回归)。 L1正则化是指权值向量w中各个元素的绝对值之和
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选 择 L2正则化是指权值向量w中各个元素的平方和然后再求平方根。 L2正则化可以防止模型过拟合,一定程度上,L1也可以防止过拟合。
五、全卷积网络(Fully Convolutional Network)
1、CNN与FCN比较
CNN:在传统的CNN网络中,在最后的卷积层之后会连接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。一般的CNN结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率。如ALexNet网络最后输出一个1000维的向量表示输入图像属于每一类的概率。
在CNN中,猫的图像输入到ALexNet,得到一个输出1000的输出向量,表示输入图像属于每一类的概率,其中在“tabby cat”这一类统计概率最高,用来做分类任务。
FCN:FCN是对图像进行像素级的分类(也就是每个像素点都进行分类),从而解决了语义级别的图像分割问题。与上面介绍的经典CNN在卷积层使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的特征图进行上采样,使他恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。
FCN与CNN的区别就是FCN把CNN最后的全连接层换成卷积层,其输出的是一张已经标记好的图,而不是一个概率值。
2、FCN上采样
2.1 双线性插值上采样
单线性插值(一个方向上)就是知道两个点的值,并将两点连成一条直线,来确定中间的点的值,假设,现在有两点(x1,y1)、(x2,y2)
连成一条直线,[x1,x2]中的点就可以用线上的点表示。双线性插值
(两个方向上)是一个三维的坐标系,因此,需要找到四个点来确定中心点坐标。如下图:
假如想得到未知函数f在点P=(x,y)的值,假设已知函数f在 Q11=(x1,y1)、Q12=(x1,y2)、Q21=(x2,y1)以及Q22=(x2,y2)四个点的 值。最常见的情况,f就是一个像素点的像素值。首先在x方向进行线性插值,得到:
由于图像双线性插值只会用相邻的四个点,四次上述公式的分母都是
1.opencv中的源码如下,用了一些优化手段,比如用整数计算替代float(下面大妈中的2048就是变11位小数为整数,最后有两个连乘, 因此>>22位)以及源图像和目标图像几何中心的对齐:
SrcX=(dstX+0.5) (srcWidth/dstWidth) -0.5 SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5,
重点:原图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设需要将一幅55的图像缩小成33,那么源图像和目标图像各个像素之间的对应关系如下。如果没有这个中心对齐,会得到左边的结果,使用对齐,会得到右边的结果。
2.2 反卷积上采样
怎样上采样:普通的卷积操作,会使得分辨率降低,如下图33的卷积核去卷积44得到2*2的输出。
上采样的过程也是卷积,那怎么会得到分辨率提高?之前有卷积时有个保持输出与输入同分辨率的方法就是周围补0.
其实上面这种补0的方法是有问题的,只在四周补0会导致最边上的信息不太好,那我们把这个信息平均下,在每个像素与像素之间补0.
2.3 反池化上采样
反池化可以用下图来理解,在池化时需要记录池化的位置,反池化时把池化的位置直接还原,其他位置填0.
上面三种方法各有优缺,双线性插值方法实现简单,无需训练,反间计上采样需要训练,但能更好的还原特征图
3、FCN具体实现过程
FCN与CNN的核心区别就是FCN将CNN末尾的全连接层转化成了卷积层:以
AlexNet为例,输入是2272273的图像,前5层是卷积层,第5层的输出是256个特征图,大小是66,即66256,第6,7,8层分别是4096、 4096、1000的一维向量。
如下图:
在FCN中第6、7、8层都是通过卷积得到的,卷积核的大小全部是1*1,
经过多次卷积后,图像的分辨率越来越低,为了从低分辨率的热图heatmap恢复到原图大小,以便对原图上每一个像素点进行分类预测, 需要对热图heatmap进行反卷积,也就是上采样。论文中首先进行了一个上池化操作,在进行反卷积(上述所提到的尚持华操作和反卷积操作,其实可以理解为上卷积操作)使得图像分辨率提高到原图大小。
跳级(strip)结构对第5层的输出执行32倍的反卷积得到原图。得到的结果不是很精确,论文中同时执行了第4层和第3层输出的反卷积操作(分别需要16被和8倍的上采样),再把这3个反卷积的结果图像融合, 提升了结果的精确度。
最后像素的分类按照该点在1000张上采样得到的图上的最大的概率来 定。FCN可以接受任意大小的输入图像,但是FCN的分类结果还是不够精细,对细节不太敏感,再者没有考虑到像素与像素之间的关联关系,丢失了部分空间信息。
4、FCN模型总结
FCN的卷积网络部分可以采用VGG、Google Net、AlexNet等作为前置基础网络,在这些的预训练基础上进行迁移学习与finetuning,对反卷积的结果跟对应的正向feature map进行叠加输出(这样做的目的是得到更加准确的像素级别分割),根据上采样的倍数不一样分为FCN-8s、FCN-16s、FCN-32s、
详情:
对原图进行卷积conv1、pool1后图像缩小为1/2
之后对图像进行第二次conv2、pool2后图像缩小为1/4
继续对图像进行第三次conv3、pool3缩小为原图的1/8此时保留pool3的featureMap
继续对图像进行第四次conv4、pool4缩小为原图的1/16此时保留pool4 的featureMap
最后对图像进行第五层卷积操作conv5、pool5,缩小为1/32
然后把原来CNN操作中 的全连接变成卷积操作conv6、conv7,图像的
fetureMap数量改变但是图像大小依然为原图的1/32,此时图像不再叫fetureMap而是叫heatMap。
六、11 卷积核
卷积核:可以看做是对某个局部的加权求和,它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整 体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有11、33和55的尺寸
卷积核的个数就对应输出的通道数(channels),对于输入的每个通道,输出每个通道上的卷积核是不一样的。
池化:卷积特征往往对应某个局部的特征。要得到global的特征需要将全局的特征执行一个aggregation(聚合)。池化就是这样一个操作, 对于每个卷积通道,将更大尺寸(甚至是global)上的卷积特征进行pooling就可以得到更有全局性的特征。这里的pooling就对应cross region。
与11卷积相对应,11卷积可以看作一个cross channel的pooling操作。pooling的另外一个作用就是升维或降维。
11卷积核,又称为网中网(Network in Network)
当输入为6632时,11卷积的形式是1132,当只有一个11卷积核的时候,此时输出的为661.现在就可以看到11的实质作用降维。当1*1 卷积核的个数小于输入channels数量时,即降维。
11卷积一般只改变输出通道数(channels),而不改变输出的宽度和高度。
2、11 卷积核作用降维/升维
增加非线性
1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。
一个filter对应卷积后得到一个feature map,不同的filter(不同的weight和bias),卷积以后得到不同的feature map,提取不同的特征,得到对应的specialized neuron。
跨通道信息交互(channel的交换)
使用11卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,33,64channel的卷积核后面添加一个11,28channels的卷积核,就变成了33,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。
七、感受野
感受野指的是一个特定的CNN特征(特征图上的某个点)在输入空间所受影响的区域。一个感受野可以用中心位置(center location)和大小(size)来表征。然而,对于一个CNN特征来说,感受野中的每个像素值(pixel)并不是同等重要,一个像素点越接近感受野中心,它对输出特征的计算所起作用越大。这意味着某一个特征不仅仅是受限在输入图片中某个特定的区域(感受野),并且呈指数聚焦在区域的中心。
八、常见损失函数
见https://blog.csdn.net/weixin_43218120/article/details/111028555损失函数部分
九、优化算法
深度学习优化算法经历了SGD->SGDM->NAG->AdaGrad->AdaDelta->Adam->Nadam
首先定义:待优化参数:w,目标函数f(w),初始化学习率a 而后,开始进行迭代优化。在每个epoch t:
1、计算目标函数关于当前参数的梯度:
4、根据下降梯度进行更新:
在步骤3、4中对于各个算法都是一直的,主要的差别就体现在1、2上SGD
SGD没有动量的概念,也就是说:
带入步骤3可以看到下降梯度就是最简单的
SGD最大的缺点就是下降速度慢,而且可能会在沟壑的两边持续震荡, 停留在一个局部最优点。
SGD with Momentum
为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,就利用惯性跑得快一些。SGDM全称是SGD withmomentum,在SGD的基础上引入了一阶动量:
一阶动量是各个时刻梯度方向的指数移动平均值,约等于最近
个时刻的梯度向量和的平均值。也就是说,t时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定。β1的经验值为0.9,这就意味着香江方向主要是此前累积的下降方向,并略微偏向当前时刻的下降方向。
SGD with Nesterov Acceleration
SGD还有一个问题就是困在局部最优的沟壑里面震荡。
NAG全称Nesterov Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于步骤1,我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。因此,NAG 在步骤1,不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,那个时候的下降方向:
然后用下一个点的梯度方向,与历史累积动量相结合,计算步骤2中当前时刻的累积动量。
AdaGrad
二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来,
SGD及其变种以同样的学习率更新每个参数,但深度神经网络往往包含大量的参数,这些参数并不是总会用得到。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些,对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。
怎么去度量历史更新频率呢?那就是二阶动量–该维度上,迄今为止所有梯度值的平方和。
在步骤3中的下降梯度:
可以看出,此时实质上的学习率a变成了
一般为了避免分母为0,会在分母上加一个小的平滑项。因此分母是恒大于0的,而且参数更新越频繁,二阶动量越大,学习率越小、
这一方法在稀疏数据场景下表现的非常好。但也存在一些问题:因为分母是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。
AdaDelta/RMSProp
由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。
修改的思路很简单,指数移动平均值大约就是过去一段时间的平均值, 因此我们用这一方法来计算二阶累积动量:
这就避免了二阶动量持续累积、导致训练过程提前结束的问题。
Adam
Adam和Nadam是上述方法的集大成者。SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来就是Adam—Adaptive + Momentum
SGD的一阶动量:
加上AdaDelta的二阶动量:
优化算法里最常见的两个超参数β1,β2,就都在这里,前者控制一阶动量,后者控制二阶动量。
优化算法常用tricks:
①、各大算法孰优孰劣并无定论。如果是刚入门,优先考虑SGD+Nesterov Momentum或者Adam
②、选择熟悉的算法–这样可以更加熟练的利用经验进行调参
③、充分了解数据–如果模型是非常稀疏的,那么优先考虑自适应学习率的算法。
④、根据需求来选择–在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam进行快速实验优化,在模型上线或者结果发布之前, 可以使用精调SGD进行模型的极致优化。
⑤、先用小数据集进行实现–随机梯度下降算法的收敛速度和数据集的大小的关系不大。因此可以先用一个具有代表性的小数据集进行实验, 测试一下最好的优化算法,并通过参数搜索来寻找最优的训练参数。
⑥、考虑不同算法的组合–先用Adam进行快速下降,然后再换到SGD进行充分调优。
⑦、数据集要充分的打散(shuffle) – 这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。
⑧、训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况,对训练数据的监控是要保证模型进行了充分的训练–下降方向正确,且学习率足够高,对验证数据的监控是为了避免出现过拟合。
⑨、制定一个合适的学习率衰减策略。可以使用定期衰减策略,比如每过多少个epoch就衰减一次,或者利用精度或者AUC等性能指标来监控, 当测试集上的指标不变或者下跌时,就降低学习率。
十、concat和add的区别
在各个网络模型中,ResNet,FPN等采用的element-wise add来融合特征,而DenseNet等则采用Concat来融合特征。
Concat是通道数的增加;add是特征图相加,通道数不变
add是描述图像的特征下的信息量增多,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。
而Concat是通道数的合并,也就是说描述图像本身的特征数(通道数) 增加了,而每一特征下的信息是没有增加的。
Concat每个通道对应着对应的卷积核。而add形式则将对应的特征图相加,在进行下一步卷积操作,相当于加了一个先验:对应通道的特征图语义类似,从而对应的特征图共享一个卷积核(对于两路输入来说,如果是通道数相同且后面带卷积的话,add等价于Concat之后对应通道共享同一个卷积核)。
因此add可以认为是特殊的Concat形式。但是add的计算量要比Concat的计算量小得多。
add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类时有益的。而Concat是通道数的合并,也就是说描述图像本身的特征增加了,而每一特征下的信息是没有增加。
十一、注意力机制
在机器翻译(Machine Translation)或者自然语言处理(Nature Language Processing)领域,以前都是使用数理统计的方法进行分析和处理。
注意力机制本质上是为了模仿人嘞观察物品的方式。通常来说,人们在看一张图片的时候,除了从整体把握一幅图片之外,也会更加关注图片的某个局部信息。在翻译领域,每次人们翻译一段话的时候,通常都是从句子入手,但是在阅读整个句子的时候,肯定就需要关注词语本身的信息,以及词语前后关系的信息和上下文的信息。在自然语言处理方 向,如果要进行情感分类的话,在某个句子里面,肯定你那个会涉及到表达情感的词语,包括但不限于“高兴”,“沮丧”“开心”等关键 词。而这些句子里面的其它词语,则是上下文关系,并不是他们没有 用,而是它们所起到的作用没有那些表达情感的关键词大。
在以上描述下,注意力机制其实包含两个部分:
1、注意力机制需要决定整段输入的哪个部分需要更加关注
2、从关键的部分进行特征提取,得到重要的信息。
机器翻译、自然语言处理、计算机视觉领域的注意力机制的区别:
1、在机器翻译领域,翻译人员需要把已有的一句话翻译成另一种语言的一句话。例如,把一句话从英文翻译到中文,把中文翻译到法语。在这种情况下,输入语言和输出语言的词语之间的先后顺序其实是相对固定的,是具有一定的语法规则的。
2、在视频分类或者情感识别领域,视频的先后顺序是由时间戳和相应的片段组成的,输入的就是一段视频里面的关键片段,也就是一系列具有先后顺序的图片的组合。NLP中的情感识别问题也是一样,语言本身就具有先后顺序的特点。
3、图像识别,物体检测领域与前面两个有本质的不同。因为物体检测其实是在一幅图里面挖掘出必要的物体结构或者位置信息,在这种情况下,它的输入就是一幅图,并没有非常明显的先后顺序,而且从人脑的角度来看,由于个体的差异性,很难找到一个同一的观察图片的方法。由于每个人都有着自己观察的先后顺序,因此很难同一成一个整体。 在这种情况下,机器翻译和自然语言处理领域使用基于RNN的Attention 机制就变得相对自然,而计算机视觉领域则需要必要的改造才能够使用
Attention机制。
基于RNN的注意力机制
通常来说,RNN等深度神经网络可以进行端到端的训练和预测,在机器翻译领域或者文本识别领域有着独特的优势。对于端到端的RNN来说, 有一个更简洁的名字叫做sequence to sequence,简写就是seq2seq。顾名思义,输入层是一句话,输出层是另外一句话,中间层包括解码和编码两个步骤。
而基于RNN的注意力机制指的是,对于seq2seq的诸多问题,在输入层和输出层之间,也就是词语和词语之间,存在着某种隐含的联系。在这种
情况下,每次进行机器翻译的时候,模型需要了解当前更加关注某个词语或者几个词语,只有这样才能够在整句话中进行必要的提炼。在这些初步的思考下,基于RNN的Attention机制就是:
1、建立一个编码(Encoder)和解码(Decoder)的非线性模型,神经网络的参数足够多,能够存储足够的信息。
2、除了关注句子的整体信息之外,每次翻译下一词语的时候,需要对不同的词语赋予不同的权重,在这种情况下,在解码的时候,就可以同时考虑到整体的信息和局部的信息。
注意力机制的种类
注意力机制有两种方法,一种是基于强化学习(Reinforcement
Learning)来做的,另外一种是基于梯度下降(Gradient Decent)来做的。强化学习的机制是通过收益函数(Reward)来激励,让模型更加关注到某个局部的细节。梯度下降法是通过目标函数以及相应的优化函数来做的。
计算机视觉领域的Attention部分论文:
Look Closer to See Better:Recurrent Attention Convolutional Neural Network for Fine-grained Image Recognition
在这篇文章里面,作者提出了一个基于CNN的注意力机制,叫做recurrent attention convolutional neural network(RA-CNN),该模型递归地分析局部信息,从局部的信息中提取必要的特征,同时,在RA-CNN中的子网络(sub-network)中存在分类结构。除此之外,还引入了attention机制,让整个网络结构不仅关注整体信息,还关注局部信息,就是所谓的Attention Proposal Sub-Network(APN)。这个APN 结构是从整个图片(full-image)出发,迭代式地生成子区域,并且对这些子区域进行必要的预测,并将子区域所得到的预测结果进行必要的整个,从而得到整张图片的分类预测概率。
十二、卷积神经网络(CNN)、循环神经网络(RNN)、深度神经网络
(DNN)
神经网络早期是感知机,拥有输入层、输出层和隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。之后就是多层感知机,使用sigmoid或tanh等连续函数模拟神经元对激励的响应,在训练算法上使用BP算法,这就是现在所说的神经网络NN。
多层感知机给我们带来了一个启示就是,神经网络的层数直接决定了它对现实的刻画能力–利用每层更少的神经元你和更加复杂的函数。
为了克服梯度消失问题,ReLU、maxout等传输函数代替了sigmoid,形成了如今的DNN的基本形式,单从结构上来说,全连接的DNN和多层感知机是没有区别的。
之后的高速公路网络(highway network)和深度残差学习(deep residual learning)进一步避免了梯度消失。
如上图所示,全连接DNN的结构里下层神经元和所有上层神经元都能够形成连接,带来的潜在问题是参数数量的膨胀。
对于CNN来说,并不是所有上下层神经元都能直接相连,而是通过卷积核作为中介。同一个卷积核在所有图像内是共享的,图像通过卷积操作后仍然保留原先的位置关系。
十三、边框回归
1、边框回归是什么?
对于窗口一般使用四维向量(x,y,w,h)来表示,分别表示窗口的中心点坐标和宽高。对于下图,红色的框P代表原始的Proposal,绿色框G 代表目标的Ground Truth,我们的目标时寻找一种关系使得输入原始的窗口P经过映射得到一个跟真实窗口G更接近的回归窗口g……
https://blog.csdn.net/zijin0802034/article/details/77685438
十四、非极大值回归(NMS、Soft NMS) 见
https://blog.csdn.net/weixin_43218120/article/details/109219131 十五、激活函数
见https://blog.csdn.net/weixin_43218120/article/details/109332510 十六、评价指标
见其它
十七、batch size的选择
十八、Graph Convolutional Network(GCN) 离散卷积本质就是一种加权求和
CNN中的卷积的本质上就是利用一个共享参数的过滤器(kernel),通过计算中心像素点以及相邻像素点的加权和来构成feature map实现空间特征提取,加权系数就是卷积核的权重系数。
卷积核的系数确定是随机初始化初值,然后根据误差函数通过反向传播梯度下降进行迭代优化。卷积核的参数通过优化求出才能实现特征提取的作用,GCN的理论很大一部分工作就是为了引入可以优化的卷积参
数。
1、GCN中的Graph指什么?为什么要研究GCN?
CNN是computer Vision里的法宝,可以有效的提取空间特征,CNN处理的图像或者视频数据中像素点(pixel)是排列成很整齐的矩阵。
Graph ConvolutionalNetwork中的Graph是指数学(图论)中的用定点和边简历相应关系的拓扑图。
为何要研究GCN?
①CNN无法处理Non Euclidean Structure的数据,学术上表达的是传统的离散卷积。在Non Euclidean Structure的数据上无法保持平移不变性,通俗理解就是在拓扑图中每个定点的相邻定点数目都可能不同,那么当然无法用一个同样尺寸的卷积核来进行卷积计算。
②由于CNN无法处理Non Euclidean Structure的数据,有希望在这样的数据结构(拓扑图)上有效地提取空间特征来进行机器学习,所以GCN 称为了研究重点。
③广义上来讲任何数据在赋范空间内都可以建立拓扑关联,谱聚类就是应用了这样的思想。所以说拓扑连接是一种广义的数据结构,GCN有很大的应用空间。
2、提取拓扑图空间特征的两种方式
GCN的本质目的是用来提取拓扑图的空间特征,那么实现这个目标只有Graph convolution 这一个途径吗?当然不是,在vertex domain(speatial domain)和soectrak domain实现目标时两种最主流的方式。
①vertex domain(spatial domain)是非常直观的一种方式。提取拓扑图上的空间特征,那么就把每个定点相邻的neighbors找出来。
②spectral domain是GCN的理论基础。这种思路就是希望借助图谱的理论来实现拓扑图上的卷积操作。从整个研究的时间进程来看:首先研究GSP(Graph signal processing)的学者定义了Graph上的Fourier
Transformation,进而定义了Graph上的convolution,最后与深度学习结合提出了Graph Convolutional network。
Spectral Graph theory就是借助图的拉普拉斯矩阵的特征值和特征向量来研究图的性质。
3、什么是拉普拉斯矩阵?为什么GCN要用拉普拉斯矩阵?
Graph Fourier Transformation以及Graph Convolution 的定义都用到图的拉普拉斯矩阵。https://www.zhihu.com/question/54504471/answer/332657604
具体见上
十九、深度学习中的梯度消失、爆炸原因及其解决方法
(1)为什么要使用梯度更新规则
造成梯度消失的根源–深度神经网络和反向传播。目前深度学习方法 中,深度神经网络的发展造就了我们可以构建更深层的网络完成更复杂的任务,深层网络比如深度卷积网络,LSTM等,最终表明,在处理复杂任务上,深度网络比浅层网络具有更好的效果。但,目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度
反向传播的方式,指导深度网络权值的更新优化。这么做的原因是:深层网络由许多非线性层堆叠而来,每一层非线性层都可以看做一个非线性函数F(x)(非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数
最终的目的是希望这个多元函数可以很好的完成输入到输出之间的映 射,假设不同的输入,输出的最优解是g(x),那么优化深度网络就是为了寻找到合适的权值,满足
取得极小值点。
(2)梯度消失、爆炸
梯度消失与爆炸其实是一种情况,两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。
从深层网络角度来说,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练。
(3)梯度消失、爆炸的解决方案
梯度消失爆炸的解决方案主要包括以下几个部分:
1、预训练加微调
Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想就是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入, 而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training)在预训练完成后,在对整个网络进行“微
调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Network)中,使用了这个方法,在各层预训练完成后,再利用BP算法
对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用不多了。
2、梯度剪切、权重正则(针对梯度爆炸)
梯度剪切这个方案主要是针对梯度爆炸这一问题,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
注:在WGAN中也有梯度裁剪限制操作,但是和这个是不一样的,WGAN限制梯度更新信息是为了保证lipchitz条件。
另一种解决梯度爆炸的手段是采用权重正则化(weithts
regularization)比较常见的是L1正则和L2正则。
正则化是通过对网络权重做正则限制过拟合。下图是正则项在损失函数的形式
其中,a是指正则项系数,因此,如果发生恒梯度爆炸,权值的范数就会变得非常大,通过正则化项,可以部分限制梯度爆炸的发生。
注:事实上,在深度神经网络中,往往梯度消失出现的更多一些。
3、使用不同的激活函数
ReLu:思想很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题,每层的网络都可以得到相同的更新速度。
relu主要贡献在于:
解决了梯度消失、爆炸的额问题计算方便,计算速度快
加速了网络的训练缺点:
由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
输出不是以0为中心leakrelu
leakrelu就是为了解决relu的0区间带来的影响
该函数解决了0区间带来的影响,而且包含了relu的所有优点、elu
elu激活函数也是为了解决relu的0区间带来的影响
4、使用batchnorm
Batchnorm目前已经被广泛应用到各大网络中,具有加速网络收敛速 度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中
的梯度问题。Batchnorm全名是batch normalization简称BN,即批规范化,通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。
在解决反向传播的过程中,经过每一层的梯度会乘以该层的权重,举个简单的例子:正向传播中
反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸, Batchnorm就是通过每一层的输出做scale和shift的方法,通过一定的规范化手段,把没成神经网络任意神经元这个输入值的分布强行拉回到接近均值为0方差为1的标准正态分布,即严重偏离的分布强制拉回比较标准的分布,这样是得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,使得让梯度变 大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
5、使用残差结构
残差结构单元如下:
相比较于以前网络的直来直去的结构,残差中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处
式子的第一个因子表示的损失函数达到L的梯度,小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全
为-1,而且就算比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。
6、使用LSTM
二十、网络权重初始化二十一、其它 1、AP和mAP
AP:AP表示Recall从0-1的平均精度值。eg:当Recall=0.1时, Precision=y1; Recall=0.2时,Precision=y2;…;Recall=1.0时,Precision=yn。那么可以以Recall为横轴,Precision为纵轴画一条曲线,曲线下的面积 就 是 AP 。 mAP:mAP表示多个物体类别上的平均AP。mAP有两次平均,一次在Recall取不同值时平均,一次在类别上平均。
(1)AP相关概念
①、Ground Truth
对于任何算法,评估指标需要知道ground Truth(真实标签)数据。对于目标检测问题,ground Truth包括图像中物体的类别以及该图像中每个物体的真实边界框。
②、Accuracy:准确率
准确率=预测正确的样本数/所有样本数,即预测正确的样本比例(包括预测正确的正样本和预测正确的负样本,不过在目标检测领域,没有预测正确的负样本说法,所以目标检测里面没有使用Accuracy的)计算公式如下:
③ 、 Precision: 查 准 率
Precision的计算容易和Accuracy弄混,Precision表示某一类样本预测有多准。比如说,模型预测出100个病患,可是实际上这里面有80个是病患,那么Precision就是80%。即,查准的几率是80%。注意:
Precision针对的是某一类样本,如果没有说明类别,那么Precision是毫无意义的(有些地方不说明类别,直接说Precision,是因为二分类问题通常说的Precision都是正样本的Precision)。Accuracy则针对的是所有类别的样本。
④ 、 Recall: 召 回 率
Recall和Precision一样,脱离类别是没有意义的。说到Recall,一定指的是某个类别的Recall。Recall表示某一类样本,预测正确的与所有Ground Truth的比例。比如说,某批数据有100个人为患者,可是模型只预测出80个人为患者,那么被召回医院就诊的比例就是80%,即Recall是80%。仔细和Precision的计算方法对比就可以发现,Recall和
Precision计算中的分子都是一样的,但是Recall计算的时候,分母是Ground Truth中某一类样本的数量,而Precision计算的时候,是预测出来的某一类样本。
⑤、IOU
IOU是预测框和ground Truth的交集和并集的比值。这个量也被称为Jaccard指数
⑥、AP
以Recall为横轴,Precision为纵轴,就可以画出一条PR曲线如下(实际计算时,当Precision下降到一定程度时,后面就直接默认为0,不算了。)
⑦、mAP
在比较mAP值时,需要注意以下几点:
a:mAP通常是在一个数据集上计算得到的。
b:虽然解释模型输出的绝对量化并不容易,但mAP作为一个相对较好的度量指标可以帮助我们。当我们在流行的公共数据集上计算这个度量时,该度量可以很容易地用来比较目标检测问题的新旧方法。 c:根据训练数据中各个类的分布情况,mAP值可能在某些类(具有良好的训练数据)非常高,而其它类(具有较少/不良数据)却比较低。所以你的mAP可能是中等的,
2、RoI Pooling 和RoI Align区别
① 基本概念RoI
RoI(Region of Interest)是通过不通区域选择方法,从原始图像
(origin image)得到的候选区域(proposal region)
RoI只是为了进一步处理而产生的的候选区域,RoI并不等价于Bounding box
Bounding box 指的是检测目标的边界矩形框。量化:
量化(quatization)是指将输入从连续值(或大量可能的离散取值) 采样为有限多个离散值的过程。也可以理解为,将输入数据集(如实数)约束到离散集(如整数)的过程。
RoI Pooling和RoI Align的作用:
RoI Pooling 对于任意大小的图像输入,总能产生固定大小的输出RoI Pooling原理:
RoI Pooling在Fast RCNN中被首次提出
RoI Pooling直接从feature map里截取各个兴趣区域(Region of Interest,RoI),并换为相同大小的feature输出。
RoI Pooling = crop feature + resize feature
通过上个图可以得到,RoI Pooling的作用本质上是为了将不同尺寸的RoI特征转换为相同的特征输出,保证特征图展开(flatten)后具有相同的大小尺寸,能够与下层的全连接层连接,分别执行先兴奋了你
(linear classifier)和边框回归(Bounding box regression) 执行步骤:
①前置条件
对于输入图片,通过候选区域方法得到固定大小数量(Faster RCNN中为256)的候选区域坐标。
将整个输入图片送入基网络(如vgg,ResNet)提取图片的特征(Fasr
RCNN中为vgg网络的conv5层特征)
下面以输出目标特征图尺寸为22512进行说明: a:对齐到网格单元(snap to grid cell)
首先将一个浮点数RoI量化为特征映射的离散粒度。表现为RoI对应的特征图的与原始特征的网格单元对齐(这里是第一次量化操作)。
下图绿色框为RoI对应的实际区域(由于经过特征尺度变换,导致RoI的坐标可能会落到特征图的单元之间),蓝色框代表量化(网格对齐)后的RoI所对应的特征图(得到到量化特征图尺寸57512)
b:划分网格为子区域(bin)
粗略的将网格分为HW(Fast RCNN中设为77)个子网格区域。将上一步得到的量化RoI特征进一步细分为量化的空间单元(bin),这里进行了第二次量化操作。
为了得到输出的特征图为22512,这里的量化操作就是将上一步的得到量化特征图划分为2*2个特征单元,如果无法通过直接均分得到量化的子区域,通过分别采取向上取整(ceil)和向下取整(floor)得到对应的单元尺寸大小。
c:最大池化操作
在每一个子区域执行聚合操作得到单元的特征值(一般是最大池化)对上一步得到22个子区域分别做最大池化操作,得到22*512的目标特征图
执行结果
通过RoI Pooling ,对于具有不同特征大小的输入区域,都可以得到相同大小输出特征。
缺点:
每一次量化操作都会对应轻微的区域特征错位(misaligned),这些量化操作在RoI和提取到的特征之间引入偏差。这些量化可能不会影响分类任务,但对预测像素精度掩模有很大的负面影响
RoI Align
下面以输出目标特征图尺寸为22512进行说明:
遍历候选每个候选区域,保持浮点数边界不做量化(不对齐网格单
元);同时平均分网格分为HW(这里为22)个子网格区域,每个单元的边界也不做量化。
对于每个区域选择4个规则采样点(分别对应将区域进一步平均分为四个区域,取每个子区域的中点)。
利用双线性插值计算得到四个采样点的像素大小,下图为一个规则采样点所对应的临近区域示意图。
利用最大池化(max Pooling)或平均池化(average pooling)分别对每个子区域执行聚合操作,得到最终的特征图。
执行结果:
通过RoI Align,对于具有不同特征大小的输入区域,都可以得到相同大小输出的特征。