1. > 智能数码 >

resnet详解(resnet参数)

超越yolov3,Centernet 原理详解(object as points)

ariXiv:

github:

摘要:目标检测要求作出包含物体的最小矩形框。大多数成功的目标检测器罗列出大量的候选框并对其分类。 这是浪费资源的,而且低效,还需要后续的处理。在这篇文章中,我们提出了一种新的方法。 我们将要检测的目标定位到一个点 --- 即检测矩形框的中心点。 我们的检测器通过热力图寻找中心点然后回归目标的其他属性,比如大小, 3D 位置坐标, 方向, 甚至姿态。 我们的基于中心点的检测网络 CenterNet, 是一个端到端的独特的, 简单而快速的目标检测器, 而且比一些基于锚框的检测器更加准确。 CenterNet 在MS COCO 数据集上在速度与准确率方面取得了最好的平衡, 142 FPS时有28.1% AP , 52 FPS时有37.4% AP, 多尺度测试时可以达到45.1% AP和 1.4 FPS。我们用同样的方法在KITTI 基准上去估计3D坐标 ,在 COCO 关键点数据集上估计人体姿态。当与其他复杂的多阶段的方法比较时我们的方法表现出巨大的竞争力而且能实时检测。

a:Hourglass 沙漏网络,文中未对其修改

b:带转置卷积的resnet, 同时增加了deformable conv

c:原始的DLA-34语义分割网络

d:文中用到的修改过的DLA-34,增加了FPN结构

由于采用全卷积网络直接得到4倍下采样的热力图,所以不需要提前设定anchors, 所以大大减少了网络参数量和计算量。热力图的通道数等于要检测的目标类别数,热力图的前100个峰值作为网络提取的目标中心点,然后设定一个阈值进行筛选得到最终的目标中心点。

Centernet 中所有的上采样前都有deformable卷积,这种卷积的作用就是使得网络的感受野变得更加精确,而不是限定为3*3的矩形卷积框内。同时4倍的下采样feature map 比一般网络的分辨率高很多,所有不需要进行多尺度预测和特征金字塔也可以同时较好的检测大小目标。

Centernet 不需要NMS,因为所有检测的中心点是由热力图的峰值得到的,这样就已经有一个非极大值抑制的过程,而且NMS是十分耗时的,所以Centernet才能又好又快。

Centernet 采用编码解码的全卷积骨干网络,上采样用到的是转置卷积,与一般上采样中的双线性差值有很大区别,转置卷积可以更好的还原图像的语义信息和位置信息。

上图表示了anchor free 算法与基于anchor算法在对待正负样本上的区别,a是基于anchor的检测算法,检测框与ground truth 交并比大于0.7的作为正样本,检测框与ground truth 交并比小于0.3的作为负样本。b是centernet 的检测器,ground truth中心点的热力图不是中心的是1, 周围像素都是0, 而是呈高斯核分布,高斯核大小与物体的大小有关,所以中心点周围高斯核内点会作为负样本,但是会有一个呈高斯分布的衰减。具体见下面的分类损失,Lk loss .

直接根据网络预测的中心点,加上回归的中心点偏移量,结合回归的box 大小得到最终的检测box

将目标类别数量设置为17,对应人体姿态估计的17 个关键点,预测17维的热力图得到所有17类别的中心点,然后回归一个34(2*17)维的每个人体中心点到17个关键点的偏移值(因为有17 个x,y坐标偏移),人体中心点加上这个34 维的偏移量可以得到每个物体的17个关键点,再将17维的热力图中心点分配到距离最近的每个人体上,再回归一个二维的关键点偏移量作为最终的准确关键点。

这里回归的将是3维的box size, 加上一个1维的深度,和一个8维的方向,最终得到3D box。

经典分类CNN模型系列其四:Resnet

终于可以说一下Resnet分类网络了,它差不多是当前应用最为广泛的CNN特征提取网络。它的提出始于2015年,作者中间有大名鼎鼎的三位人物He-Kaiming, Ren-Shaoqing, Sun-Jian。绝对是华人学者的骄傲啊。

