포스트

StyleGAN 얼굴 편집에서 머리카락이 붙어 움직이는 이유: v1, v2, v3 변화

StyleGAN 얼굴을 움직였는데 머리카락이나 피부 무늬가 화면 좌표에 붙어 따라온다면, latent 편집 문제가 아니라 생성기의 aliasing과 위치 표현 문제를 먼저 의심해야 합니다.

StyleGAN의 세 버전은 단순히 해상도와 품질만 높인 계보가 아닙니다. v1은 style로 층별 의미를 제어하는 틀을 만들었고, v2는 AdaIN과 progressive growing에서 생긴 artifact를 줄였으며, v3는 texture sticking을 translation, rotation equivariance 문제로 다뤘습니다.

세 버전은 어떤 조건으로 비교해야 하나요?

따라서 한 장의 선명도만으로 버전을 고르기보다 편집할 속성, 허용하기 어려운 artifact, 정지 이미지인지 움직이는 결과인지부터 정해야 합니다. 같은 latent와 같은 변환 조건에서 결과를 비교해야 구조 차이와 데이터 차이를 혼동하지 않습니다.

먼저 비교 목적을 하나로 고정합니다. 정체성과 자세를 층별로 섞을 수 있는지 보려면 style mixing 경계를 바꾸고, droplet이나 phase artifact를 보려면 같은 해상도의 정지 샘플을 확대하며, texture sticking을 보려면 동일한 얼굴을 평행 이동하거나 회전시켜 연속 프레임을 봅니다. 서로 다른 체크포인트와 데이터셋의 예쁜 샘플 한 장씩을 비교하면 모델 버전이 아니라 학습 데이터와 선택 편향을 비교하게 됩니다.

평가할 때는 생성 품질과 편집 안정성을 분리하는 편이 좋습니다. 사진처럼 보이는 결과라도 머리를 돌리는 순간 눈썹이나 모공이 화면에 고정되면 animation에는 부적합할 수 있습니다. 반대로 단일 이미지만 필요한 작업에서는 v3의 equivariance가 가장 우선인지는 계산 비용과 기존 편집 도구 호환성을 함께 보고 판단해야 합니다.

v1은 latent를 층별 style로 바꿨습니다

기존 GAN은 무작위 latent z를 generator에 바로 넣는 경우가 많았습니다. StyleGAN v1은 mapping network로 z를 중간 latent w로 바꾸고, synthesis network의 여러 층에 style을 주입합니다. 이 구조는 학습 데이터의 얽힌 분포에서 표현을 떼어 내고, 서로 다른 해상도 층이 다른 시각 속성을 맡도록 유도합니다.

낮은 해상도 층은 얼굴의 pose와 큰 형태 같은 coarse style, 중간 층은 눈과 머리 형태, 높은 해상도 층은 색과 미세 질감을 주로 바꿉니다. 두 latent의 style을 층 구간별로 섞는 style mixing이 가능한 이유입니다. 각 층의 독립적인 noise는 머리카락 가닥이나 주근깨처럼 정체성을 결정하지 않는 stochastic detail을 담당합니다.

v1의 style 적용에는 AdaIN이 쓰입니다.

\[\operatorname{AdaIN}(x_i,y)=y_{s,i}\frac{x_i-\mu(x_i)}{\sigma(x_i)}+y_{b,i}\]

feature를 정규화한 뒤 style에서 얻은 scale과 bias를 적용하는 방식입니다. 제어는 쉬워졌지만 강한 정규화가 물방울처럼 보이는 droplet artifact를 만드는 원인도 됐습니다.

Style mixing 실험은 두 latent를 섞었다는 사실보다 어느 층까지 첫 번째 style을 쓰고 어디서 두 번째 style로 바꿨는지가 핵심입니다. 낮은 해상도 구간만 바꾸었는데 자세와 얼굴 윤곽이 함께 움직이고, 높은 해상도 구간만 바꾸었는데 색조와 머리카락 결이 달라진다면 층별 역할을 관찰할 수 있습니다. 하지만 이 경계를 고정된 의미 사전처럼 쓰면 실패합니다. 학습 해상도, 데이터 정렬, 네트워크 구성에 따라 같은 층 번호가 담당하는 속성이 달라질 수 있기 때문입니다.

