GCP에서 돈을 들이지 않고 Stylegan2의 Finetuning

Finetuning (transfer learning)은 학습된 모델을 바탕으로 하여 원하는 타겟에 대해 다시 학습시키는 기술. 올바른 모델을 선택하면 1에서 학습시키는 것보다 적은 학습 데이터로 압도적으로 빨리 원하는 결과를 얻을 수 있고 학습에 걸리는 시간과 비용을 절감할 수 있다.

이번에는 인간의 얼굴을 생성하는 모델을 Finetune하여 anime-faces를 생성하게 한다.
또, 머신도 금도 없기 때문에, GCP의 VM을 사용해 가능한 한 비용을 억제한다.

참고



htps : // 기주 b. 코 m / n V ぁ bs / 스타 암 2
htps : // 토와 rds 였어 s 시엔세. 이 m / style 암 - v2 - s - 온 - t 라이 닌 g - 앙 d - 텐 ts 파세 - xp ぉ 라치 온 - 51cf96584b3

환경



[GCP]
Machine type:
custom (8 vCPUs, 50 GB memory)
GPUs:
1 x NVIDIA Tesla K80
Disc:
200GB
Framework:
TensorFlow Enterprise 1.15

※ 학습 도중에 오류가 발생하므로 메모리와 디스크는 괜찮습니다.
※gpu의 quora를 늘리는 것을 잊지 않도록
※Framework에 주의해, Stylegan2는 tf2.0에서는 움직이지 않는다
※가격$0.667/hour

준비



1. 원래 모델을 다운로드



아래에서 faces (FFHQ config-e 256x256) 다운로드
htps : // 레포슈 b. 이 m / py 텐 / 데에 p ぇあ r ニン g / 쥬 s 찡 삐 k 네 y 어 ぇ 소메 뿌 t 같다 dsty ぇ 암 2. HTML
gdown https://drive.google.com/uc?id=1BUL-RIzXC7Bpnz2cn230CbA4eT7_Etp0

2. 데이터 세트 다운로드



이번에는 kaggle에서 다음을 사용하십시오.
htps //w w. 꺄gぇ. 코 m / spl 치에 r / 아니 메후 세타 타세 t
pip install -q kaggle
cp kaggle.json ~/.kaggle/
chmod 600 ~/.kaggle/kaggle.json
kaggle datasets download -d splcher/animefacedataset
unzip animefacedataset.zip -d animefacedataset

3.Stylegan2의 저장소를 Clone


git clone https://github.com/shawwn/stylegan2.git

4. 데이터 세트의 이미지를 학습용으로 가공



Stylegan2의 학습용 화상은 정사각형이고 변의 사이즈가 2의 거듭제곱이 아니면 안되기 때문에, 사전에 화상의 사이즈를 가공해 둔다. 이번에는 파이썬 스크립트를 사용하여 256 * 256 크기로 가공했습니다.
from PIL import Image
import PIL
import os
import glob
filenames = glob.glob("~/animefacedataset/images/*.jpg")
stylegan_dir = '~/stylegan2/animefacedataset/'
base_width = 256
for filename in filenames:
  new_filename = stylegan_dir + filename.split('/')[-1]
  image = Image.open(filename)
  width_percent = (base_width / float(image.size[0]))
  hsize = int((float(image.size[1]) * float(width_percent)))
  image = image.resize((base_width, hsize), PIL.Image.ANTIALIAS)
  if image.size[0] == image.size[1] == base_width:
    image.save(new_filename)

5. 데이터 세트 생성



이미지를 multi-resolution TFRecords로 변환
리포지토리에 포함되어 있는 dataset_tool.py (을)를 사용해 간단하게 변환할 수 있다.
자세한 내용은
htps : // 기주 b. 코 m / n V ぁ bs / 스타 암 2 # p reparin g
python dataset_tool.py create_from_images ~/stylegan2/datasets/animedataset ~/animefacedataset

[오류 있음]

다음은 정사각형이 아닌 이미지가 포함된 경우 발생하는 오류입니다.
Loading images from "./animefacedataset"
Creating dataset "./datasets/animedataset"
Added 16 images.
Traceback (most recent call last):
  File "dataset_tool.py", line 642, in <module>
    execute_cmdline(sys.argv)
  File "dataset_tool.py", line 637, in execute_cmdline
    func(**vars(args))
  File "dataset_tool.py", line 526, in create_from_images
    tfr.add_image(img)
  File "dataset_tool.py", line 78, in add_image
    assert img.shape == self.shape
AssertionError

6.Finetuning 용 스크립트 개조



원래 run_training.py를 개조하여 Finetuning을 수행 할 수 있습니다.

run()에 다음을 작성한다

run_training.py
    train.resume_pkl = "/home/kitigai/ffhq-256-config-e-003810.pkl"  # 1でダウンロードした学習元モデル, None = train from scratch.
    train.resume_kimg = 3810.0  # 学習元モデルの学習進捗 別に0.0でも良いと思う.
    train.resume_time = 0.0  # 学習元モデルの学習時間 分からないし別に0.0でも良いと思う.

원래 metrics/frechet_inception_distance.py가 부드럽습니다. pkl을 다운로드하려고하면 "Google Drive quota has been exceeded"가되므로 로컬로 다운로드했습니다. pkl을 사용하도록 변경