VGG网络试着探寻了一下深度学习网络的深度究竟可以深几许以能持续地提高分类准确率。我们的一般印象当中,深度学习愈是深(复杂,参数多)愈是有着更强的表达能力。凭着这一基本准则CNN分类网络自Alexnet的7层发展到了VGG的16乃至19层,后来更有了Googlenet的22层。可后来我们发现深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,test dataset的分类准确率也变得更差。排除数据集过小带来的模型过拟合等问题后,我们发现过深的网络仍然还会使分类准确度下降(相对于较浅些的网络而言)。

正是受制于此不清不楚的问题,VGG网络达到19层后再增加层数就开始导致分类性能的下降。而Resnet网络作者则想到了常规计算机视觉领域常用的residual representation的概念,并进一步将它应用在了CNN模型的构建当中,于是就有了基本的residual learning的block。它通过使用多个有参层来学习输入输出之间的残差表示,而非像一般CNN网络(如Alexnet/VGG等)那样使用有参层来直接尝试学习输入、输出之间的映射。实验表明使用一般意义上的有参层来直接学习残差比直接学习输入、输出间映射要容易得多(收敛速度更快),也有效得多(可通过使用更多的层来达到更高的分类精度)。

当下Resnet已经代替VGG成为一般计算机视觉领域问题中的基础特征提取网络。当下Facebook乍提出的可有效生成多尺度特征表达的FPN网络也可通过将Resnet作为其发挥能力的基础网络从而得到一张图片最优的CNN特征组合集合。

若将输入设为X,将某一有参网络层设为H,那么以X为输入的此层的输出将为H(X)。一般的CNN网络如Alexnet/VGG等会直接通过训练学习出参数函数H的表达,从而直接学习X -> H(X)。

而残差学习则是致力于使用多个有参网络层来学习输入、输出之间的参差即H(X) - X即学习X -> (H(X) - X) + X。其中X这一部分为直接的identity mapping,而H(X) - X则为有参网络层要学习的输入输出间残差。

下图为残差学习这一思想的基本表示。

上小节中,我们知道残差学习单元通过Identity mapping的引入在输入、输出之间建立了一条直接的关联通道,从而使得强大的有参层集中精力学习输入、输出之间的残差。一般我们用F(X, W i )来表示残差映射,那么输出即为:Y = F(X, W i ) + X。当输入、输出通道数相同时,我们自然可以如此直接使用X进行相加。而当它们之间的通道数目不同时,我们就需要考虑建立一种有效的identity mapping函数从而可以使得处理后的输入X与输出Y的通道数目相同即Y = F(X, W i ) + W s *X。

当X与Y通道数目不同时,作者尝试了两种identity mapping的方式。一种即简单地将X相对Y缺失的通道直接补零从而使其能够相对齐的方式,另一种则是通过使用1x1的conv来表示W s 映射从而使得最终输入与输出的通道达到一致的方式。

作者为了表明残差网络的有效性,共使用了三种网络进行实验。其一为VGG19网络(这是VGG paper中最深的亦是最有效的一种网络结构),另外则是顺着VGG网络思维继续加深其层次而形成的一种VGG朴素网络,它共有34个含参层。最后则是与上述34层朴素网络相对应的Resnet网络,它主要由上节中所介绍的残差单元来构成。

在具体实现残差网络时,对于其中的输入、输出通道数目不同的情况作者使用了两种可能的选择。A)shortcut直接使用identity mapping,不足的通道通同补零来对齐;B)使用1x1的Conv来表示W s 映射,从而使得输入、输出通道数目相同。

自下面两表中,我们可看出残差网络能够在深度增加的情况下维持强劲的准确率增长,有效地避免了VGG网络中层数增加到一定程度,模型准确度不升反降的问题。

然后自下表中,我们可以看到常规Resnet网络与其它网络如VGG/Googlenet等在Imagenet validation dataset上的性能比较。

为了实际计算的考虑,作者提出了一种bottleneck的结构块来代替常规的Resedual block,它像Inception网络那样通过使用1x1 conv来巧妙地缩减或扩张feature map维度从而使得我们的3x3 conv的filters数目不受外界即上一层输入的影响,自然它的输出也不会影响到下一层module。

