RandAugment для классификации изображений с помощью Keras/TensorFlow PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

RandAugment для классификации изображений с помощью Keras/TensorFlow

Расширение данных долгое время служило средством замены «статического» набора данных преобразованными вариантами, поддерживая неизменность Сверточные нейронные сети (CNN), и обычно приводит к устойчивости к вводу.

Примечание: Инвариантность сводится к тому, чтобы сделать модели слепыми к определенным возмущениям при принятии решений. Изображение кошки остается изображением кошки, если вы отразите его или повернете.

Хотя расширение данных в том виде, в котором мы его использовали, оно кодирует отсутствие знаний о переводческой вариативности, что важно для обнаружения объектов, семантической сегментации и сегментации экземпляров и т. д. – неизменность это часто бывает благоприятным для моделей классификации, и, таким образом, расширение чаще и более агрессивно применяется к моделям классификации.

Типы аугментации

Аугментация стала очень простой — небольшие вращения, горизонтальные и вертикальные перевороты, колебания контраста или яркости и т. д. В последние годы были разработаны более сложные методы, в том числе Вырезать (пространственное выпадение случайным образом вводит черные квадраты во входные изображения) и Смешивать (смешение частей изображений и уточнение пропорций этикетки), а их комбинация – КатМикс. Более новые методы расширения фактически учитывают метки, а такие методы, как CutMix, изменяют пропорции меток, чтобы они были равны пропорциям изображения, занимаемого частями каждого смешиваемого класса.

С растущим списком возможных аугментаций некоторые начали применять их случайным образом (или, по крайней мере, некоторое их подмножество), с идеей, что случайный набор аугментаций повысит надежность моделей и заменит исходный набор гораздо большим. пространство входных изображений. Это где RandAugment удары в!

KerasCV и RandAugment

КерасCV — это отдельный пакет, но все же официальное дополнение к Keras, разработанное командой Keras. Это означает, что он получает тот же уровень полировки и интуитивности, что и основной пакет, но также безупречно интегрируется с обычными моделями Keras и их слоями. Единственная разница, которую вы когда-либо заметите, это вызов keras_cv.layers... вместо keras.layers....

KerasCV все еще находится в разработке на момент написания статьи и уже включает 27 новых слоев предварительной обработки. RandAugment, CutMixи MixUp быть одним из них. Давайте посмотрим, как это выглядит, чтобы применить 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'))

RandAugment для классификации изображений с помощью Keras/TensorFlow PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Слой имеет 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 - вы увидите гораздо менее агрессивную аугментацию:

RandAugment для классификации изображений с помощью Keras/TensorFlow PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Будучи слоем — его можно использовать в моделях или в tf.data конвейеры при создании наборов данных. Это делает RandAugment довольно гибкий! Дополнительными аргументами являются augmentations_per_image и rate аргументы, которые работают вместе.

Что касается 0...augmentations_per_image, слой добавляет в конвейер случайный слой предварительной обработки, который будет применен к изображению. В случае дефолта 3 – в конвейер добавляются три разные операции. Затем для каждой аугментации в конвейере выбирается случайное число, и если оно меньше rate (по умолчанию около 0.9) – применяется аугментация.

По сути, существует 90% вероятность того, что каждое (случайное) увеличение в конвейере будет применено к изображению.

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

Это естественно означает, что не все аугментации нужно применять, особенно если вы понизите rate. Вы также можете настроить, какие операции разрешены через RandomAugmentationPipeline слой, который RandAugment является частным случаем. Отдельное руководство по RandomAugmentationPipeline будет опубликовано в ближайшее время.

Обучение классификатора с RandAugment и без него

Чтобы упростить аспект подготовки/загрузки данных и сосредоточиться на RandAugment, давайте использовать tfds для загрузки части Imagenett:

