Визионные трансформеры в сельском хозяйстве | Сбор инноваций

Vision Transformers in Agriculture | Innovation Gathering

Введение

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

Кассава, или маниока или юка, является универсальным культурным растением с различными применениями, от обеспечения основных продуктов питания до промышленных применений. Его стойкость и устойчивость делают его неотъемлемой культурой для регионов с сложными условиями выращивания. Однако растения кассавы уязвимы перед различными болезнями, причем CMD и CBSD являются одними из самых разрушительных.

КМД вызывается комплексом вирусов, передаваемых белокрылками, что приводит к серьезным мозаичным симптомам на листьях кассавы. CBSD, с другой стороны, вызывается двумя связанными вирусами и в основном влияет на хранилища корней, делая их непригодными для употребления в пищу. Раннее выявление этих болезней имеет решающее значение для предотвращения массового повреждения урожая и обеспечения продовольственной безопасности. Визионные Трансформеры, эволюция архитектуры трансформеров, изначально разработанной для обработки естественного языка (NLP), оказались чрезвычайно эффективными в обработке визуальных данных. Эти модели обрабатывают изображения как последовательности патчей, используя механизмы самовнимания для захвата сложных узоров и отношений в данных. В контексте классификации болезней листьев кассавы Визионные Трансформеры обучаются идентифицировать CMD и CBSD, анализируя изображения зараженных листьев кассавы.

Результаты обучения

  • Понимание Визионных Трансформеров и их применение в сельском хозяйстве, в частности для классификации болезней листьев.
  • Изучение основных концепций архитектуры трансформера, включая механизмы самовнимания и их адаптацию для обработки визуальных данных.
  • Понимание инновационного использования Визионных Трансформеров (ViTs) в сельском хозяйстве, специально для раннего обнаружения болезней листьев кассавы.
  • Получение понимания преимуществ Визионных Трансформеров, таких как масштабируемость и глобальный контекст, а также их сложностей, включая вычислительные требования и эффективность данных.

Эта статья была опубликована в рамках Блогатона по Data Science.

Возникновение Визионных Трансформеров

Компьютерное зрение сделало огромные шаги в последние годы, благодаря развитию сверточных нейронных сетей (CNN). CNN являются основной архитектурой для различных задач, связанных с обработкой изображений, от классификации изображений до обнаружения объектов. Однако Визионные Трансформеры встали как мощная альтернатива, предлагая новый подход к обработке визуальной информации. Исследователи из Google Research представили Визионные Трансформеры в 2020 году во влиятельной статье под названием “Картинка стоит 16×16 слов: Трансформеры для распознавания изображений в масштабе”. Они адаптировали архитектуру трансформеров, изначально разработанную для обработки естественного языка (NLP), к области компьютерного зрения. Эта адаптация открыла новые возможности и вызвала новые вызовы в этой области.

Использование Визионных Трансформеров предлагает несколько преимуществ по сравнению с традиционными методами, в том числе:

  • Высокая точность: Визионные Трансформеры отличаются высокой точностью, позволяя надежно обнаруживать и отличать болезни листьев.
  • Эффективность: После обучения Визионные Трансформеры могут быстро обрабатывать изображения, что делает их подходящими для обнаружения болезней в реальном времени на поле.
  • Масштабируемость: Визионные Трансформеры могут работать с наборами данных различных размеров, что делает их приспособляемыми к различным сельскохозяйственным условиям.
  • Обобщение: Визионные Трансформеры могут обобщаться на разные сорта кассавы и типы болезней, уменьшая необходимость в конкретных моделях для каждого случая.

Архитектура Трансформера: Краткий обзор

Прежде чем погрузиться в Визионные Трансформеры, важно понять основные концепции архитектуры трансформера. Трансформеры, изначально разработанные для NLP, революционизировали задачи обработки языка. Основные особенности трансформеров – механизмы самовнимания и параллелизация, позволяющие получить более полное понимание контекста и более быстрое обучение.

В основе трансформеров лежит механизм самовнимания, который позволяет модели оценивать важность различных элементов входных данных при прогнозировании. Этот механизм, совместно с много-головыми слоями внимания, захватывает сложные отношения в данных.

Так как Визионные Трансформеры применяют эту архитектуру трансформера в области компьютерного зрения? Основная идея Визионных Трансформеров заключается в том, чтобы рассматривать изображение как последовательность патчей, аналогично тому, как задачи NLP рассматривают текст как последовательность слов. Затем слои трансформера обрабатывают каждый патч в изображении, преобразуя его в вектор.

