画像生成AIとフレーム補完で一貫性を保った表情アニメーションを作ってみた


# 初めに
画像生成AIを使っていると、いつの間にか時間が経ってしまいますよね。
ついつい、いろんな表情や動きを試したくなってしまいますね、

今回は数枚のイラストからスムーズな表情アニメーションを作成する方法を見つけましたので公開します。

この方法を使用することて、数枚のキーフレームを用意するだけで、AIを使ってその間のフレームを生成し、滑らかで一貫性のあるアニメーションが簡単に作成できます。

また、画像の一貫性はフレーム補完によりある程度保たれるためアニメーションのフレーム数は、AnimateDiffのフレーム数(16)に制限されません。
100フレーム以上の連続したアニメーションが生成可能です。

# 完成したアニメーション
![resized_animation_400x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/7b9dc39c-eb44-b530-0a3f-e53b13d52974.png)

# 使用したツール
* キーフレーム作成
Akuma.ai　
https://akuma.ai/canvas
リアルタイム生成機能のAIキャンバスを使用して表情差分を作成

* 中間フレーム作成
RIFE
https://github.com/hzwer/ECCV2022-RIFE
フレーム補完を使用して表情差分から中間フレームを作成

* 最終調整
AnimateDiff https://github.com/yasukikudan/animatediff-cli_simple_ui
こちらは自作ツールです。
neggles氏作のanimatediff-cilに突貫でimg2img,controllnet,flet製のuiを追加したものです。
フォーク元 https://github.com/neggles/animatediff-cli


# 作り方

### 1.キーフレームの作成
今回はAkuma.aiのAIキャンバスを使用して作成しました。

元のイラストの変更したい箇所にペイントを行い、プロンプトを調整することで表情差分を作成します。
![スクリーンショット 2024-10-20 170038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/5fb02288-4a2b-c4b1-0297-943c307ffaf9.png)

#### 今回作成したキーフレーム
1枚目
<img width="400" alt="flame1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/f18fd37d-8fd9-4f84-b50a-1945371a9642.png">

2枚目
<img width="400" alt="flame2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/90af8624-47cc-fc87-b736-0215171f3046.png">

3枚目
<img width="400" alt="flame3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/c39b9394-94f1-0b1c-f4e0-8fa66a76de8f.png">

4枚目
<img width="400" alt="flame4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/83bfe32d-0864-e207-b82f-8b64dee04b4f.png">



アニメーションとして一貫性を持たせるため、1枚目のフレームを最後に追加して計5枚のキーフレームとします。

### 2.中間フレームの作成

ツールをダウンロード
https://github.com/yasukikudan/animatediff-cli_simple_ui

#### 環境構築
```
git clone https://github.com/yasukikudan/animatediff-cli_simple_ui
cd animatediff-cli
python3.10 -m venv .venv
source .venv/bin/activate
python -m pip install torch torchvision torchaudio flet opencv-python
python -m pip install -e '.[dev]'
python -m pip install -e '.[rife]'
mkdir video_dir
```

#### モデルの設定例
※モデルは別途ダウンロードが必要です。
```
{
"base_model": "data/models/huggingface/stable-diffusion-v1-5/",
"controlnet_model": "data/models/controlnet/control_v11e_sd15_ip2p",
"checkpoint_path": "data/models/sd/SDHK04.safetensors",
"motion_module_path": "data/models/motion-module/mm_sd_v14.safetensors"
}
```

#### 中間フレーム作成
キーフレームをリポジトリ直下のimage_dirに保存し、フレーム補完を実行します。
jpgの場合エラーが発生するためpngを推奨します。
```
animatediff rife interpolate   -M 8 --in-fps 2 --out-fps 8 image_dir/
#中間フレームの出力先はimage_dir-rife/
```

生成される中間フレーム
キーフレームには目を開けた状態または目を閉じた状態のもののみでしたが、
RIFEを用いたフレーム補完によって目を半分閉じたフレームが生成されます。

|前フレーム|RIFEによる中間フレーム|後フレーム|
|---|---|---|
|<img width="400" alt="flame2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/90af8624-47cc-fc87-b736-0215171f3046.png">|<img width="400" alt="flame20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/c1275457-8953-5ee8-9a5c-e838eb52c64f.png">|<img width="400" alt="flame3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/c39b9394-94f1-0b1c-f4e0-8fa66a76de8f.png">|

### 3.AnimateDiffを使った最終調整
RIFEでのフレーム補完ではまだ不自然な箇所が多いため、
AnimateDiffのimg2imgでアニメーション生成を行います。


#### gui起動
```
python src/animatediff/gui.py
```
#### imageの項目にフレーム補完を行った画像の保存先を指定
strengthは0.5ぐらいが目安です。
![screenshot_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/be81a3d7-dc42-5f34-6be3-337721da16bd.png)

#### 画像のサイズと枚数を指定
width    画像の横幅 px
height   画像の縦幅 px
duration フレーム枚数　
![スクリーンショット 2024-10-20 180133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/607d4d94-cd55-e25f-e20d-997eccdee985.png)

#### img2img適用前、img2img適用後の比較

RIFE単体の場合発生していた目の周りの歪みが、
AnimateDiffを適用した後に目立たなくなっています。


|RIFEのみ|RIFE+AnimateDiff img2img|
|---|---|
|<img width="400" alt="flame20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/c1275457-8953-5ee8-9a5c-e838eb52c64f.png">|<img width="400" alt="flame20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/7d38ab43-1ebf-1c39-60fe-1e1449e75344.png">|

#### img2img適用後のフレーム

前後のフレームを確認すると、スムーズに表情が動いていることが分かります。
|1枚目|2枚目|3枚目|
|---|---|---|
|<img width="400" alt="flame20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/69d95703-f4c4-f38d-b031-c20fdff76904.png">|<img width="400" alt="flame20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/91e0b198-d8c3-81d0-a228-395416d60a76.png">|<img width="400" alt="flame20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61466/e4d71cf3-a276-456f-4f06-b33394426bfd.png">|

# まとめ
動画生成AIは日進月歩で進化しています、
この手法は生成される動画の自然さについては最新AIにかなわないのですが、
フレーム補完をベースにしているため、
人間が作成した画像に則った画像を簡単に生成できるという点では使い道があるのではないかと思います。
アニメーション作成ツールなどに統合できれば作業の効率に繋がるのではないかと考えています。


# TODO
もう少し手間がかからずにアニメーション生成ができるUIを作る。