TL;DR
Business use case
Style-GAN2-ADA 모델을 이용하여 특정인종의 미녀 만들기
코드: git hub
- 프로젝트 개요
- 데이터 설명
- 딥러닝 모델
- 설명 결과 회고
프로젝트 개요
Style-GAN으로 특정 인종의 원하는 스타일을 가진 이미지를 생성 할수 있을것이라는 가설에서 시작함. 특별히 다양한 인종이 섞여있지만 세계적으로 확고한 이미지상이 있는 히스패닉을 선정함.
Hispanic Character?
정의: 미국에 거주하는 중남미계의 미국인들을 지칭하며 브라질계는 제외.
히스패닉 뷰티를 하나로 정의하는 것의 어려움. 너무 다양한 인종이 있고 각 nationality에따른 확고한 이미지가 존재함.
- California: 15.57 million
- Texas: 11.52 million
- Florida: 5.66 million
- New York: 3.75 million
- Arizona: 2.31 million
미국에는 멕시코를 포함해 많은 중남미 출신 이민자들이 살고 있는데 이들 이민자 들은 멕시코를 비롯해 콜롬비아, 코스타리카, 엘살바도르, 과테말라, 온두라스, 니카라과 등 그 출신이 매우 다양합니다.
그 중 미국내 히스패닉 비율이 가장 높은 주는 캘리포니아이며 멕시코와 국경이 닿아 있어 전체 히스패닉중 멕시코인의 비중이 매우 높습니다.
따라서 3가지 주요 타겟층을 정하여 얼굴형을 나누어 보는것이 좋겠다고 생각하여 타겟별 얼굴 컨셉을 나누어 보았습니다.
타겟별 얼굴 컨셉
1. 미국내 다수를 차지하는 멕시코계 히스패닉의 전형을 보여주는 얼굴형
미국내 거주하는 히스패닉들의 친밀감을 이끌어 낼 수 있으며 옆집에 있을것 같지만 이쁜 얼굴을 보여주는것이 중요.
얼굴의 특징으로 얼굴이 전체적으로 넓고 광대와 하관이 넓은편으로 오각형에 가까운 굵고 각진 느낌이 강함. 콧볼이 놃고 크며 뭉툭한 느낌으로 약간 중성적인 느낌이 납니다.
대표적인 유명인
미셸 로드리게즈, 지나 로드리게즈, 대샤 폴랑코, 샤키라. 알렉산드리아 오카시오 ‑ 코르테즈
2. 미국인들이 가장 좋아하는 전형적인 섹시한 라티노의 느낌이 가미된 히스패닉의 얼굴형
얼굴이 길고 각이 졌으나 광대의 너비가 좁고 하관이 발달했으나 상대적으로 턱이 얇고 날카로지만 강한 하관이 특징, 아이홀이 깊으며 눈과 눈썹 사이가 좁아 섹시한 느낌이 강합니다.
대표적인 유명인
카밀라 카베요, 다이앤 게레로, 소피아 베르가라, 에바 롱고리아, 제니퍼 로페즈
3. 미국의 MZ세대에 인기가 많은 히스패닉 얼굴형
남미뿐만 아니라 흑인과 아시안등 다양한 인종이 섞여있는 얼굴로 보이며, 상대적으로 얼굴의 길이가 짧고 둥글며 이목구비가 오밀조밀 모여있어 동양인의 느낌이 가미되어 다양한 인종의 특성이 발현되는 히스패닉으로 섹시함 뿐만 아니라 귀여운 이미지가 강합니다.
이러한 얼굴형의 장점으로는 최근 젊은 미국인들이 선호하는 얼굴이며 글로벌 미인형에 가깝지만 전형적인 히스패닉의 얼굴과는 거리가 있어보인다는 단점이 있습니다.
대표적인 유명인
제시카 알바, 셀레나 고메즈, 마리앤드 까스트레온 카스타녜다(Mariand Castrejon Castañeda, 16.7백만의 팔로워보유한 뷰티 인플루언서)
데이터 설명
데이터 수집 및 전처리
다양한 인종의 특성상 알려지지 않은 히스패닉계의 일반인의 예쁜얼굴은 모으기가 어렵다고 판단.
히스패닉이 확인된 유명인 위주로 데이터 수집을 진행.
일반인 혹은 인플루언서의 경우 히스패닉이 확인된 사람 혹은 미국에 거주하지 않지만 해당 국가의 인물로 한정함.
데이터 수집
약 300여개의 이지 데이터 수집
- Google search
- Naver search
- IMDb
데이터 전처리
- 기본적인 수직 수평 맞춤
- 5:4비율 통일
- 정면이 아닌 사진 삭제
- 얼굴이 과도하게 가려진 사진 삭제
데이터 전처리까지 진행하여 총 55개의 사진 데이터로 모델 학습을 진행.
딥러닝 모델 설명
GAN 설명
Generative adversarial network (생성적 적대 신경망)으로 Generator(생성자)와 Discriminator(식별자)가 적대적으로 학습하여 이미지를 생성하는 모델로 Generator(생성자)는 계속 이미지를 생성하고 Discriminator(식별자)는 실제 이미지와 대조하며 생성된 이미지가 진짜인지 가짜인지 구분하며 학습한다.
GAN의 문제
- 경사손실: G의 손실함수는 0에 가까운데, 이때 0부근에서 경사도가 0을 이루며 G의 학습이 충분히 이루어지지 않는 문제
- 모드붕괴: G가 D를 속이는 이미지를 계속 생성하게 되면 손실함수는 작아지지만 유사한 이미지만 생성하게 되는 문제.
- 이미지가 어떻게 변할지 조정이 어려움
Style GAN설명
점진적으로 해상도를 올리기 위해서 Progressive Growing을 사용한다. 일반적인 GAN에서처럼 확률적(stochastically)으로 생성된 잠재 변수를 통해 이미지를 생성하는 것이 아닌 고정된 값의 텐서(fixed value tensor)를 통해 이미지를 생성한다. 확률적(stochastically)으로 생성된 잠재 변수(Latent Vector)는 8계층의 비선형 변환 신경망을 통과한 후 각 해상도에 AdaIN을 통해 스타일 벡터로 사용한다.
Progressive Growing
- Progressive Growing은 고해상도를 위해 생성자(Generator)와 판별자(Discriminator)를 저해상도에서 시작하여 점차적으로 추가하는 방법이고, 이는 고해상도의 이미지를 생성하기 위해 사용되는 방법 중 하나이다. (PGGAN)
- 각 생성자(Generator)는 독립되어있기 때문에 이가 얼굴을 따라가지 않는 문제가 발생함.
AdaIN
자세히 설명하면 두 단계로 나눌 수 있다.
- 정규화: 첫 단계는 자체 통계로 콘텐츠 정보를 정규화(normalization)하는 것
- 스케일: 두 번째는 스타일 정보를 사용하여 정규화된 콘텐츠 정보의 선형 전이(linear transition)를 하는 것
따라서 얼굴, 머리, 연령, 성별 등을 제어 할 수 있으며, 잠재변수 (Latent Vector)에서 직접 이미지를 생성하지 않고 중간 특징량으로 G의 각 해상도의 AdaIN부분에 입력하여 스타일 벡터(Style vector)로 사용 한다.
Style Mixing
StyleGAN에서는 학습중에 Style로써 랜덤 잠재변수가 아닌 두 가지 잠재변수를 혼합하는 Mixing Regularization이라고 부르는 정규화 방법을 사용하고 있다. 즉, 생성된 이미지 유형의 모양을 제어하는 흥미로운 옵션으로 두 유형의 스타일을 부분적으로 혼합하는 것으로 스타일 벡터 w가 잠재변수z(seed)와 맵핑 되었다.
스타일 벡터 w1 = 4x4 이미지 생성에 사용되고 w2=8x8이미지 생성에 사용된다.
스타일별 분류
1. Coarse = w0-w2 (4x4 -8x8) 저해상도, 이미지의 큰 구조 즉 얼굴모양, 피부색, 성별, 연령 변경
2. Middle = w3-w4(16x16-32x32) 중간해상도, Coarse스타일보다 두 잠새변수가 더 중간값으로 섞임
3. Fine = w5-w6(64x64-1024x1024) 고해상도, 배경과 머리색만 영향을 받고 매우 미세한 변경만 있음.
StyleGAN2 설명
StyleGAN의 단점을 개선. AdaIN대신 CNN의 가중치를 정규화 하고 Progressive Growing을 제거하여 Latent Space에 계속성을 제공하여 이미지품질을 향상시킨 모델. PPL의 특성에서 착안하여 이미지 품질을 개선(잠재공간을 매끄럽게 개선)여 StyleGAN의 단점(물방울 노이즈 (droplet), 부자연스러운 이미지생성)을 개선함.
정규화 Normalization
추정 통계(Estimated Statistics)
기존의 StyleGAN에서는 실제통계(Actual Statistics)를 사용하는 AdaIn으로 정규화를 진행하여 생성된 이미지에서 물방울 무늬의 노이즈가 함께 생성되는 문제가 있었으나 추정통계를 사용하여 물방울 노이즈(Droplet)가 제거됨.
생성자 구조 Generator Network
계층 생성자(Hierarchical Generator network)
기존의 StyleGAN에서의 Progressive Growing대신 Skip Connection을 가지고 있는 계층 생성를 사용하여 부자연스려운 이미지생성을 줄임. (생성된 이미지간 추적하지 않는 모드 개선)
지각적 경로 길이 PPL(Perceptual Path Length)
잠재공간의 지각적인 부드러움을 나타내는 Perceptual Path Langth와 이미지의 품질에 상관 관계가 있을 것이라고 알고 있었기 때문에, 이것을 정규화 함으로 모델에 통합한다. 이러한 정규화는 잠재변수의 섭동(;주요한 힘의 작용에 의한 운동이 부차적인 힘의 영향으로 교란되어 일어나는 운동)에 대해 Generator의 출력값의 변화가 가급적 작도록 하는 방향으로 유도한다.
StyleGAN2 -ADA 설명
손실함수(Loss function)나 network의 구조를 건드리지 않고 이미 학습이 된 GAN을 finetuning하며 학습하는 모델.
또한, 적은 데이터로 학습을 해도 식별자(Discriminator)가 overfitting 되지 않도록 Adaptive Discriminator Augmentation Mechanism(ADA)을 이용.
ADA (Adaptive Discriminator Augmentation Mechanism)
StyleGAN-ADA에서는 오직 augmented image만을 사용하여 Discriminator를 학습하며, Generator 역시 augment한 이미지를 바탕으로 학습한다. 하지만 매번 augmentation probability p를 조정하는 것은 어렵기때문에 본 모델에서는 overfitting의 정도에 의거하여 동적으로 p값을 조절한다. 처음에 p값을 0으로 초기화한 후에 4번의 minibatch마다 이 값을 조절한다.
- p 가 0이면, augmentation을 하지 않은것.
- p 가 1에 가까우면, augmentation을 많이한것.
StyleGAN2 -ADA 적용
Training Method with Colab pro 1Gpu
#1. 이미지 리사이징 512 *512 size
result_path = './selected_crop'
image_files = Path(result_path)
image_files = list(image_files.glob(r'*.jpg'))
for name in image_files[:]:
img = cv2.imread(f'{name}')
img = cv2.resize(img, (512,512))
# 전처리 이미지 저장
print(img.shape)
#2. Training Parameter option
#how often should the model generate samples and a .pkl file
snapshot_count = 4
#should the images be mirrored left to right?
mirrored = True
#should the images be mirrored top to bottom?
mirroredY = False
#metrics?
metric_list = None
#augments
augs = "bgc"
#3. Pretrained Image dataset
resume_from = "ffhq512" # 1024로 리사이징 한 이미지는 "ffhq1024"를 사용
#4. amount of kimg
kimg = 1000 # 1024로 리사이징 한 이미지는 "200kimg"를 사용
Training log for 512x512 images
#생성자(Generator) 맵핑
G Params OutputShape WeightShape
--- --- --- ---
latents_in - (?, 512) -
labels_in - (?, 0) -
epochs 1 () ()
epochs_1 1 () ()
G_mapping/Normalize - (?, 512) -
G_mapping/Dense0 262656 (?, 512) (512, 512)
G_mapping/Dense1 262656 (?, 512) (512, 512)
G_mapping/Dense2 262656 (?, 512) (512, 512)
G_mapping/Dense3 262656 (?, 512) (512, 512)
G_mapping/Dense4 262656 (?, 512) (512, 512)
G_mapping/Dense5 262656 (?, 512) (512, 512)
G_mapping/Dense6 262656 (?, 512) (512, 512)
G_mapping/Dense7 262656 (?, 512) (512, 512)
G_mapping/Broadcast - (?, 16, 512) -
dlatent_avg - (512,) -
Truncation/Lerp - (?, 16, 512) -
#생성자(Generator) log 4x4~64x64
G Params OutputShape WeightShape
G_synthesis/4x4/Const 8192 (?, 512, 4, 4) (1, 512, 4, 4)
G_synthesis/4x4/Conv 2622465 (?, 512, 4, 4) (3, 3, 512, 512)
G_synthesis/4x4/ToRGB 264195 (?, 3, 4, 4) (1, 1, 512, 3)
G_synthesis/8x8/Conv0_up 2622465 (?, 512, 8, 8) (3, 3, 512, 512)
G_synthesis/8x8/Conv1 2622465 (?, 512, 8, 8) (3, 3, 512, 512)
G_synthesis/8x8/Upsample - (?, 3, 8, 8) -
G_synthesis/8x8/ToRGB 264195 (?, 3, 8, 8) (1, 1, 512, 3)
G_synthesis/16x16/Conv0_up 2622465 (?, 512, 16, 16) (3, 3, 512, 512)
G_synthesis/16x16/Conv1 2622465 (?, 512, 16, 16) (3, 3, 512, 512)
G_synthesis/16x16/Upsample - (?, 3, 16, 16) -
G_synthesis/16x16/ToRGB 264195 (?, 3, 16, 16) (1, 1, 512, 3)
G_synthesis/32x32/Conv0_up 2622465 (?, 512, 32, 32) (3, 3, 512, 512)
G_synthesis/32x32/Conv1 2622465 (?, 512, 32, 32) (3, 3, 512, 512)
G_synthesis/32x32/Upsample - (?, 3, 32, 32) -
G_synthesis/32x32/ToRGB 264195 (?, 3, 32, 32) (1, 1, 512, 3)
G_synthesis/64x64/Conv0_up 2622465 (?, 512, 64, 64) (3, 3, 512, 512)
G_synthesis/64x64/Conv1 2622465 (?, 512, 64, 64) (3, 3, 512, 512)
G_synthesis/64x64/Upsample - (?, 3, 64, 64) -
G_synthesis/64x64/ToRGB 264195 (?, 3, 64, 64) (1, 1, 512, 3)
#생성자(Generator) log 128x128~512x512
G Params OutputShape WeightShape
--- --- --- ---
G_synthesis/128x128/Conv0_up 1442561 (?, 256, 128, 128) (3, 3, 512, 256)
G_synthesis/128x128/Conv1 721409 (?, 256, 128, 128) (3, 3, 256, 256)
G_synthesis/128x128/Upsample - (?, 3, 128, 128) -
G_synthesis/128x128/ToRGB 132099 (?, 3, 128, 128) (1, 1, 256, 3)
G_synthesis/256x256/Conv0_up 426369 (?, 128, 256, 256) (3, 3, 256, 128)
G_synthesis/256x256/Conv1 213249 (?, 128, 256, 256) (3, 3, 128, 128)
G_synthesis/256x256/Upsample - (?, 3, 256, 256) -
G_synthesis/256x256/ToRGB 66051 (?, 3, 256, 256) (1, 1, 128, 3)
G_synthesis/512x512/Conv0_up 139457 (?, 64, 512, 512) (3, 3, 128, 64)
G_synthesis/512x512/Conv1 69761 (?, 64, 512, 512) (3, 3, 64, 64)
G_synthesis/512x512/Upsample - (?, 3, 512, 512) -
G_synthesis/512x512/ToRGB 33027 (?, 3, 512, 512) (1, 1, 64, 3)
--- --- --- ---
Total 30276585
Training log for 512x512 images
#식별자(Discriminator)는 역순으로 확인
D Params OutputShape WeightShape
--- --- --- ---
images_in - (?, 3, 512, 512) -
labels_in - (?, 0) -
512x512/FromRGB 256 (?, 64, 512, 512) (1, 1, 3, 64)
512x512/Conv0 36928 (?, 64, 512, 512) (3, 3, 64, 64)
512x512/Conv1_down 73856 (?, 128, 256, 256) (3, 3, 64, 128)
512x512/Skip 8192 (?, 128, 256, 256) (1, 1, 64, 128)
256x256/Conv0 147584 (?, 128, 256, 256) (3, 3, 128, 128)
256x256/Conv1_down 295168 (?, 256, 128, 128) (3, 3, 128, 256)
256x256/Skip 32768 (?, 256, 128, 128) (1, 1, 128, 256)
128x128/Conv0 590080 (?, 256, 128, 128) (3, 3, 256, 256)
128x128/Conv1_down 1180160 (?, 512, 64, 64) (3, 3, 256, 512)
128x128/Skip 131072 (?, 512, 64, 64) (1, 1, 256, 512)
64x64/Conv0 2359808 (?, 512, 64, 64) (3, 3, 512, 512)
64x64/Conv1_down 2359808 (?, 512, 32, 32) (3, 3, 512, 512)
64x64/Skip 262144 (?, 512, 32, 32) (1, 1, 512, 512)
#식별자(Discriminator)는 역순으로 확인
D Params OutputShape WeightShape
--- --- --- ---
32x32/Conv0 2359808 (?, 512, 32, 32) (3, 3, 512, 512)
32x32/Conv1_down 2359808 (?, 512, 16, 16) (3, 3, 512, 512)
32x32/Skip 262144 (?, 512, 16, 16) (1, 1, 512, 512)
16x16/Conv0 2359808 (?, 512, 16, 16) (3, 3, 512, 512)
16x16/Conv1_down 2359808 (?, 512, 8, 8) (3, 3, 512, 512)
16x16/Skip 262144 (?, 512, 8, 8) (1, 1, 512, 512)
8x8/Conv0 2359808 (?, 512, 8, 8) (3, 3, 512, 512)
8x8/Conv1_down 2359808 (?, 512, 4, 4) (3, 3, 512, 512)
8x8/Skip 262144 (?, 512, 4, 4) (1, 1, 512, 512)
4x4/MinibatchStddev - (?, 513, 4, 4) -
4x4/Conv 2364416 (?, 512, 4, 4) (3, 3, 513, 512)
4x4/Dense0 4194816 (?, 512) (8192, 512)
Output 513 (?, 1) (512, 1)
--- --- --- ---
Total 28982849
#augmentaition metrics
augment 0.808
StyleGAN2 이미지는 512차원의 잠재 벡터로 생성되고.
이 벡터를 생성하는데 시드값이 사용된다. 두개의 매우 유사한 잠제 벡터(Latent Vector)는 매우 유사한 이미지를 생성하지만 가까운 숫자값을 가진 두개의 시드가 반드시 유사한 이미지를 생성하지 않는다.
seed는 일반적으로 정수 값이고 GAN생성기의 전체 512개의 벡터로 Seed를 랜덤하게 확장한다.
일반적으로 이 Latent Vector값을 변경하면 이미지의 배치 또는 일부 기타 사항이 변경된다.
결과
512x512 이미지 학습의 결과가 꽤나 만족스럽게 도출되었지만 fine styles의 변형을 추가로 확인하고 성능 향상을 위해 짧은 시간 더 좋은 화질의 이미지로 추가 학습을 진행하여 최종 결과물을 도출 하였습니다.
이미지의 사이즈 변경하고 200kimg의 학습을 진행하였습니다.
1.512x512
Hispanic Beauty final
Total Seeds = 4,294,967,295
Final select seeds = 15
초기 가설 설정
- 얼굴형: 얼굴이 길고 각이 졌으나 광대의 너비가 좁고 하관이 발달 상대적으로 턱이 얇고 날카롭지만 강한 하관이 특징
- 이목구비: 전체적으로 볼드한 느낌이 강합니다. 입은 크고 시원시원하며. 눈썹은 짙고 각져있고 아이홀이 깊rh 눈과 눈썹 사이가 좁아 섹시한 느낌이 강합니다.
- 피부색: 적당히 어두운 구리빛 피부를 가지고 있으며.
- 헤어: 머리카락은 짙은 갈색 혹은 흑색에 가까우며 컬리하고 풍성합니다.
Interpolation
단순히 GAN으로 이미지를 생성하는 것만으로는 흥미로운 결과를 얻을 수 없습니다. 사실, 임의의 두 이미지의 두 개의 잠재 공간 임베딩(W)은 묘사된 콘텐츠의 중간 조합을 얻기 위해 다른 비율로 함께 혼합될 수 있습니다. 사진 생성을 위한 기계 학습에서 이 기능은 이미지 유형의 다양성을 더욱 향상시키거나 디자이너가 한 이미지 유형의 시각적 스타일을 다른 로고 방향으로 "넛지"할 수 있는 기능을 제공하기 위해 활용될 수 있습니다.
2. 1024x1024
Style Mixing
스타일 믹싱을 사용하여 원하는 스타일을 셀렉하여 원하는 이미지의 얼굴을 더욱 최적화 하여 만들 수 있었습니다.
Final select seeds for style mixing = 12
Style Mixing with Middle Styles
회고
Conclusion
- 1000kimg 이상의 학습을 진행하는것이 좋음
- 이미지데이터수집은 1024이상의 화질로
- 수집된 이미지는 같은 비율로 전처리하여 진행 해야 좋은 학습결과 도출
+ PROS
- 프로젝트의 시작시 만들었던 가설에 맞는 이미지가 생성
- StyleGAN과 StyleGAN2 그리고 StyleGAN2-ADA 의 깊은 이해
- 팀원들과의 협업과 스터디로 시너지 효과
- CONS
- 이미지 데이터의 개수와 수집 데이터의 초기 화질 문제
- 컴퓨터 리소스의 문제로 한계가 있는 학습을 진행
Later
- augmentation 모두 사용
- 추후 학습시 Freeze-G와 Freeze-D를 적용하여 성능 향상 시도