SSD与yolov1的对比

模型可能会受到图像质量的影响,例如图像分辨率低、噪声较多等。

yolo系列和ssd发表的时间顺序是yolov1,ssd,yolov2,yolov3,当然现在yolov4也出现了。这个是我之前在看完yolov1之后阅读ssd论文的时候记录的笔记,因此会涉及到很多和yolov1实现的对比。

vgg16模型 vgg16模型代码vgg16模型 vgg16模型代码


vgg16模型 vgg16模型代码


fast rcnn系列的模型的套路:

1.使用事先设定的bounding boxes,

论文的贡献:

1. 引入了一种单阶段的检测器,比以前的算法YOLOv1更准更快,并没有使用RPN和Pooling作;

4. 在多个数据集(PASCAL、VOC、COCO、ILSVRC)上面的测试结果表明,它可以获得更高的mAp值;

主干网络是基于VGG的, 是一个高质量的分类网络,把这个基础模型作为ssd的前面层,用于给后面的层提供高质量的分类,我们称这个层为基础网络,注意这个基础模型在使用的时候,需要截去面的分类层。在这里使用的VGG16网络。然后添加辅助的结构来 提供最终的检测功能。

主干网对VGG16的修改:

1.将VGG16的FC6在ssd中,首先每个真实物品都先选择一个负责它的bounding box,在没有训练指之前,因为prior bounding box的位置都是确定的,所以选择IOU的为正样本。为平衡正负样本的比率,将IOU大于0.5的prior bounding box都设置为正样本。这样模型就更加稳定了。和FC7层转化为卷积层,如图1上的Conv6和Conv7;

2.去掉所有的Dropout层和FC8层;

3.添加了Atrous算法(hole算法),参考该链接;

4.将Po需要注意到这里使用的卷积预测器而不是全连接层(yolov1使用的是全连接层)。ol5从2x2-S2变换到3x3-S1;

最终的检测功能的实现依赖于下面提到的关键技术:

在基础网络之后,添加了很多个卷积层,卷积层不断的减小特征图的宽高尺寸,比如从8 8经过一层卷积之后就变成4 4了。然后在这些特征图上都应用目标检测算法。正如上面那张图所示,对于前面一层来说,相当于是在一个比较小的8 8的尺度上,对每个位置检测4个固定横纵比的bounding box,而对于后面一层来说,就是在一个相对较大的4 4尺寸上对每个位置检测4个固定横纵比的bounding box。这样就实现了在多尺度特征图上检测的目的。

图中的所有信道的对应位置的像素点被认为是一个anchor,那么对于每个anchor就会有N个比率的bounding box,需要注意的是,每一层的bounding box数量不一定是一样的。

我们从feature layer或者说feature map上抽取特征。feature layer可能是基础网络上面的某一层,也可以是在基础网络后面添加的卷积层。对于一个 m x nxc的feature layer,使用一个3x3xp的核过滤器(all kernel),那么对于每一个输出的pixel,都可以得到一个channel数为p大小的检测结果,一般p=4 (|Classes|+4)大小,最终可以得到m n p大小的检测结果。这个检测结果中包含了每个位置的分类物品出现的置信度以及四个表示位置和偏移的(cx,cy,w,h)。因为设置了bounding box的数量为4,所以结果是4 (|Classes|+4).

The key difference between training SSD and training a typical detector that uses region proals, is that ground truth rmation needs to be assigned to specific outputs in the fixed set of detector outputs.

对于打标的真实框GT,需要选择哪个预测框是与真实框对应的。这里选择是jaccard overlap>0.5的所有默认框。这样正负样本就不会很悬殊。Multibox论文中则只会选择jaccard overlap的一个框框。

个人理解中,这里的预测框是指没有偏移变化的预测框prior box,也叫先验框(prior box)。在GT确定、输入图像尺寸固定、prior box确定之后,就可以得到jaccard overlap>0.5的所有先验框。然后学习的时候,这些正例需要根据ground truth进行偏移和长宽比缩放的学习。而其他负例则不需要学习位置参数。

为图像的面积的交并比.

在Yolov1中,ground truth的中心落在哪个单元格,该单元格中与其IOU的边界框负责预测它。但是在SSD中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点。

第二个原则是:对于剩余的未匹配先验框,若某个ground truth的 IOU 大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框IOU大于阈值,那么先验框只与IOU的那个先验框进行匹配。第二个原则一定在个原则之后进行,仔细考虑一下这种情况,如果某个ground truth所对应IOU小于阈值,并且所匹配的先验框却与另外一个ground truth的IOU大于阈值,那么该先验框应该匹配谁,应该是前者,首先要确保某个ground truth一定有一个先验框与之匹配。

下面是位置回归损失函数的介绍,看着就很晕。

