📽️

【Paperspace】AIによる動画生成:Stable Video Diffusionの活用

2023/11/25に公開

はじめに

AIによる動画生成で、今回は、Stability AIの新技術: Stable Video Diffusion(SVD)について紹介します。
この記事では、Paperspaceというサービスを使って、SVDを試してみます。

Paperspaceは、パワフルなコンピューターを使えるので、AIがスムーズに動画を作れるんです。
どんな体験だったか、詳しく説明していきますね。

Runway Gen-2との検証していますが、以下のようなアニメーションが生成することができます。

https://x.com/toki_mwc/status/1728279697648423081?s=20

Stable Video Diffusionとは

Stability AIが開発した「Stable Video Diffusion」は、動画作りに特化した新しいAIです。
いわば、写真を作るAIが「動画監督」になったようなものです。

https://github.com/Stability-AI/generative-models

PaperspaceでSVDを使う理由

Paperspaceは、パワフルなコンピューターを使えるので、AIがスムーズに動画を作れます。高スペックPCを持たないユーザーにオススメです。

PaperspaceでのSVDセットアップ

Paperspace Notebookの起動

Notebookを新規作成または既存で作成したものを立ち上げます。
新規作成については、るぺったん様の記事が参考になりました。

https://note.com/rupettan/n/nf6f2ebee0fa8

※SVDはpython3.10環境で動作するため、
Notebookの新規作成時、Containerの部分に
cyberes/gradient-base-py3.10:latest」と入力してください。

SVDのセットアップ

Notebookの起動したら、SVDのセットアップを行います。

mkshing様がGoogle Colabで利用できるコードを投稿していましたので
そちらをお借りします。(若干、Paperspace用に変更しています。)

https://x.com/mk1stats/status/1727207950434083017?s=20

セットアップ

起動時、一回だけの実行でOKです。

#@title Setup
!nvidia-smi
!git clone https://github.com/Stability-AI/generative-models.git
# install required packages from pypi
# !pip3 install -r generative-models/requirements/pt2.txt
# manually install only necesarry packages for colab
!wget https://gist.githubusercontent.com/mkshing/4ad40699756d996ba6b3f7934e6ca532/raw/3f0094272c7a2bd3eb5f1a0db91bed582c9e8f01/requirements.txt

パッケージのインストール

Notebooks立ち上げ時に、毎回実行する必要があります。

!pip3 install -r requirements.txt
!pip3 install -e generative-models
!pip3 install -e git+https://github.com/Stability-AI/datapipelines.git@main#egg=sdata
!pip3 install gradio

Paperspace hack for SVD

パスが/content/(google colab)から/notebooks/(paperspace)へ変更していることに注意!

#@title Colab hack for SVD
# !pip uninstall -y numpy
# !pip install -U numpy
!mkdir -p /notebooks/scripts/util/detection
!ln -s /notebooks/generative-models/scripts/util/detection/p_head_v1.npz /notebooks/scripts/util/detection/p_head_v1.npz
!ln -s /notebooks/generative-models/scripts/util/detection/w_head_v1.npz /notebooks/scripts/util/detection/w_head_v1.npz

Download weights

以降はGoogle Colabと変更なし。そのまま使用してください。

2回目以降は、ここから実行してください。
(あと前述のパッケージもインストールしておく!)

注意:ダウロードに時間を要します。

# @title Download weights
import os
import subprocess
version = "svd_xt" #@param ["svd", "svd_xt"]
TYPE2PATH = {
    "svd": ["https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/resolve/main/svd.safetensors", "checkpoints/svd.safetensors"],
    "svd_xt": ["https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt/resolve/main/svd_xt.safetensors", "checkpoints/svd_xt.safetensors"]
}
download_from, download_to = TYPE2PATH[version]
# @markdown This will take several minutes. <br>
# @markdown **Reference:**
# @markdown * `svd`: [stabilityai/stable-video-diffusion-img2vid](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid) for 14 frames generation
# @markdown * `svd_xt`: [stabilityai/stable-video-diffusion-img2vid-xt](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt) for 25 frames generation
os.makedirs("checkpoints", exist_ok=True)
if os.path.exists(download_to):
  print("Already downloaded")
else:
  print(f"download from {download_from} to {download_to}")
  subprocess.call(["wget", download_from, "-O", download_to])

SVDとSVD-XTについて

  • SVD(Stable Video Diffusion)
    目的:画像から動画を生成するためのモデル。
    訓練:同じサイズ(576x1024)のコンテキストフレームから、14フレームの動画を生成するように訓練された。
    特徴:「Stable Diffusion 2.1」の標準画像エンコーダーを使用。ただし、デコーダーは時間的に認識し、ちらつきを減らすものに置き換えられている。

  • SVD-XT
    基本構造:SVDと同じ。
    ファインチューニング:25フレームの動画生成に特化して調整された。
    目的:より長い動画生成に対応。

