Python/Deep Learning

CycleGAN을 활용한 이미지 변환

임베디드 친구 2026. 2. 24. 20:53
728x90
반응형

CycleGAN을 활용한 이미지 변환

1. CycleGAN이란?

CycleGAN(Cycle-Consistent Generative Adversarial Networks)은 비지도 학습을 기반으로 두 개의 서로 다른 도메인의 이미지를 변환하는 생성적 적대 신경망(GAN) 모델입니다. 일반적인 GAN과 달리, CycleGAN은 한 도메인의 이미지를 다른 도메인으로 변환하는 동시에 역변환(reverse transformation)을 통해 원본 이미지로 돌아갈 수 있도록 학습됩니다. 이러한 특성은 스타일 변환(style transfer)이나 도메인 적응(domain adaptation)에 유용하게 사용됩니다.

CycleGAN의 대표적인 응용 사례는 다음과 같습니다.

  • 여름 ↔ 겨울 이미지 변환: 특정 계절의 이미지를 다른 계절로 변환
  • 말 ↔ 얼룩말 변환: 말 이미지를 얼룩말 이미지로 변환하거나 그 반대로 변환
  • 사진 ↔ 그림 변환: 현실 사진을 특정 화풍의 그림으로 변환
  • 낮 ↔ 밤 변환: 낮의 이미지를 밤의 이미지로 변환

이 글에서는 CycleGAN을 활용하여 여름 이미지와 겨울 이미지를 변환하는 모델을 구축하는 방법을 소개합니다.


2. CycleGAN의 핵심 개념

CycleGAN은 일반적인 GAN과 달리 쌍(pair)이 없는 데이터셋을 이용하여 학습합니다. 즉, 동일한 장면에서 여름과 겨울 사진을 1:1로 매칭하지 않아도 변환이 가능합니다. CycleGAN은 다음과 같은 주요 요소로 구성됩니다.

2.1. 생성자(Generator)

CycleGAN에는 두 개의 생성자가 존재합니다.

  • G(X → Y): X 도메인(여름 이미지)을 Y 도메인(겨울 이미지)로 변환하는 생성자
  • F(Y → X): Y 도메인(겨울 이미지)을 X 도메인(여름 이미지)로 변환하는 생성자

2.2. 판별자(Discriminator)

두 개의 판별자가 존재하며, 각각 생성된 이미지가 실제 도메인의 이미지와 유사한지를 판단합니다.

  • D_Y: 변환된 겨울 이미지가 실제 겨울 이미지인지 판별
  • D_X: 변환된 여름 이미지가 실제 여름 이미지인지 판별

2.3. 순환 일관성(Cycle Consistency) 손실

CycleGAN의 핵심 개념 중 하나는 순환 일관성 손실(Cycle Consistency Loss)입니다. X 도메인의 이미지를 Y 도메인으로 변환한 후 다시 X 도메인으로 변환했을 때, 원본 이미지와 최대한 유사해야 합니다.

수식으로 표현하면 다음과 같습니다.

$$ \mathcal{L}{cycle} (G, F) = \mathbb{E}{x \sim X} [||F(G(x)) - x||1] + \mathbb{E}{y \sim Y} [||G(F(y)) - y||_1] $$


3. CycleGAN 구현하기

CycleGAN을 구현하기 위해 TensorFlow 및 Keras를 활용하여 모델을 구축하고 학습하는 과정을 설명하겠습니다.

3.1. 환경 설정 및 라이브러리 설치

먼저 필요한 라이브러리를 설치합니다.

pip install tensorflow numpy matplotlib

필요한 모듈을 불러옵니다.

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.layers import Conv2D, Conv2DTranspose, LeakyReLU, ReLU, Input, Activation, BatchNormalization
from tensorflow.keras.models import Model

3.2. 생성자(Generator) 구축

CycleGAN의 생성자는 U-Net 아키텍처와 유사한 구조로 구성됩니다.

def build_generator():
    inputs = Input(shape=(256, 256, 3))
    x = Conv2D(64, (7, 7), padding='same', use_bias=False)(inputs)
    x = BatchNormalization()(x)
    x = ReLU()(x)

    # 다운샘플링
    x = Conv2D(128, (3, 3), strides=2, padding='same', use_bias=False)(x)
    x = BatchNormalization()(x)
    x = ReLU()(x)

    # 업샘플링
    x = Conv2DTranspose(64, (3, 3), strides=2, padding='same', use_bias=False)(x)
    x = BatchNormalization()(x)
    x = ReLU()(x)

    outputs = Conv2D(3, (7, 7), padding='same', activation='tanh')(x)
    return Model(inputs, outputs)

3.3. 판별자(Discriminator) 구축

판별자는 이미지가 실제 이미지인지 생성된 이미지인지 구별합니다.

def build_discriminator():
    inputs = Input(shape=(256, 256, 3))
    x = Conv2D(64, (4, 4), strides=2, padding='same')(inputs)
    x = LeakyReLU(alpha=0.2)(x)

    x = Conv2D(128, (4, 4), strides=2, padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU(alpha=0.2)(x)

    outputs = Conv2D(1, (4, 4), padding='same', activation='sigmoid')(x)
    return Model(inputs, outputs)

3.4. 학습 및 이미지 변환 결과

학습을 진행하려면 대량의 여름 이미지와 겨울 이미지 데이터셋이 필요합니다. 대표적으로 CycleGAN 공식 GitHub에서 제공하는 데이터셋을 활용할 수 있습니다.


4. 결론

CycleGAN을 활용하면 라벨이 없는 이미지 데이터를 사용하여 서로 다른 도메인 간 변환이 가능합니다. 본 글에서는 여름 이미지 ↔ 겨울 이미지 변환을 예제로 소개했지만, 이를 응용하여 다양한 스타일 변환 및 이미지 개선 작업을 수행할 수 있습니다.

더 나아가 CycleGAN의 성능을 개선하기 위해 데이터 증강, 하이퍼파라미터 튜닝, 고해상도 모델 적용 등의 추가적인 연구가 필요합니다.


이제 여러분도 CycleGAN을 활용하여 원하는 이미지 변환 모델을 직접 만들어 보시길 바랍니다!

반응형