Глубокое погружение в базовую ячейку многих нейронных сетей.

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

Итак, давайте перейдем к основам, и в этой серии руководств я подробно рассмотрю следующие фундаментальные темы, чтобы создать целостное обучение, которое приведет ко многим таким инновациям:

  1. AZ свертки.
  2. Углубленный анализ 1D, 2D и 3D слоев CNN.
  3. Прямое распространение в CNN 2D.

Хватит болтать… Начнем :)

ВВЕДЕНИЕ

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

  1. Извилины
  2. Фильтры и ядра
  3. Шаг и отступы
  4. Примеры использования в реальном мире

Что такое свертка? Насколько это актуально? Зачем использовать свертки?

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

Итак, с математической точки зрения, свертка — это оператор двух функций (матриц), который производит третью функцию (матрицу), которая является модифицированным вводом другой функции, имеющей другие характеристики (значения в матрице).

В Computer Vision свертка обычно используется для извлечения или создания карты объектов (с помощью ядер) из входного изображения.

ОСНОВНЫЕ ТЕРМИНОЛОГИИ

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

Входная матрица. Изображение состоит из пикселей, каждый из которых находится в диапазоне [0, 255]. Таким образом, мы можем представить изображение в виде матрицы, где каждая позиция представляет собой пиксель. Значение пикселя показывает, насколько он яркий, т. е. пиксель -> 0 соответствует черному цвету, а пиксель -> 255 — белому (самая высокая яркость). Изображение в градациях серого имеет единую матрицу пикселей, т. е. оно не имеет цвета, тогда как цветное изображение (RGB) имеет 3 канала, и каждый канал представляет свою плотность цвета.

Вышеприведенное изображение имеет форму: (24, 16), где высота = 24, а ширина = 16. Точно так же у нас есть цветное изображение (RGB), имеющее 3 канала, и его можно представить в виде матрицы формы: (высота, ширина, каналы)

Теперь мы знаем, что является первым входом для оператора свертки, но как преобразовать этот ввод и получить матрицу выходных признаков. Здесь появляется термин «ядро», который воздействует на входное изображение, чтобы получить требуемый результат.

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

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

На приведенном выше изображении для первой свертки мы выберем область изображения 3x3 (последовательный порядок) и сделаем скалярное произведение с ядром. Та-да! Это первая свертка, которую мы сделали, и мы будем перемещать интересующую область пиксель за пикселем (шаг).

Размер области интереса (ROI) всегда равен размеру ядра. Мы перемещаем этот ROI после каждого скалярного произведения и продолжаем делать это, пока не получим полную выходную матрицу.

Итак, к настоящему моменту мы знаем, как выполнить свертку, что именно является входными данными и как выглядит ядро. Но после каждого скалярного произведения мы сдвигаем ROI на несколько пикселей (можно пропустить 1, 2, 3… пикселя). Эта функция управляется параметром шаг.

Шаг: это параметр, который контролирует/изменяет величину движения области интереса на изображении. Шаг больше 1 используется для уменьшения выходного размера. Интуитивно он пропускает перекрытие нескольких пикселей в каждом скалярном произведении, что приводит к уменьшению окончательной формы вывода.

На изображении выше мы всегда перемещаем ROI на 1 пиксель и выполняем скалярное произведение с ядром. Но если мы увеличим шаг, скажем, шаг = 2, то выходная матрица будет иметь размер -> 2 x 2 (рис. 8).

СВЕРТКА ДЛЯ МНОГОКАНАЛЬНОГО ИЗОБРАЖЕНИЯ

Теперь мы знаем, как выглядит ввод и каковы некоторые общие параметры, такие как ядро ​​​​и шаг. Но как работает свертка, если у нас есть несколько каналов в изображении, то есть изображение цветное, или, если быть более точным, если входная матрица имеет форму: (высота, ширина, каналы), где канал больше 1.

Теперь у вас может возникнуть вопрос, у нас есть только одно ядро ​​и как его использовать на стеке 2D-матриц (в нашем случае это три 2D-матрицы, сложенные вместе). Итак, здесь мы введем термин «фильтр».

Обычно люди меняют фильтры и ядра, но на самом деле это разные вещи.

Фильтр: это группа ядер, которые используются для свертки изображения. Например: в цветном изображении у нас есть 3 канала, и для каждого канала у нас будет ядро ​​(для извлечения признаков), и группа таких ядер известна как фильтр. Для изображения в градациях серого (или двухмерной матрицы) термин фильтр равен ядру. В фильтре все ядра могут быть одинаковыми или отличаться друг от друга. Конкретное ядро ​​можно использовать для извлечения определенных функций.

Так как же происходит свертка?

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

Таким образом, на выходе получается карта признаков (извлеченные признаки) данного изображения. Мы можем в дальнейшем использовать этот вывод с классическими алгоритмами машинного обучения для задач классификации/регрессии, или этот вывод также можно использовать как один из вариантов данного изображения.

ЗАПОЛНЕНИЕ И ВЫХОДНЫЕ РАЗМЕРЫ

На данном этапе у нас есть довольно приличное понимание того, как происходит свертка между изображением и ядрами. Но этого недостаточно. Иногда необходимо получить точный размер вывода, как у данного ввода, нам нужно преобразовать ввод в другую форму, но того же размера. А вот и использование padding.

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

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

Поздравляем! Мы рассмотрели основные понятия операции свертки. Но как узнать выходную форму матрицы? И чтобы ответить на это, у нас есть простая формула, которая помогает вычислить форму выходной матрицы.

Где:
wᵢ -› ширина входного изображения, hᵢ - › высота входного изображения
wₖ - › ширина ядра, hₖ - › высота ядра
sᵥᵥ - › шаг для ширины, sₕ -> шаг для высоты
pᵥᵥ -> отступы по ширине изображения, pₕ -> отступы по высоте изображения

Как правило, отступы, шаг и ядро ​​​​в свертке симметричны (равны по высоте и ширине), что преобразует приведенную выше формулу в:

Где:
i -> форма ввода (высота = ширина)
k -> форма ядра
p -> отступы по краям изображения
s -> шаг для свертки (для скользящего скалярного произведения)

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

ЯДРА ИЗОБРАЖЕНИЯ

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

Будем считать это входным изображением.

Теперь с помощью ядер и с помощью свертки на входном изображении и заданном ядре мы преобразовали бы данное изображение в требуемый вид. Ниже приведены несколько преобразований, которые можно выполнить с помощью пользовательских ядер в свертках изображений.

  1. Обнаружение горизонтальных и вертикальных линий
  2. Обнаружение края
  3. Размытие, повышение резкости, контур, тиснение и различные другие преобразования в Photoshop.
  4. Эрозия и расширение

Итак, давайте сначала взглянем на одно из самых основных ядер, и это ядро ​​blur. Существует множество вариантов ядра размытия, но наиболее известными из них являются размытие по Гауссу и прямоугольное размытие.

Точно так же другие ядра помогают в преобразовании изображения в требуемую форму. У нас есть отличная иллюстрация, чтобы попробовать разные ядра на изображении выше: https://setosa.io/ev/image-kernels/

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

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

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

Давайте поиграем с заданным горизонтальным ядром и результатами его свертки.

Удивлен! Таким образом, из рисунка 20 мы можем легко заявить, что если мы увеличим значения в основном горизонтальном ядре, то будет обнаружено только несколько строк. Это сила ядер на изображении. Более того, мы также можем увеличивать/уменьшать плотность для данного ядра путем симметричной модификации заданных значений.

Вот и все… Надеюсь, вы узнали, а также полюбили блог :D

ЗАКЛЮЧЕНИЕ

В данной записи блога обсуждались следующие темы:

  1. Основные термины свертки: ввод, ядро, шаг, заполнение, фильтры.
  2. Разница между оттенками серого и цветными изображениями
  3. 2D свертка на изображениях в градациях серого и цветных изображениях
  4. Форма вывода оператора свертки
  5. Изучение различных ядер изображений

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

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

[1] CS231n Сверточные нейронные сети для визуального распознавания, https://cs231n.github.io/convolutional-networks/

[2] Винсент Дюмулен, Франческо Визин, Руководство по сверточной арифметике для глубокого обучения, https://arxiv.org/abs/1603.07285

[3] Обнаружение линий, https://en.wikipedia.org/wiki/Line_detection

[4] Ирхум Шафкат, Интуитивное понимание сверток для глубокого обучения, https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1

[5] Виктор Пауэлл, Ядра изображений, https://setosa.io/ev/image-kernels/