Neural Style Transfer
신경 스타일 전이는 CNN 특성 통계를 일치시켜 사진의 내용을 다른 이미지의 스타일로 다시 그립니다. Gatys의 방법, 빠른 모델, 활용 사례를 다룹니다.
신경망 스타일 전이 (NST)는 사전 학습된 합성곱 신경망 (CNN)의 내부 특징을 일치시켜 거리 사진과 같은 이미지의 콘텐츠를 그림과 같은 다른 이미지의 시각적 스타일로 렌더링하는 컴퓨터 비전 기법입니다. 콘텐츠는 무엇이 어디에 있는지 기록하는 심층 레이어의 특징 맵으로 포착됩니다. 스타일은 특징 채널 간 상관관계로 포착됩니다. 이 상관관계는 텍스처, 색상, 붓놀림을 기록하지만 배치는 보존하지 않습니다. 튀빙겐 대학교의 Leon Gatys, Alexander Ecker, Matthias Bethge는 2015년 8월 A Neural Algorithm of Artistic Style에서 이 방법을 소개했으며, 이듬해 Prisma 앱이 스마트폰 사용자에게 이 기술을 선보였습니다.
기존 방식의 작동 원리#
Gatys의 방식은 ImageNet으로 학습된 CNN인 VGG-19를 고정된 특징 추출기로 사용하며, 네트워크 가중치가 아닌 출력 이미지의 픽셀을 변경합니다. 두 개의 손실 함수가 결과를 결정합니다.
- 콘텐츠 손실: 하나의 심층 레이어인 conv4_2에서 출력 이미지와 콘텐츠 사진의 특징 맵 간 제곱 차이로, 객체와 레이아웃을 알아볼 수 있도록 유지합니다.
- 스타일 손실: conv1_1부터 conv5_1까지 다섯 개 레이어의 Gram 행렬 간 제곱 차이입니다. C개 채널이 있는 레이어의 Gram 행렬은 C x C 표이며, 각 항목 (i, j)은 이미지의 모든 위치에서 합산해 채널 i와 j가 함께 반응하는 정도를 측정합니다.
두 손실의 가중합은 L-BFGS 최적화 알고리즘으로 최소화하며, 역전파는 동결된 네트워크를 통과해 픽셀까지 그래디언트를 전달합니다.
Gram 행렬은 위치별 값을 합산하므로 이미지 레이아웃이 바뀌어도 거의 변하지 않습니다. torchvision의 ResNet-18은 VGG-19보다 작은 ImageNet CNN이며, 이를 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% 변하지만 Gram 행렬은 7%만 변합니다. 남은 7%는 새로 생긴 경계선과 각 이미지에서 서로 다른 부분을 유지하는 중앙 크롭에서 비롯됩니다. 따라서 스타일 손실은 그림의 각 요소가 있는 위치를 복사하지 않고 붓놀림과 팔레트를 복사합니다.
빠르고 임의의 스타일 전이#
이미지마다 최적화에 수백 번의 반복이 필요했기 때문에 후속 연구에서는 최적화를 학습 과정으로 옮겼습니다. Stanford의 Justin Johnson, Alexandre Alahi, Li Fei-Fei는 2016년 같은 손실을 사용해 스타일별 피드포워드 네트워크를 학습했고, 약 1,000배 빠른 결과를 얻었으며 동일한 지각 손실을 초해상도에 적용했습니다. Dmitry Ulyanov와 동료들은 해당 네트워크에서 배치 정규화를 인스턴스 정규화로 바꾸면 스타일화 품질이 개선된다는 사실을 발견했습니다. Xun Huang과 Serge Belongie의 적응형 인스턴스 정규화 (AdaIN, 2017)는 재학습 없이 어떤 스타일이든 처리합니다. 각 콘텐츠 특징 채널의 평균과 표준편차를 스타일 이미지의 값에 맞춰 이동한 다음 디코딩하므로 실시간으로 작동합니다.
강건한 비전 모델을 위한 스타일 전이#
Robert Geirhos와 동료들은 AdaIN을 사용해 ImageNet으로 학습된 CNN이 형태보다 텍스처에 더 의존한다는 것을 보였습니다. ResNet-50은 코끼리 피부 텍스처를 입힌 고양이 이미지에 코끼리라는 라벨을 부여하는데, 이는 지름길 학습의 한 형태입니다. 이들은 Painter by Numbers 컬렉션의 그림 79,434점 중 무작위 그림을 사용해 ImageNet 이미지를 모두 다시 스타일링하여 Stylized-ImageNet을 만들었으며, 이 데이터셋으로 학습된 ResNet-50은 형태에 더 의존했습니다. 형태 기반 네트워크를 Faster R-CNN 객체 탐지 모델의 백본으로 사용하자 Pascal VOC 2007의 mAP50은 70.7에서 75.1로, MS COCO에서는 52.3에서 55.2로 향상되었습니다.
스타일 전이는 모든 객체의 위치를 유지하므로 탐지 데이터셋의 데이터 증강에도 같은 아이디어를 적용할 수 있습니다. 라벨이 지정된 이미지의 스타일화된 복사본은 원본의 바운딩 박스를 재사용하므로, Ultralytics YOLO26 탐지 데이터셋에서는 새 이미지 이름으로 원본 라벨 파일을 복사하기만 하면 됩니다.
신경망 스타일 전이와 관련 용어 비교#
- 생성적 적대 신경망 (GAN): CycleGAN은 하나의 스타일 이미지 통계를 일치시키는 대신 사진과 Monet 그림처럼 이미지 컬렉션 전체 간의 매핑을 학습합니다.
- 전이 학습: 사전 학습된 가중치를 새로운 작업에 맞게 미세 조정합니다. NST는 네트워크 가중치를 업데이트하지 않고 손실 측정에만 사용합니다.
- 확산 모델: 텍스트 프롬프트나 참조 이미지에 따라 이미지를 다시 생성해 스타일을 바꾸며, 이 과정에서 스타일뿐 아니라 형태와 세부 사항도 달라질 수 있습니다.










