视频关键帧AI化的多种方法

news2024/7/4 23:56:52

视频关键帧AI化的逻辑是将视频切分成一帧帧的画面,然后使用SD绘画固定风格,最后统一在拼接在一起成为一个新的视频。

不管是Mov2Mov还是Multi Frame都能制作这种视频。但是这些操作起来比较麻烦,经过尝试处理较稳定的方法是可以通过img2imbatch_sizeControlNetADetailer进行控制修复以及批处理,这样操作会异常简单。

文章目录

  • Stable Diffusion 方法
  • After Effects 方法
  • Ebsynth 方法

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张图。
在这里插入图片描述
点击运行在对应的文件夹下会出现保存每一帧的图片。
在这里插入图片描述
选择其中一张图片拖到img2img选项卡,根据自己喜好选择模型和输出对应的关键词。你会发现第一次处理出来的图像和原图没啥关系。
在这里插入图片描述

这是由于没有选择ControlNet进行控制,点击下方的ControlNet选项卡,设置Canny。

在这里插入图片描述
然后再次点击生成图片,你会发现图像变过来了。
在这里插入图片描述
但是还会出现手脚崩坏的情况,需要在ADetailer中设置手脚修复功能。
在这里插入图片描述
设置好之后再次点击生成,来看看效果。
在这里插入图片描述
这里多生成几次记录下你满意的种子seed,记得将seed保存固定。
在这里插入图片描述
预处理这块就算完成了,接下来点击Batch批处理选项卡,这里要先把ControlNet中的图像叉掉。然后选择图片输入和输出路径。
在这里插入图片描述
这么操作是将out文件夹下的图片批处理之后保存到in文件夹下,然后点击执行,开始一张张处理图像吧。这个过程对于显卡不好的人来说比较痛苦,我这576张图片处理需要30分钟。
在这里插入图片描述
生成完所有图像后在in文件夹下删除后缀-1.png的轮廓图像。再回到视频帧互换选项卡设置需要拼接的图像目录,就是我们用SD绘画出来的图片文件夹,以及视频保存的目录,并且根据原有视频的帧数选择视频帧数。
在这里插入图片描述

点击运行之后会在test文件夹下生成一个video.mp4视频,就是我们要的结果了。
在这里插入图片描述
生成的视频会有闪烁的问题,后面会继续更新内容解决该问题。
在这里插入图片描述

After Effects 方法

使用AE转换需要下载StyleX插件。

在这里插入图片描述
然后设置参数进行预览。
在这里插入图片描述
整体效果其实和SD没有办法比,可以理解为用了简单的滤镜进行处理而已。最后添加到渲染队列输出即可。

Ebsynth 方法

Ebsynth主要可以处理SD生成动漫视频的画面闪烁的问题。

git 安装地址 https://gitcode.net/ranting8323/ebsynth_utility.git

在SD扩展中输入该网址进行安装即可。
在这里插入图片描述
安装完成后重启SD会在出现Ebsynth Utility选项卡。
在这里插入图片描述
进入Ebsynth官网根据你的系统下载安装程序。
在这里插入图片描述
然后在你的扩展目录下打开。
在这里插入图片描述
和SD处理方法一样,先要将视频按帧进行批量转换,首先拖入视频,然后指定提取关键帧的目录。视频的目录也可以手动输入。

configuration选择stage1。如果想要保持原视频尺寸默认选在-1即可。其他的不用操作,然后点击生成。
在这里插入图片描述在这里插入图片描述
在项目文件夹下自动创建video_frame文件夹,并将按帧的生成图片保存到该文件夹下,效果和之前视频转帧效果相同。
在这里插入图片描述
configuration选择stage2。这步是根据已经提取的关键帧按照间隔提取到Ebsynth中,关键帧间隔就是按照帧提取间隔,然后点击生成。
在这里插入图片描述
按照关键帧设置的配置提取关键帧Key到video_key中。
在这里插入图片描述
回到SD绘画中的img2img中,将这些图片批处理重绘和Stable Diffusion方法一样。生成完图像保存在img2img_key中。
在这里插入图片描述
configuration选择stage3.5中提取mask蒙版,也可以不提取。

