当前位置: 首页 > article >正文

最新动态一致的文生视频大模型FancyVideo部署

FancyVideo是一个由360AI团队和中山大学联合开发并开源的视频生成模型。

FancyVideo的创新之处在于它能够实现帧特定的文本指导,使得生成的视频既动态又具有一致性。

FancyVideo模型通过精心设计的跨帧文本引导模块(Cross-frame Textual Guidance Module, CTGM)改进了现有的文本控制机制,以解决现有文本到视频(T2V)模型在生成具有连贯运动视频时面临的挑战。

CTGM包含三个子模块:时间信息注入器(Temporal Information Injector, TII)、时间亲和力细化器(Temporal Affinity Refiner, TAR)和时间特征增强器(Temporal Feature Booster, TFB),分别在交叉注意的开始、中间和结束时实现帧特定文本指导。

FancyVideo在EvalCrafter基准测试上取得了最先进的T2V生成结果,并能够合成动态和一致的视频。

github项目地址:https://github.com/360CVGroup/FancyVideo。

一、环境安装

1、python环境

建议安装python版本在3.10以上。

2、pip库安装

pip install torch==2.1.2+cu118 torchvision==0.16.2+cu118 torchaudio==2.1.2 --extra-index-url https://download.pytorch.org/whl/cu118

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

3、fancyvideo模型下载

git lfs install

git clone https://huggingface.co/qihoo360/FancyVideo

4、stable-diffusion-v1-5模型下载

git lfs install

git clone https://huggingface.co/runwayml/stable-diffusion-v1-5

、功能测试

1、运行测试

(1)python代码调用测试

import os
import argparse
import torch
import yaml
from skimage import img_as_ubyte
from fancyvideo.pipelines.fancyvideo_infer_pipeline import InferPipeline


def load_config(config_path):
    with open(config_path, "r") as fp:
        return yaml.safe_load(fp)


def load_prompts(prompt_path):
    with open(prompt_path, "r") as fp:
        return [line.strip() for line in fp.readlines()]


def check_and_create_folder(folder_path):
    if not os.path.exists(folder_path):
        os.makedirs(folder_path, exist_ok=True)


@torch.no_grad()
def process_prompt(infer_pipeline, prompt, reference_image_path, seed, video_length, resolution, use_noise_scheduler_snr, cond_fps, cond_motion_score, output_fps, dst_path):
    print(f"Processing prompt: {prompt}")

    reference_image, video, _ = infer_pipeline.t2v_process_one_prompt(
        prompt=prompt,
        reference_image_path=reference_image_path,
        seed=seed,
        video_length=video_length,
        resolution=resolution,
        use_noise_scheduler_snr=use_noise_scheduler_snr,
        fps=cond_fps,
        motion_score=cond_motion_score
    )
    
    frame_list = [img_as_ubyte(frame.cpu().permute(1, 2, 0).float().detach().numpy()) for frame in video]
    infer_pipeline.save_video(frame_list=frame_list, fps=output_fps, dst_path=dst_path)

    print(f"Saved video to: {dst_path}\n")


@torch.no_grad()
def main(args):
    # Load configurations
    config = load_config(args.config)
    model_config = config.get("model", {})
    infer_config = config.get("inference", {})

    # Initialize inference pipeline
    infer_pipeline = InferPipeline(
        text_to_video_mm_path=model_config.get("text_to_video_mm_path"),
        base_model_path=model_config.get("base_model_path"),
        res_adapter_type=model_config.get("res_adapter_type"),
        trained_keys=model_config.get("trained_keys"),
        model_path=model_config.get("model_path"),
        vae_type=model_config.get("vae_type"),
        use_fps_embedding=model_config.get("use_fps_embedding"),
        use_motion_embedding=model_config.get("use_motion_embedding"),
        common_positive_prompt=model_config.get("common_positive_prompt"),
        common_negative_prompt=model_config.get("common_negative_prompt"),
    )
    
    # Prepare inference parameters
    infer_mode = infer_config.get("infer_mode")
    resolution = infer_config.get("resolution")
    video_length = infer_config.get("video_length")
    output_fps = infer_config.get("output_fps")
    cond_fps = infer_config.get("cond_fps")
    cond_motion_score = infer_config.get("cond_motion_score")
    use_noise_scheduler_snr = infer_config.get("use_noise_scheduler_snr")
    seed = infer_config.get("seed")
    prompt_path = infer_config.get("prompt_path")
    reference_image_folder = infer_config.get("reference_image_folder")
    output_folder = infer_config.get("output_folder")
    check_and_create_folder(output_folder)

    # Load prompts
    prompts = load_prompts(prompt_path)

    # Process each prompt
    for i, prompt in enumerate(prompts):
        reference_image_path = f"{reference_image_folder}/{i}.png" if infer_mode == "i2v" else ""
        dst_path = f"{output_folder}/example_{i}.mp4"
        process_prompt(
            infer_pipeline, prompt, reference_image_path, seed, video_length, resolution, use_noise_scheduler_snr, cond_fps, cond_motion_score, output_fps, dst_path
        )


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--config", type=str, default="configs/inference/i2v.yaml", help="Path to the configuration file")
    args = parser.parse_args()
    main(args)

未完......

更多详细的欢迎关注:杰哥新技术


http://www.kler.cn/a/311587.html

相关文章:

  • HTML之表单学习记录
  • 鸿蒙自定义UI组件导出使用
  • 记录学习react的一些内容
  • const限定符-C语言中指针的“可变与不可变”法则
  • Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)
  • PHP搭建开发环境(Windows系统)
  • 【MySQL】MySQL 在 Centos 7环境安装
  • Hive自定义函数——简单使用
  • C#广泛应用的简洁匿名函数Lambda 表达式
  • 基于Python的自然语言处理系列(12):使用TorchText和LSTM进行序列到序列(seq2seq)翻译
  • LVGL 控件之仪表盘(lv_meter)
  • Learn ComputeShader 15 Grass
  • 【JVM】垃圾回收
  • 派遣函数 - 缓冲区设备模拟文件读写
  • 服务器数据恢复—raid5阵列热备盘上线失败导致阵列崩溃的数据恢复案例
  • redis为什么不使用一致性hash
  • 向日葵好用吗?4款稳定的远程控制软件推荐。
  • 关于交叉编译移植到Debian开发板的一些随笔
  • gbase8s存储过程一些隐藏的错误写法
  • docker镜像源
  • info 命令:查看命令手册
  • 案例分析-Stream List 中取出值最大的前 5 个和最小的 5 个值
  • 动态内存
  • 7.Java高级编程 多线程
  • flutter Dio发送post请求
  • Linux: debug:内核log有乱码^@^@