使用 Keras/TensorFlow PlatoBlockchain 数据智能进行图像分类的 RandAugment。 垂直搜索。 哎。

使用 Keras/TensorFlow 进行图像分类的 RandAugment

长期以来,数据增强一直作为一种用转换后的变体替换“静态”数据集的手段,增强了数据的不变性 卷积神经网络 (CNN),并且通常会导致输入的鲁棒性。

请注意: 不变性归结为在做出决策时使模型对某些扰动视而不见。 如果您镜像或旋转猫的图像,它仍然是猫的图像。

虽然我们一直在使用的数据增强形式确实编码了一个 缺乏 关于平移方差的知识,这对于对象检测、语义和实例分割等很重要—— 不变性 它通常对分类模型有利,因此,增强更普遍和更积极地应用于分类模型。

增强类型

增强开始非常简单——小幅旋转、水平和垂直翻转、对比度或亮度波动等。近年来,人们设计了更精细的方法,包括 剪下 (在输入图像中随机引入黑色方块的空间丢失)和 混合 (混合部分图像并更新标签比例),以及它们的组合—— 切割混合. 较新的增强方法实际上考虑了标签,并且像 CutMix 这样的方法将标签比例更改为等于每个类别的部分被混合的图像所占的比例。

随着可能的增强列表越来越多,一些人已经开始随机应用它们(或至少是其中的一部分),他们认为随机的增强集将增强模型的鲁棒性,并用更大的集合替换原始集输入图像的空间。 这是哪里 RandAugment 踢!

KerasCV 和 RandAugment

凯拉斯CV 是一个单独的包,但仍然是 Keras 团队开发的官方补充。 这意味着它获得了与主包相同的润色和直观性,但它也与常规 Keras 模型及其层无缝集成。 您会注意到的唯一区别是调用 keras_cv.layers... 而不是 keras.layers....

截至撰写本文时,KerasCV 仍在开发中,已经包含 27 个新的预处理层, RandAugment, CutMixMixUp 成为其中的一些人。 一起来看看申请的样子 RandAugment 到图像,以及我们如何训练一个有和没有随机增强的分类器。

一,安装 keras_cv:

$ pip install keras_cv

请注意: KerasCV 需要 TensorFlow 2.9 才能工作。 如果您还没有,请运行 $ pip install -U tensorflow 第一。

现在,让我们导入 TensorFlow、Keras 和 KerasCV,以及 TensorFlow 数据集,以便轻松访问 Imagenette:

import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds

让我们加载一个图像并以其原始形式显示它:

import matplotlib.pyplot as plt
import cv2

cat_img = cv2.cvtColor(cv2.imread('cat.jpg'), cv2.COLOR_BGR2RGB)
cat_img = cv2.resize(cat_img, (224, 224))
plt.imshow(cat_img)

现在,让我们申请 RandAugment 给它,几次,看看结果:

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255))(cat_img)
    
    ax.imshow(aug_img.numpy().astype('int'))

使用 Keras/TensorFlow PlatoBlockchain 数据智能进行图像分类的 RandAugment。 垂直搜索。 哎。

该层有一个 magnitude 参数,默认为 0.5 并且可以更改以增加或减少增强的效果:

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255), magnitude=0.1)(cat_img)
    ax.imshow(aug_img.numpy().astype('int'))

当设置为低值时,例如 0.1 – 你会看到不那么激进的增强:

使用 Keras/TensorFlow PlatoBlockchain 数据智能进行图像分类的 RandAugment。 垂直搜索。 哎。

作为一个层——它可以在模型中或在 tf.data 创建数据集时的管道。 这使得 RandAugment 相当灵活! 额外的论点是 augmentations_per_imagerate 论据,它们一起工作。

针对 0...augmentations_per_image,该层将随机预处理层添加到要应用于图像的管道中。 在默认的情况下 3 – 三种不同的操作被添加到管道中。 然后,为管道中的每个增强采样一个随机数——如果它低于 rate (默认为大约 0.9) – 应用了增强。

本质上,管道中的每个(随机)增强都有 90% 的概率应用于图像。

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

