Свёртка
Свёртка двух функций и в дискретном случае определяется следующим образом:
На практике часто используются так называемые одномерная и двумерная свёртки для цифровой обработки сигналов (в частности, изображений).
Одномерная свёртка
Одномерная свёртка часто используется для цифровой обработки сигналов. Например, здесь проводится достаточно подробный разбор одномерной свёртки в таком контексте с примерами и визуализацией. Мы будем использовать её как подготовку и составную часть для свёртки изображений.
Свёртка изображений
Другие названия: image filtering, image convolution. Да-да, ровно то, что применяется в свёрточных нейронных сетях.
В рамках нашего курса считаем, что работаем с чёрно-белым изображением: байт на пиксель, без альфа-каналов и прочих деталей. То есть изображение может быть представлено как двумерная матрица байт (прозрачности нет, метаданных нет).
Ядро свёртки — квадратная матрица нечётного, как правило небольшого, размера.
Пусть есть изображение произвольного размера и ядро свёртки размера . Пусть .
Тогда свёртка изображения ядром — это изображение (также матрица) , такая что.
Обратите внимание на то, что формула выше не учитывает обработку пикселей на краю изображения, которая может быть организована разными способами. |
Обратите внимание на то, фильтр можно представить как матрицу (часто чисел с плавающей точкой), а можно и как целочисленную матрицу и коэффициент перед ней. |
Подумайте, как соотносится данная формула с общим определением свёртки, данным в начале раздела. |
Если пиксель на краю, то возможно несколько вариантов.
-
Использовать дефолтное значение
-
Копировать край
-
Применять свёртку так, чтобы не было выхода за границу. Тогда размер выходного изображения будет меньше входного.
В нейронных сетях веса в матрице как раз таки "обучаются". Но существуют предопределённые ядра, выполняющие вполне конкретные операции: размытие, выделение границ. Больше примеров:
Выражение двумерной свёртки через одномерную
В нашем курсе мы декомпозируем двумерную свёртку в набор одномерных следующим образом. Пусть ядро двумерной свёртки имеет размер . Тогда для вычисления одной строки нового ("свёрнутого") изображения нужно обработать строк исходного изображения . Пусть это буду строки . Тогда на первом шаге необходимо применить одномерную свёртку к каждой строке изображения и соответствующей строке ядра: и , и и так далее. После чего поэлементно сложить результаты этих свёрток.
Рисунок 1 показывает общую, без детализации, схему итогового решения.
Заметим, что данное решение не претендует на оптимальность и организовано представленным образом исключительно в целях упрощения обучения.
-
Предполагаем, что изображение (например, с камеры) поступает последовательно по строкам.
-
Первое, что сделаем (чтобы упростить себе дальнейшую жизнь) — преобразуем потенциально цветное изображение в градации серого.
-
Далее, для успешного применения фильтра, нам надо накопить строк. Для этого выделим буфера в памяти (LineBuffers). Их будет для того, чтобы параллельно с обработкой уже накопленных записывать следующую строку не боясь перетереть данные. Коммутатор ( ) как раз будет управлять тем, в какой буфер нужно записывать данные.
-
По мере готовности через второй коммутатор ( ) будут выбираться последовательных строк для обработки.
-
К каждой строке применяется одномерная свёртка с соответствующей частью двумерного ядра.
-
После чего производится суммирование (модуль Sum).
-
Результат накапливается в буфере очередного кадра (FrameBuffer).
Пошаговой реализации такого решения будут посвящены упражнения в курсе (с некоторыми дополнениями и ответвлениями для изучения важных тем и отработки навыков).
Обязательно порешайте упражнения. |