使用Keras预训练好的模型进行目标类别预测详解

  • Post category:Python

使用Keras预训练好的模型进行目标类别预测详解

Keras是一个强大的深度学习框架,它提供了许多预训练好的模型,如VGG、ResNet等。这些模型已经在大量的图像数据集上进行了训练,因此可以作为特征提取器使用。我们可以将一个预训练好的模型加载到内存中,然后将待预测的图像传入模型,从模型中获取特征,最终使用分类器对特征进行处理,以得出预测结果。下面是使用Keras预训练好的模型进行目标类别预测的详细步骤:

步骤1:加载预训练好的模型

Keras提供了一些预训练好的模型,可以在官方网站上下载。在加载预训练好的模型之前,我们需要导入必要的库:

from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.applications.inception_v3 import InceptionV3

上述代码分别导入了VGG、ResNet和InceptionV3三种模型。这里以VGG为例,加载VGG模型的代码如下:

model = VGG16(weights='imagenet')

这里使用的是ImageNet数据集上预训练好的模型,参数“weights”指定了下载的权重文件路径,VGG的权重文件可以从这里下载到。注意,在下载过程中需要科学上网或者使用代理才能下载成功。

步骤2:准备待预测的图像

在进行预测前,我们需要从硬盘中读取待预测的图像,并将其缩放至与预训练模型相同的尺寸。 下面是对图像进行缩放的示例代码:

from tensorflow.keras.preprocessing import image
img_path = 'path/to/image.jpg'
img = image.load_img(img_path, target_size=(224, 224)) # target_size需要与指定模型的尺寸相一致

步骤3:图像预处理

我们还需要对读入的图像进行一系列的预处理,以符合模型输入要求。在使用VGG模型时,我们需要执行以下预处理步骤:

from tensorflow.keras.applications.vgg16 import preprocess_input
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0) # 增加batch维
x = preprocess_input(x) # 预处理

步骤4:传入模型进行预测

预处理完成后,我们就可以将图像传入模型进行预测。代码如下:

preds = model.predict(x)

这里的“preds”是一个numpy数组,存储了对图像预测的结果,每个元素代表一个类别,该值越大,代表该图像属于该类别的概率越高。

由于我们使用的是VGG模型,因此可以通过以下代码获取对图像属于各个常用类别的概率:

from tensorflow.keras.applications.vgg16 import decode_predictions
preds = decode_predictions(preds, top=5)[0]

“top=5”表示返回前五个概率最高的类别,可以根据需要进行设定。

示例1:使用VGG模型对图片进行分类

下面是对一张熊猫的图片进行分类的示例代码:

from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
import numpy as np

# 加载VGG模型
model = VGG16(weights='imagenet')

# 从磁盘中读入图片并缩放大小
img_path = 'panda.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

# 预处理
x = preprocess_input(x)

# 进行预测
preds = model.predict(x)

# 解码为类别名称
preds = decode_predictions(preds, top=5)[0]
for pred in preds:
    print('类别:{},概率:{:.2f}%'.format(pred[1], pred[2]*100))

该代码运行后,输出了如下结果:

类别:giant_panda,概率:99.92%
类别:lesser_panda,概率:0.05%
类别:indri,概率:0.01%
类别:llama,概率:0.00%
类别:polecat,概率:0.00%

示例2:使用ResNet50模型对图片进行分类

除了使用VGG模型外,我们还可以使用ResNet50模型对图像进行分类,示例代码如下:

from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
import numpy as np

# 加载ResNet50模型
model = ResNet50(weights='imagenet')

# 从磁盘中读入图片并缩放大小
img_path = 'panda.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

# 预处理
x = preprocess_input(x)

# 进行预测
preds = model.predict(x)

# 解码为类别名称
preds = decode_predictions(preds, top=5)[0]
for pred in preds:
    print('类别:{},概率:{:.2f}%'.format(pred[1], pred[2]*100))

该代码运行后,输出了如下结果:

类别:giant_panda,概率:99.46%
类别:indri,概率:0.22%
类别:lesser_panda,概率:0.13%
类别:earthstar,概率:0.07%
类别:eggnog,概率:0.06%

从输出结果可以看出,两个模型对同一张熊猫的图像均成功识别出了它属于giant_panda这一类别,但是其概率存在差异。这是因为两个模型的计算方法和结构有所不同,从而导致了预测结果的不同。