这自然意味着不必应用所有增强,尤其是如果您降低 rate. 您还可以通过 RandomAugmentationPipeline 层,其中 RandAugment 是的特例。 单独的指南 RandomAugmentationPipeline 即将出版。

使用和不使用 RandAugment 训练分类器

简化数据准备/加载方面并专注于 RandAugment,让我们使用 tfds 加载 Imagenette 的一部分:

(train, valid_set, test_set), info = tfds.load("imagenette", 
                                           split=["train[:70%]", "validation", "train[70%:]"],
                                           as_supervised=True, with_info=True)

class_names = info.features["label"].names
n_classes = info.features["label"].num_classes
print(f'Class names: {class_names}') 
print('Num of classes:', n_classes) 

print("Train set size:", len(train)) 
print("Test set size:", len(test_set)) 
print("Valid set size:", len(valid_set)) 

我们只加载了一部分训练数据,以便更容易在更少的时期内过度拟合数据集(实际上使我们的实验运行得更快)。 由于 Imagenette 中的图像大小不同,让我们创建一个 preprocess() 调整它们的大小以映射数据集的函数,以及 augment() 增强图像中的功能 tf.data.Dataset:

def preprocess(images, labels):
  return tf.image.resize(images, (224, 224)), tf.one_hot(labels, 10)
  
def augment(images, labels):
  inputs = {"images": images, "labels": labels}
  outputs = keras_cv.layers.RandAugment(value_range=(0, 255))(inputs)
  return outputs['images'], outputs['labels']

现在——我们对标签进行一次性编码。 我们不一定必须这样做,但是对于像这样的增强 CutMix 篡改标签及其比例,您将不得不这样做。 因为您可能想要应用这些以及 RandAugment 与它们配合得非常好,可以创建健壮的分类器——让我们把 one-hot 编码留在里面。此外, RandAugment 正是因为这个原因,才需要一个带有图像和标签的字典——你可以添加的一些增强实际上会改变标签,所以它们是强制性的。 您可以从 outputs 字典很容易,所以这是一个额外的,但简单的,在扩充过程中采取的步骤。

让我们映射从返回的现有数据集 tfdspreprocess() 函数,对它们进行批处理并仅增加训练集:

valid_set = valid_set.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set = train.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set_aug = train.map(preprocess).map(augment_data, 
                                          num_parallel_calls=tf.data.AUTOTUNE).batch(32).prefetch(tf.data.AUTOTUNE)

让我们训练一个网络! keras_cv.models 有一些内置的网络,类似于 keras.applications. 虽然名单仍然很短——它会随着时间的推移而扩大并接管 keras.applications. API 非常相似,因此对于大多数从业者来说,移植代码将相当容易:


effnet = keras_cv.models.EfficientNetV2B0(include_rescaling=True, include_top=True, classes=10)
          
effnet.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)

history = effnet.fit(train_set, epochs=25, validation_data = valid_set)

或者,您可以使用当前的 keras.applications:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)

effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

history1 = effnet.fit(train_set, epochs=50, validation_data=valid_set)

这会导致模型表现不佳:

Epoch 1/50
208/208 [==============================] - 60s 238ms/step - loss: 2.7742 - accuracy: 0.2313 - val_loss: 3.2200 - val_accuracy: 0.3085
...
Epoch 50/50
208/208 [==============================] - 48s 229ms/step - loss: 0.0272 - accuracy: 0.9925 - val_loss: 2.0638 - val_accuracy: 0.6887

现在,让我们在增强数据集上训练相同的网络设置。 每个批次都是单独增强的,因此每当出现相同批次的图像(在下一个时期)时,它们都会有不同的增强:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

history2 = effnet.fit(train_set_aug, epochs=50, validation_data = valid_set)
Epoch 1/50
208/208 [==============================] - 141s 630ms/step - loss: 2.9966 - accuracy: 0.1314 - val_loss: 2.7398 - val_accuracy: 0.2395
...
Epoch 50/50
208/208 [==============================] - 125s 603ms/step - loss: 0.7313 - accuracy: 0.7583 - val_loss: 0.6101 - val_accuracy: 0.8143