독립 noise도 style과 구별해야 합니다. 같은 w를 유지한 채 noise만 바꿨을 때 주근깨나 잔머리 같은 국소 변화가 나타나는지 보고, 얼굴 방향이나 정체성까지 크게 바뀐다면 학습된 역할 분리가 기대와 다르다고 판단할 수 있습니다. 이렇게 입력 요인을 하나씩 고정해야 latent 편집이 불안정한 원인을 찾기 쉽습니다.

v2는 AdaIN을 weight modulation으로 바꿨습니다

StyleGAN v2는 style을 feature 통계에 직접 적용하는 대신 convolution weight를 modulation하고 demodulation합니다. 각 입력 채널에 style scale을 곱한 뒤 출력 채널별 크기를 다시 정규화해, AdaIN이 feature의 상대적 크기를 과도하게 파괴하던 문제를 줄입니다. Noise와 bias를 적용하는 순서도 정리했습니다.

또 하나의 문제는 progressive growing에서 생기는 phase artifact였습니다. 해상도를 단계적으로 키우는 과정 대신 skip 또는 residual 연결을 둔 feed-forward 구조를 비교해 더 안정적인 생성을 노렸습니다. 규제 계산도 매 미니배치마다 하지 않는 lazy regularization으로 비용을 줄였고, path length regularization은 W 공간의 움직임이 이미지 변화로 비교적 매끄럽게 이어지도록 만듭니다. 이 성질은 latent inversion과 편집에도 중요합니다.

따라서 v1과 v2를 비교할 때 “후자가 선명하다”에서 끝내기보다, artifact가 feature normalization에서 왔는지, growing 방식에서 왔는지 분리해 보는 편이 좋습니다.

Modulation은 각 샘플의 style이 convolution weight의 입력 채널 크기를 조절하게 하고, demodulation은 출력 채널별 응답 크기가 지나치게 커지거나 작아지는 것을 보정합니다. 이를 단순한 weight normalization이라고만 부르면 샘플별 style이 들어가는 지점을 놓칩니다. 구현을 확인할 때는 style 변환, weight modulation, demodulation 계수, convolution의 차원 순서를 차례로 추적해야 합니다.

v2로 바꿨는데도 원형 얼룩이 남는다면 체크포인트 변환, 데이터 전처리, noise 입력을 먼저 분리해 봐야 합니다. 또 고주파 질감이 불안정한 현상을 모두 AdaIN 탓으로 돌려서는 안 됩니다. Progressive growing을 없앤 구성과 style 적용 방식을 동시에 바꾼 버전이므로, 어떤 변경이 어떤 실패를 줄였는지 실험 조건을 나누지 않으면 원인을 잘못 짚기 쉽습니다.

v3는 texture sticking을 신호 처리 문제로 봅니다

v2까지도 얼굴을 이동하거나 회전시키면 피부와 머리카락의 일부가 이미지 좌표에 붙어 있는 듯한 texture sticking이 남았습니다. 생성기가 픽셀 격자의 절대 위치를 내부 좌표처럼 사용하고, upsampling과 비선형 연산에서 alias가 생기기 때문입니다.

StyleGAN v3의 목표는 입력의 이동이 출력의 같은 이동으로 이어지는 translation equivariance를 높이는 것입니다. rotation까지 고려한 구성도 다룹니다. 연속 신호 관점에서 feature를 다루고, 해상도를 바꾸는 구간에 low-pass filtering을 넣어 sampling 과정에서 생기는 alias를 억제합니다. 이 변화는 한 장의 정지 이미지 점수보다 animation과 편집에서 더 쉽게 체감됩니다.

Nyquist 조건을 적용할 때는 원문의 간단한 숫자 예처럼 sampling rate와 signal frequency의 관계를 뒤집어 읽지 않도록 주의해야 합니다. 핵심은 표현하려는 최고 주파수에 비해 충분한 sampling rate가 필요하다는 것입니다.

정지 샘플에서는 texture sticking을 놓치기 쉽습니다. 얼굴을 화면 오른쪽으로 조금씩 이동했는데 피부 점이 얼굴과 함께 이동하지 않고 픽셀 위치에 남아 보이는지, 회전할 때 머리카락 결이 갑자기 재배열되는지를 프레임 단위로 확인해야 합니다. 단순히 프레임마다 이미지를 독립 생성한 뒤 깜박임을 보는 것과, 같은 latent에 알려진 기하 변환을 적용해 equivariance를 보는 것은 다른 시험입니다.