不过它纯是为了节省计算时间进而缩小整个模型训练所需的时间而设计的,对最终的模型精度并无影响。

作者进一步在小的CIFAR10数据集上尝试了更深的Resnet网络,其深度最多达到了1202层。不过却发现分类性能终于开始有了一定下降。作者分析认为可能是层数过多,导致模型过于复杂,而CIFAR-10较小的数据集造成了它的过拟合吧。

如下表为其疯狂的实验结果。

数据输入层

如下为构成Resnet网络的一个residual block表示。注意它这里的identity mapping中包含了一个1x1 conv表示的W s 。而网络中其它的若干模块则可能直接使用的identity mapping,而不含任何有参层。

Resnet网络的最后若干层。与其它VGG/Alexnet或者Googlenet并无不同。

resnet详解(resnet参数)resnet详解(resnet参数)


HRNet 源代码结构详解

HRNet 主要的模型结构,具体实现部分在 HighResolutionNet 类中有详细定义。

总体结构 按照顺序 可分为三部分:

具备 pretrain 模型的,可用模型结构:

yaml 文件中,关于模型结构的关键部分,以 hrnet_w48 为例

HRNet 类定义,通过 config 指定的模型结构,实例化特定结构的模型,构建过程如下

transition layer 完成 stage 之间连接需要的 两种转换

以下为 hrnet_w48 的 transition 具体结构

stage1 产生 1/4 feature map,没有 branch 分支结构,采用与 resnet 完成一样的 _make_layer() 函数构建层

stage 2/3/4 为 HRNet 核心结构,用到了 HighResolutionModule ,内含 branch 构建和 特征 fuse 模块

实现下图红框中的,branch 并行 多 scale 特征提取 和 末端将 多 scale 特征通过 upsample/downsample 方式融合

上图红框中,每个横向的串行结构,如第1个红框 stage2 内,有2个横向的串行结构;由 num_blocks 决定串行 block 使用个数

根据 stage cfg 中指定的 branch 数量,构建多个并行的 branch,调用之前的 _make_one_branch() ,如 stage 2/3/4 各有 2/3/4 个 branches

HighResolutionModule 末尾的特征融合层

以下图红框即 stage3 中 蓝色 branch 输出结果为例,其输出结果要转换成 4 种尺度的特征,用于每个 branch 末尾的特征融合

十分钟一起学会ResNet残差网络

深度卷积网络自然的整合了低中高不同层次的特征,特征的层次可以靠加深网络的层次来丰富。从而,在构建卷积网络时,网络的深度越高,可抽取的特征层次就越丰富。所以一般我们会倾向于使用更深层次的网络结构,以便取得更高层次的特征。但是在使用深层次的网络结构时我们会遇到两个问题,梯度消失,梯度爆炸问题和网络退化的问题。

但是当使用更深层的网络时,会发生梯度消失、爆炸问题,这个问题很大程度通过标准的初始化和正则化层来基本解决,这样可以确保几十层的网络能够收敛,但是随着网络层数的增加,梯度消失或者爆炸的问题仍然存在。

还有一个问题就是网络的退化,举个例子,假设已经有了一个最优化的网络结构,是18层。当我们设计网络结构的时候,我们并不知道具体多少层次的网络时最优化的网络结构,假设设计了34层网络结构。那么多出来的16层其实是冗余的,我们希望训练网络的过程中,模型能够自己训练这五层为恒等映射,也就是经过这层时的输入与输出完全一样。但是往往模型很难将这16层恒等映射的参数学习正确,那么就一定会不比最优化的18层网络结构性能好,这就是随着网络深度增加,模型会产生退化现象。它不是由过拟合产生的,而是由冗余的网络层学习了不是恒等映射的参数造成的。

ResNet是在2015年有何凯明,张翔宇,任少卿,孙剑共同提出的,ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同。具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。将原网络的几层改成一个残差块,残差块的具体构造如下图所示:

可以看到X是这一层残差块的输入,也称作F(x)为残差,x为输入值,F(X)是经过第一层线性变化并激活后的输出,该图表示在残差网络中,第二层进行线性变化之后激活之前,F(x)加入了这一层输入值X,然后再进行激活后输出。在第二层输出值激活前加入X,这条路径称作shortcut连接。