好多了! 虽然您仍想应用其他增强功能,例如 CutMixMixUp,与其他训练技术一起最大限度地提高网络的准确性 - 只是 RandAugment 显着帮助并且可以与更长的增强管道相媲美。

如果比较训练曲线,包括训练 验证曲线——只有清楚多少 RandAugment 帮助:

使用 Keras/TensorFlow PlatoBlockchain 数据智能进行图像分类的 RandAugment。 垂直搜索。 哎。

在非增强管道中,网络过拟合(训练准确度达到上限)并且验证准确度保持在较低水平。 在增强的管道中, 训练精度始终低于验证精度.

随着更高的训练损失,网络更加意识到它仍然犯的错误,并且可以进行更多更新以使其对转换保持不变。 前者认为没有必要更新,而后者则认为需要更新并提高了潜力上限。

结论

凯拉斯CV 是一个单独的包,但仍然是 Keras 团队开发的官方补充,旨在为您的 Keras 项目带来行业实力的 CV。 截至撰写本文时,KerasCV 仍在开发中,已经包含 27 个新的预处理层, RandAugment, CutMixMixUp 成为其中的一些人。

在这个简短的指南中,我们了解了如何使用 RandAugment 从给定的应用转换列表中应用许多随机转换,以及包含在任何 Keras 训练管道中的难易程度。

走得更远——计算机视觉的实用深度学习

你好奇的天性让你想走得更远? 我们建议查看我们的 套餐: “使用 Python 进行计算机视觉的实用深度学习”.

使用 Keras/TensorFlow PlatoBlockchain 数据智能进行图像分类的 RandAugment。 垂直搜索。 哎。

另一个计算机视觉课程?

我们不会对 MNIST 数字或 MNIST 时尚进行分类。 他们很久以前就发挥了作用。 在让高级黑盒架构承担性能负担之前,太多的学习资源专注于基本数据集和基本架构。

我们想专注于 揭秘, 实际性, 理解, 直觉真实项目. 想学 形成一种 你可以有所作为? 我们将带您从大脑处理图像的方式到编写研究级的乳腺癌深度学习分类器,再到“产生幻觉”的深度学习网络,通过实际工作教您原理和理论,为您配备成为应用深度学习解决计算机视觉问题的专家的专业知识和工具。

里面是什么?

  • 视觉的首要原则以及如何教计算机“看”
  • 计算机视觉的不同任务和应用
  • 让您的工作更轻松的交易工具
  • 为计算机视觉寻找、创建和利用数据集
  • 卷积神经网络的理论与应用
  • 处理数据集中的域转移、共现和其他偏差
  • 迁移学习并利用他人的训练时间和计算资源为您谋取利益
  • 构建和训练最先进的乳腺癌分类器
  • 如何将健康的怀疑态度应用于主流思想并理解广泛采用的技术的含义
  • 使用 t-SNE 和 PCA 可视化 ConvNet 的“概念空间”
  • 公司如何使用计算机视觉技术取得更好结果的案例研究
  • 适当的模型评估、潜在空间可视化和识别模型的注意力
  • 执行领域研究,处理您自己的数据集并建立模型测试
  • 尖端架构、想法的发展、是什么让它们与众不同以及如何实现它们
  • KerasCV – 用于创建最先进的管道和模型的 WIP 库
  • 如何解析和阅读论文并自己实现它们
  • 根据您的应用选择型号
  • 创建端到端机器学习管道
  • 使用 Faster R-CNN、RetinaNets、SSD 和 YOLO 进行对象检测的景观和直觉
  • 实例和语义分割
  • 使用 YOLOv5 进行实时对象识别
  • 训练 YOLOv5 目标检测器
  • 使用 KerasNLP(行业强大的 WIP 库)使用 Transformers
  • 将 Transformers 与 ConvNet 集成以生成图像的标题
  • 深梦
  • 计算机视觉的深度学习模型优化

时间戳记:

更多来自 堆栈滥用