ResNet, AlexNet, VGG, Inception: 理解各类各样的CNN架构
本文翻译自ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks,原做者保留版权node
卷积神经网络在视觉识别任务上的表现使人称奇。好的CNN网络是带有上百万参数和许多隐含层的“庞然怪物”。事实上,一个很差的经验规则是:网络越深,效果越好。AlexNet,VGG,Inception和ResNet是最近一些流行的CNN网络。为何这些网络表现如此之好?它们是如何设计出来的?为何它们设计成那样的结构?回答这些问题并不简单,可是这里咱们试着去探讨上面的一些问题。网络结构设计是一个复杂的过程,须要花点时间去学习,甚至更长时间去本身动手实验。首先,咱们先来讨论一个基本问题:git
为何CNN模型打败了传统的计算机视觉方法?
图像分类指的是给定一个图片将其分类成预先定义好的几个类别之一。图像分类的传统流程涉及两个模块:特征提取和分类。github
特征提取指的是从原始像素点中提取更高级的特征,这些特征能捕捉到各个类别间的区别。这种特征提取是使用无监督方式,从像素点中提取信息时没有用到图像的类别标签。经常使用的传统特征包括GIST, HOG, SIFT, LBP等。特征提取以后,使用图像的这些特征与其对应的类别标签训练一个分类模型。经常使用的分类模型有SVM,LR,随机森林及决策树等。算法
上面流程的一大问题是特征提取不能根据图像和其标签进行调整。若是选择的特征缺少必定的表明性来区分各个类别,模型的准确性就大打折扣,不管你采用什么样的分类策略。采用传统的流程,目前的一个比较好的方法是使用多种特征提取器,而后组合它们获得一种更好的特征。可是这须要不少启发式规则和人力来根据领域不一样来调整参数使得达到一个很好的准确度,这里说的是要接近人类水平。这也就是为何采用传统的计算机视觉技术须要花费多年时间才能打造一个好的计算机视觉系统(如OCR,人脸验证,图像识别,物体检测等),这些系统在实际应用中能够处理各类各样的数据。有一次,咱们用了6周时间为一家公司打造了一个CNN模型,其效果更好,采用传统的计算机视觉技术要达到这样的效果要花费一年时间。数据库
传统流程的另一个问题是它与人类学习识别物体的过程是彻底不同的。自从出生之初,一个孩子就能够感知周围环境,随着他的成长,他接触更多的数据,从而学会了识别物体。这是深度学习背后的哲学,其中并无创建硬编码的特征提取器。它将特征提取和分类两个模块集成一个系统,经过识别图像的特征来进行提取并基于有标签数据进行分类。后端
这样的集成系统就是多层感知机,即有多层神经元密集链接而成的神经网络。一个经典的深度网络包含不少参数,因为缺少足够的训练样本,基本不可能训练出一个不过拟合的模型。可是对于CNN模型,从头开始训练一个网络时你可使用一个很大的数据集如ImageNet。这背后的缘由是CNN模型的两个特色:神经元间的权重共享和卷积层之间的稀疏链接。这能够从下图中看到。在卷积层,某一个层的神经元只是和输入层中的神经元局部链接,并且卷积核的参数是在整个2-D特征图上是共享的。数组
为了理解CNN背后的设计哲学,你可能会问:其目标是什么?缓存
(1)准确度网络
若是你在搭建一个智能系统,最重要的固然是要尽量地准确。公平地来讲,准确度不只取决于网路,也取决于训练样本数量。所以,CNN模型通常在一个标准数据集ImageNet上作对比。架构
ImageNet项目仍然在继续改进,目前已经有包含21841类的14,197,122个图片。自从2010年,每一年都会举行ImageNet图像识别竞赛,比赛会提供从ImageNet数据集中抽取的属于1000类的120万张图片。每一个网络架构都是在这120万张图片上测试其在1000类上的准确度。
(2)计算量
大部分的CNN模型都须要很大的内存和计算量,特别是在训练过程。所以,计算量会成为一个重要的关注点。一样地,若是你想部署在移动端,训练获得的最终模型大小也须要特别考虑。你能够想象到,为了获得更好的准确度你须要一个计算更密集的网络。所以,准确度和计算量须要折中考虑。
除了上面两个因素,还有其余须要考虑的因素,如训练的容易度,模型的泛化能力等。下面按照提出时间介绍一些最流行的CNN架构,能够看到它们准确度愈来愈高。
AlexNet
AlexNet是一个较早应用在ImageNet上的深度网络,其准确度相比传统方法有一个很大的提高。它首先是5个卷积层,而后紧跟着是3个全链接层,以下图所示:
Alex Krizhevs提出的AlexNet采用了ReLU激活函数,而不像传统神经网络早期所采用的Tanh或Sigmoid激活函数,ReLU数学表达为:
ReLU相比Sigmoid的优点是其训练速度更快,由于Sigmoid的导数在稳定区会很是小,从而权重基本上再也不更新。这就是梯度消失问题。所以AlexNet在卷积层和全链接层后面都使用了ReLU。
AlexNet的另一个特色是其经过在每一个全链接层后面加上Dropout层减小了模型的过拟合问题。Dropout层以必定的几率随机地关闭当前层中神经元激活值,以下图所示:
为何Dropout有效?
Dropout背后理念和集成模型很类似。在Drpout层,不一样的神经元组合被关闭,这表明了一种不一样的结构,全部这些不一样的结构使用一个的子数据集并行地带权重训练,而权重总和为1。若是Dropout层有 个神经元,那么会造成
个不一样的子结构。在预测时,至关于集成这些模型并取均值。这种结构化的模型正则化技术有利于避免过拟合。Dropout有效的另一个视点是:因为神经元是随机选择的,因此能够减小神经元之间的相互依赖,从而确保提取出相互独立的重要特征。
VGG16
VGG16是牛津大学VGG组提出的。VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,5x5)。对于给定的感觉野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,由于多层非线性层能够增长网络深度来保证学习更复杂的模式,并且代价还比较小(参数更少)。
好比,3个步长为1的3x3卷积核连续做用在一个大小为7的感觉野,其参数总量为 ,若是直接使用7x7卷积核,其参数总量为
,这里
指的是输入和输出的通道数。并且3x3卷积核有利于更好地保持图像性质。VGG网络的架构以下表所示:
能够看到VGG-D,其使用了一种块结构:屡次重复使用同一大小的卷积核来提取更复杂和更具备表达性的特征。这种块结构( blocks/modules)在VGG以后被普遍采用。
VGG卷积层以后是3个全链接层。网络的通道数从较小的64开始,而后每通过一个下采样或者池化层成倍地增长,固然特征图大小成倍地减少。最终其在ImageNet上的Top-5准确度为92.3%。
GoogLeNet/Inception
尽管VGG能够在ImageNet上表现很好,可是将其部署在一个适度大小的GPU上是困难的,由于须要VGG在内存和时间上的计算要求很高。因为卷积层的通道数过大,VGG并不高效。好比,一个3x3的卷积核,若是其输入和输出的通道数均为512,那么须要的计算量为9x512x512。
在卷积操做中,输出特征图上某一个位置,其是与全部的输入特征图是相连的,这是一种密集链接结构。GoogLeNet基于这样的理念:在深度网路中大部分的激活值是没必要要的(为0),或者因为相关性是冗余。所以,最高效的深度网路架构应该是激活值之间是稀疏链接的,这意味着512个输出特征图是没有必要与全部的512输入特征图相连。存在一些技术能够对网络进行剪枝来获得稀疏权重或者链接。可是稀疏卷积核的乘法在BLAS和CuBlas中并无优化,这反而形成稀疏链接结构比密集结构更慢。
据此,GoogLeNet设计了一种称为inception的模块,这个模块使用密集结构来近似一个稀疏的CNN,以下图所示。前面说过,只有不多一部分神经元是真正有效的,因此一种特定大小的卷积核数量设置得很是小。同时,GoogLeNet使用了不一样大小的卷积核来抓取不一样大小的感觉野。
Inception模块的另一个特色是使用了一中瓶颈层(实际上就是1x1卷积)来下降计算量:
这里假定Inception模块的输入为192个通道,它使用128个3x3卷积核和32个5x5卷积核。5x5卷积的计算量为25x32x192,可是随着网络变深,网络的通道数和卷积核数会增长,此时计算量就暴涨了。为了不这个问题,在使用较大卷积核以前,先去下降输入的通道数。因此,Inception模块中,输入首先送入只有16个卷积核的1x1层卷积层,而后再送给5x5卷积层。这样总体计算量会减小为16x192+25x32x16。这种设计容许网络可使用更大的通道数。(译者注:之因此称1x1卷积层为瓶颈层,你能够想象一下一个1x1卷积层拥有最少的通道数,这在Inception模块中就像一个瓶子的最窄处)
GoogLeNet的另一个特殊设计是最后的卷积层后使用全局均值池化层替换了全链接层,所谓全局池化就是在整个2D特征图上取均值。这大大减小了模型的总参数量。要知道在AlexNet中,全链接层参数占整个网络总参数的90%。使用一个更深更大的网络使得GoogLeNet移除全链接层以后还不影响准确度。其在ImageNet上的top-5准确度为93.3%,可是速度还比VGG还快。
ResNet
从前面能够看到,随着网络深度增长,网络的准确度应该同步增长,固然要注意过拟合问题。可是网络深度增长的一个问题在于这些增长的层是参数更新的信号,由于梯度是从后向前传播的,增长网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,所以简单地去增长网络深度反而出现更高的训练偏差。残差网络ResNet设计一种残差模块让咱们能够训练更深的网络。
深度网络的训练问题称为退化问题,残差单元能够解决退化问题的背后逻辑在于此:想象一个网络A,其训练偏差为x。如今经过在A上面堆积更多的层来构建网络B,这些新增的层什么也不作,仅仅复制前面A的输出。这些新增的层称为C。这意味着网络B应该和A的训练偏差同样。那么,若是训练网络B其训练偏差应该不会差于A。可是实际上倒是更差,惟一的缘由是让增长的层C学习恒等映射并不容易。为了解决这个退化问题,残差模块在输入和输出之间创建了一个直接链接,这样新增的层C仅仅须要在原来的输入层基础上学习新的特征,即学习残差,会比较容易。
与GoogLeNet相似,ResNet也最后使用了全局均值池化层。利用残差模块,能够训练152层的残差网络。其准确度比VGG和GoogLeNet要高,可是计算效率也比VGG高。152层的ResNet其top-5准确度为95.51%。
ResNet主要使用3x3卷积,这点与VGG相似。在VGG基础上,短路链接插入进入造成残差网络。以下图所示:
残差网络实验结果代表:34层的普通网络比18层网路训练偏差还打,这就是前面所说的退化问题。可是34层的残差网络比18层残差网络训练偏差要好。
总结
随着愈来愈复杂的架构的提出,一些网络可能就流行几年就走下神坛,可是其背后的设计哲学倒是值得学习的。这篇文章对近几年比较流行的CNN架构的设计原则作了一个总结。译者注:能够看到,网络的深度愈来愈大,以保证获得更好的准确度。网络结构倾向采用较少的卷积核,如1x1和3x3卷积核,这说明CNN设计要考虑计算效率了。一个明显的趋势是采用模块结构,这在GoogLeNet和ResNet中能够看到,这是一种很好的设计典范,采用模块化结构能够减小咱们网络的设计空间,另一个点是模块里面使用瓶颈层能够下降计算量,这也是一个优点。这篇文章没有提到的是最近的一些移动端的轻量级CNN模型,如MobileNet,SqueezeNet,ShuffleNet等,这些网络大小很是小,并且计算很高效,能够知足移动端需求,是在准确度和速度之间作了平衡。
图像识别是当今深度学习的主流应用,而Keras是入门最容易、使用最便捷的深度学习框架,因此搞图像识别,你也得强调速度,不能磨叽。本文让你在最短期内突破五个流行网络结构,迅速达到图像识别技术前沿。

