Neural Style Transfer
Нейронный перенос стиля перерисовывает содержимое фотографии в стиле другого изображения, подбирая статистики признаков CNN. Разбираем метод Гатиса, быстрые модели и применение.
Перенос нейронного стиля (NST) — это метод компьютерного зрения, который отображает содержимое одного изображения, например фотографии улицы, в визуальном стиле другого, например картины, сопоставляя внутренние признаки предварительно обученной свёрточной нейронной сети (CNN). Содержимое отражают карты признаков глубокого слоя, показывающие, что и где изображено. Стиль отражают корреляции между каналами признаков, которые фиксируют текстуры, цвета и мазки кисти, но не их расположение. Леон Гатис, Александр Эккер и Маттиас Бетге из Тюбингенского университета представили этот метод в августе 2015 года в работе «Нейронный алгоритм художественного стиля», а в следующем году приложение Prisma сделало его доступным пользователям смартфонов.
Как работает исходный метод#
Метод Гатиса использует VGG-19 — обученную на ImageNet CNN, — как фиксированный экстрактор признаков и изменяет пиксели выходного изображения, а не веса сети. Результат определяется двумя функциями потерь:
- Потеря содержимого: Квадрат разности между картами признаков выходного изображения и исходной фотографии содержимого на одном глубоком слое, conv4_2; это сохраняет узнаваемость объектов и композиции.
- Потеря стиля: Квадрат разности между матрицами Грама на пяти слоях от conv1_1 до conv5_1. Для слоя с C каналами матрица Грама — это таблица C x C, элемент (i, j) которой показывает, насколько часто каналы i и j активируются одновременно, суммируя значения по всем позициям изображения.
Взвешенную сумму двух потерь минимизируют с помощью алгоритма оптимизации L-BFGS, а обратное распространение ошибки передаёт градиент через замороженную сеть к пикселям:
Поскольку матрица Грама суммирует значения по позициям, она почти не меняется при изменении композиции изображения. Перестановка квадрантов фотографии наглядно показывает это на примере ResNet-18 из torchvision — меньшей CNN для ImageNet, чем VGG-19, — в PyTorch:
import torch
from skimage import data
from torchvision.models import ResNet18_Weights, resnet18
weights = ResNet18_Weights.DEFAULT
cnn = resnet18(weights=weights).eval()
early_layers = torch.nn.Sequential(cnn.conv1, cnn.bn1, cnn.relu, cnn.maxpool, cnn.layer1)
preprocess = weights.transforms()
photo = torch.tensor(data.astronaut()).permute(2, 0, 1) # 3 x 512 x 512
rearranged = torch.roll(photo, shifts=(256, 256), dims=(1, 2)) # same pixels, quadrants swapped
def content_and_style(image):
"""Return an early CNN layer's feature map (content) and its Gram matrix (style)."""
with torch.no_grad():
features = early_layers(preprocess(image)[None])[0].flatten(1) # channels x positions
return features, features @ features.T / features.shape[1]
(content_a, style_a), (content_b, style_b) = content_and_style(photo), content_and_style(rearranged)
print(f"Content change: {(content_a - content_b).norm() / content_a.norm():.0%}")
print(f"Style change: {(style_a - style_b).norm() / style_a.norm():.0%}")Перестановка квадрантов изменяет карту признаков на 96%, а матрицу Грама — всего на 7%; оставшиеся 7% объясняются новыми швами и центральной обрезкой, из-за которой в каждом изображении остаётся другая область. Именно поэтому потеря стиля копирует мазки кисти и палитру картины, не копируя расположение изображённых на ней объектов.
Быстрый перенос произвольного стиля#
Оптимизация каждого изображения требует сотен итераций, поэтому в последующих работах оптимизацию перенесли в процесс обучения. Джастин Джонсон, Александр Алахи и Ли Фэй-Фэй из Стэнфорда в 2016 году обучили отдельную сеть прямого распространения для каждого стиля с теми же функциями потерь; результат получался примерно в тысячу раз быстрее, а те же перцептивные потери применялись к сверхвысокому разрешению. Дмитрий Ульянов и его коллеги обнаружили, что замена пакетной нормализации на нормализацию по экземплярам в таких сетях улучшает качество стилизации. Адаптивная нормализация по экземплярам (AdaIN, 2017) Сюна Хуанга и Сержа Белонги поддерживает любой стиль без повторного обучения: она меняет среднее значение и стандартное отклонение каждого канала признаков содержимого, подгоняя их под изображение стиля, а затем декодирует результат; всё это выполняется в реальном времени.
Перенос стиля для устойчивых моделей компьютерного зрения#
Роберт Гейрхос и его коллеги с помощью AdaIN показали, что обученные на ImageNet CNN в большей степени полагаются на текстуру, чем на форму: ResNet-50 классифицирует изображение кошки с текстурой слоновьей кожи как слона — пример обучения на поверхностных признаках. Для Stylized-ImageNet каждое изображение ImageNet стилизовали случайной картиной из коллекции Painter by Numbers, включавшей 79 434 картины; ResNet-50, обученная на полученных данных, стала полагаться на форму. Если использовать эту модель, ориентированную на форму, как базовую сеть для модели обнаружения объектов Faster R-CNN, mAP50 на Pascal VOC 2007 выросла с 70.7 до 75.1, а на MS COCO — с 52.3 до 55.2.
Та же идея применима к расширению данных для наборов данных обнаружения, поскольку перенос стиля сохраняет положение каждого объекта. Стилизованная копия размеченного изображения использует исходные ограничивающие рамки, поэтому в наборе данных обнаружения Ultralytics YOLO26 ей нужна только копия исходного файла разметки с новым именем изображения.
Перенос нейронного стиля и связанные термины#
- Генеративно-состязательные сети (GAN): CycleGAN обучается преобразованию между целыми коллекциями изображений, например фотографиями и картинами Моне, вместо сопоставления статистик одного изображения стиля.
- Перенос обучения: Дообучает предварительно обученные веса для новой задачи. NST не обновляет веса сети, а использует её только для вычисления потерь.
- Диффузионные модели: Меняют стиль изображений по текстовой подсказке или эталонному изображению, генерируя их заново; при этом могут измениться не только стиль, но и формы с деталями.










