Комплексное руководство по свертке без учета зазоров в сверточных нейронных сетях (CNNs)

Исчерпывающее руководство по сворачиванию в сверточных нейронных сетях (CNNs) без учета зазоров

Введение

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

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

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

Цели обучения

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

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

Понимание сверточных нейронных сетей: как это работает

Сверточные нейронные сети (CNN) — класс глубоких нейронных сетей, в основном предназначенных для анализа визуальных данных, таких как изображения и видео. Они вдохновлены человеческой зрительной системой и чрезвычайно эффективны в задачах распознавания образов в визуальных данных. Вот обзор:

  1. Сверточные слои: CNN состоит из нескольких слоев, с основными сверточными слоями. Эти слои используют операции свертки, применяющие обучаемые фильтры к входным данным, извлекая различные признаки из изображений.
  2. Слои пулинга: После свертки часто применяются слои пулинга для уменьшения пространственных размеров, сжимая информацию, полученную сверточными слоями. Распространенными операциями пулинга являются максимальное пулингирование или среднее пулингирование, которые уменьшают размер представления, сохраняя при этом существенную информацию.
  3. Функции активации: После свертки и пулинга используются нелинейные функции активации (например, ReLU – линейный выпрямитель), чтобы внести нелинейность в сеть и позволить ей обучаться сложным шаблонам и взаимосвязям в данных.
  4. Полносвязные слои: В конце CNN часто используются полносвязные слои. Эти слои объединяют признаки, извлеченные предыдущими слоями, и выполняют задачи классификации или регрессии.
  5. Свертка по точкам: Свертка по точкам, также известная как свертка 1×1, – это техника, используемая в CNN для снижения размерности и комбинирования признаков. Она заключается в применении фильтра размером 1×1 к входным данным, что позволяет сократить количество входных каналов и объединить признаки между каналами. Свертка по точкам часто используется совместно с другими сверточными операциями для улучшения способности сети к распознаванию сложных шаблонов и взаимосвязей в данных.
  6. Обучаемые параметры: CNN зависят от обучаемых параметров (весов и смещений), которые обновляются во время процесса обучения. Это обучение включает прямое распространение, когда данные проходят через сеть, и обратное распространение, которое настраивает параметры на основе производительности сети.

Начиная с атрезной свертки

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

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

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

Растянутые свертки для многомасштабного обучения признакам

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

  1. Расширение контекста: Атрезные свертки позволяют сети получать информацию из более широкого контекста без значительного увеличения количества параметров. Введение промежутков в фильтрах расширяет рецептивное поле, не увеличивая вычислительную сложность.
  2. Переменные рецептивные поля: С использованием коэффициентов растяжения больше 1, эти свертки создают «многомасштабный» эффект. Они позволяют сети одновременно обрабатывать входы на разных масштабах или разбивать, улавливая как мелкие, так и крупные детали в одном слое.
  3. Иерархическое извлечение признаков: Коэффициенты растяжения могут быть изменены для различных слоев сети, создавая механизм иерархического извлечения признаков. Нижние слои с меньшими коэффициентами растяжения фокусируются на мелких деталях, а более высокие слои с большими коэффициентами растяжения улавливают более широкий контекст.
  4. Эффективное объединение информации: Растянутые свертки облегчают объединение информации с разных масштабов. Они предоставляют механизм для объединения признаков с разных рецептивных полей, улучшая понимание сложных структур в данных сети.
  5. Применение в сегментации и распознавании: В задачах, таких как сегментация изображений или распознавание речи, растянутые свертки используются для улучшения производительности, позволяя сетям изучать многомасштабные представления и делать более точные прогнозы.

Сруктура атрезных и обычных сверток

Исходное изображение (прямоугольник)    |    |Обычная свертка (квадрат)    - Размер ядра: фиксированный    - Сдвиг: через карты признаков входа    - Шаг: обычно 1    - Карта признаков на выходе: уменьшенный размер    Атрезная (растянутая) свертка (квадрат)    - Размер ядра: фиксированный с промежутками (управляемые коэффициентом растяжения)    - Сдвиг: разреженные элементы, увеличенное рецептивное поле    - Шаг: управляется коэффициентом растяжения    - Карта признаков на выходе: сохраняет исходный размер, увеличенное рецептивное поле

