HuggingFace Diffusers 0.15 : API : パイプライン : ゼロショット・テキスト-to-動画生成 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 04/16/2023 (v0.15.0)
* 本ページは、HuggingFace Diffusers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
HuggingFace Diffusers 0.15 : API : パイプライン : ゼロショット・テキスト-to-動画生成
概要
Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators (Text2Video-Zero : テキスト-to-画像拡散モデルはゼロショット・動画生成器) by Levon Khachatryan, Andranik Movsisyan, Vahram Tadevosyan, Roberto Henschel, Zhangyang Wang, Shant Navasardyan, Humphrey Shi.
私たちの手法 Text2Video-Zero は以下のいずれかを使用してゼロショット動画生成を可能にします :
- テキスト・プロンプト, or
- ポーズやエッジからのガイダンスと組み合わせたプロンプト, or
- 動画 Instruct-Pix2Pix, i.e., インストラクション誘導-動画編集。
結果は時間的に一貫性があり、ガイダンスとテキストプロンプトに密接に従います。
論文の要旨は以下のようなものです :
最近のテキスト-to-動画生成アプローチは計算的に重い訓練に依存し、大規模な動画データセットを必要とします。本論文では、ゼロショット・テキスト-to-動画生成の新しいタスクを導入し、既存のテキスト-to-画像合成手法 (e.g., Stable Diffusion) のパワーを活用し、それらを動画ドメインに合わせることによる、(どのような訓練や最適化も必要としないで) 低コストなアプローチを提案します。主要な変更点は以下を含みます : (i) 大域的なシーンと背景に時間一貫性を持たせるためにモーション・ダイナミクスを使用して生成フレームワークの潜在的なコードをリッチにする ; そして (ii) 前景オブジェクトの各フレームのコンテキスト, 外観とアイデンティティを保全するために、最初のフレームで各フレームの交差フレーム・アテンションを使用して、フレームレベルの自己アテンションを再プログラミングしました。実験は、これが少ないオーバーヘッド、しかし高品質で非常に一貫性のある動画生成という結果になることを示しています。更に、私たちのアプローチはテキスト-to-動画合成に制限されず、条件付きやコンテンツ特化の動画生成、そして Video Instruct-Pix2Pix, i.e., インストラクション誘導-動画編集のような他のタスクにも適用可能です。実験が示すように、私たちの手法は追加の動画データで訓練されていないにもかかわらず、最近のアプローチと同じ程度、時にはより良く遂行します。
リソース
利用可能なパイプライン
- パイプライン : TextToVideoZeroPipeline
- タスク : テキスト-to-動画生成 – 🤗 Spaces
使用例
テキスト-to-動画変換
プロンプトから動画を生成するには、以下の python コマンドを実行します :
import torch
import imageio
from diffusers import TextToVideoZeroPipeline
model_id = "runwayml/stable-diffusion-v1-5"
pipe = TextToVideoZeroPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")
prompt = "A panda is playing guitar on times square"
result = pipe(prompt=prompt).images
result = [(r * 255).astype("uint8") for r in result]
imageio.mimsave("video.mp4", result, fps=4)
パイプライン呼び出しでこれらのパラメータを変更できます :
- Motion field strength (論文, Sect. 3.3.1 参照):
- motion_field_strength_x と motion_field_strength_y. Default: motion_field_strength_x=12, motion_field_strength_y=12
- T と T’ (論文, Sect. 3.3.1 参照)
- 範囲 {0, …, num_inference_steps} の t0 と t1. Default: t0=45, t1=48
- Video length:
- video_length, 生成されるフレーム数。Default: video_length=8
ポーズ制御によるテキスト-to-動画変換
追加のポーズ制御によるプロンプトから動画を生成するには :
- デモ動画をダウンロードする :
from huggingface_hub import hf_hub_download filename = "__assets__/poses_skeleton_gifs/dance1_corr.mp4" repo_id = "PAIR/Text2Video-Zero" video_path = hf_hub_download(repo_type="space", repo_id=repo_id, filename=filename)
- 抽出されたポーズ画像を含む動画を読む :
from PIL import Image import imageio reader = imageio.get_reader(video_path, "ffmpeg") frame_count = 8 pose_images = [Image.fromarray(reader.get_data(i)) for i in range(frame_count)]
実際の動画からポーズを抽出するには、ControlNet ドキュメント をご覧ください。
- カスタム・アテンション・プロセッサを使用して StableDiffusionControlNetPipeline を実行する :
import torch from diffusers import StableDiffusionControlNetPipeline, ControlNetModel from diffusers.pipelines.text_to_video_synthesis.pipeline_text_to_video_zero import CrossFrameAttnProcessor model_id = "runwayml/stable-diffusion-v1-5" controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose", torch_dtype=torch.float16) pipe = StableDiffusionControlNetPipeline.from_pretrained( model_id, controlnet=controlnet, torch_dtype=torch.float16 ).to("cuda") # Set the attention processor pipe.unet.set_attn_processor(CrossFrameAttnProcessor(batch_size=2)) pipe.controlnet.set_attn_processor(CrossFrameAttnProcessor(batch_size=2)) # fix latents for all frames latents = torch.randn((1, 4, 64, 64), device="cuda", dtype=torch.float16).repeat(len(pose_images), 1, 1, 1) prompt = "Darth Vader dancing in a desert" result = pipe(prompt=[prompt] * len(pose_images), image=pose_images, latents=latents).images imageio.mimsave("video.mp4", result, fps=4)
エッジ制御によるテキスト-to-動画変換
別のポーズ制御を使用したプロンプトから動画を生成するには、Canny エッジ ControlNet モデル を使用したポーズ誘導生成に対して上記のステップに従ってください。
Video Instruct-Pix2Pix
(InstructPix2Pix で) テキスト誘導-動画編集を実行するには :
- デモ動画をダウンロードする :
from huggingface_hub import hf_hub_download filename = "__assets__/pix2pix video/camel.mp4" repo_id = "PAIR/Text2Video-Zero" video_path = hf_hub_download(repo_type="space", repo_id=repo_id, filename=filename)
- パスから動画を読む :
from PIL import Image import imageio reader = imageio.get_reader(video_path, "ffmpeg") frame_count = 8 video = [Image.fromarray(reader.get_data(i)) for i in range(frame_count)]
- カスタム・アテンション・プロセッサを使用して StableDiffusionControlNetPipeline を実行する :
import torch from diffusers import StableDiffusionInstructPix2PixPipeline from diffusers.pipelines.text_to_video_synthesis.pipeline_text_to_video_zero import CrossFrameAttnProcessor model_id = "timbrooks/instruct-pix2pix" pipe = StableDiffusionInstructPix2PixPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda") pipe.unet.set_attn_processor(CrossFrameAttnProcessor(batch_size=3)) prompt = "make it Van Gogh Starry Night style" result = pipe(prompt=[prompt] * len(video), image=video).images imageio.mimsave("edited_video.mp4", result, fps=4)
以上