RandAugment для класифікації зображень за допомогою Keras/TensorFlow PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

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

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

Примітка: Інваріантність зводиться до того, щоб зробити моделі сліпими до певних збурень під час прийняття рішень. Зображення кота залишається зображенням кота, якщо ви віддзеркалюєте його чи обертаєте.

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

Види аугментації

Розширення спочатку було дуже простим – невеликі повороти, горизонтальні та вертикальні перевороти, коливання контрасту чи яскравості тощо. Останніми роками були розроблені більш складні методи, в т.ч. Вирізати (просторове випадання, що випадково вводить чорні квадрати у вхідні зображення) і Змішувати (змішування частин зображень і оновлення пропорцій етикетки), а їх поєднання – CutMix. Новіші методи доповнення фактично враховують мітки, а такі методи, як CutMix, змінюють пропорції міток, щоб вони були рівними пропорціям зображення, зайнятого частинами кожного класу, що змішується.

Із зростаючим списком можливих доповнень деякі почали застосовувати їх у випадковому порядку (або принаймні деякі з них), вважаючи, що випадковий набір доповнень підвищить надійність моделей і замінить оригінальний набір набагато більшим простір вхідних зображень. Ось де RandAugment удари!

KerasCV і RandAugment

KerasCV є окремим пакетом, але все ж офіційним доповненням до 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. Вертикальний пошук. Ai.

Шар має a 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. Вертикальний пошук. Ai.

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

для 0...augmentations_per_image, шар додає випадковий рівень попередньої обробки до конвеєра, який буде застосовано до зображення. У разі дефолту 3 – до конвеєра додаються три різні операції. Потім для кожного збільшення в конвеєрі відбирається випадкове число, і якщо воно менше ніж rate (за замовчуванням близько 0.9) – застосовано аугментацію.

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

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

Це, природно, означає, що не всі розширення потрібно застосовувати, особливо якщо ви знижуєте rate. Ви також можете налаштувати, які операції дозволені через a 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 мають різні розміри, давайте створимо a preprocess() функція, яка змінює їх розмір для відображення набору даних, а також augment() функція, яка доповнює зображення в a 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. Вертикальний пошук. Ai.

У нерозширеному конвеєрі мережа переповнюється (точність навчання досягає межі), а точність перевірки залишається низькою. У розширеному конвеєрі точність навчання залишається нижчою, ніж точність перевірки від початку до кінця.

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

Висновок

KerasCV є окремим пакетом, але все ще офіційним доповненням до Keras, розробленим командою Keras, спрямованим на те, щоб привнести резюме промисловості у ваші проекти Keras. На момент написання KerasCV все ще знаходиться в розробці та вже містить 27 нових шарів попередньої обробки, RandAugment, CutMix та MixUp бути одними з них.

У цьому короткому посібнику ми розглянемо, як ви можете використовувати RandAugment застосувати кілька випадкових перетворень із заданого списку застосованих перетворень, і наскільки легко це включити в будь-який навчальний конвеєр Keras.

Йти далі – практичне глибоке навчання для комп’ютерного зору

Ваша допитлива природа змушує вас йти далі? Ми рекомендуємо перевірити наш Курс: «Практичне глибоке навчання комп’ютерного бачення за допомогою Python».

RandAugment для класифікації зображень за допомогою Keras/TensorFlow PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Ще один курс комп’ютерного зору?

Ми не будемо класифікувати цифри MNIST або моди MNIST. Вони свою роль давно відслужили. Занадто багато навчальних ресурсів зосереджені на базових наборах даних і базових архітектурах, перш ніж дозволити просунутим архітектурам чорної скриньки взяти на себе тягар продуктивності.

Ми хочемо зосередитися на демістифікація, практичність, розуміння, інтуїція та реальні проекти. Хочеться навчитися як ти можеш змінити ситуацію? Ми проведемо вас у подорожі від того, як наш мозок обробляє зображення, до написання дослідницького класифікатора глибокого навчання для раку молочної залози до мереж глибокого навчання, які «галюцинують», навчаючи вас принципам і теорії через практичну роботу, озброюючи вас ноу-хау та інструменти, щоб стати експертом у застосуванні глибокого навчання для вирішення проблем комп’ютерного зору.

Що всередині?

  • Перші принципи бачення та те, як комп’ютери можна навчити «бачити»
  • Різні задачі та застосування комп'ютерного зору
  • Інструменти, які полегшать вашу роботу
  • Пошук, створення та використання наборів даних для комп’ютерного зору
  • Теорія та застосування згорткових нейронних мереж
  • Обробка зсуву домену, спільного входження та інших упереджень у наборах даних
  • Передача навчання та використання часу навчання та обчислювальних ресурсів інших для вашої вигоди
  • Створення та навчання сучасного класифікатора раку молочної залози
  • Як застосувати здорову дозу скептицизму до основних ідей і зрозуміти наслідки широко поширених методів
  • Візуалізація «концептуального простору» ConvNet за допомогою t-SNE та PCA
  • Тематичні дослідження того, як компанії використовують методи комп’ютерного зору для досягнення кращих результатів
  • Правильна оцінка моделі, візуалізація прихованого простору та ідентифікація уваги моделі
  • Виконання досліджень предметної області, обробка власних наборів даних і створення тестів моделей
  • Передові архітектури, розвиток ідей, що робить їх унікальними та як їх реалізувати
  • KerasCV – бібліотека WIP для створення найсучасніших конвеєрів і моделей
  • Як аналізувати та читати документи та реалізувати їх самостійно
  • Вибір моделей в залежності від вашого застосування
  • Створення наскрізного конвеєра машинного навчання
  • Пейзаж та інтуїція під час виявлення об’єктів за допомогою Faster R-CNN, RetinaNets, SSD та YOLO
  • Екземплярна та семантична сегментація
  • Розпізнавання об'єктів у реальному часі за допомогою YOLOv5
  • Навчання детекторам об’єктів YOLOv5
  • Робота з Transformers за допомогою KerasNLP (потужна бібліотека WIP)
  • Інтеграція Transformers із ConvNets для створення підписів до зображень
  • DeepDream
  • Оптимізація моделі Deep Learning для комп’ютерного зору

Часова мітка:

Більше від Stackabuse