Toonify Youeselfで自分の顔をリアルなアニメ顔に変換する

1.はじめに

「Toonify Yourself」という自分の顔をアニメ顔に変換してくれるWebサービスが大人気です。但し、あまりにもアクセスが集中したためサーバーコストがかさみ現在はサービスが中断されています。

 自分の顔をアニメ顔に変換できるなんて面白いと思いませんか?やってみたいがサービス中止では諦めるしかないと思ったあなた、心配いりません。

 コードは公開されていますので、今回は、Webサービスを使わずに自分のアニメ顔を作る方法をご紹介します。

2.Toonify Yourselfとは?

  Toonify Yourself は、2つのStyleGAN2を組み合わせています。1つは、FFHQの顔画像70,000枚を学習したBaseモデル、もう1つはBaseモデルに300枚のアニメ顔をファインチューニングしたFine turningモデルです。

 BaseモデルとFine turningモデルの両方に同じ潜在変数w(1,18,512)を入力すると、Fine turningモデルの出力にはBaseモデルの出力と相関が高いアニメ顔が現れます。しかし、学習するアニメデータはCGや手書きの混在しているためアニメ顔の画質は低いです。そこで、この2つのモデルを組み合わせます。

  低解像度(顔の向きや形などに影響)にFine turningモデルを使い、高解像度(照明やテクスチャなどに影響)にBaseモデルを使うことで、リアルなアニメ顔の出力が得られます。これをBlendedモデルと呼びます。

 StyleGAN2では、任意の顔の潜在変数wの探索が可能ですので、任意の顔のアニメ顔への変換が可能になるわけです。

3.コード

 今回のコードもGoogle Colabで動かすような形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。

 最初に、セットアップを行います。

  ffhqモデル(Baseモデル)とblendedモデルをダウンロードします。

 必要な関数を定義します。

 まず、アニメ化したい顔が写っている画像(rawフォルダーにあるサンプル)から、顔部分を切り出します。

  rawフォルダーにある画像から、dlibを使いalign(顔が直立するように回転させる)し、設定範囲を切り取った画像(*.png)をalignedフォルダーに保存します。

※自分の顔の写った画像など自分のオリジナルの画像をアニメ顔に変換したい場合は、その画像をrawフォルダーに保存しておいて下さい。

 次に、切り取った顔画像を生成する潜在変数wを見つけます。

  alignedフォルダーの顔画像に出来るだけ似た顔画像を生成する潜在変数wを求め、潜在変数を generate/*.npy に保存し、潜在変数wから生成した画像を generate/*.png に保存します。表示されているのは、潜在変数wから生成した画像です。

 そして、潜在変数wを元に、Blendedモデルでアニメ画像を生成します。

 潜在変数w(generated/*.npy)を読み込み、Blendedモデルでアニメ画像を生成しgenerated/*-toon.jpgで保存し、使用した潜在変数は全て変数latentsに保存します。

 最後に、変数latentsからトランジションを作成します。

 潜在変数 latnts の0番目→1番目→2番目→0番目にトランジションするGIFです。my/gif/anime.gifに保存されます。

 色々な顔画像で試してみて楽しんで下さい。では、また。

(Twitterへの投稿)

4 件のコメント

  • cedro様  
    お世話になります。
    こちらのToonify Yourselfがすごいと思い、cedro3さんのコードをGoogle Colabで実行したのですが、
    BaseモデルとBlendedモデルのダウンロードのところでエラーがでました。

    _, _, Gs_blended = pretrained_networks.load_networks(blended_url)
    —> 76 G, D, Gs = pickle.load(stream, encoding=’latin1′)
    UnpicklingError: invalid load key, ‘<'.

    と出てきまして、picklをloadできませんでした。
    試しに https://www.justinpinkney.com/toonify-yourself/
    からもコードを実行しましたが、同じエラーが出てきます。
    このような場合はどこに問題があるかをお教えいただけませんでしょうか?
    お忙しいところ恐縮ですが、よろしくお願いいたします。

  • cedro様
    お世話になります。解決できました。picklをダウンロードし、その後、Toonify Yourselfの直下に置きました。そして10行目の_._.Gs_blended = pretrained_networks.load_networks(blended_url)の()内をpicklに置き換えたら、loadすることができました。

    cedroさんのブログでは、興味深い内容のものばかりで、勉強させていただいております。今後のご活躍を期待しております。

  • ピーチママさんのコメント通りで動きました。
    コード(Colab用)を載せておきますね。

    # ffhqモデル(Baseモデル)とblendedモデルのダウンロード
    import pretrained_networks
    import gdown

    # use my copy of the blended model to save Doron’s download bandwidth
    blended_url = “https://drive.google.com/uc?id=1BRqqHWk_4BjNHLXTrpHkoxmZhGw3CU59”
    ffhq_url = “http://d36zk2xti64re0.cloudfront.net/stylegan2/networks/stylegan2-ffhq-config-f.pkl”

    #モデルのダウンロード ↓↓これを追加する
    gdown.download(blended_url, quiet=False)
    gdown.download(ffhq_url, quiet=False)

    #Python2で作成されたpklをPython3で使えるように変換
    _, _, Gs_blended = pretrained_networks.load_networks(“/content/stylegan2/ffhq-cartoon-blended-64.pkl”)
    _, _, Gs = pretrained_networks.load_networks(“/content/stylegan2/stylegan2-ffhq-config-f.pkl”)

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

    ABOUTこの記事をかいた人

    アバター

    ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。