[論文読み]Stable Video Diffusion解説:文章から動画を生成！



# はじめに
本記事は、京都大学人工知能研究会KaiRAのAdvent Calender 12日目の記事です。
この記事は、Stability AIが開発した[Stable Video Diffusionの論文](https://static1.squarespace.com/static/6213c340453c3f502425776e/t/655ce779b9d47d342a93c890/1700587395994/stable_video_diffusion.pdf)の解説記事です。
拡散モデルを用いた動画生成ということで、デモを見た感じ凄いモデルのような気がしてます。
視点が変わるような動画をきれいに生成できるというのは画期的だと思います！
自分としてもどのように学習しているのか興味を持ったので、論文解説記事を書いてみることにしました。
文章から動画を生成するモデルを作ってから画像から動画を生成するモデルを作っていくのですが、この記事では文章から動画を生成するところだけを扱いたいと思います。

# 論文解説
## 要約
Stable Video Diffusionはテキストや画像から動画を生成する潜在拡散モデル(Video-LDMs)。
モデルはStable Diffusion 2.1をベースにしている。
LDMを学習するために以下のような異なる三つの学習プロセスを踏んでいる。
1. 1st stage text-to-image pretraining:テキストから画像への変換の事前学習
1. 2nd stage video pretraining:動画による事前学習
1. 3rd stage high-quality video finetuning:少ないデータ数の高品質、高画質動画でファインチューニング

3rd stageを変更することで、色々なタスクに対してファインチューニングをすることができる。

高品質な動画を生成するためには十分にキュレーション(整理)がされた事前学習用動画データセット(2nd stage dataset)が必要であることを示し、キャプションやフィルタリング戦略を含む、強力なベースモデルを学習するための体系的なキュレーションプロセスを提示した。

<!--
画像からの動画生成やカメラモーションに特化したLoRAモジュールの適応などの下流タスクに対して事前学習済みモデルが動作に対する強力な潜在表現をもたらすことが分かった。

このモデルは複数視点での3次元の事前予測ができることを示し、複数視点拡散モデル(同時に複数視点の物体の様子を生成するような拡散モデル)のファインチューニングのベースラインとすることができることを示した。

また、この手法は画像ベースの手法と比べて少ない計算コストでより優れた精度が出ることを示した。
-->

## ModelとModelの学習方法
モデルはStable Diffusion 2.1をベースにしている。
本論文ではすべての空間方向の畳み込みレイヤーやアテンションレイヤーの後に時間方向の畳み込みレイヤーとアテンションレイヤーを挿入するアーキテクチャーを採用した。[この論文](https://arxiv.org/abs/2304.08818)と同じアーキテクチャーを使っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868042/a7114b7f-7f6b-c2ad-a975-cd1342125925.png)

時間レイヤーだけファインチューニングする手法や完全にファインチューニングをしない手法とは異なり、すべてのパラメータをファインチューニングする。

最近の研究で画像拡散モデルを学習するときにはノイズスケジューリングをすることが必要不可欠で、より解像度が高い画像に対してはより多くのノイズを足すようにスケジューリングを行うと良いことが分かっている。

ベースモデルの学習プロセスは以下の通り。(1st stageと2nd stageを行ったモデルをベースモデルと呼んでいる。)
1. 1st stage text-to-image pretraining:ネットワークの前提条件を使って、画像から連続ノイズへ離散的に足していくノイズのスケジューリングを固定し、256×384の画像を用いてファインチューニングする。
1. 2nd stage video pretraining process1:時間レイヤーを足した後に、LVD-F(後ほど説明するキャプション付き動画データセット。データキュレーションを行った後のデータセット)で256×384の解像度、14フレームの動画を用いてモデルを学習する。このとき標準EDMノイズスケジューリングを行い、15万イテレーション、バッチサイズは1536で学習した。
1. 2nd stage video pretraining process2:解像度320×576、14フレームの動画を生成するように10万イテレーション、バッチサイズ768でファインチューニングをした。ここで、より多くのノイズを足すようにノイズスケジューリングを変更することが大事。

このベースモデルから3rd stage high-quality video finetuningをする。
3rd stage high-quality video finetuningでは25万の高品質キャプション付き動画データセットを用いた。このデータセットでは物体が運動しており、常にカメラ視点が動いており、良く整ったキャプションが付いており、動画の見た目もきれいである。
3rd stageでは576×1024の解像度で5万イテレーション、バッチサイズ768でベースモデルをファインチューニングを行った。ここでも、より多くのノイズを足すようにノイズスケジューリングを変更することが大事。

## 1st Stage:Text-to-Image Pretrainingの効果
この事前学習の効果はLVD-10M(LVDから100万個のデータをランダムサンプリングしたデータセット)で学習されたモデルに対して、人間の好みに基づく評価を行った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868042/8ff40723-b9cd-cbc7-697f-31631e0bc92c.png)

## 2nd Stage:Video Pretraining
### Dataset Annotation
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868042/455bfb92-bd1f-3239-2f26-a612101e7a0d.png)
動画の切り取りやフェードイン、フェードアウトが生成された動画に紛れ込まないように動画が切り取られたかどうかを異なる三つのFPSで連鎖的に判断するパイプラインを作った。

