卷积神经网络现在能够在一些电脑视觉任务上胜过人类的肉眼,例如图像分类。
也就是说,定义一个物体的照片,我们可以让电脑来回答这个照片是1000个特定种类物体中的哪一类这样的问题。
在本教程中,我们将使用几个Keras己经内建好的预训练模型来进行图像分类,其中包括了:
- VGG16
- VGG19
- ResNet50
- 盗梦空间V3
- 盗版ResNetV2
- Xception
- 移动网
使用TensorFlow后端
平台:Windows-7-6.1.7601-SP1
Tensorflow版本:1.4.0
Keras版本:2.1.1
开发一个简单的照片分类器
VGG16
获取样本图像
首先,我们需要一个我们可以进行分类的图像。
您可以在这里从Google随意检索一些动物照片并下载到这个jupyter notebook所处的目录。典型的说:我下载了:https://www.elephantvoices.org/images/slider/evimg16tf.jpg
加载VGG模型
加载在Keras己经预训练好的VGG-16的权重模型档。
加载和准备图像
接下来,我们可以将图像加载进来,并转换成预训练网络所要求的张量规格。
Keras提供了一些工具来帮助完成这一步骤。
首先,我们可以使用load_img()函数加载图像,对其大小调整为224×224所需的大小。
接下来,我们可以将其转换为NumPy复制,杀死我们可以在Keras中使用它。我们可以使用这个img_to_array()函数。
image.shape:(224,224,3)
VGG16网络期望单色阶(灰色)或多色阶图像(rgb)来作为输入;这意味着输入数组需要是转换成四个维度:
(图像尺寸,图像高,图像宽,图像色阶数)->(batch_size,img_height,img_width,img_channels)
我们只有一个样本(一个图像)。我们可以通过调用reshape()来重新调整数组的形状,并添加额外的尺寸。
image.shape:(1,224,224,3)
接下来,我们需要按照VGG在训练ImageNet数据一样的方法来对图像进行前处理。具体而言,从论文里提出:
我们唯一要做的预处理就是从每个像素中减去在训练集上计算出的RGB平均值。
2014年,《用于深度图像识别的超深度卷积网络》。
Keras提供了一个称为preprocess_input()的函数来为VGG网络准备新的图像输入。
做一个预测
我们可以调用模型中的predict()函数来预测图像属于1000个已知对像类型的机率。
解释预测
Keras提供了一个函数来解释所谓的decode_predictions()的概率。
它可以返回一个类别的列表和每一个类别机率,为了简单起见,我们只会秀出第一个机率最高的种类。
African_elephant(30.40%)
VGG19
image.shape:(224,224,3)
image.shape:(1,224,224,3)
图斯克(53.61%)
ResNet50
image.shape:(224,224,3)
image.shape:(1,224,224,3)
African_elephant(47.35%)
InceptionV3
image.shape:(299,299,3)
image.shape:(1、299、299、3)
大熊猫(94.42%)
InceptionResNetV2
image.shape:(299,299,3)
image.shape:(1、299、299、3)
African_elephant(62.94%)
MobileNet
image.shape:(224,224,3)
image.shape:(1,224,224,3)
非洲象(90.81%)
总结(结论)
在这篇文章中有一些个人学习到的一些有趣的重点:
- 在Keras中己经预建了许多高级的图像识别的网络及预训练的权重
- 需要了解每个高级图像识别的网络的结构与输入的张量
- 了解不同高级图像识别的网络的训练变数量与预训练的权重可以有效帮助图像识别类型的任务