我们发现,假设该层是冗余的,在引入ResNet之前,我们想让该层学习到的参数能够满足h(x)=x,即输入是x,经过该冗余层后,输出仍然为x。但是可以看见,要想学习h(x)=x恒等映射时的这层参数时比较困难的。ResNet想到避免去学习该层恒等映射的参数,使用了如上图的结构,让h(x)=F(x)+x;这里的F(x)我们称作残差项,我们发现,要想让该冗余层能够恒等映射,我们只需要学习F(x)=0。学习F(x)=0比学习h(x)=x要简单,因为一般每层网络中的参数初始化偏向于0,这样在相比于更新该网络层的参数来学习h(x)=x,该冗余层学习F(x)=0的更新参数能够更快收敛,如图所示:

假设该曾网络只经过线性变换,没有bias也没有激活函数。我们发现因为随机初始化权重一般偏向于0,那么经过该网络的输出值为[0.6 0.6],很明显会更接近与[0 0],而不是[2 1],相比与学习h(x)=x,模型要更快到学习F(x)=0。

并且ReLU能够将负数激活为0,过滤了负数的线性变化,也能够更快的使得F(x)=0。这样当网络自己决定哪些网络层为冗余层时,使用ResNet的网络很大程度上解决了学习恒等映射的问题,用学习残差F(x)=0更新该冗余层的参数来代替学习h(x)=x更新冗余层的参数。

这样当网络自行决定了哪些层为冗余层后,通过学习残差F(x)=0来让该层网络恒等映射上一层的输入,使得有了这些冗余层的网络效果与没有这些冗余层的网络效果相同,这样很大程度上解决了网络的退化问题。

我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新。

可以看到,假设现在需要更新 参数因为随机初始化偏向于0,通过链式求导我们会发现, 相乘会得到更加接近于0的数,那么所求的这个 的梯度就接近于0,也就产生了梯度消失的现象。

ResNet最终更新某一个节点的参数时,由于 ,由于链式求导后的结果如图所示,不管括号内右边部分的求导参数有多小,因为左边的1的存在,并且将原来的链式求导中的连乘变成了连加状态(正是 ),都能保证该节点参数更新不会发生梯度消失或梯度爆炸现象。

这样ResNet在解决了阻碍更深层次网络优化问题的两个重要问题后,ResNet就能训练更深层次几百层乃至几千层的网络并取得更高的精确度了。

这里是应用了ResNet的网络图,这里如果遇到了h(x)=F(x)+x中x的维度与F(x)不同的维度时,我们需要对identity加入Ws来保持Ws*x的维度与F(x)的维度一致。

x与F(x)维度相同时:

x与F(x)维度不同时:

下边是ResNet的网络结构图:

使用1*1卷积减少参数和计算量:

如果用了更深层次的网络时,考虑到计算量,会先用1 * 1的卷积将输入的256维降到64维,然后通过1*1恢复。这样做的目的是减少参数量和计算量。

左图是ResNet34,右图是ResNet50/101/152。这一个模块称作building block,右图称之为bottleneck design。在面对50,101,152层的深层次网络,意味着有很大的计算量,因此这里使用1 * 1卷积先将输入进行降维,然后再经过3 * 3卷积后再用 卷积进行升维。使用1*1卷积的好处是大大降低参数量计算量。

通过上述的学习,你应该知道了,现如今大家普遍认为更好的网络是建立在更宽更深的网络基础上,当你需要设计一个深度网络结构时,你永远不知道最优的网络层次结构是多少层,一旦你设计的很深入了,那势必会有很多冗余层,这些冗余层一旦没有成功学习恒等变换 ,那就会影响网络的预测性能,不会比浅层的网络学习效果好从而产生退化问题。

ResNet的过人之处,是他很大程度上解决了当今深度网络头疼的网络退化问题和梯度消失问题。使用残差网络结构 代替原来的没有shortcut连接的 ,这样更新冗余层的参数时需要学习 比学习 要容易得多。而shortcut连接的结构也保证了反向传播更新参数时,很难有梯度为0的现象发生,不会导致梯度消失。

