sd-webui-animatediffでAnimateDiff×ControlNet×クロマキーの動画を作成

# 記事の概要

これまで紹介してきた以下のような手順では、アニメーションのモーションをコントロールすることができなかったが、ControlNetでコントロールできるようになったので、紹介します。

https://qiita.com/kongo-jun/items/2bd64dd2106df22cb5ee

うまくいけば、この動画のようなアニメーションは作成できる。

https://x.com/jun_kongo/status/1773516730708689050

動画でも解説してます。

https://youtu.be/mPnMGjMcF-A

# 環境

OS:Windows 11
GPU:GeForce RTX 4090
CPU:i9-13900KF
memory:64G
python:3.10.10
pytorch:2.1.2
CUDA:11.8
cuDNN:8.8

sd-webui:v1.8.0
sd-webui-animatediff:v2.0.0-a
sd-webui-controlnet:v1.1.441

# 環境構築

Stable Diffusion Web UIのインストール手順については割愛します。

### ライブラリのインストール
Stable Diffusion Web UIを起動後、「Extensions」タブから、以下のライブラリをインストールする。
基本的には全てのライブラリは最新状態にしてください。（ControlNetが効かないことがあります。）

■ABG_extension
https://github.com/KutsuyaYuki/ABG_extension.git

■deforum
https://github.com/deforum-art/sd-webui-deforum.git

■sd-webui-animatediff
https://github.com/continue-revolution/sd-webui-animatediff.git

■sd-webui-controlnet
https://github.com/Mikubill/sd-webui-controlnet.git


### モーションモジュールのダウンロード
以下のページからモーションモジュールをダウンロードし、「stable-diffusion-webui¥extensions¥sd-webui-animatediff¥model」フォルダに格納する。

■v3_sd15_mm.ckpt
https://aieasypic.com/inspire/models/detail/animatediff-motion-v3-282581

### LoRA
Green screen LoRAとグリーンバックPNGファイルをダウンロードし、LoRAのファイルは、「stable-diffusion-webui¥model¥Lora」フォルダに格納する。

■Green screen LoRAとグリーンバックPNGファイル
https://civitai.com/models/143148/green-screen

### 「--lowvram」の設定
「stable-diffusion-webui」フォルダに格納されている「webui-user.bat」を編集モードで開き、「set COMMANDLINE_ARGS」に「--lowvram」を追記する。

```
@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--xformers --lowvram
set PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6, max_split_size_mb:128

call webui.bat
```
### 「FFmpeg」のインストール

以下の手順などを参考に、導入する。

https://taziku.co.jp/blog/windows-ffmpeg

# 事前準備

## モーションの取得

「Mootion」という３Dキャラクターのモーション動画生成サービスから、モーションをダウンロードする。

https://www.mootion.com/landing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/95de9f06-6bd1-076a-6299-9a8dfef2afa4.png)
こんな見た目の動画がダウンロードできます。

### 「Mootion」の動画を分割
「Mootion」からmp4で動画をダウンロードすると、動画を真ん中で分割する必要があるんで、以下のコマンドで分割を行う。

``````````
# インプットファイル用にインプットファイル名を定義
SET input=very_long_hard_dance__akari.mp4

# アウトプットファイル用にインプットファイル名を加工
SET base_name=%input:~0,-4%

# 左半分の動画を生成
ffmpeg -i %input% -vf "crop=in_w/2:in_h:0:0" %base_name%_left.mp4

# 右半分の動画を生成
ffmpeg -i %input% -vf "crop=in_w/2:in_h:in_w/2:0" %base_name%_right.mp4
``````````

![first_frame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/53fcfd9d-ebbd-80a3-6379-46d1dc9a99e6.png)

![first_frame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/3e55e568-dbaf-38ee-08ba-580cbce6a6d1.png)

### 動画の編集

アスペクト比などの変更が必要な場合は、Windowsに標準搭載の「clipchamp」などを使って、「4:5」などにアスペクト比を変更する。

また、フレーム数をコントロールしやすくするため、以下のコマンドで、動画のFPSを「8」に変換する。
``````````
ffmpeg -i very_long_hard_dance__akari_right_5_4.mp4 -r 8 very_long_hard_dance__akari_right_5_4_8.mp4
``````````

### 最初と最後のフレームのクロマキー生成

img2imgのインプットとなる最初のフレームと最後のフレームを以下のpythonプログラムを実行して、取得する。

``````````
import cv2

# MP4ファイルのパス
video_path = 'very_long_hard_dance__akari_right_5_4_8.mp4'

# ビデオを読み込む
cap = cv2.VideoCapture(video_path)

# 最初のフレームを取得
ret, first_frame = cap.read()

if ret:
    # 最初のフレームをPNG形式で保存
    cv2.imwrite('first_frame.png', first_frame)

# ビデオの総フレーム数を取得
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# 最後のフレームに移動
cap.set(cv2.CAP_PROP_POS_FRAMES, total_frames - 1)

# 最後のフレームを取得
ret, last_frame = cap.read()

if ret:
    # 最後のフレームをPNG形式で保存
    cv2.imwrite('last_frame.png', last_frame)

# リソースを解放
cap.release()
``````````

上記で作成した最初のフレームと最後のフレームそれぞれに対して、text2imgでクロマキー画像を生成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/c2b6da4e-14f3-6505-0192-134ad900e5da.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/393e9da1-45e5-04f5-fbd1-61c85ab0c461.png)
※「Do not auto save」はチェックなしで問題なし。

# 動画生成

Loraは「lora:GreenScreen_A3:1.5」を指定して、それ以外の設定はだいたい画像の通り。（GreenScreenは他のLoraモデルを使っても問題なし。）
ControlNetのTileで指定している画像は、GreenScreenをダウンロードしたzipファイルに含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/cbd72ed8-caf4-baa4-dced-2762aef3096e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/1ceb9e22-4d39-35f5-b0b5-5f4c548b9e8f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/66c63c82-21b4-5955-8353-c9a8eccb432e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/ed4f91fe-57fa-af9e-485c-78d0106881e3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/5f0225c6-8bd1-f8f3-a7ff-324e59969848.png)

上記の設定であれば、以下のようなアニメーションが生成される。

https://x.com/jun_kongo/status/1773289974042923091

微調整の余地は残っているが、大筋の手順としては確立できてきた。