几个月前,我写了一篇关于如何使用已经训练好的卷积(预训练)神经网络模型(特别是VGG16)对图像进行分类的教程,这些已训练好的模型是用Python和Keras深度学习库对ImageNet数据集进行训练获得的。
这些已集成到(先前是和Keras分开的)Keras中的预训练模型可以识别1000种类别对象(例如咱们在平常生活中见到的小狗、小猫等),准确率很是高。
先前预训练的ImageNet模型和Keras库是分开的,须要咱们克隆一个单独github repo,而后加到项目里。使用单独的github repo来维护就好了。
不过,在预训练的模型(VGG1六、VGG1九、ResNet50、Inception V3 与 Xception)彻底集成到Keras库以前(不须要克隆单独的备份),个人教程已经发布了,经过下面连接能够查看集成后的模型地址。我打算写一个新的教程,演示怎么使用这些最早进的模型。
https://github.com/fchollet/keras/blob/master/keras/applications/vgg16.py
具体来讲,是先写一个Python脚本,能加载使用这些网络模型,后端使用TensorFlow或Theano,而后预测你的测试集。
Keras上的VGGNet、ResNet、Inception与Xception在本教程前半部分,咱们简单说说Keras库中包含的VGG、ResNet、Inception和Xception模型架构。
而后,使用Keras来写一个Python脚本,能够从磁盘加载这些预训练的网络模型,而后预测测试集。
最后,在几个示例图像上查看这些分类的结果。
Keras上最好的深度学习图像分类器
下面五个卷积神经网络模型已经在Keras库中,开箱即用:
一、VGG16
二、VGG19
三、ResNet50
四、Inception V3
五、Xception
咱们从ImageNet数据集的概述开始,以后简要讨论每一个模型架构。
ImageNet是个什么东东
ImageNet是一个手动标注好类别的图片数据库(为了机器视觉研究),目前已有22,000个类别。
然而,当咱们在深度学习和卷积神经网络的背景下听到“ImageNet”一词时,咱们可能会提到ImageNet视觉识别比赛,称为ILSVRC。
这个图片分类比赛是训练一个模型,可以将输入图片正确分类到1000个类别中的某个类别。训练集120万,验证集5万,测试集10万。
这1,000个图片类别是咱们在平常生活中遇到的,例如狗,猫,各类家居物品,车辆类型等等。ILSVRC比赛中图片类别的完整列表以下:
http://image-net.org/challenges/LSVRC/2014/browse-synsets
在图像分类方面,ImageNet比赛准确率已经做为计算机视觉分类算法的基准。自2012年以来,卷积神经网络和深度学习技术主导了这一比赛的排行榜。
在过去几年的ImageNet比赛中,Keras有几个表现最好的CNN(卷积神经网络)模型。这些模型经过迁移学习技术(特征提取,微调(fine-tuning)),对ImaegNet之外的数据集有很强的泛化能力。
VGG16 与 VGG19

在2014年,VGG模型架构由Simonyan和Zisserman提出,在“极深的大规模图像识别卷积网络”(Very Deep Convolutional Networks for Large Scale Image Recognition)这篇论文中有介绍。
论文地址:https://arxiv.org/abs/1409.1556
VGG模型结构简单有效,前几层仅使用3×3卷积核来增长网络深度,经过max pooling(最大池化)依次减小每层的神经元数量,最后三层分别是2个有4096个神经元的全链接层和一个softmax层。
“16”和“19”表示网络中的须要更新须要weight(要学习的参数)的网络层数(下面的图2中的列D和E),包括卷积层,全链接层,softmax层:

在2014年,16层和19层的网络被认为已经很深了,但和如今的ResNet架构比起来已不算什么了,ResNet能够在ImageNet上作到50-200层的深度,而对于CIFAR-10了来讲能够作到1000+的深度。
Simonyan和Zisserman发现训练VGG16和VGG19有些难点(尤为是深层网络的收敛问题)。所以为了能更容易进行训练,他们减小了须要更新weight的层数(图2中A列和C列)来训练较小的模型。
较小的网络收敛后,用较小网络学到的weight初始化更深网络的weight,这就是预训练。这样作看起没有问题,不过预训练模型在能被使用以前,须要长时间训练。
在大多数状况下,咱们能够不用预训练模型初始化,而是更倾向于采用Xaiver/Glorot初始化或MSRA初始化。读All you need is a good init这篇论文能够更深了解weight初始化和深层神经网络收敛的重要性。
MSRA初始化: https://arxiv.org/abs/1502.01852
All you need is a good init: https://arxiv.org/abs/1511.06422
不幸的是,VGG有两个很大的缺点:
一、网络架构weight数量至关大,很消耗磁盘空间。
二、训练很是慢
因为其全链接节点的数量较多,再加上网络比较深,VGG16有533MB+,VGG19有574MB。这使得部署VGG比较耗时。咱们仍然在不少深度学习的图像分类问题中使用VGG,然而,较小的网络架构一般更为理想(例如SqueezeNet、GoogLeNet等)。
ResNet(残差网络)
与传统的顺序网络架构(如AlexNet、OverFeat和VGG)不一样,其加入了y=x层(恒等映射层),可让网络在深度增长状况下却不退化。下图展现了一个构建块(build block),输入通过两个weight层,最后和输入相加,造成一个微架构模块。ResNet最终由许多微架构模块组成。
在2015年的“Deep Residual Learning for Image Recognition”论文中,He等人首先提出ResNet,ResNet架构已经成为一项有意义的模型,其能够经过使用残差模块和常规SGD(须要合理的初始化weight)来训练很是深的网络:
论文地址:https://arxiv.org/abs/1512.03385

其在2016年后发表的文章“Identity Mappings in Deep Residual Networks”中代表,经过使用identity mapping(恒等映射)来更新残差模块,能够得到很高的准确性。
论文地址:https://arxiv.org/abs/1603.05027

须要注意的是,Keras库中的ResNet50(50个weight层)的实现是基于2015年前的论文。
即便是RESNET比VGG16和VGG19更深,模型的大小其实是至关小的,用global average pooling(全局平均水平池)代替全链接层能下降模型的大小到102MB。
Inception V3
“Inception”微架构由Szegedy等人在2014年论文"Going Deeper with Convolutions"中首次提出。
论文地址:https://arxiv.org/abs/1409.4842

Inception模块的目的是充当“多级特征提取器”,使用1×一、3×3和5×5的卷积核,最后把这些卷积输出链接起来,当作下一层的输入。
这种架构先前叫GoogLeNet,如今简单地被称为Inception vN,其中N指的是由Google定的版本号。Keras库中的Inception V3架构实现基于Szegedy等人后来写的论文"Rethinking the Inception Architecture for Computer Vision",其中提出了对Inception模块的更新,进一步提升了ImageNet分类效果。Inception V3的weight数量小于VGG和ResNet,大小为96MB。
论文地址:https://arxiv.org/abs/1512.00567
Xception

Xception是由François Chollet本人(Keras维护者)提出的。Xception是Inception架构的扩展,它用深度可分离的卷积代替了标准的Inception模块。
原始论文“Xception: Deep Learning with Depthwise Separable Convolutions”在这里:
论文地址:https://arxiv.org/abs/1610.02357
Xception的weight数量最少,只有91MB。
至于说SqueezeNet?

SqueezeNet架构经过使用squeeze卷积层和扩展层(1x1和3X3卷积核混合而成)组成的fire moule得到了AlexNet级精度,且模型大小仅4.9MB。
虽然SqueezeNet模型很是小,但其训练须要技巧。在我即将出版的书“深度学习计算机视觉与Python”中,详细说明了怎么在ImageNet数据集上从头开始训练SqueezeNet。
用Python和上述Keras库来给图像分类让咱们学习如何使用Keras库中预训练的卷积神经网络模型进行图像分类吧。
新建一个文件,命名为classify_image.py,并输入以下代码:

第2-13行的做用是导入所需Python包,其中大多数包都属于Keras库。
具体来讲,第2-6行分别导入ResNet50,Inception V3,Xception,VGG16和VGG19。
须要注意,Xception网络只能用TensorFlow后端(若是使用Theano后端,该类会抛出错误)。
第7行,使用imagenet_utils模块,其有一些函数能够很方便的进行输入图像预处理和解码输出分类。
除此以外,还导入的其余辅助函数,其次是NumPy进行数值处理,cv2进行图像编辑。
接下来,解析命令行参数:

