개발자로 후회없는 삶 살기
[22.09.26] GAN PART.CGAN, CycleGAN 본문
서론
내가 원하는 조건 생성을 할 수 있는 Conditional GAN
※ 이 포스트는 다음 교재의 학습이 목적임을 밝힙니다.
https://tensorflow.blog/gan-in-action/
본론
- 도입부
미리 보기 : sgan이 판별자에 label을 사용했다면 cgan은 생성자와 판별자를 훈련하는데 모두 label을 사용 -> label을 학습하니 원하는 가짜 샘플을 합성 가능합니다!
-> 동기 : 지금까지 gan은 실제 같은 손글씨 숫자를 합성하지만 숫자 9가 아니라 숫자 7을 생성하도록 명령할 수 없습니다.
1. 생성할 데이터의 종류를 결정할 수 있다면 많은 애플리케이션이 가능합니다.
2. ex) 긴 빨강 머리와 푸른 눈을 가진 중년 여성
- cgan
정의 : 훈련하는 동안 추가 정보를 사용해 조건이 붙는 생성적 적대 신경망 -> 클래스 label, 일련의 태그, 글로 쓰인 설명도 추가 정보로 가능합니다 (= 설명(텍스트)으로 이미지 생성!)
=> 판별자
1. 진짜 샘플-label, 가짜 샘플-label을 구별하는 법을 배웁니다.
2. 판별자는 진짜 샘플-label 쌍만 받아들이고 맞지 않는 쌍은 거부합니다.
3. 가짜 샘플의 쌍도 거부합니다.
+ ex) 샘플-label 쌍이 진짜인지 가짜인지 상관없이 (3 [이미지], 4 [label])은 거부하도록 학습합니다.
+ ex2) label과 이미지가 맞더라도 가짜 이미지-label 쌍은 모두 거부합니다.
+ 거부 리스트 : 1) 쌍이 맞지 않는 것, 2) 가짜 샘플 > sgan처럼 각 클래스를 구분하는 것을 학습(sgan) 하지 않습니다.
=> 생성자
1. 훈련 데이터 셋에 있는 각 label에 대해 실제 같은 샘플을 생성하는 법을 배웁니다
2. 거부 리스트에 따라서 진짜처럼도 보여야 하고 label도 잘 맞아야 합니다.
- 판별자, 생성자 입ㆍ출력
=> 판별자
입력 : 진짜 샘플과 label을 받고, 가짜 샘플과 이 샘플을 생성하는 데 사용한 label을 받습니다.(x*|y, y -> x*|y가 생성 이미지)
진짜 샘플 label 쌍을 받아서 진짜 데이터를 구별하고 그에 맞는 쌍을 판별하는 법을 배웁니다.
+ 생성자가 만든 쌍에서는 가짜 이미지 쌍을 판별하는 법을 배웁니다. > ★ 이것으로 진짜와 가짜를 구분하도록 학습합니다.
출력 : 입력이 진짜이고 올바른 쌍인지를 나타내는 하나의 확률을 출력(시그모이드 출력)
-> ★ 생성자가 만든 쌍과 진짜 샘플 쌍을 받아 주어진 쌍이 진짜인지 가짜인지 구별하는 것을 학습
=> 정리
-> 판별자
1. 입력 : (x, y), (x*|y, y)
2. 출력 : 입력 샘플이 진짜이고 쌍이 맞는지를 나타내는 하나의 확률
3. 목표 : 생성자가 만든 가짜 샘플-label쌍과 훈련 데이터 셋의 진짜 샘플-label 쌍을 구별하는 것
-> 생성자
1. 입력 : 랜덤 백터와 label(z, y)
2. 출력 : 주어진 label에 가능한 한 맞도록 생성된 가짜 샘플 x*|y
3. 목표 : label에 맞는 진짜처럼 보이는 가짜 샘플 생성하는 것
=> 구현 : 코랩 노트북 참고
-> 임베딩을 사용하여 샘플 x와 label을 연결합니다.
-> 임베딩 방법
1. 판별자
이미지와 label 임베딩을 연결합니다. (concat으로 합니다.)
2. 생성자
multiply() 메서드로 합니다.
- CycleGAN
=> 이미지 대 이미지 변환
개념 : 총 두 개의 GAN을 사용했는데, 각 GAN의 생성지는 한 영역에서 다른 영역으로의 이미지 변환을 수행합니다. 자세히 설명하자면 X가 입력이라 하면 첫 번째 GAN의 생성기는 G: X -> Y를 수행합니다. 따라서 출력은 Y = G(X)가 됩니다. 두 번째 GAN의 생성기는 역매핑 F: Y -> X를 수행해 X = F(Y)가 됩니다. 각 판별기는 실제 이미지와 합성 이미지를 구별하도록 훈련됩니다. 첫 번째 GAN의 판별기는 X가 진짜 이미지일 거고 Y가 합성 이미지일 거고 두 번째 GAN의 판별기는 Y가 진짜 이미지일 거고 X가 합성 이미지일 것입니다. ★G가 만들 걸 F의 판별기가 확인하고 F가 만든 걸 G의 판별기가 확인합니다.
이런 걸 하려면 생성자의 입력이 사진이어야 합니다. > 생성자가 z가 아니라 이미지에서부터 시작합니다. > ★ 한 도메인의 이미지를 다른 도메인의 이미지로 맵핑합니다.
-> 이전에 생성자에게 주입하던 잠재 벡터를 이미지로 대체합니다. > 하지만 이게 어려운 게 cgan에는 label이 필요하다는 것을 알았습니다. > 이미지를 label로 사용하기 때문에 다른 도메인에 있는 정확히 같은 이미지로 맵핑하지 않으면 사용할 수 없습니다. = 즉 스케치 사진과 동일한 실제 이미지가 필요합니다.
+ 얻는 방법을 생각해 보면 흑백 이미지를 얻어야 하면 컬러 사진을 로드하여 흑백 필터를 적용합니다.
> 결론 : cgan은 완벽한 쌍이 있어야 해서 어렵습니다. 하지만 cycle gan은 완벽한 쌍이 필요하지 않습니다.
- 손실
1) 도메인 A에서 B로 변환하고 다시 A로 변환합니다.
2) a(1) > a(햇) > a(3)
- 사이클-일관성 손실
완벽한 쌍 대신 사이클이 존재
사이클을 구성했기 때문에 원래 사진(a)과 재구성 사진(a [햇])이 동일할 것입니다. ∴ 동일하지 않으면 사이클-일관성 손실을 구합니다. -> 1과 3이 얼마나 차이가 나는지 사이클-일관성 손실을 계산합니다.
2개의 생성자가 필요합니다. : 따라서 정방향 손실과 역반향 손실 두 개의 손실이 있습니다. +이는 이미지 입력 X에 대해 두 번의 변환 F(G(X)) ~ X 후에 얻은 이미지는 X와 동일하다는 것을 보장합니다. (유사하게 역순환 일관성 손실도 G(F(Y)) ~ X를 보장합니다.
=> 적대 손실
역시나 여기서도 판별자는 A > B로 변환할 때 진짜 사진처럼 보이는지 항상 테스트하는 용도입니다.
-> 생성자가 두 개니 판별자도 두 개고 적대 손실도 두 번 등장합니다.
=> 두 개의 항으로 구성
1항 : 주어진 이미지가 변환된 이미지가 아니라 진짜일 가능성
2항 : 생성자가 판별자를 속일 가능성
=> 동일성 손실
목표 : 재구성 이미지가 처음 도메인 A 스타일을 유지하길 원합니다.(동일성) -> 이를 위해 B에서 A로 변환하는 생성자에 도메인 A에 이미 있는 이미지를 주입합니다.
이유 : cycle gan이 올바른 도메인에 있는 이미지를 이해해야 하기 때문입니다. = 얼룩말을 주입하고(이미 있는 이미지) 이 이미지를 얼룩말로 변환하려면 해야 할 일이 없기 때문에 동일한 얼룩말을 얻음 ∴ 동일성 목표를 만족합니다.
=> 정리
1. 적대 손실 : 2개의 생성자에 2개의 항으로 4개의 손실
2. 사이클-일관성 손실 : 원본 도메인의 이미지 a와 두 번 변환된 (a > b > a) 이미지 a(햇) 간의 차이 -> 총 5개의 손실
=> 구조
입력 이미지가 두 경로를 따라 이동합니다.
1. 하나는 판별자에게 주입되어 진짜인지 아닌지 판단을 받습니다. (적대 손실)
2. 하나는 생성자에게 주입되어 B로 변환되고 판별자 B가 도메인 B에 있는 진짜 이미지처럼 보이는지 평가하고 다시 A로 변환되어 사이클 손실을 만듭니다.
-> 여기서 A가 만든 B가 B의 판별자로 들어가서 평가하고 B가 만든 A가 A의 판별자로 들어가서 평가한다는 거 같습니다.
※ 여기서 뭐가 적대 손실이고 일관성 손실인지 정확히 이해해야 합니다.
=> 정리
생성자 구조 = Unet
-> 지금까지 내가 본 생성자는 확성기 모양이었는데 얘는 Z가 아닌 이미지를 입력으로 넣으니 넥타이 모양입니다.(절대로 생성자 두 개를 붙였다고 생각하면 안 됩니다.)
- 저자 말씀
후반부 재구성의 품질은 혼재되어 있습니다. 어떤 것은 아래 그림처럼 매우 뚜렷합니다. 하지만 어떤 것은 단순히 오렌지를 사과로 채색하거나 그 반대인 것 같습니다. 논문의 저자도 이 문제를 언급했습니다. CycleGAN은 근본적으로 이미지 구조를 바꿀 수 없고 단지 스타일을 바꿉니다. 이 제약 사항을 유념하세요.
> 즉 이미지를 완전히 부꾸는 것이 아닌 스타일만 바꾸는 것이라서 완전한 변환은 아닙니다.
'[AI] > [네이버 BoostCamp | 학습기록]' 카테고리의 다른 글
CV PART.데이터셋 구성, opencv (0) | 2023.03.18 |
---|---|
CV PART.객체탐지 개요 (0) | 2023.03.16 |
[22.09.23] GAN PART.최신 GAN 기술 (0) | 2022.12.27 |
[22.09.15] GAN PART.훈련과정 (0) | 2022.12.27 |
[22.09.13] GAN PART.GAN 시스템 (0) | 2022.12.27 |