aa9888993c85af7ba31db3b454ed7da0.png

卷积神经网络现在能够在一些电脑视觉任务上胜过人类的肉眼,例如图像分类。
也就是说,给出一个物体的照片,我们可以让电脑来回答这个照片是1000个特定种类物体中的哪一类这样的问题。
在本教程中,我们将使用几个keras已经内建好的预训练模型来进行图像分类,其中包括了:

  • VGG16
  • VGG19
  • ResNet50
  • InceptionV3
  • InceptionResNetV2
  • Xception
  • MobileNet
# 运行环境

开发一个简单的照片分类器

VGG16

1.获取范例图像

首先,我们需要一个我们可以进行分类的图像。
你可以在这里从google随意检索一些动物照片并下载到本地目录。例如:https://www.elephantvoices.org/images/slider/evimg16tf.jpg

601910bc95f17abc1f6e67cb74edc60c.png

也从百度上随便下载了一张猫的图片,都可以放到模型里面去预测试试。

f3cf69ddeb26eb8c99e6180658432997.png

2.加载VGG模型

加载在keras中已经预训练好的VGG-16的权重模型。

from 

3.加载和准备图像

接下来,我们可以将图像加载进来,并转换成预训练网络所要求的张量规格。
keras提供了一些工具来帮助完成这一步骤。
首先,我们可以使用load_img()函数加载图像,并将其大小调整为224x224像素所需的大小。

from 

接下来,我们可以将像素转换为Numpy数组,以便我们可以在keras中使用它。我们可以使用这个img_to_array()函数。

from 

VGG16网络期望单色阶(grey)或多色阶图像(rgb)来作为输入;这意味着输入数组需要是转换成四个维度:
(图像批次量,图像高,图像宽,图像色阶数) -> (batch_size,img_height,img_width,img_channels)
我们只有一个样本(一个图像)。我们可以通过调用reshape()来重新调整数组的形状,并添加额外的维度。

# 调整张量的维度

接下来,我们需要按照VGG在训练ImageNet数据一样的方法来对图像进行预处理。具体来说,从论文里谈到的:

The only preprocessing we do is subtracting the mean RGB value,computed on the training set,
from each pixel.Very Deep Convolutional Networks for Large-Scale Image Recognition,2014

keras提供了一个称为preprocess_input()的函数来为VGG网络准备新的图像输入。

from 

4.做一个预测

我们可以调用模型中的predict()函数来预测图像属于1000个已知对象类型的概率。

# 预测所有产出类别的概率

5.解释预测

keras提供了一个函数来解释称为decode_predictions()的概率。
它可以返回一个类别的列表和每一个类别概率,为了简单起见,我们只会秀出第一个概率最高的种类。

from 

VGG19

from 

ResNet50

from 

InceptionV3

from 

InceptionResNetV2

from 

MobileNet

from 

总结(Conclusion)

在这篇文章中有一些重点:

  • 在keras中已经预建了许多高级的图像识别的网络及预训练的权重
  • 需要了解每种高级图像识别的网络的结构以及输入的张量
  • 了解不同高级图像识别网络的训练变量与预训练的权重可以有效地帮助图像识别类型的任务。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