Что такое свёртка (convolution) и как она используется в CV?
Свёртка (convolution) — это математическая операция, применяемая к изображению для выделения признаков, трансформации или фильтрации данных. В компьютерном зрении (CV, computer vision) она играет ключевую роль в задачах обработки изображений, распознавания объектов, обнаружения границ, подавления шума и построения нейронных сетей (особенно сверточных нейронных сетей — CNN).
Математическая основа
Свёртка между функцией изображения и ядром (или фильтром) — это операция, которая перемещает ядро по всему изображению и на каждом шаге вычисляет скалярное произведение ядра и соответствующего фрагмента изображения.
Формально, для двумерной свёртки:
S(i, j) = ∑∑ K(m, n) * I(i - m, j - n)
-
I(i, j) — входное изображение
-
K(m, n) — ядро (фильтр)
-
S(i, j) — результат свёртки
На практике часто используется кросс-корреляция, в которой ядро не переворачивается:
S(i, j) = ∑∑ K(m, n) * I(i + m, j + n)
Компоненты операции свёртки
-
Ядро (Kernel, Filter)
Маленькая матрица, например 3×3 или 5×5. Каждый элемент — вес, применяемый к соответствующему пикселю подматрицы изображения. -
Stride (шаг)
Количество пикселей, на которое сдвигается фильтр после каждого применения. Чем больше stride, тем меньше выходной размер. -
Padding (дополнение)
Дополнительные пиксели (обычно нули), добавляемые вокруг изображения для сохранения размеров после свёртки. -
Output
Новая матрица признаков (feature map), содержащая результаты применения фильтра по всему изображению.
Пример: фильтр для обнаружения границ
Фильтр Собеля по X (обнаружение вертикальных границ):
[-1, 0, 1]
[-2, 0, 2]
[-1, 0, 1]
Этот фильтр усиливает переходы яркости по горизонтали. При применении к изображению он выделяет вертикальные края объектов.
Пример вычисления вручную
Пусть изображение 3×3:
I = [[10, 10, 10],
[10, 50, 10],
[10, 10, 10]]
и фильтр 3×3:
K = [[ 0, -1, 0],
[-1, 5, -1],
[ 0, -1, 0]]
Результат S(1,1) вычисляется как сумма попарных произведений I(i,j) * K(i,j) по всем элементам 3×3. Это может усилить центральный пиксель (напр., при "sharpen").
Использование в классическом CV
1. Фильтрация изображений
-
Размытие (Blur): среднее или гауссово.
-
Резкость (Sharpen): усиление различий между пикселями.
-
Подавление шума: медианная фильтрация, гауссовы ядра.
2. Выделение признаков
-
Обнаружение границ (фильтры Собеля, Лапласа).
-
Детекторы углов (Harris Corner, FAST).
-
Фильтры Габора — имитация отклика зрительных рецепторов.
3. Преобразование изображений
-
Уменьшение/увеличение размерности.
-
Нормализация и стандартизация изображения.
-
Обнаружение паттернов (текстуры, направленности).
Использование в свёрточных нейронных сетях (CNN)
В машинном обучении, особенно в нейронных сетях, свёртки заменяют ручную разработку фильтров: модель сама обучает веса ядер во время тренировки.
Особенности:
-
Обучаемые фильтры: в отличие от фиксированных в классическом CV.
-
Многоканальные свёртки: свёртка применяется к каждому каналу (например, R, G, B) и результаты суммируются.
-
Глубокие представления: слои свёртки один за другим строят всё более абстрактные признаки (от краёв к формам и объектам).
Пример:
import cv2
import numpy as np
from scipy.signal import convolve2d
image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.array(\[\[0, -1, 0\],
\[-1, 5, -1\],
\[0, -1, 0\]\])
output = convolve2d(image, kernel, mode='same')
Разница между свёрткой и кросс-корреляцией
-
Свёртка: ядро отражается по обоим осям (формально).
-
Кросс-корреляция: ядро применяется напрямую без отражения.
На практике в OpenCV и PyTorch реализуется именно кросс-корреляция, хотя называют это "свёрткой" по привычке.
Пространственная и частотная интерпретация
Свёртка в пространственной области (через ядро) эквивалентна умножению в частотной области (через преобразование Фурье). Это активно используется в ускорении фильтрации:
F = fft2(image)
K = fft2(kernel, s=image.shape)
result = ifft2(F * K)
Применение в различных задачах
-
Детектирование объектов: выделение краёв, контуров, углов.
-
Сегментация изображений: идентификация границ объектов.
-
Оптический поток: фильтрация для извлечения движений.
-
Обнаружение лиц, номеров, текста: предварительная фильтрация.
-
Анализ текстур: Габоровы фильтры.
-
Data augmentation: свёртки с шумами или аугментированными ядрами.
-
Обработка видео: временные свёртки для анализа движения.
Производительность
Свёртка — вычислительно затратная операция, особенно при больших фильтрах и высоком разрешении. Оптимизация включает:
- **Fast convolution через FFT
** - **Глубинные библиотеки (OpenCV, CuDNN)
** - **Параллелизация на GPU
** - **Кэширование и использование dilated (расширенных) свёрток
**
Свёртка — это фундаментальный инструмент в компьютерном зрении, объединяющий математику, геометрию, фильтрацию сигналов и обучение признаков. Она используется как в традиционных методах обработки изображений, так и в современных нейронных сетях.