ビデオ キーフレーム AI のロジックは、ビデオをフレームに分割し、次に SD ペイントを使用してスタイルを修正し、最後にそれらをつなぎ合わせて新しいビデオを形成することです。
Mov2Mov と Multi Frame はどちらもこの種のビデオを作成できます。しかし、これらの操作は面倒なので、より安定した方法を試した後、 、 、 を渡してコントロール修復とバッチ処理を行うことができるので、img2im
操作は非常に簡単になります。batch_size
ControlNet
ADetailer
記事ディレクトリ
Stable Diffusion 方法
ビデオ変換プラグインをインストールし、 SD ディレクトリの下のscripts
フォルダーに Convert.py ファイルを作成し、そのファイルに次のコードをコピーします。
import cv2
import gradio as gr
import os
from tqdm import tqdm
from modules import script_callbacks
def add_tab():
with gr.Blocks(analytics_enabled=False) as ui:
with gr.Row().style(equal_height=False):
with gr.Column(variant='panel'):
gr.HTML(value="<p>Extract frames from video</p>")
input_video = gr.Textbox(label="Input video path")
output_folder = gr.Textbox(label="Output frames folder path")
output_fps = gr.Slider(minimum=1, maximum=120, step=1, label="Save every N frame", value=1)
extract_frames_btn = gr.Button(label="Extract Frames", variant='primary')
with gr.Column(variant='panel'):
gr.HTML(value="<p>Merge frames to video</p>")
input_folder = gr.Textbox(label="Input frames folder path")
output_video = gr.Textbox(label="Output video path")
output_video_fps = gr.Slider(minimum=1, maximum=60, step=1, label="Video FPS", value=30)
merge_frames_btn = gr.Button(label="Merge Frames", variant='primary')
extract_frames_btn.click(
fn=extract_frames,
inputs=[
input_video,
output_folder,
output_fps
]
)
merge_frames_btn.click(
fn=merge_frames,
inputs=[
input_folder,
output_video,
output_video_fps
]
)
return [(ui, "视频<->帧", "vf_converter")]
def extract_frames(video_path: str, output_path: str, custom_fps=None):
"""从视频文件中提取帧并输出为png格式
Args:
video_path (str): 视频文件的路径
output_path (str): 输出帧的路径
custom_fps (int, optional): 自定义输出帧率(默认为None,表示与视频帧率相同)
Returns:
None
"""
cap = cv2.VideoCapture(video_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
custom_fps = int(custom_fps)
frame_count = 0
print(f"Extracting {
video_path} to {
output_path}...")
while True:
ret, frame = cap.read()
if not ret:
break
if custom_fps:
if frame_count % custom_fps == 0:
output_name = os.path.join(output_path, '{:06d}.png'.format(frame_count))
cv2.imwrite(output_name, frame)
else:
output_name = os.path.join(output_path, '{:06d}.png'.format(frame_count))
cv2.imwrite(output_name, frame)
frame_count += 1
cap.release()
print("Extract finished.")
def merge_frames(frames_path: str, output_path: str, fps=None):
"""将指定文件夹内的所有png图片按顺序合并为一个mp4视频文件
Args:
frames_path (str): 输入帧的路径(所有帧必须为png格式)
output_path (str): 输出视频的路径(需以.mp4为文件扩展名)
fps (int, optional): 输出视频的帧率(默认为None,表示与输入帧相同)
Returns:
None
"""
# 获取所有png图片
frames = [f for f in os.listdir(frames_path) if f.endswith('.png')]
img = cv2.imread(os.path.join(frames_path, frames[0]))
height, width, _ = img.shape
fps = fps or int(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_writer = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
print(f"Merging {
len(frames)} frames to video...")
for f in tqdm(frames):
img = cv2.imread(os.path.join(frames_path, f))
video_writer.write(img)
video_writer.release()
print("Merge finished")
script_callbacks.on_ui_tabs(add_tab)
AI 処理を実行するために必要な短いビデオを準備します。ビデオを保存するパスに中国語が含まれないように注意してください。ここではビデオに高解像度の解像度を選択するようにしてください。そうしないと、最終的に合成されたビデオのキャラクターが変形してしまいます。
SD を開いてビデオとフレームの交換タブを選択し、ビデオ パスと画像を保存するためのフレーム変換パスを入力します。下の数字 1 はすべてのフレームがインターセプトされることを意味します。つまり、60 フレームのビデオが 1 秒であることを意味します。 、60枚になります。
クリックして実行すると、各フレームの画像が対応するフォルダーの下に表示されます。
写真の 1 つを選択してimg2img
タブにドラッグし、モデルを選択して、好みに応じて対応するキーワードを出力します。初めて処理された画像は元の画像とは何の関係もないことがわかります。
これは、ControlNet が制御に選択されていないためです。下の ControlNet タブをクリックして Canny を設定します。
次に、もう一度 [イメージの生成] をクリックすると、イメージが変更されたことがわかります。
ただし、手足が壊れている場合もあるので、ADetailerで手足の修復機能を設定する必要があります。
設定後、再度「生成」をクリックして効果を確認します。
ここで数回生成して満足のいくシードを記録し、シードを保存して修正することを忘れないでください。
前処理が完了した場合でも、[次へ] をクリックするとBatch批处理选项卡
、最初に ControlNet 内のイメージがフォークされる必要があります。次に、画像の入力パスと出力パスを選択します。
この操作は、out フォルダー内の画像をバッチ処理して in フォルダーに保存し、[実行] をクリックすると画像を 1 枚ずつ処理します。このプロセスは、グラフィック カードの性能が低い人にとってはさらに面倒で、576 枚の写真を処理するのに 30 分かかります。
すべての画像が生成されたら、in フォルダー内の末尾のアウトライン画像を削除します-1.png
。ビデオフレームスワップタブに戻り、結合する必要のある画像ディレクトリ(SDで描いた画像フォルダとビデオが保存されているディレクトリ)を設定し、元のビデオフレームに従ってビデオフレーム番号を選択します番号。
「実行」をクリックすると、テスト フォルダーの下に video.mp4 ビデオが生成されます。これが目的の結果です。
生成されたビデオにはちらつきの問題が発生するため、この問題を解決するためにコンテンツの更新を継続していきます。
After Effects 方法
AE変換を利用するには、StyleXプラグインをダウンロードする必要があります。
次に、プレビューするパラメータを設定します。
全体的な効果は実際にはSDとは比較にならないほどで、単純なフィルターを使用して処理していることがわかります。最後に、それをレンダー キューの出力に追加します。
エブシンセ法
Ebsynth は主に SD で生成されたアニメーションビデオのちらつき問題に対処できます。
gitのインストールアドレスhttps://gitcode.net/ranting8323/ebsynth_utility.git
この URL を SD 拡張機能に入力してインストールします。インストールが完了したら、SD を再起動するとタブ
が表示されます。Ebsynth 公式 Web サイトにアクセスして、システムに応じてインストーラーをダウンロードします。次に、拡張機能ディレクトリでそれを開きます。SD処理方法と同様に、まずビデオをフレームごとに一括変換し、最初にビデオをドラッグし、次にディレクトリを指定してキーフレームを抽出します。ビデオのディレクトリは手動で入力することもできます。Ebsynth Utility
configuration
選択中stage1
。元のビデオ サイズを維持したい場合は、デフォルトで -1 を選択します。他は操作する必要がないので、「生成」をクリックします。
プロジェクトフォルダーの下に自動的にvideo_frame
フォルダーが作成され、生成されたコマ送り画像がそのフォルダー内に保存され、前回のビデオフレーム変換と同様の効果が得られます。選択
中。このステップでは、抽出されたキー フレームを間隔に従って Ebsynth に抽出します。キー フレーム間隔は、フレームに従って間隔を抽出し、[生成] をクリックします。キーフレーム設定の構成に従って、キーフレーム Key を に抽出します。SD ペイントに戻り、安定拡散法と同じ方法でこれらの画像をバッチ再描画します。生成された画像はimg2img_keyに保存されます。選択範囲内のマスクを抽出するかどうか。configuration
stage2
video_key
img2img
configuration
stage3.5
configuration
選択項目ではstage4
、Extras
画像を拡大するか加工しないかを選択できます。
キーフレームによって処理された画像ファイルを に配置するconfiguration
ことを選択します。フォルダーが存在しない場合は、手動で作成します。次に、ビルドを実行して対応するファイルを生成します。stage5
img2img_upscale_key
.ebs
[開く]configuration
を選択した後、対応するファイルを順番にドラッグ アンド ドロップします。マスクを閉じて をクリックし、キーフレームが生成されるまで待ちます。キーフレームを生成する処理済みのバッチ画像。stage6
EbSynth.exe
.ebs
on
Run All
バッチ処理後、クリックExport to AE
して合成します。