WSL2でGo With the Flowを試してみる
「動画生成モデルにおいてモーション制御を可能にする革新的な手法を提供し、従来のノイズ生成に『リアルタイムで歪ませたノイズ(warped noise)』を導入することで、動画中のカメラやオブジェクトの動きを直感的に制御できる点が特徴」らしいGo With the Flowを試してみます。
使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。
1. 準備
環境構築
python3.11 -m venv gowiththeflow
cd $_
リポジトリをクローン。
git clone https://github.com/VGenAI-Netflix-Eyeline-Research/Go-with-the-Flow
cd Go-with-the-Flow
パッケージのインストールの前に、requirements.txtを編集します。
sed -e 's/^--/#--/' requirements.txt > requirements_fixed.txt
先頭の1行目をコメントアウトです。
diff --git a/requirements.txt b/requirements.txt
index d76fe94..f85e04a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
---index-url https://download.pytorch.org/whl/cu118
+#--index-url https://download.pytorch.org/whl/cu118
rp
torch
torchvision
編集後のrequirements_fixed.txt.txtを使ってパッケージのインストールです。
pip install -r requirements_fixed.txt
# 不足分: cut_and_drag_gui.py
pip install GitPython art ffmpeg-python
# 不足分: make_warped_noise.py
pip install rich
2. コードを確認する
3つの.pyファイルが用意されており、次の順序で実行することが推奨されています。
(1) GUIでアニメーションを設定
ローカル環境でGUIを起動し、アニメーションテンプレートを作成します。
python cut_and_drag_gui.py
対象とするポリゴンや動きを設定します。設定内容は保存され、次のステップで使用します。
手順:
ポリゴンをクリックで描画(左クリック: 点追加、右クリック: 点削除)。
スライダーを調整して、スケールや回転を設定。
保存ボタンを押して設定をファイルに保存。
(2) ノイズ生成
動画またはURLからノイズデータを生成します。
python make_warped_noise.py <PATH TO VIDEO OR URL> \
--output_folder noise_warp_output_folder
主な出力ファイルは、
ノイズデータ (noises.npy)
光学フローデータ (flows_dxdy.npy)
処理された動画 (input.mp4)
(3) 推論して動画生成
生成したノイズデータと設定ファイルを使用して最終的な動画を作成します。
python cut_and_drag_inference.py noise_warp_output_folder \
--prompt "A duck splashing" \
--output_mp4_path "output.mp4" \
--device "cuda" \
--num_inference_steps 5
3. 試してみる
(1) GUIでアニメーションを設定
python cut_and_drag_gui.py
画像ファイル名を指定(ここでは、sample4.jpeg)を指定し、layersを1とします。
次に、動かしたいオブジェクトを指定します。
そして、閉じます。続いてウインドウが表示され、どう移動させたい?というのを指定します。
しばらくすると、ファイルが保存されます。
Saved outputs:
- Saved video: sample4/sample4.mp4
- Saved masks: sample4/sample4_mask.mp4
- Saved shape: ./sample4/polygons.npy
- Saved cartridge: ./sample4/sample4_cartridge.pkl
(2) ノイズ生成
続いてノイズデータを生成します。
python make_warped_noise.py sample4/sample4.mp4 \
--output_folder noise_warp_output_folder_sample4
以下のファイルが生成されました。
$ ls -l noise_warp_output_folder_sample4*
-rw-r--r-- 1 user user 3015160 Jan 20 13:59 noise_warp_output_folder_sample4.mp4
noise_warp_output_folder_sample4:
total 27216
-rw-r--r-- 1 user user 449389 Jan 20 13:58 first_frame.png
-rw-r--r-- 1 user user 16588928 Jan 20 13:58 flows_dxdy.npy
-rw-r--r-- 1 user user 1512566 Jan 20 13:58 input.mp4
-rw-r--r-- 1 user user 249442 Jan 20 13:58 noise_video.mp4
-rw-r--r-- 1 user user 8467328 Jan 20 13:58 noises.npy
drwxr-xr-x 2 user user 4096 Jan 20 13:58 visualization_images
-rw-r--r-- 1 user user 582903 Jan 20 13:58 visualization_video.mp4
noise_warp_output_folder_sample4.mp4の内容がこちら。
(3) 推論して動画生成
(2)で生成したnpy等と、プロンプトを入力に推論して動画生成です。
CUDA_VISIBLE_DEVICES=0 python cut_and_drag_inference.py noise_warp_output_folder_sample4 \
--prompt "木が風で激しく揺れる" \
--output_mp4_path sample4_output.mp4 \
--device cuda \
--num_inference_steps 5
しばらく待つと保存されました。
load_video: path='noise_warp_output_folder_sample4.mp4': done loading frames, creating numpy array...done.
Saving preview MP4 to preview_mp4_path = sample4_output.mp4_preview.mp4...done!
Saving preview gif to preview_gif_path = sample4_output.mp4_preview.mp4.gif...done!
{"output_mp4_path": "sample4_output.mp4", "preview_mp4_path": "sample4_output.mp4_preview.mp4", "compressed_preview_mp4_path": "/mnt/data/shoji_noguchi/venv/gowiththeflow2/Go-with-the-Flow/sample4_output.mp4_preview_compressed.mp4", "preview_gif_path": "sample4_output.mp4_preview.mp4.gif"}
sample4_output.mp4がこちら。
幹も動いて満足。