N表示匹配的框,应该可以理解为正样本框。首先g表示是ground truth box的各个指标,d是先验框的各个指标,l是预测结果的各个指标。g^ 这个是根据g和d得到的可以和预测结果匹配计算损失函数的指标。比如g^cx 这个指标,是归一化的横坐标偏移指标,因为先验框的中心不会完全和ground truth的中心重合,因此计算实际的偏移量。这个值就是我们希望模型学习到的值。同理,先验框的宽度也不会完全重合ground truth的宽度,我们用log函数来计算g^w,这也意味着我们希望学习到的宽度也是这种变换的。

oothL1损失函数长这样:

分类的置信度损失函数如下,正样本的softmax loss函数以及负样本的背景置信度损失.

在某些论文的方法中,为了获得不同缩放的的结果,通过现将缩放在不同的尺度然后在将每个缩放尺度的结果组合起来。而在这篇论文中使用的方式是使用同一个网络中的不同层上抽取的feature map来获得和上面的缩放效果一样的结果。

这张图上有两个feature map。我们知道网络的不同层有不同的感受野。在SSD中,bounding box的大小不需要匹配对应层的感受野。我们设计了bounding box的尺寸规则,这样每个feature map就可以自己计算。

如果我们使用m个feature map,其中1表示较低层,m表示叫高层。bounding box的默认尺度按照如下的计算公式计算

bounding box的横纵比尺度为

什么是hard negative mining:

【2】然后扔进网络中训练。Howr,这也许会出现一个问题那就是正样本的数量远远小于负样本,这样训练出来的分类器的效果总是有限的,会出现许多false itive,把其中得分较高的这些false itive当做所谓的Hard negative,既然mining出了这些Hard negative,就把这些扔进网络得到类别的损失函数,将这些难负样本的损失函数作为背景损失函数,从而加强分类器判别阳性的能力。

绝大部分的bounding box匹配出来是没有物品的,这样会导致负样本和正样本失衡。SSD这里没有使用全部的负样本,而是对每个负样本的bounding box根据其confidence loss排序,然后选择的一批作为负样本,这样是的负样本和正样本的比率稳定在3:1。实践证明,这样的方式是的优化的碎度更快,训练也更加稳定。

数据的扩充策略中数据来自于以下三种之一

base netowrk是VGG16。SSD300的模型就是上面那张结构图所示。新的层的初始化使用xier方式( , )。实验认为和R相比,SSD在定位localization上更加,因为在神经网络模型中直接学习回归了物品的形状。但是SSD很容易有分类错误问题,尤其是类似的类别(比如动物)。SSD对bounding box的大小很敏感,也就是说,小物体的表现不如大物体。结合模型来看,因为小物体的预测使用的是网络的前面的层,而前面的层并没有很多的信息。虽然存在上面的问题,但是SSD在大物体上的表现很好,二千对于不同横纵比的物体的性能鲁棒。

下面这张图展示了ssd中的哪些技术使得性能得到了提升。

性能提升的贡献:

SSD是如何提升小物体的检测准确率的:通过数据扩充

SSD用的是VGG16(但去掉了fc层加速)而YOLO普通版有24个卷积层。

SSD的输入尺寸较小(300 300),而YOLO是448 448,即使网络结构类似计算量距还是挺明显的,速度快一点正常。

ssd全靠卷积完成,而yolo里还有全连接,用上gpu的话肯定是ssd快

SSD算法思想和结构详解 :

SSD详解

经典网络结构-AlexNet、VGG、GoogleNet、ResNet)

