Свёртка

Свёртка двух функций и в дискретном случае определяется следующим образом:

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

Одномерная свёртка

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

Свёртка изображений

Другие названия: image filtering, image convolution. Да-да, ровно то, что применяется в свёрточных нейронных сетях.

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

Ядро свёртки — квадратная матрица нечётного, как правило небольшого, размера.

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

Тогда свёртка изображения ядром  — это изображение (также матрица) , такая что.

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

Если пиксель на краю, то возможно несколько вариантов.

  • Использовать дефолтное значение

  • Копировать край

  • Применять свёртку так, чтобы не было выхода за границу. Тогда размер выходного изображения будет меньше входного.

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

Выражение двумерной свёртки через одномерную

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

Рисунок 1 показывает общую, без детализации, схему итогового решения.

convolution scheme
Рисунок 1. Схема предлагаемой реализации свёртки

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

  1. Предполагаем, что изображение (например, с камеры) поступает последовательно по строкам.

  2. Первое, что сделаем (чтобы упростить себе дальнейшую жизнь) — преобразуем потенциально цветное изображение в градации серого.

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

  4. По мере готовности через второй коммутатор ( ) будут выбираться последовательных строк для обработки.

  5. К каждой строке применяется одномерная свёртка с соответствующей частью двумерного ядра.

  6. После чего производится суммирование (модуль Sum).

  7. Результат накапливается в буфере очередного кадра (FrameBuffer).

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

Обязательно порешайте упражнения.