这样,ResNet的构建,使我们更朝着符合我们的直觉走下去,即越深的网络对于高级抽象特征的提取和网络性能更好,不用在担心随着网络的加深发生退化问题了。

近段时间,准备持续发表一些CNN常见的网络模型讲解。好了,今天的十分钟就带你一起学会ResNet,下次的十分钟我们再见。

超越yolov3,Centernet 原理详解(object as points)

ariXiv:

github:

摘要:目标检测要求作出包含物体的最小矩形框。大多数成功的目标检测器罗列出大量的候选框并对其分类。 这是浪费资源的,而且低效,还需要后续的处理。在这篇文章中,我们提出了一种新的方法。 我们将要检测的目标定位到一个点 --- 即检测矩形框的中心点。 我们的检测器通过热力图寻找中心点然后回归目标的其他属性,比如大小, 3D 位置坐标, 方向, 甚至姿态。 我们的基于中心点的检测网络 CenterNet, 是一个端到端的独特的, 简单而快速的目标检测器, 而且比一些基于锚框的检测器更加准确。 CenterNet 在MS COCO 数据集上在速度与准确率方面取得了最好的平衡, 142 FPS时有28.1% AP , 52 FPS时有37.4% AP, 多尺度测试时可以达到45.1% AP和 1.4 FPS。我们用同样的方法在KITTI 基准上去估计3D坐标 ,在 COCO 关键点数据集上估计人体姿态。当与其他复杂的多阶段的方法比较时我们的方法表现出巨大的竞争力而且能实时检测。

a:Hourglass 沙漏网络,文中未对其修改

b:带转置卷积的resnet, 同时增加了deformable conv

c:原始的DLA-34语义分割网络

d:文中用到的修改过的DLA-34,增加了FPN结构

由于采用全卷积网络直接得到4倍下采样的热力图,所以不需要提前设定anchors, 所以大大减少了网络参数量和计算量。热力图的通道数等于要检测的目标类别数,热力图的前100个峰值作为网络提取的目标中心点,然后设定一个阈值进行筛选得到最终的目标中心点。

Centernet 中所有的上采样前都有deformable卷积,这种卷积的作用就是使得网络的感受野变得更加精确,而不是限定为3*3的矩形卷积框内。同时4倍的下采样feature map 比一般网络的分辨率高很多,所有不需要进行多尺度预测和特征金字塔也可以同时较好的检测大小目标。

Centernet 不需要NMS,因为所有检测的中心点是由热力图的峰值得到的,这样就已经有一个非极大值抑制的过程,而且NMS是十分耗时的,所以Centernet才能又好又快。

Centernet 采用编码解码的全卷积骨干网络,上采样用到的是转置卷积,与一般上采样中的双线性差值有很大区别,转置卷积可以更好的还原图像的语义信息和位置信息。

上图表示了anchor free 算法与基于anchor算法在对待正负样本上的区别,a是基于anchor的检测算法,检测框与ground truth 交并比大于0.7的作为正样本,检测框与ground truth 交并比小于0.3的作为负样本。b是centernet 的检测器,ground truth中心点的热力图不是中心的是1, 周围像素都是0, 而是呈高斯核分布,高斯核大小与物体的大小有关,所以中心点周围高斯核内点会作为负样本,但是会有一个呈高斯分布的衰减。具体见下面的分类损失,Lk loss .

直接根据网络预测的中心点,加上回归的中心点偏移量,结合回归的box 大小得到最终的检测box

将目标类别数量设置为17,对应人体姿态估计的17 个关键点,预测17维的热力图得到所有17类别的中心点,然后回归一个34(2*17)维的每个人体中心点到17个关键点的偏移值(因为有17 个x,y坐标偏移),人体中心点加上这个34 维的偏移量可以得到每个物体的17个关键点,再将17维的热力图中心点分配到距离最近的每个人体上,再回归一个二维的关键点偏移量作为最终的准确关键点。

这里回归的将是3维的box size, 加上一个1维的深度,和一个8维的方向,最终得到3D box。