这里的bounding box的概念类似于Faster R-中的anchor boxes.但是这里不同的feature map层可以安排不同形状和数量的bounding box。,这样可以有效的离散化可能的输出box的空间(想象一下,如果每个feature map的bounding box长的不多,那么得到的可能异只在大小上,我们需要的是不同大小和形状的box来拟合真实的物品的坐标,因此box越多样越好。

AlexNet之所以能够成功,跟这个模型设计的特点有关,主要有:

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

使用了非线性激活函数:ReLU

防止过拟合的方法:Dropout,数据扩充(Data augmentation)

其他:多GPU实现,LRN归一化层的使用

GoogLeNet(从Inception v1到v4的演进)

VGG 继承了 LeNet 以及 AlexNet 的一些框架结构,而 GoogLeNet 则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比 AlexNet 和 VGG 小很多。

GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。

解决深度网络(过拟合, 参数过多, 梯度弥散)这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能, 如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

原始输入图像为224x224x3,且都进行了零均值化的预处理作(图像每个像素减去均值)。

输入为224x224的RGB图像,‘#3x3 reduce’和‘#5x5 reduce’表示3x3和5预处理过后,进过个卷积层C1之后,原始的图像也就变成了55x55的像素大小,此时一共有96个通道。模型分为上下两块是为了方便GPU运算,48作为通道数目更加适合GPU的并行运算。上图的模型里把48层直接变成了一个面,这使得模型看上去更像一个立方体,大小为55x55x48。在后面的第二个卷积层C2中,卷积核的尺寸为5x5x48,由此再次进行卷积运算。在C1,C2卷积层的卷积运算之后,都会有一个池化层,使得提取特征之后的特征图像素值大大减小,方便了运算,也使得特征更加明显。而第三层的卷积层C3又是更加特殊了。第三层卷积层做了通道的合并,将之前两个通道的数据再次合并起来,这是一种串接作。第三层后,由于串接,通道数变成256。全卷积的卷积核尺寸也就变成了13×13×25613×13×256。一个有4096个这样尺寸的卷积核分别对输入图像做4096次的全卷积作,的结果就是一个列向量,一共有4096个数。这也就是的输出,但是AlexNet最终是要分1000个类,所以通过第八层,也就是全连接的第三层,由此得到1000个类输出。x5卷积之前1x1的卷积核的个数。

之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了。

怎么打印pt权重文件所有参数

对上图说明如下:

首先需要安装torchsummary。

在相应的虚拟环境下pip install torchs(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器如下表为其疯狂的实验结果。是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。ummary

在做图像处理时,如何提高识别算法的设计与效果的精度?

需要用到图像处理软件。

BMP、PCX、GIF、TIF和JPG格式的文件是位图文件,文件的扩展名指明了图像文件的标准。每种位图文件都按照不同的标准存储图像信息,这些标准是为某些特定的目的制定的。GIF标准设计,用来把尽可能多的图像信息压缩到尽可能小的空间中。

位图文件有两种存储像素数据的格式。16777216色(真彩色)的图像,一个像素的颜色可以用24位数据表示。然而,256色的图像可以用调色板对颜色的信息进行编码,一个像素的值对应的是调色板的索引,而不是直接对应一个像素的颜色,调色板的索引映射为像素的颜色。这样通过减少描述像素的字节数可以大大减少文件的长度。

大部分位图文件格式是按行格式来存储像素值的。如果一幅图像的尺寸是100100,并且像素是八位值描述的,那么文件中图形数据的个100字节存储图像的行的像素值,第二个100字节存损失函数是回归损失和置信度损失的加权平均储图像的第二行,以此类推。有的位图格式的行排列顺序则恰恰相反,BMP文件是先存储图像的最下面一行,然后依次向上存储。

每种位图文件格式的图形数据和非图形数据的结构是不同的。以一百万个像素,256种颜色的BMP文件在电脑上的存储为例。这个文件包括一个十四字节的文件首部,一个四十字节的信息1、打印每层参数信息:summary(net,input_size,batch_size,dev),net:网络模型input_size:网络输入的shape,batch_size:默认参数为-1,dev:在gpu上还是cpu上运行,默认是cuda在gpu上运行,若想在cpu上运行,需将参数改为cpu。首部,一个1024字节的颜色表,一兆字节的位图数据。文件首部的前两个字节由字符BM组成,还包括了文件长度和位图数据在文件中的起始位置。文件的信息首部包含了图像的高、宽、颜色数等非图形数据。这个图像共有一百万个像素,一个像素需要八位的颜色信息,文件的这一部分的长度是一百万个字节,字节排放的顺序是自左到右从图像的最下面那行开始,这个文件的总大小是1001078字节。

颜色数不同的BMP文件的格式将有细微中文大学的多媒体实验室是最早应用深度学习进行计算机视觉研究的华人团队。在人工智能竞赛LFW(大规模人脸识别竞赛)上,该实验室曾力压FaceBook夺得冠军,使得人工智能在该领域的识别能力首次超越真人。的异。

深度学习 caffe flatten层怎么配置

网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU作,以增加网络的非线性特征

flatten层用来扁平参数用,一般用在卷积层与全链接层之间,可以从vgg16网络中可以看出,但是在后来的网络中用GlobalAveragePooling2D代替了flatten层,可以从vgg16与inceptionV3网络对比看出。从参数的对比可以看出,显然这种改进大大的减少了参数的使用量,避免了过拟合现象。

主干网络backbone network

from keras.models import Sequential

from keras.layers.core import Flatten

from keras.layers.convolutional import Convolution2D

from keras.utils.vis_utils import plot_model

model = Sequential()

model.add(Convolution2D(64,3,3,border_mode="same",input_shape=(3,32,32)))

# now:model.output_shape==(None,64,32,32)

model.add(Flatten())

# now: model.output_shape==(None,65536)

plot_model(model, to_file='Flatten.png', show_shapes=True)

扩展资料

应用

计算机视觉

语音识别

微软研究人员通过与hinton合作,首先将RBM和DBN引入到语音识别声学模型训练中,并且在大词汇量语音识别系统中获得巨大成功,使得语音识别的错误率相对减低30%。但是,DNN还没有有效的并行快速算法,很多研究机构都是在利用大规模数据语料通过GPU平台提高DNN声学模型的训练效率。

在上,IBM、google等公司都快速进行了DNN语音识别的研究,并且速度飞上图就是残网络的基本结构,可以看出其实是增加了一个恒等映射,将原本的变换函数H(x)转换成了F(x)+x。示意图中可以很明显看出来整个网络的变化,这样网络不再是简单的堆叠结构,这样的话便很好地解决了由于网络层数增加而带来的梯度原来越不明显的问题。所以这时候网络可以做得很深,到目前为止,网络的层数都可以上千层,而能够保证很好地效果。并且,这样的简单叠加并没有给网络增加额外的参数跟计算量,同时也提高了网络训练的效果与效率。快。

国内方面,阿里巴巴、科大讯飞、百度、中科院自动化所等公司或研究单位,也在进行深度学习在语音识别上的研究。

参考资料来源:

CV领域初窥--图像分类(一)

什么是Inception呢?Inception历经了V1、V2、V3、V4等多个版本的发展,不断趋于完善,下面一一进行介绍

2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet获得了名、VGG获得了第二名,这两类模型结构的共同特点是层次更深了。图像分类是计算机视觉中最基础的任务,其中可以分为跨物种语义级别的图像分类,子类细粒度图像分类,以及实例级图像分类三大类别。

细粒度图像分类,是一个大类中的子类的分类,例如不同鸟类的分类,不同狗类的分类,不同车型的分类等等。例如Caltech-UCSD Birds-200-2011数据集,他是包含200类,11788张图像的鸟类书籍,为每一张图提供了15哥局部区域位置,1个标注框。这种细粒度级别的检测需要更为精细的分类器设计

MNIST数据集在当时是一个baseline,其包含60000个训练数据,10000个测试数据,图像均为灰度图像,大小为3232。在这个数据集中,其实传统方法表现的也不错,例如SVM以及KNN,SVM为代表的方法可以将MNIST分类错误率降低到0.56%, 超过当时的人工神经网络。

后来经过多次迭代,LeNet5在1998年诞生,这是一个经典的卷积神经网络,饱含着一些重要的特性:

虽然LeNet5的错误率在0.7%左右,不如SVM方法,但随着网络结构的发展,神经网络方法很快的超过了其他的所有方法,有着很好的效果。

为了在工业界落地更加复杂的图像分类任务,李飞飞等人数年时间的整理下,2009年,Ima把真实的物品坐标框称为ground truth,对于一张,在经过SSD模型的各层检测,会有8732个prior box(也就是检测结果),需要标记这些检测结果中,哪些是正样本,那些是负样本。 这些标记过程都是在训练之前做好的;不同层的default box的数量和大小也是在训练钱都确定好的;还需要准备好难负例挖掘的策略。geNet数据集发布了。ImageNet数据集共有1400多万张,共有2万多个类别,不过论文中常用的都是1000类的基准。

AlexNet在2012年时横空出世,是个真正意义上的深度网络,与LeNet5的5层相比,它的层数增加了3层,网络的参数量也大大增加,输入也从28变成了224,同时GPU的面世,也使得深度学习从此进行GPU为王的训练时代。

AlexNet有以下的特点:

VGGNet探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了16~19层深的卷积神经网络,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降,同时拓展性又很强,迁移到其它数据上的泛化性也非常好。到目前为止,VGG仍然被用来提取图像特征。

VGGNet可以看成是加深版本的AlexNet,都是由卷积层、全连接层两大部分构成.全部使用3×3的卷积核和2×2的池化核,简化了卷积神经网络的结构。VGGNet很好的展示了如何在先前网络架构的基础上通过简单地增加网络层数和深度就可以提高网络的性能。虽然简单,但是却异常的有效,在今天,VGGNet仍然被很多的任务选为基准模型。

GoogLeNet也是将网络层次加深了,不过GoogLeNet做了更加大胆的网络结构的尝试,其深度只有22层,从参数数量来看,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;但是从模型结果来看,GoogLeNet的性能却更加优越。

一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:

(1)参数太多,如果训练数据集有限,很容易产生过拟合;

(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。

解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。比较通用的方法是使用dropout的方法,相当于从原始的网络中找到一个更”瘦“的网络(有待考究)

通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。谷歌提出了最原始Inception的基本结构:

该结构将中常用的卷积(1x1,3x3,5x5)、池化作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。

然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构

(2)网络采用了erage pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在还是加了一个全连接层,主要是为了方便对输出进行灵活调整;

(3)虽然移除了全连接,但是网络中依然使用了Dropout ;

Inception V2版本的解决方案就是修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。

2.1 卷积分解(Factorizing Convolutions)

GoogLeNet团队提出可以用2个连续的3x3卷积层组成的小网络来代替单个的5x5卷积层,即在保持感受野范围的同时又减少了参数量

2.2 降低特征图大小

如果想让图像缩小,可以有如下两种方式:先池化再作Inception卷积,或者先作Inception卷积再作池化。但是方法一(左图)先作pooling(池化)会导致特征表示遇到瓶颈(特征缺失),方法二(右图)是正常的缩小,但计算量很大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)

使用Inception V2作改进版的GoogLeNet,网络结构图如下:

Inception V3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算,又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。

Inception V4主要利用残连接(Residual Connection)来改进V3结构,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。

深度学习之卷积神经网络经典模型

在比赛中,为了证明自己观点是正确的,作者控制变量地设计几个实验。首先作者构建了两个plain网络,这两个网络分别为18层跟34层,随后作者又设计了两个残网络,层数也是分别为18层和34层。然后对这四个模型进行控制变量的实验观察数据量的变化。下图便是实验结果。实验中,在plain网络上观测到明显的退化现象。实验结果也表明,在残网络上,34层的效果明显要好于18层的效果,足以证明残网络随着层数增加性能也是增加的。不仅如此,残网络的在更深层的结构上收敛性能也有明显的提升,整个实验大为成功。

LeNet-5模型 在的应用中,文字识别系统所用的LeNet-5模型是非常经典的模型。LeNet-5模型是1998年,Yann LeCun提出的,它是个成功大规模应用在手写数字识别问题的卷积神经网络,在MNIST数据集中的正确率可以高达99.2%。

下面详细介绍一下LeNet-5模型工作的原理。

LeNet-5模型一共有7层,每层包含众多参数,也就是卷积神经网络中的参数。虽然层数只有7层,这在如今庞大的神经网络中可是说是非常少的了,但是包含了卷积层,池化层,全连接层,可谓麻雀虽小五俱全了。为了方便,我们把卷积层称为C层,下采样层叫做下采样层。

池化层包含了六个特征映射,每个映射的像素值为14x14,这样的池化层非常重要,可以在一定程度上保证网络的特征被提取,同时运算量也大大降低,减少了网络结构过拟合的风险。因为卷积层与池化层是交替出现的,所以隐藏层的第三层又是一个卷积层,第二个卷积层由16个特征映射构成,每个特征映射用于加权和计算的卷积核为10x10的。第四个隐藏层,也就是第二个池化层同样包含16个特征映射,每个特征映射中所用的卷积核是5x5的。第五个隐藏层是用5x5的卷积核进行运算,包含了120个神经元,也是这个网络中卷积运算的一层。

之后的第六层便是全连接层,包含了84个特征图。全连接层中对输入进行点积之后加入偏置,然后经过一个激活函数传输给输出层的神经元。一层,也就是第七层,为了得到输出向量,设置了十个神经元来进行分类,相当于输出一个【1】对于目标检测中我们会事先标记处ground truth,然后再算法中会生成一系列proal,这些proal有跟标记的ground truth重合的也有没重合的,那么重合度(IOU)超过一定阈值(通常0.5)的则认定为是正样本,以下的则是负样本。包含十个元素的一维数组,向量中的十个元素即0到9。

AlexNet模型

AlexNet

2012年Imagenet图像识别大赛中,Alext提出的alexnet网络模型一鸣惊人,引爆了神经网络的应用热潮,并且赢得了2012届图像识别大赛的冠军,这也使得卷积神经网络真正意义上成为图像处理上的核心算法。上文介绍的LeNet-5出现在上个世纪,虽然是经典,但是迫于种种复杂的现实场景限制,只能在一些领域应用。不过,随着SVM等手工设计的特征的飞速发展,LeNet-5并没有形成很大的应用状况。随着ReLU与dropout的提出,以及GPU带来算力突破和互联网时代大数据的爆发,卷积神经网络带来历史的突破,AlexNet的提出让深度学习走上人工智能的最前端。

图像预处理

AlexNet的训练数据采用ImageNet的子集中的ILSVRC2010数据集,包含了1000类,共1.2百万的训练图像,50000张验证集,150000张测试集。在进行网络训练之前我们要对数据集进行预处理。首先我们要将不同分辨率的全部变成256x256规格的图像,变换方法是将的短边缩放到 256像素值,然后截取长边的中间位置的256个像素值,得到256x256大小的图像。除了对大小进行预处理,还需要对减均值,一般图像均是由RGB三原色构成,均值按RGB三分量分别求得,由此可以更加突出的特征,更方便后面的计算。

ReLU激活函数

之前我们提到常用的非线性的激活函数是sigmoid,它能够把输入的连续实值全部确定在0和1之间。但是这带来一个问题,当一个负数的很大时,那么输出就是0;如果是非常大的正数,输出就是1。这就会出现饱和的现象,饱和现象中神经元的梯度会变得特别小,这样必然会使得网络的学习更加困难。此外,sigmoid的output的值并不是0为均值,因为这会导致上一层输出的非0均值信号会直接输入到后一层的神经元上。所以AlexNet模型提出了ReLU函数,公式:f(x)=max(0,x)f(x)=max(0,x)。

用ReLU代替了Sigmoid,发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid快很多,这成了AlexNet模型的优势之一。

AlexNet模型提出了一个有效的模型组合方式,相比于单模型,只需要多花费一倍的时间,这种方式就做Dropout。在整个神经网络中,随机选取一半的神经元将它们的输出变成0。这种方式使得网络关闭了部分神经元,减少了过拟合现象。同时训练的迭代次数也得以增加。当时一个GTX580 GPU只有3GB内存,这使得大规模的运算成为不可能。但是,随着硬件水平的发展,当时的GPU已经可以实现并行计算了,并行计算之后两块GPU可以互相通信传输数据,这样的方式充分利用了GPU资源,所以模型设计利用两个GPU并行运算,大大提高了运算效率。

模型分析

AlexNet模型共有8层结构,其中前5层为卷积层,其中前两个卷积层和第五个卷积层有池化层,其他卷积层没有。后面3层为全连接层,神经元约有六十五万个,所需要训练的参数约六千万个。

Alexnet网络中各个层发挥了不同的作用,ReLU,多个CPU是为了提高训练速度,重叠pool池化是为了提高精度,且不容易产生过拟合,局部归一化响应是为了提高精度,而数据增益与dropout是为了减少过拟合。

VGG net

在ILSVRC-2014中,牛津大学的视觉几何组提出的VGGNet模型在定位任务名和分类任务名[[i]]。如今在计算机视觉领域,卷积神经网络的良好效果深得广大开发者的喜欢,并且上文提到的AlexNet模型拥有更好的效果,所以广大从业者学习者试图将其改进以获得更好地效果。而后来很多人经过验证认为,AlexNet模型中所谓的局部归一化响应浪费了计算资源,但是对性能却没有很大的提升。VGG的实质是AlexNet结构的增强版,它侧重强调卷积神经网络设计中的深度。将卷积层的深度提升到了19层,并且在当年的ImageNet大赛中的定位问题中获得了名的好成绩。整个网络向人们证明了我们是可以用很小的卷积核取得很好地效果,前提是我们要把网络的层数加深,这也论证了我们要想提高整个神经网络的模型效果,一个较为有效的方法便是将它的深度加深,虽然计算量会大大提高,但是整个复杂度也上升了,更能解决复杂的问题。虽然VGG网络已经诞生好几年了,但是很多其他网络上效果并不是很好地情况下,VGG有时候还能够发挥它的优势,让人有意想不到的收获。

与AlexNet网络非常类似,VGG共有五个卷积层,并且每个卷积层之后都有一个池化层。当时在ImageNet大赛中,作者分别尝试了六种网络结构。这六种结构大致相同,只是层数不同,少则11层,多达19层。网络结构的输入是大小为224224的RGB图像,最终将分类结果输出。当然,在输入网络时,要进行预处理。

VGG网络相比AlexNet网络,在网络的深度以及宽度上做了一定的拓展,具体的卷积运算还是与AlexNet网络类似。我们主要说明一下VGG网络所做的改进。点,由于很多研究者发现归一化层的效果并不是很好,而且占用了大量的计算资源,所以在VGG网络中作者取消了归一化层;第二点,VGG网络用了更小的3x3的卷积核,而两个连续的3x3的卷积核相当于5x5的感受野,由此类推,三个3x3的连续的卷积核也就相当于7x7的感受野。这样的变化使得参数量更小,节省了计算资源,将资源留给后面的更深层次的网络。第三点是VGG网络中的池化层特征池化核改为了2x2,而在AlexNet网络中池化核为3x3。这三点改进无疑是使得整个参数运算量下降,这样我们在有限的计算平台上能够获得更多的资源留给更深层的网络。由于层数较多,卷积核比较小,这样使得整个网络的特征提取效果很好。其实由于VGG的层数较多,所以计算量还是相当大的,卷积层比较多成了它最显著的特点。另外,VGG网络的拓展性能比较突出,结构比较简洁,所以它的迁移性能比较好,迁移到其他数据集的时候泛化性能好。到现在为止,VGG网络还经常被用来提出特征。所以当现在很多较新的模型效果不好时,使用VGG可能会解决这些问题。

GoogleNet

谷歌于2014年Imagenet挑战赛(ILSVRC14)凭借GoogleNet再次斩获名。这个通过增加了神经网络的深度和宽度获得了更好地效果,在此过程中保证了计算资源的不变。这个网络论证了加大深度,宽度以及训练数据的增加是现有深度学习获得更好效果的主要方式。但是增加尺寸可能会带来过拟合的问题,因为深度与宽度的加深必然会带来过量的参数。此外,增加网络尺寸也带来了对计算资源侵占过多的缺点。为了保证计算资源充分利用的前提下去提高整个模型的性能,作者使用了Inception模型,这个模型在下图中有展示,可以看出这个有点像金字塔的模型在宽度上使用并联的不同大小的卷积核,增加了卷积核的输出宽度。因为使用了较大尺度的卷积核增加了参数。使用了11的卷积核就是为了使得参数的数量最少。

Inception模块

上图表格为网络分析图,行为卷积层,输入为224×224×3 ,卷积核为7x7,步长为2,padding为3,输出的维度为112×112×64,这里面的7x7卷积使用了 7×1 然后 1×7 的方式,这样便有(7+7)×64×3=2,688个参数。第二行为池化层,卷积核为3×33×3,滑动步长为2,padding为 1 ,输出维度:56×56×64,计算方式:1/2×(112+2×1?3+1)=56。第三行,第四行与行,第二行类似。第 5 行 Inception module中分为4条支线,输入均为上层产生的 28×28×192 结果:第 1 部分,1×1 卷积层,输出大小为28×28×64;第 2 部分,先1×1卷积层,输出大小为28×28×96,作为输入进行3×3卷积层,输出大小为28×28×128;第 3部分,先1×1卷积层,输出大小为28×28×32,作为输入进行3×3卷积层,输出大小为28×28×32;而第3 部分3×3的池化层,输出大小为输出大小为28×28×32。第5行的Inception module会对上面是个结果的输出结果并联,由此增加网络宽度。

ResNet

2015年ImageNet大赛中,MSRA何凯明团队的ResidualNetworks,在ImageNet的诸多领域的比赛中上均获得了名的好成绩,而且这篇关于ResNet的论文Deep Residual Learning for Image Recognition也获得了CVPR2016的论文,实至而名归。

上文介绍了的VGG以及GoogleNet都是增加了卷积神经网络的深度来获得更好效果,也让人们明白了网络的深度与广度决定了训练的效果。但是,与此同时,宽度与深度加深的同时,效果实际会慢慢变。也就是说模型的层次加深,错误率提高了。模型的深度加深,以一定的错误率来换取学习能力的增强。但是深层的神经网络模型牺牲了大量的计算资源,学习能力提高的同时不应当产生比浅层神经网络更高的错误率。这个现象的产生主要是因为随着神经网络的层数增加,梯度消失的现象就越来越明显。所以为了解决这个问题,作者提出了一个深度残网络的结构Residual:

除此之外,作者还做了关于shortcut方式的实验,如果残网络模块的输入输出维度不一致,我们如果要使维度统一,必须要对维数较少的进行増维。而增维的效果是用0来填充。不过实验数据显示三者距很小,所以线性投影并不是特别需要。使用0来填充维度同时也保证了模型的复杂度控制在比较低的情况下。

随着实验的深入,作者又提出了更深的残模块。这种模型减少了各个层的参数量,将资源留给更深层数的模型,在保证复杂度很低的情况下,模型也没有出现梯度消失很明显的情况,因此目前模型可达1202层,错误率仍然控制得很低。但是层数如此之多也带来了过拟合的现象,不过诸多研究者仍在改进之中,毕竟此时的ResNet已经相对于其他模型在性能上了。

残网络的精髓便是shortcut。从一个角度来看,也可以解读为多种路径组合的一个网络。如下图:

ResNet可以做到很深,但是从上图中可以体会到,当网络很深,也就是层数很多时,数据传输的路径其实相对比较固定。我们似乎也可以将其理解为一个多人投票系统,大多数梯度都分布在论文中所谓的effective path上。

DenseNet

在Resnet模型之后,有人试图对ResNet模型进行改进,由此便诞生了ResNeXt模型。

这是对上面介绍的ResNet模型结合了GoogleNet中的inception模块思想,相在不同物种的层次上识别不同类别的对象,例如猫狗分类,这样的分类任务的特征是,较大的类间方,较小的类内方,例如典型的cifar10是在交通工具以及动物内部进行区分,都是语义上完全可以区分开的对象比于Resnet来说更加有效。随后,诞生了DenseNet模型,它直接将所有的模块连接起来,整个模型更加简单粗暴。稠密相连成了它的主要特点。

我们将DenseNet与ResNet相比较:

从上图中可以看出,相比于ResNet,DenseNet参数量明显减少很多,效果也更加优越,只是DenseNet需要消耗更多的内存。

总结

上面介绍了卷积神经网络发展史上比较的一些模型,这些模型非常经典,也各有优势。在算力不断增强的现在,各种新的网络训练的效率以及效果也在逐渐提高。从收敛速度上看,VGG>Inception>DenseNet>ResNet,从泛化能力来看,Inception>DenseNet=ResNet>VGG,从运算量看来,Inception

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

2. 使用一个小的卷积滤波器应用在不同的feature map层从而预测BB的类别的BB偏;

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

这些设的基础是模型的结构和训练过程。如果模型的结构不能很好地捕捉图像的特征,则可能会出现分类错误。如果训练数据不够丰富,则模型可能无法学习足够的信息来准确地分类图像。超参数也可能会对模型的行为产生影响,例如学习率过高可能会导致模型无法收敛,而过低则可能会使模型训练过慢。

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

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

若将输入设为X,将某一有参网络层设为H,那么以X为输入的此层的输出将为H(X)。一般的网络如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 中最深的亦是最有效的一种网络结构),另外则是顺着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。

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

数据输入层

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

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

将原模型中的卷积层(卷积核为55)全部替换成两个33级联的卷积层(就像VGG模型)训练误一直为2.3不变

用局部连接而不是全连接,同时权值共享。局部连接的概念参考局部感受域,即某个视神经元仅考虑某一个小区域的视觉输入,因此相比普通神经网络的全连接层(下一层的某一个神经元需要与前一层的所有连接),卷积网络的某一个卷积层的所有只负责前层输入的某一个区域(比如某个33的方块)。这样一来需要训练的权值数相比全连接而言会大大减如果我们需要区分不同的个体,不仅仅是物种类别或者子类,其就是一个识别问题,例如最典型的任务就是人脸识别。人脸识别对于计算机视觉领域落地是十分有意义的,它能够完成很多任务,例如安全维稳,考勤打卡,人脸解锁等应用场景都是和人脸识别这个实例级图像分类任务密切相关的。少,进而减小对样本空间大小的需求。权值共享的概念就是,某一隐藏层的所有神经元共用一组权值。这两个概念对应卷积层的话,恰好就是某个固定的卷积核。卷积核在图像上滑动时每处在一个位置分别对应一个“局部连接”的神经元,同时因为“权值共享”的缘故,这些神经元的参数一致,正好对应同一个卷积核。顺便补充下,不同卷积核对应不同的特征,比如不同方向的边(edge)就会分别对应不同的卷积核。激活函数f(x)用ReLU的话避免了x过大梯度趋于0(比如用sigmoid)而影响训练的权值的情况(即Gradient Vanishing)(2)网络越大、参数越多,计算复杂度越大,难以应用;。同时结果会更稀疏一些。

池化之后(例如保留邻域内或平均以舍弃一些信息)一定程度也压制了过拟合的情况。综述总体来说就是重复卷积-relu 来提取特征,进行池化之后再作更深层的特征提取,实质上深层卷积网络的主要作用在于特征提取。 一层直接用softmax来分类(获得一个介于0~1的值表达输入属于这一(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;类别的概率)。

vgg16运算速度

eg.vgg16网络:from models import VGG16_torch,model = vgg16()summary(mo首先,对于中每个ground truth,找到与其IOU的先验框,该先验框与其匹配,这样,可以保证每个ground truth一定与某个先验框匹配。通常称与ground truth匹配的先验框为正样本(其实应该是先验框对应的预测box,不过由于是一一对应的就这样称呼了),反之,若一个先验框没有与任何ground truth进行匹配,那么该先验框只能与背景匹配,就是负样本。一个中ground truth是非常少的, 而先验框却很多,如果仅按个原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以需要第二个原则。del,(3,32,32),dev=‘cpu’)

IPhone 16运算速度,它的运算速度很快,运动这速度很快

3. 可以在更小的输入中得到更好的检测效果(相比Faster-rcnn);

Vgg16运算速度这个你可以单独去测试仪一款计算器就可以测出它的速度

在densenent、resnet、mobilenet中VGG16的预测速度是最慢的

医院医生速度是非常快的英语一年友谊,有的人遇到可能会更快好有的人,他就是特别慢,所以说要跟你。

关于解释MATLAB代码及相关问题?

在训练过程中,首先要确定训练中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。

(a) 修改预训练模型的三层的步骤如下:

我觉得这个idea真的很赞,超级赞。这样不仅仅可以利用参数共享,而且很方便。已经有研究表明使用前面层的feature map可以优化语义分段质量semantic segmentation quality,因为前面的层可以获得更多的细节的优质的关于输入的信息。

加载 VGG-19 网络:

net 此外,对了保证训练的效果,我们仍需对训练数据进行更为严苛的处理。在256x256大小的图像中,截取227x227大小的图像,在此之后对取镜像,这样就使得原始数据增加了(256-224)x(256-224)x2= 2048倍。对RGB空间做PCA,然后对主成分做(0,0.1)的高斯扰动,结果使错误率下降1%。对测试数据而言,抽取以图像4个角落的大小为224224的图像,中心的224224大小的图像以及它们的镜像翻转图像,这样便可以获得10张图像,我们便可以利用softmax进行预测,对所有预测取平均作为最终的分类结果。= vgg19(); 使用 VGG-19 网络的前几层作为转移层:

layersTransfer = net.Layers(1:end-3); 计算类别数量:

numClasses = numel(categories(pictures.Labels)); 定义新的完整连接层,并将其添加到转移层之后:

layers = [

layersTransfer

fullyConnectedLayer(numClasses,'WeightLearnRateFactor', 20, ...

'BiasLearnRateFactor', 20)

softmaxLayer

classificationLayer]; 修改预训练模型的三层的原因是,预训练的模型是用来解决一般性问题的,而在这个例子中,我们希望模型能够识别花的种类。因此,我们需要修改三层,使它们能够将图像的特征与花的种类相关联。

(b) 运行结果是分类器对输入图像的预测类别。要改进结果,可以考虑以下几点:

增加训练数据的数量和多样性。

增加训练迭代次数。

调整超参数,如学习率和小批量大小。

使用数据增强来扩展训练数据。

尝试使用不同的模型结构。

(c) 关于模型的行为,可以做出如下设:

模型可能会更倾向于将图像分类为其中的主要物体,例如如果图像中有花,模型可能会将其分类为花,而不是将其分类为背景或其他物体。

模型可能会受到训练数据的影响,例如训练数据中缺乏某些类别或训练数据不够多样时。

模型可能会受到超参数的影响,例如学习率过高或过低、小批量大小过大或过小等。