Stable Diffusionでロトスコープを試してみた
Stable DiffusionのEbSynth Utilityを試す
Stable Diffusionで動画を元にAIで加工した動画が作れるということで、私も試してみました。いわゆるロトスコープというものだそうです。ロトスコープという言葉を初めて知ったのですが、アニメーション手法の1つで、カメラで撮影した動画を元にアニメーションを作ることを指すようです。
サンプルの動きそっくりに別人が動いてくれるアニメーションが作れるなんて、ちょっと楽しみです。
参考
テルルとロビンさん。
Stable Diffusionで制作する際に毎度参考にさせていただいています。
用意したもの
5秒程度の動画(パソコンの処理能力を考えてまずは短めの動画)
Stable Diffusion web UI(パソコンにインストールする画像生成AI)
Control-Net ver1.1(Stabel Diffusionで使える拡張機能)
EbSynth Utility(Stabel Diffusionで使える拡張機能)
FFmpeg(動画を加工できるソフトウェア。無料)
EbSynth(動画をアニメ化するソフト。ベータ版のため無料)
この技術は、動画をパラパラ漫画のように静止画に分けて、静止画に対してAIで画像を加工し、最後に動画のようにつなぎ合わせると言うものです。
Stable DiffusionにControl-NetとEbSynth Utilityという拡張機能をインストールしておきます。特にControl-Netはバージョン1.1で大幅に機能が追加され、今回もこの最新機能を用いています。
FFmpegとEbSynthはStable Diffusionとは別の外部ソフトウェアです。別途インストールしておきます。
デモ
まずは元動画。サンプルのモデルは自分です😅(著作権を気にせず使えるコンテンツ…)。
加工データその1です。あら、素敵な美女に変身できたかな!
30fpsですが、ちょっと画面がチラチラしすぎでしょうか。Tシャツにロゴが浮き出てきたり、ジーンズがダメージジーンズになったりしています。
元はショートヘアですが、加工する際にプロンプトの指定に"long hair"と入れてみたところ、一つ結びのような髪型になっています。ちなみにマスク画像はこうなっています↓
このシルエットで長髪なら1つ結びで納得です!"blue eyes"と入力しましたが、この動画では変化はなさそうでした。
画像加工時のパラメータを参考までに添付します。(Sizeが360x960ではなく360x640のはずなのに…きっと入力ミスしてますね)
Control-Netの使い方に慣れておらず、Contorol-NetのReference-onlyしか指定できていませんでした。加工方法は好みによりますので、これでも間違いではないです。
('(best quality, masterpiece:1.2), 1 woman, long hair, blue eyes,\n'
'Negative prompt: (EasyNegative:1.2), worst quality, low quality, '
'monochrome, \n'
'Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 364004433, Size: '
'360x960, Model hash: 2537d1a815, Model: G_GuoFeng3.2, Denoising strength: 1, '
'Clip skip: 2, ControlNet 0: "preprocessor: reference_only, model: None, '
'weight: 1, starting/ending: (0, 1), resize mode: Crop and Resize, pixel '
'perfect: False, control mode: Balanced, preprocessor params: (512, 0.5, 64)"')
さてもう1つ、同じサンプル動画を元に、別の加工をしたものがこちらです。Contorol-NetのReference-only(元画像のスタイルを参考にする)、Tile-resample(元画像の細部を加工しつつも高解像度を実現する)、Openpose-full(元画像の全身のポーズを検出する)を設定しました。
顔だけが別人に変わっています。目が少し大きくなってる?先ほどと同じように、"long hair"、"blue eyes"と指定しましたが、この辺は全く変わっていません。Seed値を変えたり、再起動してやってみたりもしましたが、加工の結果は概ねこの動画のようになりました。この辺はなぜかわかっていません。もっと大幅に加工したかったのですが、今回はノウハウがなくてここまでです。
('(best quality, masterpiece:1.2), 1 woman, long hair, blue eyes\n'
'Negative prompt: (EasyNegative:1.2), bad quality, low quality, monochrome\n'
'Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 189537106, Size: '
'360x640, Model hash: fc2511737a, Model: C_chilloutmix_NiPrunedFp32Fix, '
'Denoising strength: 0.35, Clip skip: 2, ControlNet 0: "preprocessor: '
'reference_only, model: None, weight: 1, starting/ending: (0, 1), resize '
'mode: Crop and Resize, pixel perfect: False, control mode: Balanced, '
'preprocessor params: (512, 0.5, 64)", ControlNet 1: "preprocessor: '
'tile_resample, model: control_v11f1e_sd15_tile [a371b31b], weight: 1, '
'starting/ending: (0, 1), resize mode: Crop and Resize, pixel perfect: False, '
'control mode: Balanced, preprocessor params: (512, 1, 64)", ControlNet 2: '
'"preprocessor: openpose_full, model: control_v11p_sd15_openpose [cab727d4], '
'weight: 1, starting/ending: (0, 1), resize mode: Crop and Resize, pixel '
'perfect: False, control mode: Balanced, preprocessor params: (512, 1, 64)"')
失敗談
サンプル動画が複雑
最初はこのようなシンプルな動画ではなく、複数人出てくる・乗り物が出てくる・カメラの視点が結構変わる・動画の途中で全く別の画像が差し込まれる・10秒近い、このような複雑な画像を使っていました。うまくいきませんでした。
まず、加工する部分をStabel Diffusionが検出するためにマスク画像を生成するのですが、マスクが検出できませんでした。マスク画像を生成するためのしきい値の設定をうまくやればできたかもしれません。
サンプル動画の解像度が大きい
サンプル動画の解像度が大きいと失敗しました。Stable Diffusionで作成動画の解像度を指定する工程がありますが、この工程で動画の解像度を縮小するようなことをすると、キーフレームをつなぎ合わせるEbSynthを使う段階で解像度が合わないとエラーが出ました。結局、元となるサンプル動画を360pまで落として作成し、うまくいきました。
マスク画像が作れていない
マスク画像がないまま処理を進めると、ほぼ全く別の画像に置き換わりました。先にも書いたように、サンプル画像が複雑でマスク検出できなかったか、しきい値の設定をきちんとできていなかったためだとは思います。サンプル動画とは程遠いものができそうな雰囲気でした。
今後やってみたいこと
当たり前のようにControl-Netを使いましたが、これは強力な画像加工機能のようです。LoRA学習をしなくともサンプル画像を元に雰囲気を足すことができそうなのでもっと使ってみなければなりませんね。
またこれまでは、テキストから画像を生成するText2Image機能ばかりを使っていましたが、今回ロトスコープ化を試すに当たって使ったのは、画像を元に画像を生成するImage2Imageの機能です。これも不慣れなので、使ってみなければと思いました。