SberSwapで、個別の学習プロセス無しでFaceSwapを実現する

1.はじめに

 今までのFaceSwapは、個別に学習プロセスが必要なため処理に時間がかかるのが難点でした。今回ご紹介するのは、個別の学習プロセス無しでFaceSwapを実現するSberSwapという技術です。

2.SberSwapとは?

 下記の図は、SberSwapのモデル図でAEI-Netと呼ばれており、3つの部分で構成されています。

 1つ目がIdentity Encoderで、画像XsからベクトルZidを求めます。2つ目がMulti-level Attributes Encoderdで、U-Netと同様な構造を持ち画像Xtから特徴Zattを取り出します。そして、3つ目がAAD Generatorで、これらの情報から目的とする画像を生成します。

3.コード

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

 まず、セットアップを行います。

 

 最初に、画像をFaceswapしてみましょう。sourceとtargetに画像を指定して実行すると、targetの顔がsourceの顔に置き換えられます。ここでは、sourceを松嶋菜々子、targetを石原さとみに設定しています。

 自分で用意した画像を使う場合は、examples/imagesにアップロードして下さい。

 石原さとみの写真の顔だけが、松嶋菜々子に入れ替わったのが分かると思います。

 次に、動画をFaceswapしてみましょう。sourceに画像を、videoに動画を設定して実行すると、videoの顔がsourceの顔に置き換えられます。ここでは、sourceをアンジェリーナ・ジョリー、videoを新垣結衣に設定しています。

 自分の用意した画像や動画を使いたい場合は、画像はexamples/imagesに、動画はexamples/videoにアップロードして下さい。なお、オンメモリで処理するので、動画はHDで20秒くらいまでにして下さい(長いとクラッシュします)。

 新垣結衣のビデオの顔だけがアンジェリーナ・ジョリーに入れ替わりました。

 では、また。

(オリジナルgithub)https://github.com/sberbank-ai/sber-swap

(twitter投稿)

13 件のコメント

  • 公式(SberBank AI)のcolab notebookの推論のセルは、バッチサイズが可変できますが、cedroさんのnotebookでは省略されているように見受けました。
    省略した意図を教えていただければ幸いです。
    (公式版でバッチサイズを40、100、1と可変して推論しても、生成される動画はすべて一律に同じものでしたので、現状でバッチサイズを指定しても無意味ということでしょうか)

    • 出川さん
      バッチサイズは小さくすると速度に影響し、大きくするとメモリの制約の問題があり、デフォルトの40くらいが良いのではと考えてUIからは省き内部の設定のみにしました。UIに出すのは調整する意味が明確にあるものだけにしたいと思っています。

  • ご回答ありがとうございます。
    バッチサイズは精度(生成品質)に影響するものかと思っていましたが、生成速度とメモリ消費に関わる部分なのですね。
    私はPRO+を契約しているのでバッチサイズ100でも動きましたが、1でも入力する動画によっては1分程度の尺ですらクラッシュしますね。

    とはいえ、DeepFaceLabやFaceSwapはメモリ消費が穏やかな代わりに処理時間が冗長になるので、今後はSimSwapやSberSwapの路線が流行るかもですね。

  •  自分で用意した画像を使う場合は、examples/imagesにアップロードして下さい。
    これはどういう意味ですか?自分で用意した画像はexamplesフォルダー内のimagesフォルダーに入れるということでしょうか?
    examples。imagesというフォルダーはどこにありますか?

    • beginnerさん
      colabの左のウインドウにファイルを表示させ、examples/imagesの右端にある縦3つの黒丸をクリックし、アップロードを選択します。
      あるいは、examples/imagesフォルダにアップロードしたいファイルをドラッグ&ドロップします。
      参考:https://blog.kikagaku.co.jp/google-colab-file

  • 画像をアップロードしようとすると、

    source = crop_face(source_full, app, crop_size)[0]

    の下の部分に赤い波線が表示されうまくいきません。この場合はどうすればよろしいでしょうか?

    • akmnさん
      顔を構成するキーポイント(目、鼻、顎など)の検出に失敗しています。顔全体が写っていて、正面を向いている画像でお試しください。

  • こんにちわ。
    画像がどうやっても認識されず、試しにデフォルトのnanako.jpgの画像を保存→リネームして同じ画像をアップロードしてみたのですが、エラーが出てしまいました。
    何か解決策はありますでしょうか。

    • pepeさん
      静止画は、「顔のアップ」、「目線がこちらを向いていない」、「手など顔を遮るものがある」と顔を認識しない場合があります。その場合は、「顔の周囲も写っていて」、「目線がこっちを向いていて」、「顔を遮るものがない」静止画にすると上手くことがあります。まずは試してみて下さい。
      どの段階でどんなエラーが出ているのか教えて頂くと、もう少し適切な回答ができかもしれません。

  • 長尺、高画質を実現するためにメモリのクラッシュを避けるためにcolab pro に加入することは解決策として適していますか?

    • Sayoさん

      Colab pro にすると「ハイメモリ設定」でメモリが倍増できるので効果はあります。但し、HDで1分弱だったのが2分強になる程度の効果です。

    • しのさん

      バッチ処理をする形にすれば良いと思います。動画を30秒程度(高画質にする場合はもっと短く)に分割・処理して後で連結すればOKです。

  • コメントを残す

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

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

    ABOUTこの記事をかいた人

    アバター

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