Keras深度学习框架第十八讲:使用 KerasCV 进行分类

1、绪论

1.1 使用 KerasCV 进行分类的概念

KerasCV 是一个用于构建和训练计算机视觉模型的库,它集成了 Keras 的高级 API 和计算机视觉中常用的工具和预处理层。虽然 KerasCV 主要被设计为处理目标检测任务,但它的一些组件和工具也可以用于其他计算机视觉任务,包括图像分类。

分类是为给定的输入图像预测类别标签的过程。尽管分类是计算机视觉中一个相对直接的任务,但现代方法仍然由几个复杂的组件构成。幸运的是,KerasCV 提供了用于构建常用组件的 API。

本文展示了 KerasCV 通过模块化方法解决图像分类问题的三个复杂度级别:

  1. 使用预训练分类器进行推理
  2. 微调预训练的骨干网络
  3. 从头开始训练图像分类器

KerasCV 使用 Keras 3 来与 TensorFlow、PyTorch 或 Jax 中的任何一个协同工作。在下面的讨论中,我们将使用 jax 后端。这个指南在 TensorFlow 或 PyTorch 后端下运行无需任何更改,只需更新下面的 KERAS_BACKEND 即可。

1.2 使用 KerasCV 进行图像的步骤

在使用 KerasCV 进行图像分类时,你通常会遵循以下步骤:

  1. 数据准备:准备你的图像数据集,并将其分为训练集、验证集(可选)和测试集。确保你的图像已经被适当地预处理和标签化。

  2. 构建模型:使用 KerasCV(或直接使用 Keras)构建你的图像分类模型。这可能包括使用卷积神经网络(CNN)架构,如 VGG、ResNet、MobileNet 等。

  3. 编译模型:配置模型的学习过程,包括选择优化器、损失函数和评估指标。对于分类任务,常见的损失函数是交叉熵损失(categorical crossentropy 或 sparse categorical crossentropy),而评估指标通常是准确率(accuracy)。

  4. 训练模型:使用训练数据对模型进行训练。你可以使用 Keras 的 fit() 方法来执行训练过程。

  5. 评估模型:在验证集(如果有的话)或测试集上评估模型的性能。

  6. 使用模型:一旦模型训练完成并经过验证,你就可以使用它来对新的图像进行分类了。

请注意,虽然 KerasCV 提供了许多有用的工具和层来处理目标检测任务中的边界框,但在图像分类任务中,你可能更多地依赖于 Keras 的核心功能和常见的 CNN 架构。

1.3 基础设置

!pip install -q --upgrade keras-cv
!pip install -q --upgrade keras  # Upgrade to Keras 3.
import os

os.environ["KERAS_BACKEND"] = "jax"  # @param ["tensorflow", "jax", "torch"]

import json
import math
import numpy as np

import keras
from keras import losses
from keras import ops
from keras import optimizers
from keras.optimizers import schedules
from keras import metrics

import keras_cv

# Import tensorflow for [`tf.data`](https://www.tensorflow.org/api_docs/python/tf/data) and its preprocessing functions
import tensorflow as tf
import tensorflow_datasets as tfds

2、使用kerasCV进行分类

2.1 使用预训练分类器进行推理

让我们从最简单的 KerasCV API 开始:一个预训练分类器。在这个例子中,我们将构建一个已经在 ImageNet 数据集上预训练的分类器。我们将使用这个模型来解决古老的“猫或狗”问题。

KerasCV 中的最高级别模块是任务(task)。一个任务是一个 keras.Model,它由一个(通常是预训练的)骨干模型和特定于任务的层组成。以下是一个使用 keras_cv.models.ImageClassifier 和 EfficientNetV2B0 骨干网络的例子。

EfficientNetV2B0 在构建图像分类管道时是一个很好的起点。这种架构能够在使用 7M 参数计数的同时实现高准确率。

classifier = keras_cv.models.ImageClassifier.from_preset(
    "efficientnetv2_b0_imagenet_classifier"
)

程序员可能会注意到,这与旧的 keras.applications API 有一些小的差异;在旧的 API 中,您会使用 EfficientNetV2B0(weights=“imagenet”) 来构造分类器。虽然旧的 API 在分类方面表现得很好,但它并不能有效地扩展到需要复杂架构的其他用例,如目标检测和语义分割。

现在我们已经构建了分类器,让我们将其应用于这张可爱的猫咪图片吧!

filepath = keras.utils.get_file(origin="https://i.imgur.com/9i63gLN.jpg")
image = keras.utils.load_img(filepath)
image = np.array(image)
keras_cv.visualization.plot_image_gallery(
    np.array([image]), rows=1, cols=1, value_range=(0, 255), show=True, scale=4
)

在这里插入图片描述
接下来,让我们从分类器获取一些预测结果:

predictions = classifier.predict(np.expand_dims(image, axis=0))

预测结果以 softmax 类别排名的形式呈现。我们可以使用简单的 argsort 函数找到顶部类别的索引:

top_classes = predictions[0].argsort(axis=-1)

为了解码类别映射,我们可以构建一个从类别索引到 ImageNet 类别名称的映射。为了方便起见,我已经将 ImageNet 类别映射存储在一个 GitHub Gist 上。现在我们来下载并加载它。

classes = keras.utils.get_file(
    origin="https://gist.githubusercontent.com/LukeWood/62eebcd5c5c4a4d0e0b7845780f76d55/raw/fde63e5e4c09e2fa0a3436680f436bdcb8325aac/ImagenetClassnames.json"
)
with open(classes, "rb") as f:
    classes = json.load(f)

现在我们可以简单地通过索引查找类别名称:

top_two = [classes[str(i)] for i in top_classes[-2:]]
print("Top two classes are:", top_two)
Top two classes are: ['Egyptian cat', 'velvet']

2.2 微调预训练分类器

当针对我们任务的具体标记图像可用时,微调自定义分类器可以提高性能。如果我们想要训练一个猫狗分类器,使用明确标记的猫狗数据应该比通用分类器表现更好!对于许多任务,可能没有相关的预训练模型可用(例如,针对您应用程序的特定图像分类)。

首先,让我们从加载一些数据开始:

BATCH_SIZE = 32
IMAGE_SIZE = (224, 224)
AUTOTUNE = tf.data.AUTOTUNE
tfds.disable_progress_bar()

data, dataset_info = tfds.load("cats_vs_dogs", with_info=True, as_supervised=True)
train_steps_per_epoch = dataset_info.splits["train"].num_examples // BATCH_SIZE
train_dataset = data["train"]

num_classes = dataset_info.features["label"].num_classes

resizing = keras_cv.layers.Resizing(
    IMAGE_SIZE
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUKAMO

你的鼓励是我们创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值