Сравнение обычной свертки и атрезной (растянутой) свертки

Аспект Обычная свертка Атрезная (растянутая) свертка
Применение фильтра Применяет фильтры к смежным областям входных данных Вводит промежутки между элементами фильтра (пустоты)
Размер ядра Фиксированный размер ядра Фиксированный размер ядра с промежутками (управляемые коэффициентом растяжения)
Сдвиг Перемещается по картам признаков входа Разреженные элементы позволяют увеличенному рецептивному полю
Шаг Обычно шаг 1 Увеличенный эффективный шаг, управляемый коэффициентом растяжения
Размер карты признаков на выходе Уменьшение размера из-за свертки Сохранение исходного размера с увеличенным рецептивным полем
Рецептивное поле Ограниченное эффективное рецептивное поле Увеличенное эффективное рецептивное поле
Захват контекстной информации Ограниченная захват контекста Улучшена способность захвата широкого контекста

Применение сверток Atrous

  • Свертки Atrous увеличивают скорость, расширяя рецептивное поле без добавления параметров.
  • Они позволяют сосредоточиться на конкретных областях ввода, улучшая эффективность извлечения признаков.
  • Вычислительная сложность снижается по сравнению с традиционными свертками с большими ядрами.
  • Идеально подходят для обработки видео в реальном времени и работы с крупными наборами изображений.

Исследование известных архитектур

DeepLab [REF 1]

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

Вот краткий обзор DeepLab:

  • DeepLab сфокусирована на сегментации изображений в смысловые области, присваивая каждому пикселю метку, что помогает понять детализированный контекст внутри изображения.
  • Atrous Convolution, используемая в DeepLab, это расширенные свертки, которые увеличивают рецептивное поле сети без потери разрешения. Это позволяет DeepLab улавливать контекст на разных масштабах, обеспечивая всесторонний сбор информации без значительного увеличения вычислительной сложности.
  • Пирамидальный пул пространственных атроусов (ASPP) – особенность, используемая в DeepLab для эффективного сбора многомасштабной информации. Он использует параллельные свертки Atrous с различными коэффициентами растяжения для улавливания контекста на разных масштабах и эффективного слияния информации.
  • Архитектура DeepLab с фокусом на многомасштабном контексте и точной сегментации достигла высоких результатов в различных задачах семантической сегментации, обеспечивая высокую точность в задачах сегментации.

Код:

