CycleGAN 끄적이기
CycleGAN
여러분이 이미지 변환에 관심이 있으시다면, CycleGAN이라는 기술을 한 번 들어보셨을 것입니다. CycleGAN은 이미지 변환에 대한 최신 연구 중 하나로, 특히 두 개의 이미지 집합 사이에서 스타일을 변환하는 데 사용됩니다. 이 포스트에서는 CycleGAN의 주요 개념과 작동 방식에 대해 설명하고, Python과 TensorFlow를 사용하여 CycleGAN을 구현하는 방법을 소개하겠습니다.
CycleGAN이란?
CycleGAN은 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks의 약자로, 서로 상응하는 훈련 예제가 없는 두 이미지 도메인 간의 스타일 변환을 가능하게 하는 기술입니다. 예를 들어, 여름 풍경 사진을 겨울 풍경 사진으로 바꾸는 것과 같은 작업을 수행할 수 있습니다.
CycleGAN의 주요 개념
CycleGAN은 여러 가지 중요한 개념을 사용합니다:
- Residual blocks : Residual block은 입력을 직접 출력에 더하는 ‘skip connection’과 비슷한 개념입니다. 이는 네트워크가 학습해야 하는 함수의 복잡성을 줄이고, 따라서 학습 속도를 높이는데 도움이 됩니다.
1
2
x -> conv -> norm -> relu -> conv -> norm -> y
return x + y
- Instance normalization : Instance normalization은 각 피처 맵의 채널별로 정규화를 수행하는 방법입니다. 이는 네트워크가 배치 사이즈에 의존하지 않고 안정적으로 학습될 수 있게 합니다.
LSGAN (Least Squares GAN) : LSGAN은 기존의 sigmoid cross entropy loss function 대신 least square loss function을 사용하는 GAN입니다. 이는 생성된 이미지가 실제 이미지와 더 가깝게 만들어질 수 있도록 돕습니다.
Autoencoder : Autoencoder는 입력 데이터의 특징을 학습하고 재구성하는 비감독학습 모델입니다. 이는 복잡한 데이터의 특징을 추출하고 이를 이용해 새로운 데이터를 생성하는 데 유용합니다.
Identity loss : Identity loss는 CycleGAN의 핵심 개념 중 하나로, 입력 이미지를 동일한 이미지로 재구성하는 능력을 측정하는 손실 함수입니다. 이는 네트워크가 입력과 출력 사이의 일관성을 유지하도록 돕습니다.
CycleGAN 구현하기
CycleGAN을 구현하는 코드는 여기에서 확인하실 수 있습니다.
요구사항
위에 코드를 실행하려면 CycleGAN을 구현하려면 다음과 같은 요구사항이 필요합니다
- python 3
- scipy
- numpy
- tqdm
- tensorflow
데이터셋
- 데이터셋은 Berkeley에서 제공하는 CycleGAN 데이터셋을 사용할 수 있습니다.
코드구조
CycleGAN의 코드 구조는 다음과 같습니다:
- ops : Tensorflow 연산에 대한 유틸리티 함수들이 들어있습니다.
- utils : 이미지 로딩, 저장 등에 관련된 유틸리티 함수들이 들어있습니다.
- CycleGAN : CycleGAN 모델의 핵심 코드가 들어있습니다.
- train : 훈련 과정을 제어하는 코드가 들어있습니다.
하이퍼파라미터
1
2
3
4
5
6
7
8
9
10
11
12
img_ch = 3
img_size = 256
learning_rate = 0.0002
# feature weight
gan_w = 1.0 # X -> Y' 1 * loss(Y,Y')
cycle_w = 10.0 # X -> Y' -> X'' 10 * loss(X,X'')
identity_w = 5.0 # Y -> X' 5 * loss(X,X')
epoch = 2
iteration = 100000
batch_size = 1
손실함수
- L1
1
loss = tf.reduce_mean(tf.abs(x - y))
- G_LOSS
1
2
3
4
#LSGAN
fake_cost = tf.reduce_mean(tf.squared_difference(fake, 1.0))
return fake_cost
- D_LOSS
1
2
3
4
5
#LSGAN
real_cost = tf.reduce_mean(tf.squared_difference(real,1.0))
fake_cost = tf.reduce_mean(tf.square(fake))
return real_cost + fake_cost
- LOSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# loss
# X' -> X
# Y' -> Y
identity_loss_A = L1_loss(G_aa,train_A)
identity_loss_B = L1_loss(G_bb,train_B)
# X -> Y'
# Y -> X'
G_cost_A = g_cost(D_fake_A)
G_cost_B = g_cost(D_fake_B)
# X -> Y' vs real
D_cost_A = d_cost(D_real_A,D_fake_A)
D_cost_B = d_cost(D_real_B,D_fake_B)
# X -> Y' -> X'' vs X
recon_cost_A = L1_loss(G_aba,train_A)
recon_cost_B = L1_loss(G_bab,train_B)
G_loss_A = gan_w * G_cost_A + \
cycle_w * recon_cost_A + \
identity_w * identity_loss_A
G_loss_B = gan_w * G_cost_B + \
cycle_w * recon_cost_B + \
identity_w * identity_loss_B
D_loss_A = gan_w * D_cost_A
D_loss_B = gan_w * D_cost_B
G_loss = G_loss_A + G_loss_B
D_loss = D_loss_A + D_loss_B
결론
CycleGAN은 이미지 변환 분야에서 흥미로운 결과를 보여주는 기술입니다. 이 포스트에서는 CycleGAN의 주요 개념과 Python을 사용한 구현 방법에 대해 설명했습니다. 이미지 변환에 관심이 있는 분들에게는 CycleGAN이 흥미로운 주제가 될 것입니다.