Help us understand the problem. What is going on with this article?

Few-shot vid2vidで顔イラストをアニメ風に動かしてみた

はじめに

「Few-shot Video-to-Video Synthesis」(以下、Few-shot vid2vid)は2019年に発表され話題になったGANです。今年になって、公式の実装も公開されました。[paper, github]

今回の記事では、はじめにFew-shot vid2vidについて簡単に紹介した後、実際に学習と動画生成を試した結果を書いていきます。

Few-shot vid2vidとは

一言で言うと、動画→動画の変換を行うGANであるvid2vid [paper]の進化形です。下図は論文からの引用で、左がvid2vid、右がFew-shot vid2vidを示します。
from_paper.png

vid2vidは一つのドメインで学習を行い、それについての動画生成しかできません。例えば上の図のように骨格画像から全身画像への変換を行う場合、Aさんの画像を集めて学習を行ったとしたらAさんの動画しか生成できません。Bさんの動画を生成したければ、Bさんの画像を集めて学習させる必要があります。
これに対し、Few-shot vid2vidでは複数のドメインで学習を行い、動画生成する際は学習時になかったドメインにも対応できます。例えば学習データに入れていなかったZさんの動画を生成することも可能です。この時Example imageとしてZさんの画像が必要になりますが、これは1~数枚(few shot)で機能します。

このようなFew-shot合成は、ネットワークの一部のモジュールの重みをExample imageから抽出した特徴量によって動的に変更することで可能になっています。
※こちらのページの解説が参考になりました。
「数枚の画像で動きを転移できるFew shot vid2vid(Few shot video to video Synthesis)」

また公式の動画では、彫刻を躍らせたり絵画をしゃべらせたりといった応用が紹介されていて面白いです。
Few-Shot Video-to-Video Synthesis (youtube)

実験

今回はFew-shot vid2vidを使って、アニメ系の顔イラストを動かす実験をしてみました。
公式の動画では絵画(モナリザ)を動かしていますが、よりデフォルメされたアニメの絵でも上手く動かせるのか気になったからです。
あと、1枚のイラストを元にアニメのように動かせたら、けっこう実用的なのではないかと思ったからです。

ここからは、実際に作業した内容を書いていきます。

作業環境

自宅のゲーム用PCにUbuntuとCUDA等を入れて作った環境です。
OS : Ubuntu 18.04.4 LTS
GPU : GeForce RTX 2060 SUPER(8GB) x1

データセット作成

Few-shot vid2vidを学習させるには、元画像と対になるラベル画像のセットが大量に必要です。

元画像としては、実験のため個人的に集めた画像からキャラの顔部分だけ切り抜いた物を使用しました。

問題はラベル画像の作成方法ですが、調べたところアニメ顔用のlandmark検出ツールが公開されていたので、こちらをありがたく使わせて頂きました。
Anime face landmark detection by deep cascaded regression

流れとしては以下の通りです。
(1) landmark検出により目や口などのパーツの代表点を取得
(2) 各点の位置を元に顔ラベルを描画
  ここの処理はOpenCVのrectangle()やfillPoly()などを使って作りました。
(3) 元絵と顔ラベルをセットにして、Few-shot vid2vidで使える形式のデータセットを作成
landmark_example.png

landmark検出点をそのまま使わずに顔ラベルを描くことにしたのは、その方が各パーツの大きさや位置を制御しやすいと思ったからです。(以前、pix2pixHD等で色々遊んでいた時の結果から)
ただ、このラベルの描き方が本当に良いかは分かりません。この描き方の違いで生成結果の質はかなり変わると思います。

また、(3)のデータセット作成に際しては拡大・縮小・回転等のaugmentationを行っています。
この時、Few-shot vid2vidに適したシーケンスデータ(時系列的に連続して変化)となるよう調整しました。
1シーケンスにつき元画像/顔ラベルをそれぞれ20枚とし、最終的に3000シーケンス程度の学習データを用意しました。

学習

作成したデータセットで、Few-shot vid2vidの学習を行いました。
※学習は主に2020年の5月上旬に行ったので、githubのコードはその時点の最新版を使いました。

以下、メモ程度ですが書いておきます。
・準備は本家のREADMEにしたがって特に問題なく完了。
 推奨通りPyTorch1.2を使用。FlowNet2をコンパイル。
 自分の環境だと初回学習時にnumpyのエラーが出たが、numpyのバージョンを下げることで解消。
・1回のiterationで使うシーケンス枚数の最大値(seq_len_max)を変更。
 seq_len_maxはdata/base_dataset.py内で指定されている。(デフォルト値は30)
 GPUメモリサイズと学習時間の問題のため、これを30->16に変更。
・学習時のオプションで、生成画像の解像度は288x288を指定。
 GPUメモリサイズによりこの位が限界だった。本当はもっと大きくしたい。
・かかった学習時間は3~4days。

評価

学習後のモデルを使い、動画生成の確認を行いました。
ここでは、学習時に使っていない画像として、前回の記事で確認したStyleGANで生成したイラストをExample imageに使用しました。

結果を以下に示します。
 静止画: Example image (動かしたいイラスト)
 動画: 一番左が顔ラベルの入力、右側が対応する生成結果
となります。
header1.png
fsv2v_1_1.gif
fsv2v_1_2.gif

以下、もう一例。
header2.png
fsv2v_2_1.gif
fsv2v_2_2.gif

全体的に、元絵の特徴をうまくとらえた上で動かせているように思いました。元絵で目を閉じている例が一つありますが、その場合の目の色は推測で(確率的に?)自然な色にしてくれていると思われます。頭の動きにもある程度は追従できているようです。

現状の問題としては、以下のような傾向がみられました。
・表情や頭の動きが大きくなると、目や口の周囲に期待しない線が出たり、髪の部分がぼやけてしまう。
 --> 学習用データセットの作り方次第で、もう少し動きに強くすることはできるかも。
・顔や目の縦横比、目の離れ方などが顔ラベルの入力で規定されるため、元キャラの個性がやや失われる。
 --> これらをパラメータとして正規化し、Exampleごとに調整して顔ラベルを描くことで改善できる?

おわり

Few-shot vid2vidを使い、顔イラストをアニメ風に動かす実験を行いました。
けっこう面白い結果が得られているので、データセットの作り方や学習条件を見直し、もっと質を上げられないか検討してみる予定です。良い結果が出たら改めて書きたいと思います。
もっと強力なGPU環境があれば、更に解像度を上げてきれいに生成したい所ですが。(AWSはそれなりにかかるし...)

ramu_206020
仕事は画像認識(主に深層学習)、UI開発など。趣味で画像生成(GAN)の実験とかしてます。修士卒。漫画・温泉好き。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした