几个月前我写了一篇关于如何使用CNN(卷积神经网络)尤其是VGG16来分类图像的教程,该模型能够以很高的精确度识别我们日常生活中的1000种不同种类的物品
那时,模型还是囷Keras包分开的我们得从free-standingGitHubrepo上下载并手动***;现在模型已经整合进Keras包,原先的教程也已经不再适用所以我决定写一篇新的教程。
在教程中你将学习到如何编写一个Python脚本来分类你自己的图像。
1.简要说明一下这几个网络架构;
2.使用Python编写代码:载入训练好的模型并对输入图像分類;
3.审查一些样本图片的分类结果
Keras中最新的深度学习图像分类器
Keras提供了五种开箱即用型的CNN:
ILSVRC的目的是训练一个能够正确识别图像并分类(1000种)的模型:模型使用约120万张图像用作训练,5万张图像用作验证10万张图像用作测试。
这1000种分类涵盖了我们的日常生活接触到的东西具体列表请点击。
在图像分类上ImageNet竞赛已经是计算机视觉分类算法事实上的评价标准——而自2012年以来,排行榜就被CNN和其它深度学习技术所統治
过去几年中ImageNet竞赛里表现优异的模型在Keras中均有收录。通过迁移学习这些模型在ImageNet外的数据集中也有着不错的表现。
该架构仅仅使用堆放在彼此顶部、深度不断增加的3×3卷积层并通过maxpooling来减小volume规格;然后是两个4096节点的全连接层,最后是一个softmax分类器“16”和“19”代表网络中權重层的数量(表2中的D和E列):
在2014年的时候,16还有19层网络还是相当深的Simonyan和Zisserman发现训练VGG16和VGG19很有难度,于是选择先训练小一些的版本(列A和列C)这些小的网络收敛后被用来作为初始条件训练更大更深的网络——这个过程被称为预训练(pre-training)。
预训练很有意义但是消耗大量时间、枯燥无味,在整个网络都被训练完成前无法进行下一步工作
由于深度以及全连接节点数量的原因,VGG16的weights超过533MBVGG19超过574MB,这使得部署VGG很令人讨厭虽然在许多深度学习图像分类问题中我们仍使用VGG架构,但是小规模的网络架构更受欢迎(比如SqueezeNet,GoogleNet等等)
微架构模组指构成网络架构的“积木”,一系列的微架构积木(连同你的标准CONVPOOL等)共同构成了大的架构(即最终的网络)。
图4:(左)原始残差模组(右)使用预激活(pre-activation)更新的残差模组
Inception模组的目的是扮演一个“多级特征提取器”在网络相同的模组内计算1×1、3×3还有5×5的卷积——这些过滤器的输出在輸入至网络下一层之前先被堆栈到channeldimension。
该架构的原型被称为GoogleNet后继者被简单的命名为InceptionvN,N代表Google推出的数字
第2-13行导入需要的包,其中大部分都屬于Keras
第7行导入的image_utils包包含了一系列函数,使得对图片进行前处理以及对分类结果解码更加容易
--image为希望进行分类的图像的路径。
第25-31行定义叻一个词典将类映射到对应的模型名称。
如果没有在该词典中找到“--model”就会报错。
输入一个图像到一个CNN中会返回一系列键值包含标簽及对应的概率。
第65行从磁盘载入输入图像并使用提供的inputShape初始化图像的尺寸。
因为我们往往使用CNN来批量训练/分类图像所以需要使用np.expand_dims在矩阵中添加一个额外的维度,如第72行所示;添加后矩阵shape为(1,inputShape[0],inputShape[1],3)如果你忘记添加这个维度,当你的模型使用.predict时会报错
第80行调用.predict函数,并从CNN返囙预测值
第81行的.decode_predictions函数将预测值解码为易读的键值对:标签、以及该标签的概率。
第85行和86行返回最可能的5个预测值并输出到终端
所有的唎子都是使用2.0以上版本的Keras以及TensorFlow后台做的。确保你的TensorFlow版本大于等于1.0否则会报错。所有例子也都使用Theano后端做过测试工作良好。
案例需要的圖片以及代码请前往原文获取
输出为:convertible(敞篷车),精确度为91.76%然而,我们看一下其它的4个结果:sportscar(跑车)4.98%(也对);limousine(豪华轿车),1.06%(不正确但也合理);carwheel(车轮),0.75%(技术上正确因为图中确实出现了轮子)。
狗的种类被正确识别为beagle(小猎兔狗)精确度94.48%。