咱们只须要一个命令行参数--image,这是要分类的输入图像的路径。
还能够接受一个可选的命令行参数--model,指定想要使用的预训练模型,默认使用vgg16。
经过命令行参数获得指定预训练模型的名字,咱们须要定义一个Python字典,将模型名称(字符串)映射到其真实的Keras类。

第25-31行定义了MODELS字典,它将模型名称字符串映射到相应的类。
若是在MODELS中找不到--model名称,将抛出AssertionError(第34-36行)。
卷积神经网络将图像做为输入,而后返回与类标签相对应的一组几率做为输出。
经典的CNN输入图像的尺寸,是224×22四、227×22七、256×256和299×299,但也能够是其余尺寸。
VGG16,VGG19和ResNet均接受224×224输入图像,而Inception V3和Xception须要299×299像素输入,以下面的代码块所示:

将inputShape初始化为224×224像素。咱们还使用函数preprocess_input执行平均减法。
然而,若是使用Inception或Xception,咱们须要把inputShape设为299×299像素,接着preprocess_input使用separate pre-processing function,图片能够进行不一样类型的缩放。
下一步是从磁盘加载预训练的模型weight(权重)并实例化模型:

第58行,从--model命令行参数获得model的名字,经过MODELS词典映射到相应的类。
第59行,而后使用预训练的ImageNet权重实例化卷积神经网络。
注意:VGG16和VGG19的权重文件大于500MB。ResNet为〜100MB,而Inception和Xception在90-100MB之间。若是是第一次运行此脚本,这些权重文件自动下载并缓存到本地磁盘。根据您的网络速度,这可能须要一些时间。然而,一旦权重文件被下载下来,他们将不须要从新下载,再次运行classify_image.py会很是快。
模型如今已经加载并准备好进行图像分类 - 咱们只须要准备图像进行分类:

第65行,从磁盘加载输入图像,inputShape调整图像的宽度和高度。
第66行,将图像从PIL/Pillow实例转换为NumPy数组。
输入图像如今表示为(inputShape[0],inputShape[1],3)的NumPy数组。
第72行,咱们一般会使用卷积神经网络分批对图像进行训练/分类,所以咱们须要经过np.expand_dims向矩阵添加一个额外的维度(颜色通道)。
通过np.expand_dims处理,image具备的形状(1,inputShape[0],inputShape[1],3)。如没有添加这个额外的维度,调用.predict会致使错误。
最后,第76行调用相应的预处理功能来执行数据归一化。
通过模型预测后,并得到输出分类:

