AIでイラストのアニメーションを作成する【Stylegan2-ada】

イラストのアニメーションってAIで作れないの?
作れなくはないよ。

今回はAIの力でイラストのアニメーションを作成するっていうことをやっていきます。Stylegan2-adaっていうものを使ってやっていきますよ。

記事の内容
  • Stylegan2-adaを使ってイラストのアニメーションを作成してみる

この記事ではAI関連のプログラムを使っていくんだけど、自分ほとんどAIプログラミングは分かりません。なのでなんかAIわからないやつが適当にやっているなっていう感覚で見てみてください。

イラストのアニメーションを作成していこう

作成するイラストアニメーション

今回作成するイラストアニメーションなんですが、最終的にこんな感じのアニメーションができました。

イラストが変化しているね。
そうだね、想定通りのものはできなかったけど・・・

これはイラスト画像を2枚使ってアニメーションさせているんだけど、本当はもっと違う感じにしたかったんです。

本来やりたかったこと

イラストのアニメーションにはNovelAIで作成した以下のイラストを使いました。

本当はこの2つのイラストをさっき出した動画のようにアニメーションさせたかったんだけど、軽く試した感じだとできなかった・・・(どうやるんだ・・・)

AI関連のプログラミング知識があればできたんだろなとは思うけど、軽く触って試したところ自分の知識じゃ無理でした。

それにしてもNovelAI本当にクオリティ高いね。
ね、やばいよね。

NovelAIの使い方は以下の記事で書いているのでよかったら見てみてください。イラストの生成は有料になります。

2枚のイラストを使ってアニメーションさせる

Stylgegan2-ada-pytorchっていうものを使ってやっていきます。画像生成が可能なもので、調べると何やら高度な説明がなされていますが正直分かりません。興味のある人は調べてみるといいでしょう。

画像の生成にはGoogleColaboratoryを使ってやっていきます。

コードは前に2枚の静止画から顔を変えるアニメーションを作成する【Stylegan2-ada】でもやったように、他サイトにある[StyleGAN2-ADA] 機械学習で顔画像のモーフィング動画を作成 [Python]を参考にしました。ありがとうございます。

%cd /content
!git clone https://github.com/NVlabs/stylegan2-ada-pytorch.git

!pip install moviepy
!pip install imageio==2.4.1
# ninja
!wget https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip > /dev/null
!sudo unzip ninja-linux.zip -d /usr/local/bin/ > /dev/null
!sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force > /dev/null
%cd /content/stylegan2-ada-pytorch

import cv2
import numpy as np
from PIL import Image
import dlib
from matplotlib import pyplot as plt
import torch
import dnnlib
import legacy
import imageio
from tqdm.notebook import tqdm

from moviepy.video.fx.resize import resize
from moviepy.editor import VideoFileClip

アニメ画像を生成してくれる学習済みのモデルをダウンロードします。

import gdown
gdown.download('https://drive.google.com/u/0/uc?id=1uouxd9q6M4Gcbrve3R9Fi2qUpy9ZSCdG', 'anime.pkl', quiet=False)

このモデルをStylegan2-ada-pytorchを通して使います。

NETWORK = "/content/stylegan2-ada-pytorch/anime.pkl"
SOURCE_NAME = '/content/stylegan2-ada-pytorch/src.jpg'
TARGET_NAME = '/content/stylegan2-ada-pytorch/dst.jpg'
%cd /content/stylegan2-ada-pytorch
!mkdir -p inputs

inputsというフォルダを作ってここに変化させたいイラスト画像を2枚突っ込みます。

projector.pyというファイルがあるのでそれを使います。inputsフォルダに入れた画像に対して処理をかけていきます。

%cd /content/stylegan2-ada-pytorch

!python projector.py \
  --save-video 0 \
  --num-steps 15 \
  --outdir=outputs/src \
  --target=inputs/src.png \
  --network={NETWORK}
%cd /content/stylegan2-ada-pytorch

!python projector.py \
  --save-video 0 \
  --num-steps 15 \
  --outdir=outputs/dst \
  --target=inputs/dst.png \
  --network={NETWORK}

num-stepsの回数を多くするとイラストがかなり崩れてしまうので少なくしました。2つの画像に対して実行すると以下2つの画像になりました。

ここらへん分かっていなくてこのprojector.pyって何やっているんですかね?ん??

イラストのアニメーション生成するのに.npzっていうのじゃないとダメみたいだから、それ生成するために実行したんだけどイラストも変更されています。

まあ進めていきましょう。生成された1枚の画像から2枚目の画像にアニメーションさせます。

STEPS = 100
FPS = 20
FREEZE_STEPS = 20
%cd /content/stylegan2-ada-pytorch

lvec1 = np.load('./outputs/src/projected_w.npz')['w']
lvec2 = np.load('./outputs/dst/projected_w.npz')['w']

network_pkl = "/content/stylegan2-ada-pytorch/anime.pkl"
device = torch.device('cuda')
with dnnlib.util.open_url(network_pkl) as fp:
    G = legacy.load_network_pkl(fp)['G_ema'].requires_grad_(False).to(device) # type: ignore

diff = lvec2 - lvec1
step = diff / STEPS
current = lvec1.copy()
target_uint8 = np.array([1024,1024,3], dtype=np.uint8)

video = imageio.get_writer('./movie.mp4', mode='I', fps=FPS, codec='libx264', bitrate='16M')

for j in tqdm(range(STEPS)):
  z = torch.from_numpy(current).to(device)
  synth_image = G.synthesis(z, noise_mode='const')
  synth_image = (synth_image + 1) * (255/2)
  synth_image = synth_image.permute(0, 2, 3, 1).clamp(0, 255).to(torch.uint8)[0].cpu().numpy()

  repeat = FREEZE_STEPS if j==0 or j==(STEPS-1) else 1
   
  for i in range(repeat):
    video.append_data(synth_image)
  current = current + step


video.close()
clip = VideoFileClip('./movie.mp4')
clip = resize(clip, height=420)
clip.ipython_display()

生成された動画を見てみるとこんな感じになりましたね。

おーーなかなか良いじゃん。
悪くないよね。

最初にやろうと思っていたことは違ってしまったけど、これはこれで良い感じですよね。かなり綺麗にアニメーションされています。

まとめ

イラストのアニメーションを作成したいなーって思ってStylegan2-adaっていうやつを使ってみたけど、AIプログラミングの知識がないと結構きついですね。

ライブラリを使うならまだいいけど、イラストをアニメーションさせるとかなると難しいなあ・・・って感じました。ちゃんとやるには諸々勉強しないとね。。