ProgressiveGAN의 생성 이미지를 자신의 취향으로 고품질로 바꾸는 방법

1. 소개



일반적으로, 학습이 끝난 GAN 모델의 생성 화상은, 좋아하는 화상, 싫은 화상, 파탄된 화상이 혼재하고 있어, 그대로는 감상을 견딜 수 없습니다. 거기서, 이번은 간편하게 GAN의 생성 화상을 자신 취향으로 질 높은 것으로 바꾸는 방법을 소개합니다.

이번에 사용하는 GAN의 학습이 끝난 모델은, TF-Hub Progressive GAN 입니다. 또한 코드는 Google Colab에서 작성하여 Github에 올리고 있으므로, 스스로 해보고 싶은 분은이 "링크" .

2. 어떻게 할까?



학습된 GAN 모델은 입력하는 벡터와 출력 이미지는 일대일로 이미 정해져 있으므로 개조할 수 없습니다. 그럼 어떻게 할까. 입력하는 벡터를 변경합니다.

GAN 모델에 랜덤 벡터를 입력하여 이미지 생성했을 때, 파탄된 이미지나 자신이 싫은 이미지가 있는 경우는 해당하는 벡터를 마이너스 벡터에 축적하고, 자신이 좋아하는 이미지가 있는 경우는 해당하는 벡터를 플러스 벡터에 축적합니다.

그리고 GAN 모델에 입력하는 다음 벡터는 랜덤 벡터 + 플러스 벡터의 평균 - 마이너스 벡터의 평균으로 합니다. 이것을 반복함으로써, 아라 이상한, GAN의 생성 화상은 자신 취향으로 질 높은 것으로 변신해 갑니다.

3. 구현



먼저 라이브러리 설치 및 가져오기, 함수 정의, 모델 다운로드를 수행합니다. 자세한 내용은 google colab을 참조하십시오.

우선, 초기화합니다.
# 学習の初期化
tf.random.set_seed(80)  
vectors = tf.zeros([5,512])
plus_vector = tf.zeros([1,512])
minus_vector = tf.zeros([1,512])

google colab의 Form 기능을 사용하고 있기 때문에 초기 상태에서는 코드가 보이지 않지만 UI를 클릭하면 코드를 볼 수 있습니다. 조작을 하기 위해서는, 초기 상태가 하기 쉽습니다.
#@title please, you change the selected action if you need. 
vec_0 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec_1 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec_2 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec_3 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec_4 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec = [vec_0, vec_1, vec_2, vec_3, vec_4]

for i in range(len(vectors)):
    if vec[i] == 'plus':
      plus_vector = tf.concat([plus_vector, tf.reshape(vectors[i],[1,512])],axis=0)

    if vec[i] == 'minus':
      minus_vector = tf.concat([minus_vector, tf.reshape(vectors[i],[1,512])], axis=0)

print('number of plus_vector = ', len(plus_vector)-1)
print('number of minus_vector = ', len(minus_vector)-1)

plus_vector_mean = tf.reduce_mean(plus_vector, axis=0) # plus_vectorの平均をとる
minus_vector_mean = tf.reduce_mean(minus_vector, axis=0)  # minus_vectorの平均をとる

vectors = tf.random.normal([5, 512])  # ランダムベクトル取得
vectors = vectors + plus_vector_mean - minus_vector_mean  # ベクトルの補正
display_images(vectors)

Form 기능에 의해, 변수 vec_0 ~ vec_4 에는 UI로 선택한 캐릭터 라인 ('plus', 'nothing', 'minus')이 들어갑니다. 문자열이 'plus'이면 해당 벡터를 plus_vector에 저장하고 'minus'이면 해당 벡터를 minus_vector에 저장합니다. 다음은 tf.reduce_mean() 에서 평균을 취하고 무작위 벡터에 더하거나 빼기만 하면 됩니다.

처음에는 아무것도 설정을 괴롭히지 않고 코드를 실행합니다. 두 번째 이후 생성 된 5 개의 이미지를보고 자신의 판단으로 마이너스 벡터에 넣는지 (minus), 플러스 벡터에 넣을지 (plus), 아무것도하지 않는지 (nothing)를 결정하여 설정을 변경합니다. 그런 다음 코드를 실행합니다. 이것을 여러 번 반복합니다.



표시하고 있는 것은, 수십번 정도 해 본 결과입니다. UI가 초기 상태로 실행 중입니다. 플러스 벡터를 5개(자신이 좋아하는 여성), 마이너스 벡터를 8개(파탄한 이미지) 선택한 결과의 이미지입니다. 확실히, 나누기와 자신 취향의 여성만이 되고 있네요(웃음).

4. 추가



추가로, StyleGAN2판의 코드를 Google_colab로 작성해, Github 에 올리고 있으므로, 이쪽도 좋으면 시험해 보세요.

좋은 웹페이지 즐겨찾기