多模态——使用stable-video-diffusion将图片生成视频

多模态——使用stable-video-diffusion将图片生成视频

  • 0. 内容简介
  • 1. 运行环境
  • 2. 模型下载
  • 3. 代码梳理
    • 3.1 修改yaml文件中的svd路径
    • 3.2 修改DeepFloyDataFiltering的vit路径
    • 3.3 修改open_clip的clip路径
    • 3.4 代码总体结构
  • 4. 资源消耗
  • 5. 效果预览

0. 内容简介

近期,stabilityAI发布了一个新的项目,是将图片作为基础,生成一个相关的小视频,其实也算是其之前研究内容的扩展。早在stable-diffusion的模型开源出来的时候,除了由prompt生成图片之外,也可以生成连续帧的短视频。

本文主要是体验一下stable-video-diffusion的使用,以及对其使用方法进行简单的介绍。具体原理相关内容并不是我的主要研究方法,也就不在此展开介绍了。

下面的这个小火箭就是项目的示例图片,生成视频之后,小火箭可以发射升空。

test_image

项目地址:
HF:https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt
git:https://github.com/Stability-AI/generative-models
论文地址:
https://stability.ai/research/stable-video-diffusion-scaling-latent-video-diffusion-models-to-large-datasets

观前提醒:此项目消耗显存较多,最好是48G以上,请根据实际情况判断是否继续尝试。

1. 运行环境

这里提供一下我的运行环境以供大家参考。

系统:CentOS 7
Python:3.10
驱动:470.63.01
CUDA:11.4
cudnn:8.5.0
torch:2.0.1+cu117
torchvision:0.15.2+cu117

其他模块参考https://github.com/Stability-AI/generative-models/blob/main/requirements/pt2.txt.

2. 模型下载

由于国内目前不能正常访问HF了,所以代码的一键运行可能会遇到网络连接的问题,于是可以考虑将模型先下载到本地,然后直接从本地读取模型。需要下载的模型包括:

  • laion/CLIP-ViT-H-14-laion2B-s32B-b79K
  • ViT-L/14
  • stable-video-diffusion-img2vid-xt

3. 代码梳理

代码主要参考官方git上的样例脚本:https://github.com/Stability-AI/generative-models/blob/main/scripts/sampling/simple_video_sample.py

3.1 修改yaml文件中的svd路径

模型的创建用到了yaml配置文件,所以需要把git中的svd_xt.yaml等yaml文件下载下来,并且将其中的模型地址ckpt_path,修改为第2部分中,从HF下载的stable-video-diffusion-img2vid-xt/svd_xt.safetensors的地址。

svd_xt_image_decoder.yaml同理。

3.2 修改DeepFloyDataFiltering的vit路径

注意运行脚本的import部分:

import math
import os
from glob import glob
from pathlib import Path
from typing import Optionalimport cv2
import numpy as np
import torch
from einops import rearrange, repeat
from fire import Fire
from omegaconf import OmegaConf
from PIL import Image
from torchvision.transforms import ToTensor# from scripts.util.detection.nsfw_and_watermark_dectection import \
#     DeepFloydDataFiltering
# from sgm.inference.helpers import embed_watermark
# from sgm.util import default, instantiate_from_config

找到其中的DeepFloyDataFiltering,将其中的路径修改为2中下载的ViT-L-14.pt的路径。

3.3 修改open_clip的clip路径

在python环境中,找到…lib/python3.10/site-packages/open_clip/factory.py,大约在210行的if model_cfg is None之后,添加:

if model_cfg is None:with open('.../CLIP-ViT-H-14-laion2B-s32B-b79K/open_clip_config.json', 'r') as f:model_cfg = json.load(f)['model_cfg']

其中的路径是2中下载的clip的路径。

3.4 代码总体结构

代码的运行就是参考https://github.com/Stability-AI/generative-models/blob/main/scripts/sampling/simple_video_sample.py的结构,我是在jupyter中执行的,下面给出我的代码的结构以供参考,所包含的函数和类只给出了名称,其具体内容均可在原项目的git中找到。