Основные компоненты Vision Transformer

  • Внедрение патчей: Разделите изображение на фиксированные патчи фиксированного размера, обычно 16×16 пикселей. Затем каждый патч линейно встраивается в вектор меньшей размерности.
  • Позиционные кодировки: Добавьте позиционные кодировки к внедрениям патчей, чтобы учесть пространственное расположение патчей. Это позволяет модели узнавать относительные положения патчей внутри изображения.
  • Трансформаторный кодировщик: Vision Transformer состоит из нескольких слоев кодировщика трансформатора, как у NLP трансформаторов. Каждый слой выполняет самовнимание и операции прямого распространения на внедрениях патчей.
  • Голова классификации: В конце слоев трансформатора добавляется голова классификации для задач, таких как классификация изображений. Она принимает выходные внедрения и производит вероятности классов.

Введение Vision Transformer представляет собой значительное отступление от сверточных нейронных сетей (CNN), которые полагаются на сверточные слои для извлечения признаков. Обрабатывая изображения как последовательности патчей, Vision Transformer достигает передовых результатов в различных задачах компьютерного зрения, включая классификацию изображений, обнаружение объектов и даже анализ видео.

Реализация

Набор данных

Набор данных по болезням листьев маниоки включает около 15000 изображений высокого разрешения листьев маниоки, на которых проявляются различные стадии и степени симптомов болезни. Каждое изображение тщательно помечено, чтобы указать наличие болезни, что позволяет проводить обучение с учителем и задачи классификации изображений с использованием методов машинного обучения. Болезни маниоки обладают отличительными характеристиками, что позволяет классифицировать их на несколько категорий. Эти категории включают Бактериальное пятнистость маниоки (CBB), Бородавочность коричневая маниоки (CBSD), Зеленая пятнистость маниоки (CGM) и Мозаичная болезнь маниоки (CMD). Исследователи и специалисты по обработке данных используют этот набор данных для обучения и оценки моделей машинного обучения, включая глубокие нейронные сети, такие как Vision Transformer (ViTs).

Импорт необходимых библиотек

import numpy as np
import pandas as pd
import tensorflow as tf
import tensorflow.keras.layers as L
import tensorflow_addons as tfa
import glob, random, os, warnings
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns csv

Загрузка набора данных

image_size = 224
batch_size = 16
n_classes = 5

train_path = '/kaggle/input/cassava-leaf-disease-classification/train_images'
test_path = '/kaggle/input/cassava-leaf-disease-classification/test_images'

df_train = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/train.csv', dtype = 'str')

test_images = glob.glob(test_path + '/*.jpg')
df_test = pd.DataFrame(test_images, columns = ['image_path'])

classes = {0 : "Бактериальное пятнистость маниоки (CBB)",
           1 : "Бородавочность коричневая маниоки (CBSD)",
           2 : "Зеленая пятнистость маниоки (CGM)",
           3 : "Мозаичная болезнь маниоки (CMD)",
           4 : "Здоровый"}#import csv

Аугментация данных

def data_augment(image):
    p_spatial = tf.random.uniform([], 0, 1.0, dtype = tf.float32)
    p_rotate = tf.random.uniform([], 0, 1.0, dtype = tf.float32)
 
    image = tf.image.random_flip_left_right(image)
    image = tf.image.random_flip_up_down(image)
    
    if p_spatial > .75:
        image = tf.image.transpose(image)
        
    # Повороты
    if p_rotate > .75:
        image = tf.image.rot90(image, k = 3) # поворот на 270º
    elif p_rotate > .5:
        image = tf.image.rot90(image, k = 2) # поворот на 180º
    elif p_rotate > .25:
        image = tf.image.rot90(image, k = 1) # поворот на 90º
        
    return image#import csv

Генератор данных

datagen = tf.keras.preprocessing.image.ImageDataGenerator(samplewise_center = True,
                                                          samplewise_std_normalization = True,
                                                          validation_split = 0.2,
                                                          preprocessing_function = data_augment)

train_gen = datagen.flow_from_dataframe(dataframe = df_train,
                                        directory = train_path,
                                        x_col = 'image_id',
                                        y_col = 'label',
                                        subset = 'training',
                                        batch_size = batch_size,
                                        seed = 1,
                                        color_mode = 'rgb',
                                        shuffle = True,
                                        class_mode = 'categorical',
                                        target_size = (image_size, image_size))