第80行,调用CNN中.predict获得预测结果。根据这些预测结果,将它们传递给ImageNet辅助函数decode_predictions,会获得ImageNet类标签名字(id转换成名字,可读性高)以及与标签相对应的几率。
而后,第85行和第86行将前5个预测(即具备最大几率的标签)输出到终端 。
在咱们结束示例以前,咱们将在此处执行的最后一件事情,经过OpenCV从磁盘加载咱们的输入图像,在图像上绘制#1预测,最后将图像显示在咱们的屏幕上:

查看预训练模型的实际运行,请看下节。
VGGNet、ResNet、Inception与Xception的分类结果这篇博文中的全部示例都使用Keras>=2.0和TensorFlow后端。若是使用TensorFlow,请确保使用版本>=1.0,不然将遇到错误。我也用Theano后端测试了这个脚本,并确承认以使用Theano。
安装TensorFlow/Theano和Keras后,点击底部的源代码+示例图像连接就可下载。
如今咱们能够用VGG16对图像进行分类:

咱们能够看到VGG16正确地将图像分类为“足球”,几率为93.43%。
要使用VGG19,咱们只须要更改--network命令行参数:

VGG19可以以91.76%的几率将输入图像正确地分类为“convertible”。看看其余top-5预测:“跑车”的几率为4.98%(实际上是轿车),“豪华轿车”为1.06%(虽然不正确但看着合理),“车轮”为0.75%(从模型角度来讲也是正确的,由于图像中有车轮)。
在如下示例中,咱们使用预训练ResNet架构,能够看下top-5几率值:

ResNet正确地将ClintEastwood持枪图像分类为“左轮手枪”,几率为69.79%。在top-5中还有,“步枪”为7.74%,“冲锋枪”为5.63%。因为"左轮手枪"的视角,枪管较长,CNN很容易认为是步枪,因此获得的步枪也较高。
下一个例子用ResNet对狗的图像进行分类:

狗的品种被正确识别为“比格犬”,具备94.48%的几率。
而后,我尝试从这个图像中分出《加勒比海盗》演员约翰尼・德普:

虽然ImageNet中确实有一个“船”类,但有趣的是,Inception网络可以正确地将场景识别为“(船)残骸”,且有具备96.29%几率的。全部其余预测标签,包括 “海滨”,“独木舟”,“桨”和“防波堤”都是相关的,在某些状况下也是绝对正确的。
对于Inception网络的另外一个例子,我给办公室的沙发拍摄了照片:

Inception正确地预测出图像中有一个“桌灯”,几率为69.68%。其余top-5预测也是彻底正确的,包括“工做室沙发”、“窗帘”(图像的最右边,几乎不显眼)“灯罩”和“枕头”。
Inception虽然没有被用做对象检测器,但仍然可以预测图像中的前5个对象。卷积神经网络能够作到完美的对物体进行识别!
再来看下Xception:

这里咱们有一个苏格兰桶的图像,尤为是我最喜欢的苏格兰威士忌,拉加维林。Xception将此图像正确地分类为 “桶”。
最后一个例子是使用VGG16进行分类:

几个月前,当我打完《巫师 III》(The Wild Hunt)这局游戏以后,我给显示器照了这个照片。VGG16的第一个预测是“家庭影院”,这是一个合理的预测,由于top-5预测中还有一个“电视/监视器”。
从本文章的示例能够看出,在ImageNet数据集上预训练的模型可以识别各类常见的平常对象。你能够在你本身的项目中使用这个代码!
总结简单回顾一下,在今天的博文中,咱们介绍了在Keras中五个卷积神经网络模型:
VGG16
VGG19
ResNet50
Inception V3
Xception
此后,我演示了如何使用这些神经网络模型来分类图像。但愿本文对你有帮助。
原文地址:
http://www.pyimagesearch.com/2017/03/20/imagenet-vggnet-resnet-inception...