Операция свертки (convolution) является фундаментальным строительным блоком сверточных нейронных сетей (CNN). На примере детекции границ объектов становится понятно, как именно нейронные сети «видят» изображения на ранних этапах обработки, выделяя контуры, чтобы в дальнейшем распознавать сложные структуры, такие как лица или предметы.
Основы процесса свертки 1:25
Для компьютерного зрения распознавание объектов начинается с анализа базовых линий и границ. Представим входное изображение в виде матрицы интенсивности пикселей.
- Для работы с изображением создается матрица меньшего размера, называемая фильтром (иногда в академической литературе используется термин «ядро» или kernel).
- В данном примере используется 6x6-матрица изображения в оттенках серого и 3x3-фильтр.
- Операция свертки (обозначается символом
*) заключается в наложении фильтра на область изображения, поэлементном перемножении значений и последующем суммировании результатов.
Процесс вычисления выходной матрицы 4x4 происходит пошагово:
- Фильтр накладывается на верхний левый блок 3x3 исходного изображения.
- Выполняется поэлементное умножение: каждое число фильтра умножается на соответствующее значение пикселя.
- Девять полученных результатов суммируются, формируя первый элемент результирующей матрицы.
- Фильтр сдвигается на один шаг вправо, и операция повторяется для следующей области.
Этот процесс последовательного сдвига (stride) и вычисления продолжается до тех пор, пока не будет заполнена вся выходная матрица.
Программная реализация операции 7:10
Хотя в математической нотации для свертки часто используется символ *, в программировании это обозначение может быть неоднозначным из-за перегруженности оператора (например, он может означать обычное умножение).
В профессиональных фреймворках для глубокого обучения существуют специализированные функции:
- TensorFlow:
tf.nn.conv2d. - Keras:
Conv2D. - Программные упражнения: часто используется функция
conv_forward.
Детекция границ: как это работает 8:02
Чтобы понять, почему именно такая матрица выполняет роль детектора, рассмотрим простой пример. Представим изображение, где левая половина состоит из «ярких» пикселей (интенсивность 10), а правая — из «темных» (интенсивность 0).
Используя фильтр с положительными значениями слева и отрицательными справа:
- При наложении на область с резким переходом фильтр «подсвечивает» границу, выдавая высокие значения в результирующей матрице.
- Если изображение однородно (все значения одинаковы), результат свертки будет близок к нулю, так как положительные и отрицательные коэффициенты фильтра взаимно уничтожаются.
Этот метод позволяет выделить вертикальные линии: яркая область в центре выходной матрицы является сигналом о наличии сильного вертикального перехода в исходном изображении. Хотя на примере 6x6 граница кажется толстой, при использовании изображений высокого разрешения (например, 1000x1000 пикселей) этот подход показывает высокую эффективность в поиске контуров.
Интуиция проста: вертикальная граница — это область, где яркие пиксели соседствуют с темными. Фильтр свертки эффективно специфицирует этот шаблон, позволяя нейронной сети автоматически находить структурные особенности.