configuration选择stage4中使用Extras将图片进行放大处理也可以不处理。

configuration选择stage5将关键帧处理好的图片文件放到img2img_upscale_key中,如果该文件夹不存在则手动创建。然后执行生成会生成对应 .ebs文件。
在这里插入图片描述

configuration选择stage6打开EbSynth.exe依次将对应 .ebs文件拖入。关闭蒙版on,点击Run All,等待关键帧生成。
在这里插入图片描述
会生成关键帧的处理过的批处理图片。
在这里插入图片描述

批处理之后点击Export to AE进行合成即可。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win10电脑开机PIN码怎么取消?

有的用户稀里糊涂的设置了PIN码之后&#xff0c;在开机时发现多了个PIN码&#xff0c;但又不知道电脑PIN码是什么意思&#xff0c;也不清楚开机PIN码怎么取消。您可以通过阅读以下内容&#xff0c;以了解什么是PIN以及如何取消PIN码。 PIN码是一种快捷登录密码方式&#xff0c;…

第九章、vim程序编辑器

9.1 vi与vim 9.1.1 为何要学vim 所有的 Unix Like 系统都会内置 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在&#xff1b; 很多个别软件的编辑接口都会主动调用 vi &#xff08;例如未来会谈到的 crontab, visudo, edquota等指令&#xff09;&#xff1b; vi…

最新版Flink CDC MySQL同步MySQL(一)

1.概述 Flink CDC 是Apache Flink 的一组源连接器&#xff0c;使用变更数据捕获 (CDC) 从不同数据库中获取变更。Apache Flink 的 CDC Connectors集成 Debezium 作为捕获数据更改的引擎。所以它可以充分发挥 Debezium 的能力。 2.支持的连接器 连接器数据库驱动mongodb-cdc…

深度学习神经网络学习笔记-论文研读-transformer及代码复现参考

摘要 优势序列转导模型基于复杂的循环或包括一个编码器和一个解码器的卷积神经网络。最好的表现良好的模型还通过attention 连接编码器和解码器机制。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c; 完全基于注意力机制&#xff0c;省去了递归和卷积完…

在一个呼号前+B1/是啥意思?有人知道吗?

电台呼号有什么意义&#xff1f;呼号指配意义在于&#xff0c;识别各个不同的具体的电台或同一固定电台内使用2个以上频率时&#xff08;包括两个频率&#xff09;来识别每个不同频率&#xff0c;另外电台的类别和性质也取决于其呼号的组成形式&#xff0c;所以呼号一经确定&am…

Mycat2 使用教程(三)原始数据导入分库分表【MySQL分库分库分表】

Mycat2 使用教程&#xff08;三&#xff09;原始数据导入分库分表【MySQL分库分库分表】 本文主要描述mycat2完成分库分别数据源配置后&#xff0c;将数据导入的过程mysql 分库分表如果是新项目&#xff0c;则不用考虑本文内容mycat2如何配置分库分表&#xff1f;见上文 1.计…

排序链表问题

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&#xff1a;…

Hadoop下载安装(物理机)

1、下载Hadoop安装包## http://archive.apache.org/dist/hadoop/common 2、解压安装Hadoop 将hadoop-2-7.4.tar.gz包上传到/root/export/software目录 cd /root/export/software mkdir /root/exprot/servers tar -zxvf hadoop-2.7.4.tar.gz -C /root/export/servers/3、配置…

第三届DeepModeling黑客松竞赛

今年的Hackathon难度梯度设置很广&#xff0c;有偏向硬核开发的&#xff0c;有偏向应用的&#xff0c;还有面向初学者的教学布道赛道&#xff01;欢迎大家来围观&#xff01; 参赛链接

【抽奖实现源码】原生js实现简单九方格抽奖实现(附源码下载)

文章目录 写在前面涉及知识效果图1、搭建抽奖页面2、设置抽奖样式1&#xff09;奖项区块颜色2&#xff09;开始按钮背景色3&#xff09;启动初始块颜色 3、编写抽奖功能4、源码下载1&#xff09; 百度网盘2&#xff09;123云盘 总结 写在前面 之前在一次线下活动大屏上看到一个…