動画の切り抜きに対して、異なる3つのキャプション生成手法でキャプションのアノテーションを行った。プロセスは以下の通り。
1. 動画切り抜きの中間フレームをアノテーションするのにCoCaを使用
1. 動画ベースキャプションをするためにV-BLIPを使用
1. 作成した2種類のキャプションをLLMベースのモデルで要約

作成されたデータセットはLarge Video Dataset(LVD)と名付けた。このデータセットは5億8000万組の注釈付きビデオ切り抜きから構成され、212年分のコンテンツとなっている。

しかし、このデータセットは動画生成モデルのパフォーマンスを悪化させるデータを含んでいることが判明した。その例は、動きが少なかったり、テキストが多く含まれすぎていたり、一般的に美的に価値が低かったりする動画切り抜きなど。

そこで、dense optical flowによってさらにこのデータセットをアノテーションした。
optical flow magnitudeを2FPSで計算し、その平均値が閾値よりも小さいものはフィルタリングするというものである。
これによって、動きが少ない動画切り抜きを取り除くことができた。

また、 optical character recognitionを用いて大量の書かれているテキストを取り除いた。

最後に、動画切り抜きの最初、中間、最後のフレームをCLIP埋め込みでアノテーションを行い、そこから美的スコアとテキストの類似度を計算した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868042/48c575a2-119c-f47d-0e0b-57a5e2d642d2.png)

### Dataset Curation
動画では、要らない例をフィルターするのに使うことができる既成の潜在表現が存在しなかったので、適切な事前学習データセットを作るために人間の好みを指標として用いた。
以下のようにLVDのデータキュレーションを行い、これらのデータセットで学習された潜在動画拡散モデルに人の好みに基づいたランキングを付けた。

まず、フィルタリングを行わないでLVDから980万個のデータをランダムサンプリングしたデータセットLVD-10Mを作った。
次に、アノテーションの種類(CLIP scores, aesthetic scores, OCR detection rates, synthetic captions, optical flow scoresなど)ごとに下から12.5%、25%、50%のデータを体系的にデータセットから取り除いた。
ただし、synthetic captionsに対しては、単純にはこのような意味でフィルタリングを行うことができないことに注意。
その代わりに、様々なキャプション手法に対するEloレーティングを用いてフィルタリングを行った。

データの数を取り扱いやすい個数にするために、アノテーションの種類ごとにこれらの手続きを行った。

アノテーションの種類ごとに一番適切なフィルタリングの閾値を決めるために、ハイパーパラメーターは固定してフィルタリングをした後のデータセットでモデルを学習し、人間の好みによる投票に関するEloレーティングで同じアノテーションの種類内でモデルの性能を比較した。

