【作品解説】PGGANを使って新しいダンス表現を模索する話【BreakGAN】
こんにちは!デザイニウムのBBOY/エンジニアの平澤(@eatora22)です。今回はAI技術を用いて制作された映像作品「BreakGAN」のご紹介をしようと思います。
はじめに
まずは以下の動画をご覧ください。
こちらの映像と音楽は機械学習の技術を使って制作されたものです。特に映像についてはBBOYでもある私が実際に踊っている様子をAIが学習して生成されました。以下で使用している技術や作品のコンセプトなど諸々ご紹介していきます!
技術紹介
今回は画像生成のためにPGGAN(Progressive Growing of GANs)を使用しました。GANには多くの種類が存在しますが、PGGANの特徴として低解像度の画像から学習していき、徐々に解像度を上げていく仕組みが挙げられます。この特徴により難しいと言われてきた高解像度での学習を安定させ、更に全体の学習時間の短縮にもつながるといったメリットが生まれました。本家リポジトリはNVIDIA製なのですが、ライセンス的なアレで今回は以下のリポジトリ(MITライセンス)を利用させていただきました。Beihang Universityの学生の皆さんが作られたようでKerasによる実装となっています(このリポジトリは少し古いので分かれていますが現在Keras自体はTensorFlowに取り込まれた形となっています)。
ただし上記リポジトリは、CelebAという顔画像のデータセットに特化した形となっているため、独自の画像データセットで学習させるためにはいくつか修正が必要です。画像データをHDF5形式に変換するh5tool.pyというスクリプトがあるのですが、ファイルパスの読み込みや必要に応じて、画像クロップ処理の修正などを学習に使う画像の枚数やサイズも考慮した上で変更する必要があります。
ここで備忘録なのですが、dataset.pyにmirror_augmentというパラメーターがあります。これは左右反転した学習データも使うかどうかを決定するもので、CelebAのような正面を向いた顔画像だとデータを水増し(Data Augmentation)できるので便利です。一方で左右非対称の画像(例えば横向きの靴)を学習させる場合は、学習後のモデルが意図しない画像を生成する可能性があるため注意が必要です。
またGANの学習には多くの計算リソースと学習時間が必要です。ローカル環境での学習も試しましたが、PCがめちゃくちゃ熱くなり他の作業が滞るレベルで大変なので、今回はオンラインでPythonが実行できるGoogle Colaboratoryを使用します。無料でGPUも使える非常にありがたい環境です。ただしGPUの使用上限や継続して使う場合の制限時間などもあるため、今回のように学習時間が長く必要なときには注意が必要です(中断した学習を再開するためのResume機能は必須)。今回使用したリポジトリもGoogleDrive内のデータセット読み込みや学習途中に生成されるtraining weights(重みファイル)の保存や読み込みをDrive内で行えるように改良しました。
さらに注意事項として、学習実行時にColobでのGPUメモリが足りなくなりランタイムが落ちる場合があります。すぐにできる対策としては、設定パラメータのminibatchサイズを下げてあげることです。これはデータセット全体からどれぐらいの量のデータを学習時のパラメータ更新に使うかといった指標ですが、この値が大きくなるほど多くの計算量を必要とするためメモリ不足が起こります。ただしGANの学習においてバッチサイズは基本的に大きい方が良いと言われているらしく、Colabを使用する場合はできるだけ良いGPUを引き当てることも大切です(Colabではユーザーに割り当てられるGPUが毎回異なります)。私が学習を回していたときだと、比較的割り当ての可能性が高かったTesla K80では256×256以上の高解像度の学習でデフォルト設定だとランタイムが何度も落ちたと記憶しています。
これらの話を読んでピンと来なかった場合は、深層学習の基本的な仕組みやKeras(TensorFlow)の使い方など一度確認されることをお勧めします。やはり独自のデータセットで機械学習をする場合は結果うまくいかないことも多々あるので、そういった場合に改善すべき点(ハイパーパラメーターの設定が悪いのか、モデルの構造が悪いのか、データセットが悪いのかetc)を色々見直してあげる必要があるためです(CelebAでお試しするだけであればそこまで考えなくてもよいかも)。私も機械学習を専門的に学んできたわけではないので、新しいモデルを扱うたびに四苦八苦しております……!
ちなみにお試しでCelebAを64×64サイズまで学習させてみると以下のような生成画像が得られました(データセットをHDF5形式に変換したときのファイルサイズが10GB以上もありDriveへのアップロードが大変であったため意図的に画像枚数を100まで減らしたときのもの)。
最初はノイズ画像のようなものが出力されていますが(fakes000000)、10万枚分の画像を学習したとき(すでにデータ枚数も超えていますが同じ画像を繰り返し学習している模様)にはすでに顔らしき輪郭が生成されているのが分かります(fakes000100)。100万枚を超えたあたりでは解像度も上がりより人間の顔に近い画像が出力されました。
更にお試しで30秒という短い自分のダンス動画から連番画像を書き出し512×512サイズまで学習させてみます(画像書き出しにはFFmpegを利用しました)。元となった動画はTecoGANを試した記事でも使われているのでご確認ください。
すると60万枚辺り(fakes000600)では同じような画像しか生成しないようになってしまいました("real"は学習データとして使われている本物の画像です)。これはMode Collapseと呼ばれる現象で、今回の場合は単純にデータ数量が少ないことや元の動画内でただ棒立ちしている状態の割合が大きかったことが原因と考えられるでしょう。以下の記事も参考にさせていただきました。
以上を踏まえて、今回の作品に使用するデータセットを作成する際には「できるだけダンスの動きが被らず多様性があること」を意識しつつ撮影を行いました。背景も白壁のように余計な情報が入らない方が良いと考え、撮影場所を探していたところ、会社の同じフロアに入居されているホロラボさんの新オフィスを使わせていただけることになりました(感謝)。以下は撮影中の様子です笑。※すべて私一人で撮影したのでソーシャルディスタンスは完全に保たれています。
2時間弱の撮影を終えデータとして使えそうな部分を編集し1024×1024サイズにして書き出します。老体に鞭を打ち頑張ったのですが、動画としては3分の長さになりました悲。以下は参考までにGIF画像にしてみたものです。床がカーペットでスピン系の動きができなかったので色々とごまかしているのが分かると思います笑。最終的にデータとしては静止画になる前提でダンス以外の動きも少し入れてみたりもしました。
作品の構成もこの時点でなんとなくは考えていたので、直立や膝を付いた状態の動画も少し多めに入れています。ひとつ反省点として、撮影時にシャッタースピードのことをあまり考えておらず、静止画にして書き出したときに動きがブレてよく分からないものも含まれてしまいました(画質や明るさにばかり気がとられていました)。動きのあるものを撮影して学習データとする場合には注意が必要です。また最終的に学習データには使わなかったのですが、全身黒色の服だとGANの生成画像が分かりにくくなりそうだったので、違う色の上着を着て踊ったりも実はしています。
こうして作成したデータセットをPGGANに学習させます。今回は512×512サイズまでとしました。ColabのGPU上限まで学習を回し制限が解除されたら学習再開というような流れで4日間ほど学習し続けた結果(データ数量的には少ないこと&良いGPUを引き当てたこと踏まえるとこれでも短い方だと思います)、80万枚の画像を学習した段階で以下のような生成画像が得られました。
学習を継続してもこれ以上の改善は見られなかったので、この時点でのモデル(重みファイル)を作品では使用することにしました。これでも生成画像に多少の偏りはあるものの、ある程度の多様性は確認できたので今回は良しとします。
またPGGANのGeneratorは静止画しか出力しないので、画像Aから画像Bに遷移していくようなモーフィング映像を作成するにはひと手間が必要です。Generatorの入力は512次元の潜在変数なので、二つの変数間を補完するようにして連続した入力値を用意してあげることでモーフィングに使う連番画像を作成することができます。以下のBigGANを使った記事でも同じようなことをしているので参考にしてみてください。
続いて音楽の生成にはDrumsRNNを使用しました。こちらはGoogle Magentaが開発したドラムパターンを生成してくれる機械学習モデルです。以下の記事でも解説しているのでこちらでの解説は省略します。
他の音生成系モデルも少しだけ試したりしたのですが、ダンスミュージックにおいてドラムビートは非常に重要です。実際、ドラム音だけでも普通に踊ることができます。また、今回はドラムの各パートに合わせて異なるモーフィング映像が流れるような構成にしたので、パート別の出力が得られるDrumsRNNを選びました。
作品構成のために各パートの音源が必要となったので、BodyDrumのときと同じくTensorFlow.jsベースのDrumsRNNとTone.js、p5.jsを使った専用ツールを作成しました。以下が実際にツールを使っている様子です。
seedとなるパターンはこちらで決めてあげる必要がありますが、その後は良さげなパターンが生成されるまで推論実行し続けます。ドラムのどのパートを音声ファイルに含めるかもツール上で選択できるようにしました。
さらにモーフィング動画をオーディオリアクティブにするのにはTouchDesignerを使用しました(これもBigGAN記事と同様です)。実写映像とのフェードやタイル状の配置などはAdobe Premiere Proを使っています。少し長くなりましたが技術的な解説は以上です(そのはず)。
作品解説
ここでは「BreakGAN」の作品コンセプトや制作過程で考えていたことを書いていこうと思います。
まずなぜダンス動画をGANに学習させたのかと言いますと、ダンスにおいて新しい動きを創造するきっかけになるのではと考えたからです。HIPHOPカルチャーにおいてオリジナリティーは非常に重要な要素です。それはダンサーのキャラクターであったり音の取り方であったり個性を表現する手段はたくさんあるのですが、ダンスは身体表現である以上「フレッシュな動き」で自分を表現するのは個人的にもいつも気にかけているポイントです。他の人と同じ動きをしてしまうとバイト(パクリ)と言われてしまうぐらいダンスシーンでは繊細な問題です(この辺の話は個人ブログでも記事にしてあるので興味ある方は是非どうぞ笑)。
そうした状況の中でダンサーたちは日々新しい動きの創造(ネタ作りとも言います)に明け暮れるわけなのですが、ここでGANのGeneratorが使えるのではと考えました。本来であればGANは本物の画像と見分けがつかない偽物を生成するのがゴールなので、今回の学習済みモデルでは本物との違いは明らかです。ただ、その生成物の不完全さやモーフィング中における画像の曖昧さが人間のダンサーが思いつかないような動きの創造につながるのではと今回は期待して作品を制作しました。
実際のところダンスとGANを組み合わせたような事例もすでに存在はしているのですが、上に記したようなコンセプトであったり制作過程における工夫であったりダンサー且つクリエイターとしての視点を今回は多く含めることができたのではないかと思っています。例えば、GANによる映像を先に生成し、その時系列における特徴量を使ってDrumsRNNのシードを決定するような仕組みも面白いなとは思いつつ、ダンサーは音を聴いた上で踊るのが基本であることを踏まえると、今回はコンセプト的に無しだなと決めた点などダンスに深く関わっている人でないと至ることのない部分もあったと感じています(これはこれで面白そうなアイデアではあるので別の作品で使うかも笑)。
しばしばAIにより芸術家はとって代わられるというような話も出てきます。ただ私個人としてはAIで既存の芸術を置き換えるようなつもりは無く、むしろAIが新しい可能性に気付かせてくれることで、より人としての表現の幅も広がるのではないかと考えて普段の作品制作に取り組んでいます。また、社外でダンスAIという研究開発プロジェクトにも取り組んでいるのでそちらもぜひご覧いただけると幸いです。
さいごに
以上、機械学習を用いた映像作品「BreakGAN」をご紹介いたしました。今回はPGGANを採用しましたが、より精度の高いモデルも日々生み出されているのでそちらも機会あればぜひ使ってみたいと思います。とりあえずColab Proが日本でも早く使えるようになることを願って本記事は終わりです。
The Desinium.inc
Interactive Website
The Designium YouTube Channel
Facebook
Twitter
編集後記
広報のマリコです!いままでもGANをつかった作品はありましたが、今回はなんと音楽も映像どちらも機械学習を用いて作成されていましたね。はじめに動画を見たときは音楽も学習させたものだとはまったく気付かずに見ていたのでビックリしました❗(改めて動画を見直しましたw)また今回は作品解説において作品のコンセプトやきっかけなど、ダンサーかつクリエイターならではの視点で語られているのがとても興味深かったです。ぜひ今後の平澤のプロジェクトにもご注目ください✨