招商银行、江苏银行争相入局AIGC,“老银行”能否讲出“新故事”?

文 | 新熔财经 作者 | 和花 由ChatGPT引发的“大语言模型热潮”还没有过去。 六月&#xff0c;A股市场ChatGPT概念指数入选后股价涨幅超过20%的就超过30支&#xff0c;涨幅超过50%也有将近20支&#xff0c;像昆仑万维、万兴科技、神州泰岳、汤姆猫等公司&#xff0c;更是借着…

Qt扫盲-QMouseEvent 鼠标事件

QMouseEvent 鼠标事件理论 一、概述二、鼠标事件的传递三、组合修饰符四、鼠标坐标位置五、使用方式 一、概述 当在QWidget窗口内的鼠标按钮被按下或释放&#xff0c;或者鼠标光标被移动时&#xff0c;就会发生鼠标事件。 鼠标按下释放没有什么特殊的&#xff0c;但是鼠标移动…

数据可视化利器:五个常见组件助您洞察数据

数据可视化组件是在数据分析展示中我们离不开的工具&#xff0c;可以帮助我们更直观地理解和分析数据。不同的数据可视化组件适用于不同类型的数据&#xff0c;本文介绍五个常见的可视化组件以及它们适合展示的数据类型。 柱状图&#xff08;Bar Chart&#xff09;&#xff1a…

美团太狠:100亿级分库分表,不停机迁移,如何处理?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如腾讯、美团、阿里、拼多多、极兔、有赞、希音的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; 数据库如何不停机迁移?100亿级库表&#xff0c;如何不停机迁移&a…

开放式耳机和封闭式耳机有什么区别,那开放式耳机对耳朵伤害大吗?

开放式耳机从字面意思可以理解为&#xff1a;开放耳朵&#xff0c;不需要入耳就可以听见声音的耳机。这种耳机最大的优点就是不压迫不封闭耳道&#xff0c;而且在听耳机音的同时能够及时注意到周围环境的声音&#xff0c;从而可以避免到一些安全事故的发生。 第一点&#xff1a…

台灯选a级还是aa级?科普a级台灯和aa级台灯的区别

我们经常能听到a级台灯aa级台灯&#xff0c;那么里面所说的a级、aa级到底是什么意思呢&#xff1f;其实这里所说的是国A级照度和国AA级照度标准的台灯&#xff0c;是根据国家颁布的《读写作业台灯性能要求》区别的&#xff0c;只有符合其标准的台灯才能被称为护眼台灯&#xff…

学习笔记整理-UML建模与应用复习3-动态模型

动态模型是用来描述系统的动态行为&#xff0c;分为状态模型和交互模型。 其中状态模型分为状态图和活动图&#xff1b;交互模型分为时序图和协作图。 一、交互模型 时序图是描述信息交换时的时间顺序&#xff0c;而协作图是描述系统对象之间共同完成系统功能的要求。 1、时序…

【网络技术】TCP详解

1 TCP是什么 TCP是Transmission Control Protocol的缩写&#xff0c;即传输控制协议。 TCP是一种面向连接的、可靠的、基于字节流的传输协议&#xff0c;是互联网通信协议TCP/IP中的一个重要组成部分。 2 三次握手 三次握手的过程可以用以下图示表示&#xff1a; 2.1 详细介绍…

php命令执行漏洞加固

首先需要去看一下命令执行漏洞的代码&#xff1a; 就像这样&#xff0c;我们可以利用管道符来进行执行一些命令。 我们在网站中渗透一下&#xff1a; 配合上管道符&#xff0c;我们就可以进行执行命令。 这样的话我们总么进行加固呢&#xff0c;我们可以利用if语句来进行加固…

Hadoop启动后没有NameNode进程,日志报ulimit -a for user root

环境&#xff1a;CentOS7、Hadoop2.6.4 背景&#xff1a;安装后启动正常&#xff0c;一段时间在来启动发生这种情况。 现象&#xff1a; 启动后没有NameNode进程&#xff0c;于是查看日志&#xff0c;日志显示ulimit -a for user root&#xff0c;潜意识还以为文件不能读。&a…