ResNet的发展历程的总结和一点思考

这里不再讲特别多的基础知识,也基本不会放图片,其实,到了2019年并且做深度学习的人,真的有谁不知道或者没看过ResNet的文章、或者博文吗。

ResNet刚刚提出来的时候,想法就是很简单,就是 ,原因也很直白,层数太多会有 的情况,那么不如把前边的给它直接怼过去?作者一开始说了那么多话,也掩饰不住这个连接是拍脑袋搞出来的,或者说是最简单的试试就work了,所以开始的比较也并没有比如为参数是1不是0.5之类的问题(这些都在v2中给了实验)。而另一个比较神奇的地方就是 ,作者敢在16年就这么大规模的用,确实很有勇气。后来的注解也说明了,普通的 也是OK的,这么用就是为了省点参数,梯度的问题也完全没有被 所解决,而这样的结构就如此广泛地被所有后续paper所接受,感觉还是有一些改进的空间。

不得不说,ResNet这篇paper写的是真的好,娓娓道来,实验充分,图表充足,这样的paper不得best还有谁能得呢?

后续给出了ResNet-v2,这个paper作者确实是用力了,把之前没讨论的形式基本都讨论了一遍,比如为啥 这一部分的系数是1而不是0.5:

第 L 层可以被表示为:

那么Loss对第l层的偏导就是:

因此,如果第 i 层 项有个系数 ,第 L 层就会被表示为:

( 代表省略后续累加项的常数参数)

则第 l 层对Loss的偏导就变成了:

所以你看,前边的系数就参与了BP,大了吧梯度爆炸,小了吧梯度消失。

还有很多实验分析这里不一一介绍,但是结论还是要知道的:

(1)直接累加就挺好

(2)当 项的顺序是 时是最好的。

然后一个有意思但是至今一个意见不太统一的地方就是, 的时候究竟要不要一个 。v1说要,v2说不要,不过很多后续paper或者工程其实还是要了的,不过作者也说了,层数少可以搞一个,层数多了就算了,这也是蛮神奇的地方,我觉得思路可能和ResNet本身要解决的问题倒有一点相似,层数变多、结构复杂未必好,或者说,未必好训。一般来讲,ResNet-50差不多可以用,我明天试试。之所以单独提50,就是因为这基本上是个工业界非常喜欢的结构,用的非常非常多。

然后时过境迁,就到了ResNeXt,这个工作作者说直接motivation是Inception,恩,看起来也很没有创意的样子。作者吭哧吭哧画了3个图,然后就说,我们使用 的版本实现了下,它们其实差不多等价!我去,这也太不严谨了吧,好歹在cifar上验证下也行啊。打算闲下来了也同样做个实验。这里有个需要注意的就是,参数量差不多的时候ResNeXt的(输入)channel可以更多一点(毕竟每个conv的数量减少了嘛),这样就可以把模型搞得宽,效果也好一点。

然后就很有意思了,既然有了 ,那为啥不把它搞到 呢,于是就将其命名为 ,(注:这里我没有完全按照时间线来分析,只是这个思路确实比较好懂,有利于大脑理解),也就有了mobile net。

然后就向2条不同的路延伸了,一条在优化 的路上一路向前,有了v2,v3,shuffle net,顺便说下v2,它的改进好像只有2个,1. ,2.最后一个 换了个 作为激活,这不就是把原来ResNet的 抄了过来嘛(当然维度变化情况是不一样的);是另一条在“如何创建更好的shortcut”上一路向前,有了densenet,甚至还有了“是不是shortcut点别的东西也会有奇效”的路,比如residual-attention net,senet,cbam。其实最后者一般被称为attention,不过图像attention这个东西吧,本来就不算特别让人信服,它的实现机制简直就是一个并联的conv。要是说senet真的读取了channel attention的信息,那么它根本不应该gap之后去做fc,毕竟fc也实现了每个channel信息的交互啊!作者要么应该gap后之间连,要么用 去做一点处理,总的来说, 不应该有信息的交互 。这也是一个我打算尝试下的点。倒不是说这几个点有什么用,只是为了解疑答惑,让自己信服。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, website.service08@gmail.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息