import math
import os
from glob import glob
from pathlib import Path
from typing import Optionalimport cv2
import numpy as np
import torch
from einops import rearrange, repeat
from fire import Fire
from omegaconf import OmegaConf
from PIL import Image
from torchvision.transforms import ToTensor# from scripts.util.detection.nsfw_and_watermark_dectection import \
#     DeepFloydDataFiltering
from sgm.inference.helpers import embed_watermark
from sgm.util import default, instantiate_from_configimport clip
import torchvision.transforms as Tos.environ['CUDA_VISIBLE_DEVICES'] = '0'# 注意这里的路径,是配置文件yaml所在的目录,我直接把yaml放在同级目录了
RESOURCES_ROOT = './'def load_model_weights(path: str):def load_img(path: str) -> torch.Tensor:# 注意将self.clip_model, _ = clip.load中的路径修改为下载的ViT-L-14.pt路径
class DeepFloydDataFiltering(object):def predict_proba(X, weights, biases):def get_unique_embedder_keys_from_conditioner(conditioner):def clip_process_images(images: torch.Tensor) -> torch.Tensor:def get_batch(keys, value_dict, N, T, device):def load_model(...# 在这个方法里修改输入图像的路径
def sample(...# 执行:可以不用Fire,直接调用即可
sample()

所有的方法均可在项目的git中找到,找不到的话可以直接在git搜索对应的函数名。

4. 资源消耗

官方提供的样例图片,尺寸为(1024, 576),在所有参数均选择默认的情况下,占用显存约为60G。

当我使用的图片为手机原图时,程序很容易就OOM了,所以对于一般手机的相片,可以将尺寸压缩到(960, 720),显存消耗就大概维持在60G。

图片的裁剪主要用到PIL模块,非常方便:
(1) 加载图片:

from PIL import Image
img = Image.open("image.png")

(2) 裁剪图片:

img = img.crop((left, top, right, bot))

(3) 缩放图片:

img = img.resize((960, 720))

需要注意的是,此项目似乎并不能使用cpu进行计算,也不能将device设置成’cuda:0’的方法来指定显卡,但是可以利用os.environ[‘CUDA_VISIBLE_DEVICES’] = '0’的方法来指定显卡。

关于图片的帧数,目前还没有进一步实验,猜测应该是代码中的num_frames参数来控制。

5. 效果预览

下面展示一下我用自己拍的照片的生成效果:
图1

381b3b2a5906da699b1271fc6695f89f

图2

c06e3a2fa85fb925e6a23fe9064cacc6

图3

6a5943a31f38a8b87e54b0394ddf2d16

从效果来看,在前几帧的生成效果通常比较好,随着帧数的推移,视频的部分内容可能会发生形变。尤其是在图三中,随着西郊线小火车由远及近,模型“脑补”出的列车部分开始变得不够真实。

经过我的一些测试,如果输入的图片是街道,以及行人车辆的话,镜头会顺着街道移动,行人和车辆也会移动;如果输入图片是动物,则需要动物主体的分辨率需要高,否则动物主体可能形变失真,如果是人像或静物,则镜头一般只是左右晃动。

总的来说,模型的效果是让人惊喜,但可以预见的。尽管模型在生成所需step上与之前的工作相比,有了很大的改善,但整个生成过程仍然需要较大的显存消耗。

与此同时,图像生成类任务应该是有可以输入prompt的地方以指导生成,但是在该项目中,暂时还没找到文本编码器。希望随着技术的发展,通过文本来指导图片生成视频的,或利用部分关键帧来生成连续视频的技术,可以早日成熟并普及。在今后的学习中,看到有趣的开源项目,我也会试着体验并与大家分享。

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

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

相关文章

理解CLIP模型

1.简介 学习深度学习必看CLIP!论文链接arxiv.org/pdf/2103.00020v1.pdf。 简单来说就是传统的分类任务被用来预测指定的类别,有监督训练限制了模型的通用性和可用性,并且需要带有标签的数据来训练,该篇论文就想直接从原始文本中…

Navicat 技术指引 | 适用于 GaussDB 的用户权限设置

Navicat Premium(16.2.8 Windows版或以上) 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

Spring 七大组件

文章目录 Spring 七大组件 Spring 七大组件 核心容器(Spring core) 核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式…

(Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分代码: 四、本文代码数据说明手册分享 一、程序及算法内容介绍: 基本内容: 本代码基于Matalb平台编译&am…

Flink Flink中的分流

一、什么是分流 所谓“分流”,就是将一条数据流拆分成完全独立的两条、甚至多条流。也就是基于一个DataStream,定义一些筛选条件,将符合条件的数据拣选出来放到对应的流里。 二、基于filter算子的简单实现分流 其实根据条件筛选数据的需求…

面了一个4年经验的测试工程师,自动化都不会也要15k,我也是醉了····

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

表单考勤签到作业周期打卡打分评价评分小程序开源版开发

表单考勤签到作业周期打卡打分评价评分小程序开源版开发 表单打卡评分 表单签到功能:学生可以通过扫描二维码或输入签到码进行签到,方便教师进行考勤管理。 考勤功能:可以记录学生的出勤情况,并自动生成出勤率和缺勤次数等统计数…

ruoyi-plus-vue部署

安装虚拟机 部署文档 安装docker 安装docker 安装docker-compose 可能遇到的错误 Failed to deploy ruoyi/ruoyi-server:5.1.0 Dockerfile: ruoyi-admin/Dockerfile: Cant retrieve im age ID from build stream 安装 vim 命令 yum install vim -y 修改文件 vim /etc/re…

基于Springboot的冬奥会科普平台(有报告),Javaee项目,springboot项目。

演示视频: 基于Springboot的冬奥会科普平台(有报告),Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层…

ELK+kafka+filebeat企业内部日志分析系统

1、组件介绍 1、Elasticsearch: 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布…

创新研报|企业如何在不确定时期突破至新高度?

报告下载地址: 创新研报|BCG 2023最创新企业研究-在不确定时期跃升新高度 创新从未如此重要,领先的企业创新者正在证明这一切。BCG(于2005年首次发布年度创新报告,其中列出了全球创新高管最钦佩的50家企业&#xf…

【MATLAB源码-第88期】基于matlab的灰狼优化算法(GWO)的栅格路径规划,输出做短路径图和适应度曲线

操作环境: MATLAB 2022a 1、算法描述 灰狼优化算法(Grey Wolf Optimizer, GWO)是一种模仿灰狼捕食行为的优化算法。灰狼是群居动物,有着严格的社会等级结构。在灰狼群体中,通常有三个等级:首领&#xff…

数据结构-归并排序+计数排序

1.归并排序 基本思想: 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个…

2023年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2023年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题是由安全生产模拟考试一点通提供,P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材,P气瓶充装大纲整理而成(含2023年P气瓶…

pulseaudio是如何测试出音频延迟的

通常专业的音频设备生产厂商都有专业的设备来测试精确的音频链路延时。 那么没有专业设备怎么测试出音频延迟呢?如下图,我们可以看到pulseaudio可以测试出硬件音频延迟。 那么,他是怎么测试出硬件延迟的呢?他的理论依据是什么呢?接下来我带大伙一起探索一下。 /*占位…

红队攻防实战之从边界突破到漫游内网(无cs和msf)

也许有一天我们再相逢,睁大眼睛看清楚,我才是英雄。 本文首发于先知社区,原创作者即是本人 本篇文章目录 网络拓扑图: 本次红队攻防实战所需绘制的拓扑图如下: 边界突破 访问网站: http://xxx.xxx.xxx…

Linux 排查必看文件

目录 1. 登录日志 1.1 /var/log/wtmp 1.2 /var/log/btmp.* 1.3 /var/log/lastlog 1.4 /var/log/faillog 1.5 /var/log/secure 1.6 /var/log/auth.log 2. 系统日志 2.1 /var/log/cron.* 2.2 /var/log/syslog 2.3 /var/log/audit/audit.*log 3. 历史命令 3.1 ~/…

Docker 中OpenResty下载与使用

1Panel安装OpenResty 查看到就说明安装成功 部署项目 在http中添加: server { listen 8001; //端口号 server_name localhost; location / { root /admin; //项目路径 index index.html index.htm; …

Java二级医院区域HIS信息管理系统源码(SaaS服务)

一个好的HIS系统,要具有开放性,便于扩展升级,增加新的功能模块,支撑好医院的业务的拓展,而且可以反过来给医院赋能,最终向更多的患者提供更好的服务。 系统采用前后端分离架构,前端由Angular、J…

P1028 [NOIP2001 普及组] 数的计算

时刻记住一句话:写递归,1画图,2大脑放空!!! 意思是,自己写递归题目,先用样例给的数据画图,然后想一个超级简单的思路,直接套上去就可以了。 上题干&#xff…