CycleGAN 이란
CycleGAN은 Style Transfer 분야에 GAN을 적용시킨 대표적인 모델입니다. Unpaired Image-to-Image Translation using Cycle-Consistent...
이 모델을 통해 풍경 사진에 대해 특정 화가의 화풍을 적용하거나, 여름 사진을 겨울로 변경 할 수도 있습니다.
자율주행 연구에서는 부족한 야간 주행 이미지를 CycleGAN을 통해 생성해내거나, 비가 오는 날의 물방울이 맺힌 주행 이미지를 물방울이 맺히지 않은 이미지로 변형해 성능을 높이기 위해서 CycleGAN을 사용하는 등 다양한 분야에서 사용이 되는 모델입니다.
그렇다면 어떠한 방법을 사용했기에 이러한 Style Transfer 모델을 만들 수 있었는지 확인해보도록 하겠습니다.
CycleGAN 설명
아키텍쳐
CycleGAN은 기존 GAN의 Generator처럼 noise를 image로 만드는 작업을 하는 것이 아닌 아래 그림처럼 image domain을 다른 domain으로 변환하는 아키텍쳐를 제안했습니다.
Generator A는 X 이미지를 Y처럼 보이게 변형하는 것을 학습하고, Generator B는 Y 이미지를 X처럼 보이게 학습을 합니다. Discriminator A는 이미지가 X 도메인인지 아닌지를 판별하며, B는 그 반대입니다.
굳이 왜 2개의 Generator가 존재하는 걸까요? 만약 Generator A만이 존재한다고 가정해보면, Generator의 Loss는 X 이미지에 대해 Generator A를 적용한 그림과 Y 이미지 간의 차이를 계산해야 할 것입니다. 그러려면 X와 Y이미지는 변환하고자 하는 도메인만 다른 같은 이미지가 Pair하게 준비되어야 합니다. 예를 들어 풍경을 고흐의 화풍으로 변경하는 모델을 구성한다면, 같은 사진 `예 : 런던 빅벤` 에 대해 실제 사진 한장과 고흐가 그린 그림 한장이 필요하게 됩니다. 이렇게 Pair한 데이터를 사용하여 학습하는 모델이 CycleGAN 이전의 Pix2Pix라는 모델입니다.
CycleGAN은 Unpair한 데이터셋에서도 학습이 가능하게끔 2개의 Generator를 두는 아키텍쳐, 로스를 구성했습니다. 방법은 아래와 같습니다. X 이미지에 대해 Generator G를 적용하여 Y 도메인으로 이미지를 변형한 후, 바로 다시 Generator F를 적용하여 원래 도메인 X로 변형합니다. 이후 원래의 X와 Generator 두개를 적용한 X_Fake 간의 Loss를 계산하여 이를 줄이는 방식을 제안했습니다. 이 Loss를 cycle-consistency loss라 부릅니다.
CycleGAN은 이러한 구조 덕에 Unpair한 데이터셋에서도 학습이 가능합니다.
공식
Generator A를 G, Generator B를 F라고 우선 정의해두겠습니다.
기존 GAN은 Generator로 학습한 G(x)를 최대한 y의 분포와 유사하게 만듭니다. CycleGAN의 저자는 이러한 학습은 제약이 적기 때문에 역방향 제네레이터를 추가해 F(G(x))가 x와 유사해지도록 학습하는 `cycle consistency loss`를 기존 `adversarial loss`와 함께 쓰는 방법을 제안했습니다. 이렇게 F(G(x))와 x를 비교하는 구조 덕에 데이터의 쌍이 맞지 않아도 학습할 수 있다는 장점이 존재합니다.
목적함수는 다음과 같이 구성할 수 있습니다.
Generator는 위의 수식을 최소화, Discriminator는 위의 수식을 최대화하는 minimax 문제로 볼 수 있습니다. 두 개의 GAN이 존재하므로 각각을 아래의 수식으로 표현할 수 있습니다.
여기에 CycleGAN만의 Loss인 `cycle consistency loss`를 보도록 하겠습니다. `cycle consistency loss`는 F(G(x))와 x 간의 Loss를 의미합니다. 그림으로 표현하면 아래와 같습니다.
cycle consistency loss는 기존 이미지 x에 대해 Generator G로 생성한 이미지 G(x)를 다시 Generator F로 생성한 이미지가 기존 이미지 x와 최대한 가깝게 있게끔 만들어야 하므로 다음과 같은 수식으로 표현할 수 있습니다.
이제 이를 전체 합친 목적함수는 다음과 같이 정리할 수 있습니다. 람다의 경우 위의 앞 두 식의 중요도에 따라 결정되는 값으로 저자는 10을 사용했습니다. 논문의 저자는 위의 두 식 adversarial loss과 밑의 식 cycle consistency loss각각을 단독으로 사용해 본 결과 두 식 모두 중요한 역할을 하고 있다고 말합니다.
추가로 논문의 저자는 이렇게 두 개의 loss로 학습을 할 때 학습을 하는 데 있어 복구된 이미지의 색상 문제가 있었다고 합니다. 이에 대해 원본 이미지의 값을 산출할 수 있도록 도움을 주는 identity loss를 추가하여 보정했습니다.
CycleGAN 구현
CycleGAN 구현은 https://velog.io/@tjdtnsu/PyTorch-실전-CycleGAN-모델-구현하기 의 코드를 일부 수정하여 사용했습니다.