Low-pass filtering도 무조건 세게 적용하면 된다는 뜻은 아닙니다. 필요한 주파수까지 제거하면 디테일이 흐려지고, filtering 전후의 sampling 위치와 비선형 연산을 함께 설계하지 않으면 alias가 다시 생길 수 있습니다. v3의 핵심은 특정 필터 하나가 아니라 전체 synthesis network가 연속 신호와 sampling을 일관되게 다루도록 만든 데 있습니다.

버전을 고를 때 보는 기준

층별 style mixing과 의미 분해를 이해하려면 v1이 출발점입니다. 고정된 이미지 생성에서 droplet, phase artifact를 줄인 구조를 보고 싶다면 v2의 modulation/demodulation과 skip generator를 먼저 보면 됩니다. 카메라나 얼굴이 움직이는 영상에서 질감이 좌표에 붙는 현상이 문제라면 v3의 alias-free 설계가 직접적인 답입니다.

하지만 버전 변경이 데이터 문제까지 고쳐 주지는 않습니다. 정렬되지 않은 얼굴, 뒤섞인 화풍, 부족한 pose 분포는 여전히 결과를 흔듭니다. 또한 “coarse, middle, fine 층”의 경계는 학습 해상도와 데이터에 따라 달라질 수 있으므로, 특정 층 번호를 모든 모델의 고정 의미로 간주하지 말고 실제 style mixing 결과를 확인해야 합니다.

데이터 실패는 버전 실패처럼 보일 수 있습니다. 얼굴 중심과 크기가 제각각이면 큰 형태를 담당하는 층이 정체성뿐 아니라 정렬 보정까지 떠맡을 수 있고, 특정 배경과 헤어스타일이 항상 함께 나오면 style mixing에서도 둘이 붙어 움직일 수 있습니다. 버전을 교체하기 전에 동일한 crop, 정렬 규칙, pose 분포, 중복 이미지와 편향을 확인해야 결과 차이를 해석할 수 있습니다.

자주 남는 질문

StyleGAN v1의 style mixing으로 무엇을 확인할 수 있나요?

서로 다른 latent의 style을 해상도 층 구간별로 섞어, 큰 형태와 중간 속성, 미세 질감을 어느 층이 주로 제어하는지 확인할 수 있습니다.

StyleGAN v2는 왜 AdaIN을 modulation과 demodulation으로 바꿨나요?

AdaIN의 강한 feature 정규화에서 생기던 droplet artifact를 줄이면서 style이 convolution에 영향을 주도록 하기 위해서입니다.

StyleGAN v3가 특히 필요한 경우는 언제인가요?

얼굴이나 카메라를 이동, 회전할 때 머리카락과 피부 질감이 화면 좌표에 붙어 움직이는 texture sticking이 문제가 될 때입니다.

함께 읽으면 이해가 이어지는 글

자주 묻는 질문

StyleGAN v1의 style mixing으로 무엇을 확인할 수 있나요?

서로 다른 latent의 style을 해상도 층 구간별로 섞어, 큰 형태와 중간 속성, 미세 질감을 어느 층이 주로 제어하는지 확인할 수 있습니다.

StyleGAN v2는 왜 AdaIN을 modulation과 demodulation으로 바꿨나요?

AdaIN의 강한 feature 정규화에서 생기던 droplet artifact를 줄이면서 style이 convolution에 영향을 주도록 하기 위해서입니다.

StyleGAN v3가 특히 필요한 경우는 언제인가요?

얼굴이나 카메라를 이동, 회전할 때 머리카락과 피부 질감이 화면 좌표에 붙어 움직이는 texture sticking이 문제가 될 때입니다.

THE END / OPSOAI

여기까지 읽었습니다

핵심 장면을 한 번 더 떠올려 보세요. 이해가 남았다면 이 책은 제 역할을 다했습니다.

다른 책 고르기
표지 1

키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.

CONTENTS

이 책의 목차

    9개 장 17 분읽는 시간