Jammy@Jetson Orin - Tensorflow & Keras Get Started: 004 Keras Pre-Trained ImageNet Models
1. 源由
我们已经看到了如何训练一个简单的神经网络来对来自CIFAR-10数据集的图像进行分类,但这是一个相对简单的任务,因为只有十个类别。
对大量对象类型进行分类将需要包含许多百万参数的更大型的网络。由于计算量巨大,训练集众多,导致了大量的训练时间。同时由于自建模型算法的不完善,通常需要大量的循环往复时间,才能达到一个相对理想的值。
在应用方面,为了更好,更快的应用业界顶尖技术,可以采用经过预训练的模型。在《Jammy@Jetson Orin - Tensorflow & Keras Get Started: 003 Implementing a CNN in TensorFlow & Keras》中,已经提及了相关模型的保存&加载操作。对于已经做过预训练的大型网络,可以直接采用load
进行加载,然后直接进行预测。
ImageNet 项目是一个大型的视觉数据库,旨在用于视觉对象识别软件研究。
该项目的构想是由人工智能研究者李飞飞在15年前提出的。ImageNet团队于2009年首次展示了他们的数据集。截止目前,已手工注释了超过 1400 万张图像,以指示图像中所描绘的对象,并且在至少一百万张图像中还提供了边界框。ImageNet 包含超过 20,000 个类别,其中典型的类别(如“气球”或“草莓”)包含数百张图像。第三方图像 URL 注释的数据库可直接从 ImageNet 免费获取,尽管实际的图像不属于 ImageNet。
自 2010 年以来,ImageNet 项目每年举办一次软件竞赛,即 ImageNet 大规模视觉识别挑战(ILSVRC)。研究团队将在这些竞赛基础上不断评估他们的计算机视觉算法在各种视觉识别任务中的表现,如对象分类和对象定位。使用的训练数据是ImageNet的一个子集,包含120万张图像,属于1,000个类别。
2. Keras预训练模型
ILSVRC的获胜者非常慷慨地将他们的模型发布到开源社区。因此,在Keras中可以获得几种模型,例如AlexNet、VGGNet、Inception、ResNet、Xception等等。除了ILSVRC的获胜者外,许多研究团队也分享了他们为类似任务训练的模型,例如MobileNet、SqueezeNet等等。所有在ImageNet上训练的模型都用于将图像分类为1,000个类别之一。
Keras附带了许多预训练的分类模型。截至Keras版本2.11,共有19种不同的预训练模型可用,其中一些版本还包含许多变体。模型列表可以在这里找到。
- convnext module
- densenet module
- efficientnet module
- efficientnet_v2 module
- imagenet_utils module
- inception_resnet_v2 module
- inception_v3 module
- mobilenet module
- mobilenet_v2 module
- mobilenet_v3 module
- nasnet module
- resnet module
- resnet50 module
- resnet_v2 module
- vgg16 module
- vgg19 module
- xception module
要在Keras中使用任何预训练模型,需要四个基本步骤:
- 加载预训练模型。
model_resnet50 = tf.keras.applications.resnet50.ResNet50(include_top=True,
weights=‘imagenet’,
input_tensor=None,
input_shape=None,
pooling=None,
classes=1000,
classifier_activation=‘softmax’,
)
- 使用模型中的专用预处理函数 preprocess_input() 对输入图像进行预处理。
tf.keras.applications.resnet50.preprocess_input(x, data_format=None)
- 调用模型的 predict() 方法生成预测结果。
preds = model_resnet50.predict(image_batch)
- 使用模型中的专用后处理函数 decode_predictions() 对预测结果进行解码。
decoded_preds = tf.keras.applications.resnet50.decode_predictions(preds, top=5)
注:以上简单的说明四个步骤,至于具体参数以及API含义可以查阅Keras手册。
3. 举例 - 预训练模型
在这里,我们将使用以下预训练模型对几个示例测试图像进行预测。
3.1 获取样本图像
images/
├── baseball-player.png
├── clown-fish.png
├── elephant.png
├── forklift.png
├── ice-cream.png
├── lemons.png
├── magnetic-compass.png
└── polar-bear.png
3.2 显示样本图像
3.3 加载三个预训练模型
3.4 模型处理通用函数
- 读取图像
- 按照模型要求进行必要的图像预处理
- 为图像张量添加批处理维度
- 调用模型的 predict() 方法进行预测
- 解码预测结果,找到前 k 个预测的类别名称和置信度分数
- 显示结果
3.5 预测结果
3.5.1 VGG16
- ball playerd的识别率只有50.61%
- African elephant的识别率只有 52.34%
- compass的识别率只有35.00%
3.5.2 Resnet-50
- ball playerd的识别率从VGG16 50.61%提升到80.50%
- African elephant的识别率依然只有 58.49%
- compass的识别率从VGG16 35.00% 提升到91.90%
3.5.3 Inception-V3
- ball playerd的识别率69.22%
- African elephant的识别率从50+%提升到了89.94%
- compass的识别率97.08%
4. 总结
在本篇文章中,学习了如何使用Keras中的三种不同预训练模型进行图像分类。
在随后的文章中,将学习如何利用预训练模型来为特定应用程序进行定制。有两种非常常见的技术,称为迁移学习和微调。
是不是越来越有感觉了??? :)
测试代码:004_Keras-Pre-Trained-ImageNet-Models