FLUX.1 とシネマグラフ:RunPod で実現する本格 Image-to-Video 生成の完全ガイド
前回の記事では、RunPod(ランポッド)上で FLUX.1(フラックスワン)を動かし、神秘的な静止画を生成する手順を解説しました。
本記事はその続編として、生成した静止画に動きを加え、シネマグラフ(Cinemagraph)と呼ばれる映像作品に仕上げる手順をご案内します。
シネマグラフとは、写真の中の特定部分だけが繰り返し動く映像表現を指します。
空の雲だけがゆっくり流れる、水面だけが揺らめく、ろうそくの炎だけが揺れる、星空だけが瞬く、といった作品が代表例です。静止画と動画の中間に位置するこの表現は、瞑想・癒し・スピリチュアル系コンテンツとの親和性が極めて高く、SNSでのループ再生にも理想的です。
本記事では2つのアプローチを解説します。
前半では Ken Burns効果と呼ばれる軽量手法を紹介し、後半では本格的な Image-to-Video(イメージトゥビデオ、画像から動画への変換)モデルである Stable Video Diffusion(ステーブルビデオディフュージョン)を用いた本来のシネマグラフ生成を詳細に解説します。
本記事の主軸は後半の Image-to-Video 手法であり、こちらに記述の大部分を割いています。
なお、本記事は前回記事「RunPod で FLUX.1 を動かしてみた」を読了済みであることを前提に構成しています。RunPod の Pod(ポッド)起動、Jupyter Lab(ジュピターラボ)への接続、Hugging Face(ハギングフェイス)トークン設定など、基本的なセットアップは前回記事をご参照ください。
アプローチの比較
本格的な解説に入る前に、2つのアプローチの特性を整理します。
第一のアプローチである Ken Burns 効果は、静止画にズーム・パン・フェードといったカメラワーク的な動きを加える手法です。
1911年のアメリカ人映像作家ケン・バーンズ氏に由来する古典技法で、ドキュメンタリー映像で広く使われてきました。
生成コストは1本あたり0.01ドル未満、処理時間は数秒で、自動化に最適です。ただし厳密には「動く写真」であり、本来のシネマグラフではありません。
第二のアプローチである Image-to-Video モデルは、AI(エーアイ、人工知能)が静止画の内容を理解し、自然な動きを生成する手法です。
雲、水、髪、布、火、光といった「本来動くべき要素」を AI が自動検出し、物理的に妥当な動きを付与します。
生成コストは1本あたり0.05〜0.20ドル、処理時間は2〜5分で、品質は商用映像水準に達します。
本来のシネマグラフはこのアプローチで実現します。
第1部:Ken Burns 効果による軽量シネマグラフ
まず軽量手法から解説します。
本パートは比較的短く、後半の Image-to-Video パートが本記事の中心です。
Ken Burns 効果のためのライブラリ準備
Jupyter Lab のターミナル(Terminal)を開き、以下のコマンドで必要なライブラリをインストールします。
Copypip install --upgrade moviepy pillow numpy
moviepy(ムービーパイ)は Python(パイソン)から動画編集を行うためのライブラリです。Pillow(ピロウ)は画像処理、numpy(ナンパイ)は数値計算を担当します。
Ken Burns 効果の実装コード
Jupyter Notebook で新しいセル(Cell)を作成し、以下のコードを入力してください。
前回記事で生成した output_001.png を入力画像として使用する想定です。
Copyfrom moviepy import ImageClip, concatenate_videoclips
from moviepy.video.fx import Resize
import numpy as np
def create_ken_burns_video(image_path, output_path, duration=10, zoom_ratio=0.04):
"""
静止画から Ken Burns 効果動画を生成する関数
Parameters:
- image_path: 入力画像のパス
- output_path: 出力動画のパス
- duration: 動画の長さ(秒)
- zoom_ratio: ズーム速度(1秒あたりの拡大率)
"""
clip = ImageClip(image_path).with_duration(duration)
# 時間経過に応じて少しずつ拡大する効果
def zoom_function(t):
return 1 + zoom_ratio * t
zoomed_clip = clip.resized(zoom_function)
# 縦型動画(SNS向け)の場合は 1080x1920、横型は 1920x1080
zoomed_clip = zoomed_clip.with_position("center").resized(height=1920)
zoomed_clip.write_videofile(
output_path,
fps=30,
codec="libx264",
bitrate="5000k"
)
# 実行例
create_ken_burns_video(
image_path="output_001.png",
output_path="cinemagraph_kenburns_001.mp4",
duration=15,
zoom_ratio=0.03
)
Copy
このコードを実行すると、output_001.png から15秒間のゆっくり拡大する動画 cinemagraph_kenburns_001.mp4 が生成されます。
生成時間は数十秒、GPU(ジーピーユー)はほぼ使用せず、コストは無視できる水準です。
Ken Burns 効果のバリエーション
ズームインだけでなく、ズームアウト・パン(横方向移動)・回転といったバリエーションを組み合わせると、表現の幅が広がります。
以下は左から右へのパン効果を加えた例です。
Copyfrom moviepy import ImageClip
from moviepy.video.fx import Crop
def create_pan_video(image_path, output_path, duration=10):
"""左から右へパンする動画を生成"""
clip = ImageClip(image_path).with_duration(duration)
# 画像サイズを取得
w, h = clip.size
# パンの実装:時間経過で表示領域を右に移動
def crop_position(t):
x_center = w * 0.3 + (w * 0.4) * (t / duration)
return x_center
panned_clip = clip.with_position(lambda t: (-crop_position(t) + w/2, "center"))
panned_clip.write_videofile(output_path, fps=30, codec="libx264")
create_pan_video("output_002.png", "cinemagraph_pan_001.mp4", duration=12)
Ken Burns 効果は実装の単純さと処理速度の速さが利点ですが、すべての領域が同じ方向に動くため、本来のシネマグラフが持つ「一部分だけが動く」という核心的な魅力は再現できません。
ここから本記事の主軸である Image-to-Video アプローチに進みます。
第2部:Stable Video Diffusion による本格シネマグラフ生成
ここからが本記事の中心パートです。AI による本格的なシネマグラフ生成を、原理から実装、運用まで詳細に解説します。
Image-to-Video モデルの選定
オープンソース(Open Source)の Image-to-Video モデルには複数の選択肢が存在します。
それぞれの特性を整理した上で、本記事で使用するモデルを選定します。
Stable Video Diffusion(SVD、エスブイディー) は Stability AI(スタビリティエーアイ)が2023年末に公開したモデルで、14フレームまたは25フレーム(約2〜4秒)の動画を生成します。
VRAM(ブイラム、ビデオメモリ)消費が比較的軽く、RTX 4090(GeForce RTX 4090)の24GB で問題なく動作します。
学習データが多様で、自然な動きを生成する能力に優れています。
CogVideoX-5B(コグビデオエックス) は Tsinghua University(清華大学)が公開したモデルで、SVD よりも長尺(最大6秒)かつ高解像度の動画を生成可能です。
ただし VRAM 消費が大きく、推論時間も長めです。
LTX-Video(エルティーエックスビデオ) は Lightricks(ライトリックス)社のモデルで、高速生成が特徴です。
リアルタイム性が求められる用途に向いています。
Wan 2.2(ワン) は Alibabaが公開した最新世代モデルで、現時点で最高品質の Image-to-Video 出力を実現しますが、VRAM 要求が大きく、A100クラスの GPU が推奨されます。
本記事ではコスト・品質・実装の容易さのバランスから Stable Video Diffusion を主軸として解説します。
SVD は安定性と再現性に優れ、シネマグラフのような繊細な動きの生成に最適です。
後半では他モデルへの応用についても言及します。
Stable Video Diffusion の動作原理
実装に入る前に、SVD がどのような仕組みでシネマグラフを生成するのかを理解しておきます。
動作原理を把握することで、パラメータ調整の意図が明確になります。
SVD は Latent Diffusion Model(レイテントディフュージョンモデル、潜在拡散モデル)と呼ばれるアーキテクチャを採用しています。
入力された静止画をまず潜在空間(Latent Space)と呼ばれる低次元表現に変換し、その潜在空間上で時系列方向への拡散プロセスを実行します。
具体的には、画像の各領域が「次のフレームでどう変化すべきか」を学習データから推論し、自然な動きを段階的に生成します。
シネマグラフ的な「一部だけが動く」効果は、SVD の Motion Bucket ID(モーションバケットアイディー)と呼ばれるパラメータで制御できます。
この値が小さいほど動きが控えめになり、大きいほどダイナミックな動きが生成されます。
シネマグラフ用途では低めの値(80〜127程度)を指定するのが定石です。
加えて、Frames Per Second(FPS、フレームパーセコンド、フレーム毎秒)の指定も重要です。
SVD は学習時の FPS 設定により、生成される動きの速度を制御できます。
瞑想・癒し系コンテンツでは6〜10 FPS の遅めの設定が、緩やかで没入感のある映像を生成します。
必要なライブラリの追加インストール
前回記事でインストール済みのライブラリに加え、Image-to-Video 用のライブラリを追加します。
Jupyter Lab のターミナルで以下を実行してください。
Copypip install --upgrade diffusers transformers accelerate
pip install opencv-python imageio imageio-ffmpeg
pip install xformers
opencv-python(オープンシーブイパイソン)は動画処理の汎用ライブラリです。imageio(イメージアイオー)と imageio-ffmpeg(イメージアイオーエフエフエムペグ)は動画形式の入出力を担当します。
xformers(エックスフォーマーズ)は Attention(アテンション)機構を高速化し、VRAM 消費を削減するためのライブラリで、SVD の推論速度を約30〜40パーセント向上させます。
Stable Video Diffusion の基本実装
Jupyter Notebook で新しいセルを作成し、以下のコードを入力します。
これが SVD の基本的な動作確認用コードです。
Copyimport torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video
from PIL import Image
# パイプラインの読み込み
pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid-xt",
torch_dtype=torch.float16,
variant="fp16"
)
# VRAM 節約のための設定
pipe.enable_model_cpu_offload()
pipe.unet.enable_forward_chunking()
print("Stable Video Diffusion のパイプライン読み込みが完了しました")
各パラメータの意味を解説します。stabilityai/stable-video-diffusion-img2vid-xt は SVD の拡張版(XT、エックスティー)で、標準版より高品質な25フレーム動画を生成できます。torch_dtype=torch.float16 は半精度浮動小数点での演算指定で、VRAM 消費を約半分に削減します。
variant="fp16" はモデルの fp16 版重みを使用する指定です。
enable_model_cpu_offload() は使用していないモジュールを CPU(シーピーユー)メモリに退避させる機能で、enable_forward_chunking() は Attention 計算を分割実行することでさらに VRAM を節約します。
このセルの初回実行時に、約10GB のモデルファイルが Hugging Face Hub(ハブ)からダウンロードされます。
所要時間は通常3〜5分です。
最初のシネマグラフ生成
モデルの読み込みが完了したら、実際にシネマグラフを生成します。
前回記事で生成した静止画を入力として使用してください。
新しいセルに以下のコードを入力します。
Copyimport torch
from diffusers.utils import load_image, export_to_video
# 入力画像の読み込み
input_image = load_image("output_001.png")
# SVD の入力解像度に合わせてリサイズ(推奨は1024x576または576x1024)
input_image = input_image.resize((1024, 576))
# シード値を固定して再現性を確保
generator = torch.manual_seed(42)
# 動画生成の実行
frames = pipe(
input_image,
decode_chunk_size=8,
generator=generator,
motion_bucket_id=100,
fps=7,
num_inference_steps=25,
noise_aug_strength=0.02
).frames[0]
# 動画ファイルとして保存
export_to_video(frames, "cinemagraph_svd_001.mp4", fps=7)
print("シネマグラフの生成が完了しました")
各パラメータの意味を詳細に解説します。
decode_chunk_size(デコードチャンクサイズ)は VRAM 消費とのトレードオフを制御するパラメータです。
値が小さいほど VRAM 消費が少なくなりますが、生成時間が延びます。
RTX 4090 環境では8が適切なバランスです。VRAM に余裕があれば14まで上げると高速化します。
motion_bucket_id(モーションバケットアイディー)は動きの強度を指定します。
シネマグラフ用途では80〜127の範囲を推奨します。
80は雲がわずかに流れる程度の控えめな動き、127はカメラが軽くスイングする程度の動きとなります。
試行錯誤しながら好みの値を探すのが定石です。
fps は出力動画のフレームレートです。
6〜10の範囲が瞑想・癒し系コンテンツに適しており、本記事では7を採用しています。
25フレームを 7 FPS で再生すると約3.5秒の動画になります。
num_inference_steps(ナムインファレンスステップス)は拡散プロセスの反復回数です。25が標準値で、品質と速度のバランスが取れています。30〜40に増やすとさらに品質が向上しますが、生成時間も比例して長くなります。
noise_aug_strength(ノイズオーグストレングス)は入力画像にどの程度のノイズを加えてから処理するかを指定します。
値が大きいほど入力画像から離れた、よりダイナミックな動きが生成されます。
シネマグラフ用途では0.02〜0.05の控えめな値が推奨です。
このセルの実行時間は RTX 4090 環境で約2〜3分です。
生成された cinemagraph_svd_001.mp4 を Jupyter Lab のファイル一覧からダブルクリックすると、ブラウザ上で再生確認できます。
シネマグラフ品質を高めるための実践テクニック
基本実装ができたところで、コンテンツとして使えるレベルに品質を引き上げるテクニックを解説します。
テクニック1:入力画像の最適化
SVD は1024×576または576×1024の解像度で最も安定した動作を見せます。
前回記事で生成した1024×1024の正方形画像は、SVD に入力する前にこの推奨解像度にリサイズする必要があります。
単純なリサイズではなく、コンポジション(Composition、構図)を意識したクロップ(Crop、切り抜き)を行うことで、生成品質が向上します。
Copyfrom PIL import Image
def prepare_image_for_svd(input_path, orientation="vertical"):
"""
SVD 用に画像を最適化する関数
orientation: "vertical"(縦型)または "horizontal"(横型)
"""
img = Image.open(input_path)
if orientation == "vertical":
# 縦型(SNS のショート動画向け)
target_width, target_height = 576, 1024
else:
# 横型(YouTube などの通常動画向け)
target_width, target_height = 1024, 576
# アスペクト比を保ちながらリサイズ
img_ratio = img.width / img.height
target_ratio = target_width / target_height
if img_ratio > target_ratio:
# 元画像が横長の場合、高さに合わせてリサイズ後に左右をクロップ
new_height = target_height
new_width = int(new_height * img_ratio)
img = img.resize((new_width, new_height), Image.LANCZOS)
left = (new_width - target_width) // 2
img = img.crop((left, 0, left + target_width, target_height))
else:
# 元画像が縦長の場合、幅に合わせてリサイズ後に上下をクロップ
new_width = target_width
new_height = int(new_width / img_ratio)
img = img.resize((new_width, new_height), Image.LANCZOS)
top = (new_height - target_height) // 2
img = img.crop((0, top, target_width, top + target_height))
return img
# 使用例
optimized_image = prepare_image_for_svd("output_001.png", orientation="vertical")
optimized_image.save("output_001_optimized.png")
Copy
テクニック2:Motion Bucket ID の段階的探索
同じ入力画像でも、Motion Bucket ID を変えるだけで動きの印象が大きく変わります。
シネマグラフ制作では、複数の値で生成してから最適なものを選ぶ手法が有効です。
Copyimport torch
from diffusers.utils import load_image, export_to_video
input_image = load_image("output_001_optimized.png")
# 複数の Motion Bucket ID で連続生成
motion_values = [60, 90, 120, 150]
for motion_value in motion_values:
generator = torch.manual_seed(42)
frames = pipe(
input_image,
decode_chunk_size=8,
generator=generator,
motion_bucket_id=motion_value,
fps=7,
num_inference_steps=25,
noise_aug_strength=0.02
).frames[0]
output_filename = f"cinemagraph_motion_{motion_value:03d}.mp4"
export_to_video(frames, output_filename, fps=7)
print(f"生成完了: {output_filename}")
このコードを実行すると、4つの動きレベルの動画が生成されます。
例えば星空・宇宙系の素材では60〜90、雲や水の素材では90〜120、抽象的な光や粒子の素材では120〜150といった傾向があります。
試行錯誤を通じて自分のブランドに最適な値を見つけてください。
テクニック3:FPS と再生速度の調整
SVD は生成時の FPS パラメータと、最終出力動画の FPS パラメータを別々に指定できます。
この性質を利用して、ゆっくりとした幻想的な動きを演出できます。
Copygenerator = torch.manual_seed(42)
frames = pipe(
input_image,
decode_chunk_size=8,
generator=generator,
motion_bucket_id=100,
fps=6,
num_inference_steps=30,
noise_aug_strength=0.02
).frames[0]
# 生成は 6 FPS だが、出力は 24 FPS にすることで動きが滑らかになる
export_to_video(frames, "cinemagraph_smooth_001.mp4", fps=24)
生成時 FPS を低く(6〜8)、出力時 FPS を高く(24〜30)設定することで、各フレーム間の動きが小さくなり、滑らかで瞑想的な質感が生まれます。
テクニック4:ループ動画化による無限再生対応
シネマグラフの本来の特徴は無限ループ再生にあります。
SVD の出力動画は通常3〜4秒の有限の動画ですが、これを自然なループ動画に変換する処理を加えることで、SNS や瞑想アプリでの繰り返し再生に最適化できます。
Copyimport imageio
import numpy as np
def create_seamless_loop(input_video_path, output_video_path, fade_frames=10):
"""
動画を逆再生でつなげて無限ループ動画を生成する関数
"""
reader = imageio.get_reader(input_video_path)
fps = reader.get_meta_data()["fps"]
frames = [frame for frame in reader]
reader.close()
# 通常再生 + 逆再生 でループを構成
forward_frames = frames
backward_frames = frames[::-1]
# フェード処理で接続点をなめらかに
combined_frames = forward_frames + backward_frames
writer = imageio.get_writer(
output_video_path,
fps=fps,
codec="libx264",
quality=8
)
for frame in combined_frames:
writer.append_data(frame)
writer.close()
print(f"ループ動画を生成しました: {output_video_path}")
create_seamless_loop(
"cinemagraph_svd_001.mp4",
"cinemagraph_svd_001_loop.mp4"
)
Copy
この処理により、動画長が約7秒に延長され、開始点と終了点が同じフレームになるため、再生プレイヤーのループ機能と組み合わせれば完全にシームレスな無限ループとなります。
量産パイプラインの構築
シネマグラフ制作の真価は、量産可能なパイプラインを構築することにあります。
複数の入力画像から自動的にシネマグラフを生成するスクリプトを実装します。
Copyimport os
import torch
from diffusers.utils import load_image, export_to_video
from pathlib import Path
def batch_generate_cinemagraphs(
input_directory,
output_directory,
motion_bucket_id=100,
fps=7,
num_inference_steps=25,
create_loop=True
):
"""
指定ディレクトリ内のすべての画像からシネマグラフを一括生成する関数
"""
input_dir = Path(input_directory)
output_dir = Path(output_directory)
output_dir.mkdir(parents=True, exist_ok=True)
# 対応する画像形式
image_extensions = [".png", ".jpg", ".jpeg", ".webp"]
image_files = [
f for f in input_dir.iterdir()
if f.suffix.lower() in image_extensions
]
print(f"処理対象の画像数: {len(image_files)}")
for index, image_path in enumerate(image_files):
print(f"\n[{index+1}/{len(image_files)}] {image_path.name} を処理中")
# 画像の前処理
input_image = prepare_image_for_svd(
str(image_path),
orientation="vertical"
)
# シネマグラフ生成
generator = torch.manual_seed(index)
frames = pipe(
input_image,
decode_chunk_size=8,
generator=generator,
motion_bucket_id=motion_bucket_id,
fps=fps,
num_inference_steps=num_inference_steps,
noise_aug_strength=0.02
).frames[0]
# 出力ファイル名
base_name = image_path.stem
output_path = output_dir / f"{base_name}_cinemagraph.mp4"
export_to_video(frames, str(output_path), fps=fps)
# ループ動画の追加生成
if create_loop:
loop_path = output_dir / f"{base_name}_loop.mp4"
create_seamless_loop(str(output_path), str(loop_path))
print(f"完了: {output_path.name}")
print(f"\nすべての処理が完了しました。出力先: {output_dir}")
# 実行例
batch_generate_cinemagraphs(
input_directory="./input_images",
output_directory="./output_cinemagraphs",
motion_bucket_id=100,
fps=7,
num_inference_steps=25,
create_loop=True
)
Copy
このスクリプトを使用すれば、input_images フォルダに10枚の静止画を配置し、実行するだけで10本のシネマグラフ動画(およびループ版10本)が output_cinemagraphs フォルダに自動生成されます。
他の Image-to-Video モデルへの応用
SVD で基礎を習得した後は、他のモデルへの展開も視野に入れられます。
本セクションでは簡潔に応用先を紹介します。
CogVideoX-5B(コグビデオエックス) は、より長い動画(最大6秒)と高解像度を求める場合の選択肢です。
実装は SVD とほぼ同じ流れで、diffusers の CogVideoXImageToVideoPipeline クラスを使用します。
VRAM 消費は約20GB と SVD よりやや多めですが、RTX 4090 で動作可能です。
LTX-Video(エルティーエックスビデオ) は超高速生成が特徴で、SVD の3〜5倍の速度で動画を生成できます。
リアルタイム生成や大量自動化のパイプラインに適しています。
Wan 2.2(ワン) は2025年に登場した最新世代モデルで、現時点で最高品質の Image-to-Video 出力を実現します。A100 80GB(80ギガバイト)クラスの GPU が推奨されるため、特別なコンテンツ制作時のみ使用する想定が現実的です。
これらのモデルは Hugging Face Hub から同じ手順で導入できます。
本記事の SVD 実装を理解していれば、各モデルのドキュメントを参照することで容易に移行可能です。
コスト試算
本記事の構成でのコストを試算します。
Ken Burns 効果は GPU をほとんど使用せず、1本あたりのコストは無視できる水準(0.01ドル未満)です。
Stable Video Diffusion での生成は、1本あたり約2〜3分の GPU 使用時間を要します。
RTX 4090 の時間単価0.69ドルで計算すると、1本あたり約0.03〜0.04ドル(日本円で約5〜6円)です。
月100本のシネマグラフを生成する場合でも、月のコストは3〜4ドル(約450〜600円)の範囲に収まります。
商用サービスとの比較として、Runway Gen-3(ランウェイジェンスリー)のような Image-to-Video API は1秒あたり0.05ドル前後の課金で、3秒のシネマグラフ1本あたり0.15ドル相当となります。
100本生成すると15ドル(約2,250円)です。自前運用は約4〜5倍のコスト優位性を持ちます。
Replicate(レプリケート)経由で SVD を呼び出す場合、1本あたり約0.05〜0.10ドルで、自前運用と比較すると2〜3倍のコストですが、インフラ管理が不要という利点があります。
月10〜30本程度の少量生成であれば Replicate も合理的な選択肢ですが、月100本を超える量産フェーズでは自前運用が明確に優位です。
まとめと次のステップ
本記事では、Ken Burns 効果による軽量シネマグラフから、Stable Video Diffusion を用いた本格 Image-to-Video 生成まで、2つのアプローチを解説しました。
中心となる SVD パートでは、動作原理、基本実装、品質向上テクニック、ループ化処理、量産パイプラインまでを段階的に取り上げました。
実運用にあたっては、毎日の SNS 投稿用素材は Ken Burns 効果で量産し、有料コンテンツや特別な作品には SVD を使い分けるハイブリッド運用を推奨します。
両者は対立するものではなく、用途に応じて補完的に活用するものです。
シネマグラフは静と動の境界に位置する映像表現であり、瞑想・癒し・スピリチュアル系コンテンツとの相性は格別です。
本記事がみなさんの映像制作の出発点となれば幸いです。