最終的にフィルタリング方法をLVDに適用し、1億5200万個の学習例からなる事前学習データセットLVD-Fを作った。

### Data Curationの効果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868042/5fe33be4-6f49-563a-1887-cc5adfe8607c.png)
LVD-10Mに対してフィルタリングを行って4倍くらい小さいデータセットLVD-10M-Fを作った。

LVD-10MとLVD-10M-Fのデータセットでベースラインモデルの学習を行い、見た目の品質と、動画の並び方に関する人間の好みのスコアで評価を行った。

LVD-10M-Fは4倍データセットが小さいのにもかかわらず、LVD-10Mで学習したよりもLVD-10M-Fで学習した時の方がモデルの精度が向上した。

研究用ライセンスの付いているもっとも有名な動画データセットの一つであるWebVid-10Mや美的に美しいデータをフィルタリングによって集めている動画データセットであるInternVid-10Mでモデルを学習した場合とLVD-10M-Fでモデルを学習した場合を比較しても、LVD-10M-Fの方がこれらのデータセットよりも4倍小さいのにもかかわらず、LVD-10M-Fを用いた学習した方がより人間の評価者には好まれた。

データセットのサイズを大きくして同様の評価をしてもキュレーションをしたデータセットで学習した方がモデルの精度が高いという傾向は変わらなかった。
さらに、step数を固定した場合もデータセットの大きさが大きい方がモデルの精度が良いことが分かった。(LVD-50M-Fで学習した場合とLVD-10M-Fで学習した場合で比較した。LVD-50M-Fは500万個のデータにデータキュレーションを行ったデータセット)

## 3rd Stage:High-Quality Video Finetuningも行った場合のVideo PretrainingとData Curationの効果
以下の三つのモデルを作ってその精度を比較した。
- 画像による事前学習(1st stage)を行ったモデル(動画による事前学習(2nd stage)は行わない)を高品質動画でファインチューニング(3rd stage)
- 画像による事前学習(1st stage)と5000万個のデータキュレーションをした動画による事前学習(2nd stage)を行ったモデルを高品質動画でファインチューニング(3rd stage)
- 画像による事前学習(1st stage)と5000万個のデータキュレーションをしていない動画による事前学習(2nd stage)を行ったモデルを高品質動画でファインチューニング(3rd stage)

1万ステップと5万ステップでファインチューニング(3rd stage)をした場合の3つのモデルの精度を、人間の好みによるEloレーティングによって比較した。

結果としては、video pretraining(2nd stage)を行った方がモデルの精度が上がり、データキュレーションをしたデータでvideo pretraining(2nd stage)を行った方がモデルの精度が上がることが分かった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868042/eda8543a-c4fb-1d6c-79f6-7e0be070ccb1.png)

<!--
## High Resolution Image-to Video Model
3rd stageを変更してimage-to-video generationを行うようにファインチューニングを行った。

入力を文章ではなく画像にするために、文章の埋め込みの代わりにCLIPによる画像の埋め込みを与えるように変更した。

さらに、conditioning frameの、ノイズによるaugmentationを行ったバージョンをチャンネルごとにUNetの入力に連結した。

maskingを行うことは無く、単にフレームを時間方向にコピーした。

14フレーム出力するモデルを25フレーム出力するモデルの2つを学習した。

標準的なvalnilla classifier-free guidanceを使うと人工的な出力になってしまうことが分かった。guidance scaleが小さすぎるとconditioning frameに一貫性が無くなってしまう可能性があり、guidance scaleが大きすぎると、学習が途中で頭打ちになってしまう。
そこで、一定のguidance scaleを使うのではなく、frame軸に沿ってguidance scaleを線形的に大きくしていくと良いことが分かった。

### Camera Motion LoRA
-->

# 終わりに
kaggleの解法みたいな感じで楽しんで読むことができました。
やっぱりモデルを学習するデータは大事だと実感しました。

Stable Video Diffusionの理解を深めるのに役立つことができたら幸いです。