(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 работает с ними очень хорошо для создания надежных классификаторов — давайте оставим одноразовое кодирование. Кроме того, RandAugment берет словарь с изображениями и метками именно из-за этого — некоторые дополнения, которые вы можете добавить, на самом деле изменят метки, поэтому они обязательны. Вы можете извлечь дополненные изображения и метки из outputs словарь легко, так что это дополнительный, но простой шаг, который нужно предпринять во время дополнения.

Давайте сопоставим существующие наборы данных, возвращенные из tfds с preprocess() функцию, группируйте их и увеличивайте только тренировочный набор:

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

Намного лучше! Хотя вы все еще хотите применить другие дополнения, такие как CutMix и MixUp, наряду с другими методами обучения, чтобы максимизировать точность сети — просто RandAugment значительно помогло и может быть сравнимо с более длинным конвейером дополнений.

Если сравнить тренировочные кривые, включая тренировочную и кривые валидации – только становится понятно, насколько RandAugment помогает:

RandAugment для классификации изображений с помощью Keras/TensorFlow PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

В конвейере без дополнений сеть переобучается (точность обучения достигает потолка), а точность проверки остается низкой. В расширенном трубопроводе точность обучения остается ниже точности проверки от начала до конца.

При более высоких потерях при обучении сеть гораздо лучше осведомлена об ошибках, которые она все еще совершает, и может быть сделано больше обновлений, чтобы сделать ее инвариантной к преобразованиям. Первый не видит необходимости в обновлении, а второй делает и поднимает потолок потенциала.

Заключение

КерасCV это отдельный пакет, но все же официальное дополнение к Keras, разработанное командой Keras, направленное на то, чтобы привнести отраслевое резюме в ваши проекты Keras. KerasCV все еще находится в разработке на момент написания статьи и уже включает 27 новых слоев предварительной обработки. RandAugment, CutMixи MixUp быть одним из них.

В этом кратком руководстве мы рассмотрели, как вы можете использовать RandAugment применять ряд случайных преобразований из заданного списка применяемых преобразований и насколько легко их включить в любой обучающий конвейер Keras.

Двигаясь дальше — практическое глубокое обучение компьютерному зрению

Ваша любознательная натура заставляет вас идти дальше? Рекомендуем ознакомиться с нашим "Курс": «Практическое глубокое обучение компьютерному зрению с помощью Python».

RandAugment для классификации изображений с помощью Keras/TensorFlow PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Еще один курс по компьютерному зрению?

Мы не будем заниматься классификацией цифр MNIST или моды MNIST. Они уже давно отслужили свою роль. Слишком много учебных ресурсов сосредоточено на базовых наборах данных и базовых архитектурах, прежде чем позволить продвинутым архитектурам черного ящика взять на себя бремя производительности.

Мы хотим сосредоточиться на демистификация, практичность, понимание, интуиция и реальные проекты. Хочу учиться КАК Вы можете внести разнообразие? Мы проведем вас от того, как наш мозг обрабатывает изображения, до написания классификатора глубокого обучения исследовательского уровня для рака молочной железы, до сетей глубокого обучения, которые «галлюцинируют», обучая вас принципам и теории посредством практической работы, вооружая вас ноу-хау и инструменты, чтобы стать экспертом в применении глубокого обучения для решения задач компьютерного зрения.

Что внутри?

  • Первые принципы зрения и как научить компьютеры «видеть»
  • Различные задачи и приложения компьютерного зрения
  • Ремесленные инструменты, которые облегчат вашу работу
  • Поиск, создание и использование наборов данных для компьютерного зрения
  • Теория и применение сверточных нейронных сетей
  • Обработка смещения домена, совпадения и других смещений в наборах данных
  • Передача обучения и использование времени обучения и вычислительных ресурсов других в ваших интересах
  • Создание и обучение современного классификатора рака молочной железы
  • Как применить здоровую дозу скептицизма к господствующим идеям и понять последствия широко распространенных методов
  • Визуализация «концептуального пространства» ConvNet с использованием t-SNE и PCA
  • Тематические исследования того, как компании используют методы компьютерного зрения для достижения лучших результатов
  • Правильная оценка модели, визуализация скрытого пространства и выявление внимания модели
  • Выполнение исследования предметной области, обработка ваших собственных наборов данных и создание модельных тестов
  • Передовые архитектуры, развитие идей, что делает их уникальными и как их реализовать
  • KerasCV — WIP-библиотека для создания современных пайплайнов и моделей.
  • Как разбирать и читать статьи и реализовывать их самостоятельно
  • Выбор моделей в зависимости от вашего применения
  • Создание сквозного конвейера машинного обучения
  • Ландшафт и интуиция при обнаружении объектов с помощью Faster R-CNN, RetinaNets, SSD и YOLO
  • Экземпляр и семантическая сегментация
  • Распознавание объектов в реальном времени с помощью YOLOv5
  • Обучение детекторам объектов YOLOv5
  • Работа с трансформерами с использованием KerasNLP (надежная библиотека WIP)
  • Интеграция Transformers с ConvNets для создания подписей к изображениям
  • DeepDream
  • Оптимизация модели глубокого обучения для компьютерного зрения

Отметка времени:

Больше от Стекабьюс