import tensorflow as tffrom tensorflow.keras import Sequentialfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Conv2DTransposedef create_DeepLab_model(input_shape, num_classes):    model = Sequential([        Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=input_shape),        Conv2D(64, (3, 3), activation='relu', padding='same'),        MaxPooling2D(pool_size=(2, 2)),                Conv2D(128, (3, 3), activation='relu', padding='same'),        Conv2D(128, (3, 3), activation='relu', padding='same'),        MaxPooling2D(pool_size=(2, 2)),                # Add more convolutional layers as needed                Conv2DTranspose(64, (3, 3), strides=(2, 2), padding='same', activation='relu'),        Conv2D(num_classes, (1, 1), activation='softmax', padding='valid')    ])    return model# Define input shape and number of classesinput_shape = (256, 256, 3)  # Example input shapenum_classes = 21  # Example number of classes# Create the DeepLab modeldeeplab_model = create_DeepLab_model(input_shape, num_classes)# Compile the model (you might want to adjust the optimizer and loss function based on your task)deeplab_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# Print model summarydeeplab_model.summary()

Полносверточные сети (FCNs) [REF 2]

  • Полносверточные сети (FCNs) и сохранение пространственной информации: FCNs заменяют полносвязные слои на свертки 1×1, что важно для сохранения пространственной информации, особенно в задачах сегментации.
  • Структура энкодера: Энкодер, часто основанный на VGG, проходит трансформацию, где полносвязные слои преобразуются в сверточные слои. Это сохраняет пространственные детали и связь с изображением.
  • Интеграция атроус свертки: Атроус свертки играют ключевую роль в FCNs. Они позволяют сети получать информацию на многих масштабах, не увеличивая значительно количество параметров или теряя пространственное разрешение.
  • Семантическая сегментация: Атроус свертки помогают улавливать широкий контекст на разных масштабах, позволяя сети понимать объекты разных размеров и масштабов в одном и том же изображении.
  • Роль декодера: Декодерная сеть увеличивает размер карт признаков до исходного размера изображения с помощью обратных сверточных слоев. Атроус свертки позволяют сохранить важные пространственные детали из энкодера в процессе увеличения размера.
  • Улучшенная точность: Благодаря интеграции атроус сверток, FCNs достигают улучшенной точности в задачах семантической сегментации, эффективно улавливая контекст и сохраняя пространственную информацию на разных масштабах.

Code: 

import tensorflow as tf# Определение функции слоя атрезной свертки def atrous_conv_layer(inputs, filters, kernel_size, rate):    return tf.keras.layers.Conv2D(filters=filters, kernel_size=kernel_size,     dilation_rate=rate, padding='same', activation='relu')(inputs)# Пример архитектуры FCN с атрезной сверткой def FCN_with_AtrousConv(input_shape, num_classes):    inputs = tf.keras.layers.Input(shape=input_shape)    # Энкодер (в стиле VGG)    conv1 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)    conv2 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)    # Слой атрезной свертки    atrous_conv1 = atrous_conv_layer(conv2, 128, (3, 3), rate=2)    atrous_conv2 = atrous_conv_layer(atrous_conv1, 128, (3, 3), rate=4)    # Добавьте необходимое количество атрезных сверток...    # Декодер (транспонированная свертка)    upsample = tf.keras.layers.Conv2DTranspose(64, (3, 3), strides=(2, 2), padding='same')    (atrous_conv2)    output = tf.keras.layers.Conv2D(num_classes, (1, 1), activation='softmax')(upsample)    model = tf.keras.models.Model(inputs=inputs, outputs=output)    return model# Определение формы ввода и количества классовinput_shape = (256, 256, 3)  # Пример формы вводанum_classes = 10  # Пример количества классов# Создание экземпляра модели FCN с атрезной сверткойmodel = FCN_with_AtrousConv(input_shape, num_classes)# Компиляция моделиmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# Отображение суммарной информации о моделиmodel.summary()

LinkNet [REF 3]

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

  • Эффективная сегментация изображений: LinkNet эффективно сегментирует изображения, используя атрезные свертки – технику, которая расширяет рецептивное поле без чрезмерного увеличения параметров.
  • Интеграция атрезных сверток: Используя атрезные свертки, LinkNet эффективно улавливает контекстную информацию, сохраняя при этом управляемые вычислительные требования.
  • Skip-соединения для улучшенного потока: Skip-соединения LinkNet помогают улучшить поток информации по сети. Это обеспечивает более точную сегментацию, объединяя признаки из разных глубин сети.
  • Оптимизированный дизайн: Архитектура оптимизирована для достижения баланса между вычислительной эффективностью и точной сегментацией изображений. Это делает ее подходящей для различных задач сегментации.
  • Масштабируемая архитектура: Дизайн LinkNet позволяет масштабировать систему, что позволяет справляться с задачами сегментации различной сложности с эффективностью и точностью.

Code:

import torchimport torch.nn as nnimport torch.nn.functional as Fclass ConvBlock(nn.Module):    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):        super(ConvBlock, self).__init__()        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size,         stride=stride, padding=padding)        self.bn = nn.BatchNorm2d(out_channels)        self.relu = nn.ReLU(inplace=True)    def forward(self, x):        x = self.conv(x)        x = self.bn(x)        x = self.relu(x)        return xclass DecoderBlock(nn.Module):    def __init__(self, in_channels, out_channels):        super(DecoderBlock, self).__init__()        self.conv1 = ConvBlock(in_channels, in_channels // 4, kernel_size=1, stride=1, padding=0)        self.deconv = nn.ConvTranspose2d(in_channels // 4, out_channels, kernel_size=4,         stride=2, padding=1)        self.conv2 = ConvBlock(out_channels, out_channels)    def forward(self, x, skip):        x = F.interpolate(x, scale_factor=2, mode='nearest')        x = self.conv1(x)        x = self.deconv(x)        x = self.conv2(x)        if skip is not None:            x += skip        return xclass LinkNet(nn.Module):    def __init__(self, num_classes=21):        super(LinkNet, self).__init__()        # Энкодер        self.encoder = nn.Sequential(            ConvBlock(3, 64),            nn.MaxPool2d(2),            ConvBlock(64, 128),            nn.MaxPool2d(2),            ConvBlock(128, 256),            nn.MaxPool2d(2),            ConvBlock(256, 512),            nn.MaxPool2d(2)        )        # Декодер        self.decoder = nn.Sequential(            DecoderBlock(512, 256),            DecoderBlock(256, 128),            DecoderBlock(128, 64),            DecoderBlock(64, 32)        )        # Финальное предсказание        self.final_conv = nn.Conv2d(32, num_classes, kernel_size=1)    def forward(self, x):        skips = []        for module in self.encoder:            x = module(x)            skips.append(x.clone())        skips = skips[::-1]  # Reverse for decoder        for i, module in enumerate(self.decoder):            x = module(x, skips[i])        x = self.final_conv(x)        return x# Пример использования:input_tensor = torch.randn(1, 3, 224, 224)  # Пример формы ввода тензораmodel = LinkNet(num_classes=10)  # Пример количества классовoutput = model(input_tensor)print(output.shape)  # Пример формы вывода

InstanceFCN [REF 4]

Этот метод адаптирует Fully Convolutional Networks (FCNs), которые являются очень эффективными для семантической сегментации, для сегментации с учетом экземпляра. В отличие от оригинального FCN, где каждый выходной пиксель является классификатором объектной категории, в InstanceFCN каждый выходной пиксель является классификатором относительных позиций экземпляров. Например, в карте оценок каждый пиксель является классификатором принадлежности к “правой стороне” экземпляра или нет.

Как работает InstanceFCN

На входное изображение применяется FCN для генерации k² карт оценок, каждая из которых соответствует определенной относительной позиции. Эти карты называются instance-sensitive score maps. Для создания объектных экземпляров из этих карт оценок используется скользящее окно размером m×m. Окно m×m разделено на k², m ⁄ k × m ⁄ k размерных окон, соответствующих каждой из k² относительных позиций. Каждое подокно m ⁄ k × m ⁄ k выхода непосредственно копирует значения из того же подокна соответствующей карты оценок. K² подокон собираются вместе в соответствии с их относительными позициями, чтобы собрать выход сегментации m×m. Например, подокно #1 выхода на рисунке берется прямо из верхнего левого подокна m ⁄ k × m ⁄ k окна m×m на instance-sensitive карте оценок #1. Это называется модулем сборки экземпляров.

Архитектура InstanceFCN

Архитектура состоит в применении полностью сверточной сети VGG-16 к входному изображению. На выходной карте признаков присутствуют две полностью сверточные ветки. Одна из них предназначена для оценки объектных экземпляров (как описано выше), а другая для оценки очков экземпляров.

Для первой ветки используется 1×1 512-d слой сверточной обработки, за которым следует 3×3 слой сверточной обработки для получения набора k² instance-sensitive карт оценок. Модуль сборки (как описано ранее) используется для предсказания сегментационной маски m×m ( = 21). Вторая ветка состоит из 3×3 512-d слоя сверточной обработки, за которым следует 1×1 слой сверточной обработки. Этот 1×1 слой сверточной обработки является методом логистической регрессии для классификации экземпляра/не экземпляра скользящего окна m×m, центрированного в этом пикселе. Таким образом, выход ветви – это карта оценки объектности, в которой одна оценка соответствует одному скользящему окну, создающему один экземпляр. Таким образом, этот метод не различает различные объектные категории.

Код:

from tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Input, Conv2D, concatenate# Определите ваш слой атроусной сверткиdef atrous_conv_layer(input_layer, filters, kernel_size, dilation_rate):    return Conv2D(filters=filters, kernel_size=kernel_size,     dilation_rate=dilation_rate, padding='same', activation='relu')(input_layer)# Определите вашу модель InstanceFCNdef InstanceFCN(input_shape):    inputs = Input(shape=input_shape)        # Ваши полностью сверточные слои, аналогичные VGG-16, здесь    conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)        # Слой атроусной свертки    atrous_conv = atrous_conv_layer(conv2, filters=128, kernel_size=(3, 3),     dilation_rate=(2, 2))    # Дополнительные сверточные слои и ветви для оценки и определения экземпляров    # Выходные слои для оценки и определения экземпляров    score_output = Conv2D(num_classes, (1, 1), activation='softmax')(... )      # Ваш выход оценки    instance_output = Conv2D(num_instances, (1, 1), activation='sigmoid')(... )      # Ваш выход экземпляра    return Model(inputs=inputs, outputs=[score_output, instance_output])# Использование:model = InstanceFCN(input_shape=(256, 256, 3))  # Пример входной формыmodel.summary()  # Просмотреть сводку модели

Полносверточная семантическая сегментация с учетом экземпляров (FCIS)

Полносверточная семантическая сегментация с учетом экземпляров (FCIS) состоит из метода IntanceFCN. Метод IntanceFCN может предсказывать только маску фиксированного размера m×m и не может классифицировать объекты на разные категории. FCIS исправляет это, предсказывая маски разного размера и классифицируя объекты по разным категориям.

Совместное предсказание маски и классификация

Для каждого пикселя ROI (Region of Interest), создаются карты оценок для каждого пикселя по сборке, описанной выше в методе IntanceFCN. Для каждого пикселя ROI выполняются две задачи (следовательно, генерируются две карты оценок):

  1. Обнаружение: принадлежит ли он прямоугольнику объекта в относительной позиции
  2. Сегментация: находится ли он внутри границы экземпляра объекта

На основе этого возникают три случая:

  1. Высокая оценка внутри и низкая оценка снаружи: обнаружение+, сегментация+
  2. Низкая оценка внутри и высокая оценка снаружи: обнаружение+, сегментация-
  3. Обе оценки низкие: обнаружение-, сегментация-

Для обнаружения используется операция максимума для разделения случаев 1 и 2 (обнаружение+) от случая 3 (обнаружение-). Оценка обнаружения для всего ROI получается путем усреднения вероятностей каждого пикселя, за которым следует оператор softmax по всем категориям. Для сегментации используется оператор softmax для разделения случая 1 (сегментация+) от остальных (сегментация-). Маска переднего плана ROI является объединением оценок по пикселю сегментации для каждой категории.

ResNet используется для извлечения признаков из входного изображения полносверточно. На верхнем уровне слоя conv4 добавляется RPN для генерации ROIs. С помощью 1×1 слоя свертки на основе карт признаков conv5 производятся 2k² × C+1 карт оценок (C – количество категорий объектов, одна категория фона, два набора k² карт оценок для каждой категории). ROIs (после отсечения по максимальной вероятности) классифицируются как категории с наивысшими оценками классификации. Чтобы получить переднюю маску, берутся все ROIs с показателями пересечения больше чем 0,5 с рассматриваемым ROI. Маска категории усредняется на пиксельной основе с учетом их оценок классификации. Усредненная маска затем бинаризуется.

Вывод

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

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

Основные моменты

  • Дырявые свертки в СНС помогают нам понять сложные изображения, рассматривая их на разных масштабах, не потеряв деталей.
  • Они сохраняют четкость и детализацию изображения, что упрощает идентификацию каждой его части.
  • Они плавно интегрируются в архитектуры, такие как DeepLab, LinkNet и другие, улучшая их эффективность при точной сегментации объектов в различных областях.

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

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