要するに、SVDは14フレームの短い動画を、SVD-XTは25フレームのやや長い動画を生成するために使われます。

Load ModelとSampling function

コードはそのままGoogle Colabのコードをコピペしてください。(コードが長いので省略)

Do the Run!

以下のコードを実行すると、「Running on local URL:」と「Running on public URL:」の2つのリンクが出力されますので後者のRunning on public URL をクリックしてブラウザを起動します。

# @title Do the Run!

import gradio as gr
import random


def infer(input_path: str, resize_image: bool, n_frames: int, n_steps: int, seed: str, decoding_t: int) -> str:
  if seed == "random":
    seed = random.randint(0, 2**32)
  seed = int(seed)
  output_paths = sample(
    input_path=input_path,
    resize_image=resize_image,
    num_frames=n_frames,
    num_steps=n_steps,
    fps_id=6,
    motion_bucket_id=127,
    cond_aug=0.02,
    seed=23,
    decoding_t=decoding_t,  # Number of frames decoded at a time! This eats most VRAM. Reduce if necessary.
    device=device,
  )
  return output_paths[0]


with gr.Blocks() as demo:
  with gr.Column():
    image = gr.Image(label="input image", type="filepath")
    resize_image = gr.Checkbox(label="resize to optimal size", value=True)
    btn = gr.Button("Run")
    with gr.Accordion(label="Advanced options", open=False):
      n_frames = gr.Number(precision=0, label="number of frames", value=num_frames)
      n_steps = gr.Number(precision=0, label="number of steps", value=num_steps)
      seed = gr.Text(value="random", label="seed (integer or 'random')",)
      decoding_t = gr.Number(precision=0, label="number of frames decoded at a time", value=2)
  with gr.Column():
    video_out = gr.Video(label="generated video")
  examples = [
      ["https://user-images.githubusercontent.com/33302880/284758167-367a25d8-8d7b-42d3-8391-6d82813c7b0f.png"]
  ]
  inputs = [image, resize_image, n_frames, n_steps, seed, decoding_t]
  outputs = [video_out]
  btn.click(infer, inputs=inputs, outputs=outputs)
  gr.Examples(examples=examples, inputs=inputs, outputs=outputs, fn=infer)
  demo.queue().launch(debug=True, share=True, show_error=True)

SVDを使って動画を生成

ブラウザを起動すると、webUIが表示されますので設定を行います。

画像のアップロード

画像をアップロードする部分が表示されますので、
赤枠から好きな画像をアップロードします。

動画の生成

RUNボタンを押すと動画が生成されます。
再生時間3秒を生成するのに、A6000(VRAM48GB)で1分30秒~2分くらいかかりました。

「resize to optimal size」は画像を最適なサイズに変換する機能です。画像が引き延ばされて変になる場合は、チェックボタンを外してください。

そして、webUIを下にスクロールします。
生成が完了すると「generated video」画面に動画が表示されます。

右上のボタンで動画をダウンロードできます。

詳細な設定

Advanced optionsについて簡単に説明します。(使用しなくても大丈夫です)
間違っていましたらご指摘ください。

Advanced Optionsは、動画生成の際の詳細な設定を指します。ここでは、SVDやSVD-XTのようなモデルで使われる主要なオプションについて説明します。

  • フレーム数(Number of Frames)
    意味:生成する動画のフレーム数。
    用途:動画の長さを決める。多いほど長い動画に。

※例えば、SVD-XTは25フレームの生成に最適化されていますが、30フレームを指定するとエラーが発生することがあります。一方で、50フレームなど、さらに多いフレーム数を設定すると問題なく動作しました。(倍々?)

  • ステップ数(Number of Steps)
    意味:動画生成プロセスのイテレーション(繰り返し)数。
    用途:多いほど詳細に生成プロセスが行われ、品質が向上する可能性があるが、処理時間も長くなる。

  • シード(Seed)
    意味:乱数生成のための初期値。整数値または「ランダム」。
    用途:同じシードを使うと、同じ結果が再現される。異なるシードでは異なる結果が得られる。「ランダム」を選ぶと、毎回異なる乱数が使われる。

  • 一度にデコードされるフレーム数(Number of Frames Decoded at a Time)
    意味:一度に処理されるフレームの数。
    用途:この数が多いほど、一度に多くのフレームが処理される。しかし、メモリ消費量も増えるため、ハードウェアによっては制限が必要。

まとめ

PaperspaceでSVD(Stable Video Diffusion)を使ってみた結果、手軽に動画生成ができました。

皆さん、ぜひPaperspaceでStable Video Diffusion(SVD)を試してみてください。このツールは、AIを使って独自の動画を簡単に作ることができます。

さらに、あなたのSVD体験や感想、質問などがあれば、ぜひコメント欄で共有してください。皆さんの体験談や疑問点を聞くことで、私たちも学びが深まりますし、他の読者の方々にも参考になります。

Discussion