frechet_inception_distance.py
    def _evaluate(self, Gs, Gs_kwargs, num_gpus):
        minibatch_size = num_gpus * self.minibatch_per_gpu
        #inception = misc.load_pkl('https://nvlabs-fi-cdn.nvidia.com/stylegan/networks/metrics/inception_v3_features.pkl')
        inception = misc.load_pkl('/home/kitigai/inception_v3_features.pkl', 'inception_v3_features.pkl')
        activations = np.empty([self.num_images, inception.output_shape[1]], dtype=np.float32)


7. 학습 시작



명령에 대한 자세한 내용은
htps : // 기주 b. 코 m / n V ぁ bs / 스타 암 2 # t 라이 마늘 g-와 rks
python run_training.py --num-gpus=1 --data-dir=datasets --config=config-e \
  --dataset=animedataset --mirror-augment=true

[오류 있음]

  • --data-dir 또는 --dataset에 전달하는 경로에 "/"또는 "."가 포함되어 있으면 오류가 발생합니다
  • # ダメなやつ
    --data-dir=./datasets 
    # ダメなやつ2
    --dataset=/home/kitigai/stylegan2/datasets/animedatasets
    
  • 절반 메모리가 있으면 오류가 발생합니다

  • RAM : 30GB의 VM을 사용하고 있으면 이하의 에러가 되었기 때문에 50GB까지 늘렸다. 케치하지 마라.
    Traceback (most recent call last):
      File "run_training.py", line 192, in <module>
        main()
      File "run_training.py", line 187, in main
        run(**vars(args))
      File "run_training.py", line 120, in run
        dnnlib.submit_run(**kwargs)
      File "/home/myuser/stylegan2-master/dnnlib/submission/submit.py", line 343, in submit_run
        return farm.submit(submit_config, host_run_dir)
      File "/home/myuser/stylegan2-master/dnnlib/submission/internal/local.py", line 22, in submit
        return run_wrapper(submit_config)
      File "/home/myuser/stylegan2-master/dnnlib/submission/submit.py", line 280, in run_wrapper
        run_func_obj(**submit_config.run_func_kwargs)
      File "/home/myuser/stylegan2-master/training/training_loop.py", line 341, in training_loop
        metrics.run(pkl, run_dir=dnnlib.make_run_dir_path(), data_dir=dnnlib.convert_path(data_dir), num_gpus=num_gpus, tf_config=tf_config)
      File "/home/myuser/stylegan2-master/metrics/metric_base.py", line 151, in run
        metric.run(*args, **kwargs)
      File "/home/myuser/stylegan2-master/metrics/metric_base.py", line 67, in run
        self._evaluate(Gs, Gs_kwargs=Gs_kwargs, num_gpus=num_gpus)
      File "/home/myuser/stylegan2-master/metrics/frechet_inception_distance.py", line 54, in _evaluate
        labels = self._get_random_labels_tf(self.minibatch_per_gpu)
      File "/home/myuser/stylegan2-master/metrics/metric_base.py", line 140, in _get_random_labels_tf
        return self._get_dataset_obj().get_random_labels_tf(minibatch_size)
      File "/home/myuser/stylegan2-master/metrics/metric_base.py", line 121, in _get_dataset_obj
        self._dataset_obj = dataset.load_dataset(data_dir=self._data_d![3810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896087/955d309d-eff5-535a-ba30-c0b6a31b50b3.png)
    ir, **self._dataset_args)
      File "/home/myuser/stylegan2-master/training/dataset.py", line 192, in load_dataset
        dataset = dnnlib.util.get_obj_by_name(class_name)(**kwargs)
      File "/home/myuser/stylegan2-master/training/dataset.py", line 86, in __init__
        self._np_labels = np.zeros([1<<30, 0], dtype=np.float32)
    MemoryError: Unable to allocate 0 bytes for an array with shape (1073741824, 0) and data type float32
    

    결과



    얼굴의 방향이나 입가의 표정, 헤어스타일에 주목하면 최초의 인물의 얼굴과 애니메이션 얼굴에 관련성이 있는 것을 알 수 있다. 이것은 생성 이미지의 대략적인 곳을 결정하는 네트워크의 저레벨 레이어가 거의 공통되기 때문입니다. 원래 모델과 애니메이션 모델에 같은 latent space를 주면 비슷한 얼굴이 생기고 재미있어요.

    학습 30분 후



    아직


    학습 10시간 후



    이미 그렇다.


    학습 48시간 후



    좋은


    가격



    꽤 걸렸다. 미안해.


    요약


  • Finetuning을 사용하여 단시간에 나름의 성과를 낼 수 있었다.
  • 6 시간 이내에 만족하면 비용이 절감되었습니다

  • ※비교:1부터 학습한 경우의 예상 시간
    이번에는 config-e이므로 아래보다 시간이 걸리지 않지만 여전히 10d가 걸릴 것입니다.


    구성
    Resolution
    Total kimg
    1 GPU
    2 GPUs
    4 GPUs
    8 GPUs
    GPU mem


    config-f
    256×256
    25000
    32d
    13h
    16d
    23h
    8d


  • 인간 얼굴과 애니메이션 얼굴로 비슷한 표정이 되는 것은 재미있다. 여기 난 아직도 놀 수 있을 것 같아
  • 좋은 웹페이지 즐겨찾기