Свёрточная нейронная сеть (CNN)

Автор: Елена Капаца

Свёрточная нейронная сеть (Convolutional Neural Network, CNN) — это тип искусственной нейронной сети, специально разработанный для обработки изображений и других данных, имеющих пространственную структуру. CNN автоматически находит важные признаки на изображении — края, текстуры, формы и целые объекты — и использует их для решения задач компьютерного зрения.

Сегодня CNN являются основой многих моделей компьютерного зрения, включая YOLO, ResNet и проч.

До появления свёрточных сетей признаки изображений создавались вручную.

Например, инженеры вычисляли:

  • углы;
  • границы объектов;
  • текстуры;
  • контуры.

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

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

Работу свёрточной сети можно представить в виде нескольких этапов:

  • изображение подаётся на вход;
  • свёрточные слои извлекают признаки;
  • слои объединения (Pooling) уменьшают размер карты признаков;
  • несколько таких блоков последовательно усложняют извлекаемые признаки;
  • полносвязные слои используют полученные признаки для предсказания результата.

Что такое свёртка

Главный элемент CNN — операция свёртки (Convolution). Во время свёртки небольшое окно, называемое ядром (Kernel) или фильтром (Filter), последовательно проходит по изображению. На каждом участке изображения вычисляется новое значение, благодаря чему модель может обнаруживать различные признаки.

Например, один фильтр может научиться распознавать:

  • вертикальные линии;
  • горизонтальные линии;
  • углы;
  • текстуры.

По мере увеличения глубины сети признаки становятся всё более сложными.

Например:

  • первый слой обнаруживает границы;
  • второй — простые формы;
  • третий — части объектов;
  • последние слои — целые объекты.

После свёртки обычно применяется слой Pooling. Его задача:

  • уменьшить размер карты признаков;
  • сократить вычисления;
  • сделать модель менее чувствительной к небольшим смещениям объекта.

Наиболее распространённый вариант — Max Pooling, который выбирает максимальное значение внутри небольшого окна.

Преимущества CNN

По сравнению с обычными полносвязными нейронными сетями CNN обладают рядом преимуществ:

  • автоматически извлекают признаки;
  • требуют значительно меньше параметров;
  • хорошо работают с изображениями;
  • устойчивы к небольшим смещениям объектов;
  • эффективно обучаются на больших наборах изображений.

Где используются CNN

Свёрточные сети применяются практически во всех задачах компьютерного зрения:

  • Classification (классификация изображений);
  • Object Detection (обнаружение объектов);
  • Instance Segmentation;
  • Semantic Segmentation;
  • Pose Estimation (Keypoint Detection);
  • Face Recognition;
  • OCR и проч.

Минимальный пример на Python (PyTorch)

Ниже показан пример простой свёрточной сети для классификации изображений.

import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super().__init__()

        self.features = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),

            nn.Conv2d(16, 32, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )

        self.classifier = nn.Sequential(
            nn.Flatten(),
            nn.Linear(32 * 8 * 8, 10)
        )

    def forward(self, x):
        x = self.features(x)
        return self.classifier(x)

model = SimpleCNN()

x = torch.randn(8, 3, 32, 32)
y = model(x)

print(y.shape)

Результат:

torch.Size([8, 10])

В этом примере:

  • вход имеет размер 32×32 пикселя;
  • два свёрточных слоя извлекают признаки изображения;
  • два слоя Max Pooling уменьшают размер карты признаков;
  • полносвязный слой выполняет классификацию по десяти классам.

Ограничения CNN

Несмотря на высокую эффективность, свёрточные сети имеют и недостатки:

  • требуют большого объёма данных для обучения;
  • чувствительны к сильным изменениям масштаба и ракурса;
  • плохо учитывают долгосрочные зависимости в данных;
  • обучение глубоких CNN требует значительных вычислительных ресурсов.

По этой причине в последние годы в некоторых задачах CNN постепенно дополняются или заменяются архитектурами на основе механизма внимания (Attention), например Vision Transformer (ViT).