valid_gen = datagen.flow_from_dataframe(dataframe = df_train,
                                        directory = train_path,
                                        x_col = 'image_id',
                                        y_col = 'label',
                                        subset = 'validation',
                                        batch_size = batch_size,
                                        seed = 1,
                                        color_mode = 'rgb',
                                        shuffle = False,
                                        class_mode = 'categorical',
                                        target_size = (image_size, image_size))

test_gen = datagen.flow_from_dataframe(dataframe = df_test,
                                       x_col = 'image_path',
                                       y_col = None,
                                       batch_size = batch_size,
                                       seed = 1,
                                       color_mode = 'rgb',
                                       shuffle = False,
                                       class_mode = None,
                                       target_size = (image_size, image_size))#import csv

images = [train_gen[0][0][i] for i in range(16)]
fig, axes = plt.subplots(3, 5, figsize = (10, 10))

axes = axes.flatten()

for img, ax in zip(images, axes):
    ax.imshow(img.reshape(image_size, image_size, 3))
    ax.axis('off')

plt.tight_layout()
plt.show()#import csv

Построение модели

learning_rate = 0.001
weight_decay = 0.0001
num_epochs = 1

patch_size = 7  # Размер извлекаемых патчей из входных изображений
num_patches = (image_size // patch_size) ** 2
projection_dim = 64
num_heads = 4
transformer_units = [
    projection_dim * 2,
    projection_dim,
]  # Размер слоев трансформера
transformer_layers = 8
mlp_head_units = [56, 28]  # Размеры плотных слоев финального классификатора

def mlp(x, hidden_units, dropout_rate):
    for units in hidden_units:
        x = L.Dense(units, activation = tf.nn.gelu)(x)
        x = L.Dropout(dropout_rate)(x)
    return x

Создание патчей

В нашем проекте классификации болезней листьев кассавы мы используем специальные слои, которые помогают извлекать и кодировать патчи изображений. Эти специализированные слои являются ключевыми для подготовки данных к обработке моделью Vision Transformer.

class Patches(L.Layer):
    def __init__(self, patch_size):
        super(Patches, self).__init__()
        self.patch_size = patch_size

    def call(self, images):
        batch_size = tf.shape(images)[0]
        patches = tf.image.extract_patches(
            images = images,
            sizes = [1, self.patch_size, self.patch_size, 1],
            strides = [1, self.patch_size, self.patch_size, 1],
            rates = [1, 1, 1, 1],
            padding = 'VALID',
        )
        patch_dims = patches.shape[-1]
        patches = tf.reshape(patches, [batch_size, -1, patch_dims])
        return patches
        
plt.figure(figsize=(4, 4))

x = train_gen.next()
image = x[0][0]

plt.imshow(image.astype('uint8'))
plt.axis('off')

resized_image = tf.image.resize(
    tf.convert_to_tensor([image]), size = (image_size, image_size)
)

patches = Patches(patch_size)(resized_image)
print(f'Размер изображения: {image_size} X {image_size}')
print(f'Размер патча: {patch_size} X {patch_size}')
print(f'Патчей на изображение: {patches.shape[1]}')
print(f'Элементов в патче: {patches.shape[-1]}')

n = int(np.sqrt(patches.shape[1]))
plt.figure(figsize=(4, 4))

for i, patch in enumerate(patches[0]):
    ax = plt.subplot(n, n, i + 1)
    patch_img = tf.reshape(patch, (patch_size, patch_size, 3))
    plt.imshow(patch_img.numpy().astype('uint8'))
    plt.axis('off')
    
class PatchEncoder(L.Layer):
    def __init__(self, num_patches, projection_dim):
        super(PatchEncoder, self).__init__()
        self.num_patches = num_patches
        self.projection = L.Dense(units = projection_dim)
        self.position_embedding = L.Embedding(
            input_dim = num_patches, output_dim = projection_dim
        )

    def call(self, patch):
        positions = tf.range(start = 0, limit = self.num_patches, delta = 1)
        encoded = self.projection(patch) + self.position_embedding(positions)
        return encoded#import csv

Слой патчей (класс Patches(L.Layer)

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

Визуализация патчей изображения

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

Слой кодирования патчей (класс PatchEncoder(L.Layer)

После извлечения патчей они проходят дальнейшую обработку через слой PatchEncoder. Этот слой играет ключевую роль в кодировании информации, содержащейся в каждом патче. Он состоит из двух основных компонентов: линейной проекции, улучшающей особенности патча, и встраивания положения, добавляющего пространственный контекст. Результатирующие обогащенные представления патчей критически важны для анализа и обучения Vision Transformer, в конечном итоге внося вклад в эффективность модели в точной классификации болезней.

Пользовательские слои Patches и PatchEncoder являются неотъемлемой частью нашего процесса предварительной обработки данных для классификации болезни листа маниоки. Они позволяют модели сосредоточиться на патчах изображений, улучшая ее способность различать существенные закономерности и особенности, необходимые для точной классификации болезней. Этот процесс значительно усиливает общую производительность нашей модели Vision Transformer.

def vision_transformer():
    inputs = L.Input(shape = (image_size, image_size, 3))
    
    # Создание патчей.
    patches = Patches(patch_size)(inputs)
    
    # Кодирование патчей.
    encoded_patches = PatchEncoder(num_patches, projection_dim)(patches)

    # Создание нескольких слоев блока Трансформера.
    for _ in range(transformer_layers):
        
        # Нормализация слоя 1.
        x1 = L.LayerNormalization(epsilon = 1e-6)(encoded_patches)
        
        # Создание слоя многоголового внимания.
        attention_output = L.MultiHeadAttention(
            num_heads = num_heads, key_dim = projection_dim, dropout = 0.1
        )(x1, x1)
        
        # Пропуск соединения 1.
        x2 = L.Add()([attention_output, encoded_patches])
        
        # Нормализация слоя 2.
        x3 = L.LayerNormalization(epsilon = 1e-6)(x2)
        
        # MLP.
        x3 = mlp(x3, hidden_units = transformer_units, dropout_rate = 0.1)
        
        # Пропуск соединения 2.
        encoded_patches = L.Add()([x3, x2])

    # Создание тензора [batch_size, projection_dim].
    representation = L.LayerNormalization(epsilon = 1e-6)(encoded_patches)
    representation = L.Flatten()(representation)
    representation = L.Dropout(0.5)(representation)
    
    # Добавление MLP.
    features = mlp(representation, hidden_units = mlp_head_units, dropout_rate = 0.5)
    
    # Классификация выходов.
    logits = L.Dense(n_classes)(features)
    
    # Создание модели.
    model = tf.keras.Model(inputs = inputs, outputs = logits)
    
    return model
    
decay_steps = train_gen.n // train_gen.batch_size
initial_learning_rate = learning_rate

lr_decayed_fn = tf.keras.experimental.CosineDecay(initial_learning_rate, decay_steps)

lr_scheduler = tf.keras.callbacks.LearningRateScheduler(lr_decayed_fn)

optimizer = tf.keras.optimizers.Adam(learning_rate = learning_rate)

model = vision_transformer()
    
model.compile(optimizer = optimizer, 
              loss = tf.keras.losses.CategoricalCrossentropy(label_smoothing = 0.1), 
              metrics = ['accuracy'])


STEP_SIZE_TRAIN = train_gen.n // train_gen.batch_size
STEP_SIZE_VALID = valid_gen.n // valid_gen.batch_size

earlystopping = tf.keras.callbacks.EarlyStopping(monitor = 'val_accuracy',
                                                 min_delta = 1e-4,
                                                 patience = 5,
                                                 mode = 'max',
                                                 restore_best_weights = True,
                                                 verbose = 1)

checkpointer = tf.keras.callbacks.ModelCheckpoint(filepath = './model.hdf5',
                                                  monitor = 'val_accuracy', 
                                                  verbose = 1, 
                                                  save_best_only = True,
                                                  save_weights_only = True,
                                                  mode = 'max')

callbacks = [earlystopping, lr_scheduler, checkpointer]

model.fit(x = train_gen,
          steps_per_epoch = STEP_SIZE_TRAIN,
          validation_data = valid_gen,
          validation_steps = STEP_SIZE_VALID,
          epochs = num_epochs,
          callbacks = callbacks)
#import csv

Пояснение кода

Этот код определяет пользовательскую модель Vision Transformer, адаптированную для нашей задачи классификации заболеваний листьев маниоки. Она включает в себя несколько блоков Трансформера, каждый из которых состоит из слоев многоголового внимания, пропусков соединений и многослойных перцептронов (MLP). В результате получается надежная модель, способная улавливать сложные закономерности в изображениях листьев маниоки.

Прежде всего, функция vision_transformer() занимает центральное место, определяя архитектурный план нашего Vision Transformer. Эта функция описывает, как модель обрабатывает и учится на изображениях листьев маниоки, позволяя ей точно классифицировать заболевания.

Для дальнейшей оптимизации процесса обучения мы реализуем планировщик скорости обучения. Этот планировщик использует стратегию косинусного затухания, динамически adjusting скорость обучения по мере изучения моделью. Эта динамическая адаптация улучшает сходимость модели, позволяя ей эффективно достигать максимальной производительности.

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

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

Вместе эти компоненты создают целостную систему разработки, обучения и оптимизации нашей модели Vision Transformer, ключевой шаг в нашем пути к точной классификации болезней листьев кассавы.

Применение ViTs в сельском хозяйстве

Применение Vision Transformers в кассавном земледелии выходит за рамки исследований и новинок; оно предлагает практические решения для насущных проблем:

  • Раннее обнаружение болезней: ViTs позволяют раннее обнаружение CMD и CBSD, что позволяет фермерам принимать оперативные меры для предотвращения распространения болезней и минимизации потерь урожая.
  • Эффективное использование ресурсов: С помощью ViTs ресурсы, такие как время и труд, используются более эффективно, поскольку автоматизированное обнаружение болезней снижает необходимость вручную проверять каждое растение кассавы.
  • Точное сельское хозяйство: Интегрируйте ViTs с другими технологиями, такими как дроны и устройства IoT, для точного сельского хозяйства, где точно определяются и лечатся очаги заболеваний.
  • Улучшенная продовольственная безопасность: Благодаря смягчению влияния болезней на урожай кассавы, ViTs способствуют улучшению продовольственной безопасности в регионах, где кассава является основным продуктом в рационе.

Преимущества Vision Transformers

Vision Transformers предлагают несколько преимуществ по сравнению с традиционными подходами на основе сверточных нейронных сетей (CNN):

  • Масштабируемость: Vision Transformers могут обрабатывать изображения разных разрешений без изменения архитектуры модели. Эта масштабируемость особенно ценна в реальных приложениях, где изображения имеют разные размеры.
  • Глобальный контекст: Механизм самообращения в Vision Transformers позволяет эффективно улавливать глобальный контекст. Это важно для задач, таких как распознавание объектов в загроможденных сценах.
  • Меньше архитектурных компонентов: В отличие от CNN, Vision Transformers не требуют сложных архитектурных компонентов, таких как слои пулинга и сверточные фильтры. Это упрощает проектирование и поддержку модели.
  • Перенос обучения: Vision Transformers могут быть предобучены на больших наборах данных, что делает их отличным выбором для переноса обучения. Предобученные модели могут быть дообучены для конкретных задач с относительно небольшим количеством данных, специфичных для задачи.

Проблемы и будущие направления

Хотя Vision Transformers показали замечательные результаты, они также сталкиваются с несколькими проблемами:

  • Вычислительные ресурсы: Для обучения больших моделей Vision Transformer требуются значительные вычислительные ресурсы, что может стать преградой для меньших исследовательских команд и организаций.
  • Эффективность использования данных: Vision Transformers могут требовать большого количества данных, и достижение надежной производительности с ограниченными данными может быть сложной задачей. Разработка техник более эффективного использования данных является актуальной проблемой.
  • Интерпретируемость: Трансформеры часто подвергаются критике из-за их «черного ящика». Исследователи работают над методами улучшения интерпретируемости Vision Transformers, особенно в критически важных приложениях.
  • Реальное время вывода: Достижение реального времени вывода с использованием больших моделей Vision Transformer может требовать вычислительных ресурсов. Оптимизация для более быстрого вывода является активной областью исследований.

Заключение

Vision Transformers преобразуют кассавное земледелие, предлагая точные и эффективные решения для классификации болезней листьев. Их способность обрабатывать визуальные данные, в сочетании с прогрессом в сборе данных и обучении моделей, имеет огромный потенциал для защиты кассавы и обеспечения продовольственной безопасности. Несмотря на оставшиеся проблемы, текущие исследования и практические применения способствуют принятию ViTs в кассавном земледелии. Постоянные инновации и сотрудничество превратят ViTs в бесценный инструмент для кассавных фермеров по всему миру, поскольку они способствуют устойчивым методам сельского хозяйства и снижают потери урожая, вызванные разрушительными болезнями листьев.

Основные выводы

  • Визионные трансформеры (ViTs) адаптируют архитектуру трансформера для компьютерного зрения, обрабатывая изображения как последовательности патчей.
  • ViTs, изначально разработанные для компьютерного зрения, теперь применяются в сельском хозяйстве для решения проблем, таких как раннее обнаружение болезней листьев.
  • Решайте проблемы, такие как вычислительные ресурсы и эффективность использования данных, делая ViTs многообещающей технологией для будущего компьютерного зрения.

Часто задаваемые вопросы

Показанный в этой статье контент не принадлежит Analytics Vidhya и используется по усмотрению автора.