動画キーフレームAIのさまざまな手法

ビデオ キーフレーム AI のロジックは、ビデオをフレームに分割し、次に SD ペイントを使用してスタイルを修正し、最後にそれらをつなぎ合わせて新しいビデオを形成することです。

Mov2Mov と Multi Frame はどちらもこの種のビデオを作成できます。しかし、これらの操作は面倒なので、より安定した方法を試した後、 、 、 を渡してコントロール修復とバッチ処理を行うことができるのでimg2im操作非常に簡単になります。batch_sizeControlNetADetailer

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に保存されます。選択範囲内のマスクを抽出するかどうか。configurationstage2
ここに画像の説明を挿入
video_key
ここに画像の説明を挿入
img2img
ここに画像の説明を挿入
configurationstage3.5

configuration選択項目ではstage4Extras画像を拡大するか加工しないかを選択できます。

キーフレームによって処理された画像ファイルを に配置するconfigurationことを選択します。フォルダーが存在しない場合は、手動で作成します。次に、ビルドを実行して対応するファイルを生成します。stage5img2img_upscale_key.ebs
ここに画像の説明を挿入

[開く]configurationを選択した後、対応するファイルを順番にドラッグ アンド ドロップしますマスクを閉じて をクリックし、キーフレームが生成されるまで待ちます。キーフレームを生成する処理済みのバッチ画像。stage6EbSynth.exe.ebsonRun All
ここに画像の説明を挿入

ここに画像の説明を挿入

バッチ処理後、クリックExport to AEして合成します。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_20288327/article/details/131573664