卷积神经网络现在能够在一些电脑视觉任务上胜过人类的肉眼,例如图像分类。
也就是说,定义一个物体的照片,我们可以让电脑来回答这个照片是1000个特定种类物体中的哪一类这样的问题。
在本教程中,我们将使用几个Keras己经内建好的预训练模型来进行图像分类,其中包括了:
- VGG16
- VGG19
- ResNet50
- 盗梦空间V3
- 盗版ResNetV2
- Xception
- 移动网
#这个Jupyter笔记本的环境
进口 平台,
进口 tensorflow
进口 keras
打印(“平台:{} ” 。 格式(平台。平台()))打印(“Tensorflow版本:{} ” 。 格式(tensorflow 。__version__ ))打印(“ keras版本:{} “ 。 格式(keras 。__version__ ))
%matplotlib直列
进口 matplotlib.pyplot 作为 PLT
进口 matplotlib.image 作为 mpimg
进口 numpy的 作为 NP
从 IPython.display 进口 图片
使用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.applications.vgg16 导入 VGG16
#载入权重
model_vgg16 = VGG16 ()
加载和准备图像
接下来,我们可以将图像加载进来,并转换成预训练网络所要求的张量规格。
Keras提供了一些工具来帮助完成这一步骤。
首先,我们可以使用load_img()函数加载图像,对其大小调整为224×224所需的大小。
从 keras.preprocessing.image 导入 load_img
#载入图像档
img_file = 'evimg16tf.jpg'
图像 = load_img (img_file , target_size = (224 , 224 )) #因为VGG16的模型的输入是224x224
接下来,我们可以将其转换为NumPy复制,杀死我们可以在Keras中使用它。我们可以使用这个img_to_array()函数。
从 keras.preprocessing.image 导入 img_to_array
#将图像资料转为numpy的阵列
图像 = img_to_array (图像) #RGB
打印(“image.shape:” , 图像。形状)
image.shape:(224,224,3)
VGG16网络期望单色阶(灰色)或多色阶图像(rgb)来作为输入;这意味着输入数组需要是转换成四个维度:
(图像尺寸,图像高,图像宽,图像色阶数)->(batch_size,img_height,img_width,img_channels)
我们只有一个样本(一个图像)。我们可以通过调用reshape()来重新调整数组的形状,并添加额外的尺寸。
#调整张量的尺寸
image = image 。重塑((1 , 图像。形状[ 0 ], 图像。形状[ 1 ], 图象。形状[ 2 ]))
打印(“image.shape:” , 图像。形状)
image.shape:(1,224,224,3)
接下来,我们需要按照VGG在训练ImageNet数据一样的方法来对图像进行前处理。具体而言,从论文里提出:
我们唯一要做的预处理就是从每个像素中减去在训练集上计算出的RGB平均值。
2014年,《用于深度图像识别的超深度卷积网络》。
Keras提供了一个称为preprocess_input()的函数来为VGG网络准备新的图像输入。
从 keras.applications.vgg16 导入 preprocess_input
#准备VGG模型的图像
image = preprocess_input (image )
做一个预测
我们可以调用模型中的predict()函数来预测图像属于1000个已知对像类型的机率。
#预测所有产出类别的机率
y_pred = model_vgg16 。预测(图片)
解释预测
Keras提供了一个函数来解释所谓的decode_predictions()的概率。
它可以返回一个类别的列表和每一个类别机率,为了简单起见,我们只会秀出第一个机率最高的种类。
从 keras.applications.vgg16 导入 encode_predictions
#将机率转换为类别标签
label = encode_predictions (y_pred )
#检索最可能的结果,例如最高的概率
label = 标签[ 0 ] [ 0 ]
#打印预测结果
print (' %s (%.2f %% )' % (标签[ 1 ], 标签[ 2 ] * 100 ))
African_elephant(30.40%)
VGG19
从 keras.applications.vgg19 进口 VGG19
从 keras.preprocessing 导入 图像
从 keras.applications.vgg19 进口 preprocess_input
从 keras.applications.vgg19 进口 decode_predictions
#载入权重
model_vgg19 = VGG19 (权重= 'imagenet' )#
载入图像档
img_file = 'evimg16tf.jpg'
图像 = load_img (img_file , target_size = (224 , 224 )) #因为VGG19的模型的输入是224x224
#将图像资料转为numpy的阵列
图像 = img_to_array (图像) #RGB
打印(“image.shape:” , 图像。形状)
#调整张量的尺寸
image = image 。重塑((1 , 图像。形状[ 0 ], 图像。形状[ 1 ], 图象。形状[ 2 ]))
的打印(“image.shape:” , 图像。形状)
#准备模型所需要的图像前处理
image = preprocess_input (image )
#预测所有
产出 类别的机率y_pred = model_vgg19 。预测(图片)
#将机率转换为类别标签
label = encode_predictions (y_pred )
#检索最可能的结果,例如最高的概率
label = 标签[ 0 ] [ 0 ]
#打印预测结果
print (' %s (%.2f %% )' % (标签[ 1 ], 标签[ 2 ] * 100 )
image.shape:(224,224,3)
image.shape:(1,224,224,3)
图斯克(53.61%)
ResNet50
从 keras.applications.resnet50 进口 ResNet50
从 keras.preprocessing 导入 图像
从 keras.applications.resnet50 进口 preprocess_input
从 keras.applications.resnet50 进口 decode_predictions
#载入权重
model_resnet50 = ResNet50 (权重= 'imagenet' )
#
加载 图像档img_file = 'evimg16tf.jpg'
#因为RESNET的模型的输入是224x224
图像 = load_img (img_file , target_size = (224 , 224 ))
#将图像资料转为numpy的阵列
图像 = img_to_array (图像) #RGB
打印(“image.shape:” , 图像。形状)
#调整张量的尺寸
image = image 。重塑((1 , 图像。形状[ 0 ], 图像。形状[ 1 ], 图象。形状[ 2 ]))
的打印(“image.shape:” , 图像。形状)
#准备模型所需要的图像前处理
image = preprocess_input (image )
#预测所有
产出 类别的机率y_pred = model_resnet50 。预测(图片)
#将机率转换为类别标签
label = encode_predictions (y_pred )
#检索最可能的结果,例如最高的概率
label = 标签[ 0 ] [ 0 ]
#打印预测结果
print (' %s (%.2f %% )' % (标签[ 1 ], 标签[ 2 ] * 100 ))
image.shape:(224,224,3)
image.shape:(1,224,224,3)
African_elephant(47.35%)
InceptionV3
从 keras.applications.inception_v3 进口 InceptionV3
从 keras.preprocessing 导入 图像
从 keras.preprocessing.image 进口 load_img
从 keras.applications.inception_v3 进口 preprocess_input
从 keras.applications.inception_v3 进口 decode_predictions
#
加载 权重model_inception_v3 = InceptionV3 (权重= 'imagenet' )
#载入图像档
img_file = 'image.jpg的'
#InceptionV3的模型的输入是299x299
IMG = load_img (img_file , target_size = (299 , 299 ))
#将图像资料转为numpy array
image = image 。img_to_array (IMG ) #RGB
打印(“image.shape:” , 图像。形状)
#调整张量的尺寸
image = image 。重塑((1 , 图像。形状[ 0 ], 图像。形状[ 1 ], 图象。形状[ 2 ]))
的打印(“image.shape:” , 图像。形状)
#准备模型所需要的图像前处理
image = preprocess_input (image )
#预测所有
产出 类别的机率y_pred = model_inception_v3 。预测(图片)
#将机率转换为类别标签
label = encode_predictions (y_pred )
#检索最可能的结果,例如最高的概率
label = 标签[ 0 ] [ 0 ]
#打印预测结果
print (' %s (%.2f %% )' % (标签[ 1 ], 标签[ 2 ] * 100 ))
image.shape:(299,299,3)
image.shape:(1、299、299、3)
大熊猫(94.42%)
InceptionResNetV2
从 keras.applications.inception_resnet_v2 进口 InceptionResNetV2
从 keras.preprocessing 导入 图像
从 keras.applications.inception_resnet_v2 进口 preprocess_input
从 keras.applications.inception_resnet_v2 进口 decode_predictions
#
加载 权重model_inception_resnet_v2 = InceptionResNetV2 (权重= 'imagenet' )
#
加载 图像档img_file = 'evimg16tf.jpg'
#InceptionResNetV2的模型的输入是299x299
图像 = load_img (img_file , target_size = (299 , 299 ))
#将图像资料转为numpy的阵列
图像 = img_to_array (图像) #RGB
打印(“image.shape:” , 图像。形状)
#调整张量的尺寸
image = image 。重塑((1 , 图像。形状[ 0 ], 图像。形状[ 1 ], 图象。形状[ 2 ]))
的打印(“image.shape:” , 图像。形状)
#准备模型所需要的图像前处理
image = preprocess_input (image )
#预测所有目标类别的机率
y_pred = model_inception_resnet_v2 。预测(图片)
#将机率转换为类别标签
label = encode_predictions (y_pred )
#检索最可能的结果,例如最高的概率
label = 标签[ 0 ] [ 0 ]
#打印预测结果
print (' %s (%.2f %% )' % (标签[ 1 ], 标签[ 2 ] * 100 ))
image.shape:(299,299,3)
image.shape:(1、299、299、3)
African_elephant(62.94%)
MobileNet
从 keras.applications.mobilenet 进口 MobileNet
从 keras.preprocessing 导入 图像
从 keras.applications.mobilenet 进口 preprocess_input
从 keras.applications.mobilenet 进口 decode_predictions
#
加载 权重model_mobilenet = MobileNet (权重= 'imagenet' )
#
加载 图像档img_file = 'evimg16tf.jpg'
#MobileNet的模型的输入是224x224
图像 = load_img (img_file , target_size = (224 , 224 ))
#将图像资料转为numpy的阵列
图像 = img_to_array (图像) #RGB
打印(“image.shape:” , 图像。形状)
#调整张量的尺寸
image = image 。重塑((1 , 图像。形状[ 0 ], 图像。形状[ 1 ], 图象。形状[ 2 ]))
的打印(“image.shape:” , 图像。形状)
#准备模型所需要的图像前处理
image = preprocess_input (image )
#预测所有目标类别的机率
y_pred = model_mobilenet 。预测(图片)
#将机率转换为类别标签
label = encode_predictions (y_pred )
#检索最可能的结果,例如最高的概率
label = 标签[ 0 ] [ 0 ]
#打印预测结果
print (' %s (%.2f %% )' % (标签[ 1 ], 标签[ 2 ] * 100 ))
image.shape:(224,224,3)
image.shape:(1,224,224,3)
非洲象(90.81%)
总结(结论)
在这篇文章中有一些个人学习到的一些有趣的重点:
- 在Keras中己经预建了许多高级的图像识别的网络及预训练的权重
- 需要了解每个高级图像识别的网络的结构与输入的张量
- 了解不同高级图像识别的网络的训练变数量与预训练的权重可以有效帮助图像识别类型的任务