多模态——使用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的使用,以及对其使用方法进行简单的介绍。具体原理相关内容并不是我的主要研究方法,也就不在此展开介绍了。
下面的这个小火箭就是项目的示例图片,生成视频之后,小火箭可以发射升空。

项目地址:
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. 效果预览
下面展示一下我用自己拍的照片的生成效果:

381b3b2a5906da699b1271fc6695f89f

c06e3a2fa85fb925e6a23fe9064cacc6

6a5943a31f38a8b87e54b0394ddf2d16
从效果来看,在前几帧的生成效果通常比较好,随着帧数的推移,视频的部分内容可能会发生形变。尤其是在图三中,随着西郊线小火车由远及近,模型“脑补”出的列车部分开始变得不够真实。
经过我的一些测试,如果输入的图片是街道,以及行人车辆的话,镜头会顺着街道移动,行人和车辆也会移动;如果输入图片是动物,则需要动物主体的分辨率需要高,否则动物主体可能形变失真,如果是人像或静物,则镜头一般只是左右晃动。
总的来说,模型的效果是让人惊喜,但可以预见的。尽管模型在生成所需step上与之前的工作相比,有了很大的改善,但整个生成过程仍然需要较大的显存消耗。
与此同时,图像生成类任务应该是有可以输入prompt的地方以指导生成,但是在该项目中,暂时还没找到文本编码器。希望随着技术的发展,通过文本来指导图片生成视频的,或利用部分关键帧来生成连续视频的技术,可以早日成熟并普及。在今后的学习中,看到有趣的开源项目,我也会试着体验并与大家分享。
相关文章:
多模态——使用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. 内容简介 近期,…...
springboot(ssm网络相册 在线相册管理系统Java(codeLW)
springboot(ssm网络相册 在线相册管理系统Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0)…...
邮箱发送短信的多种方式
第一种:邮箱验证方法: 导入依赖: <!-- mail依赖(发送短信的依赖) --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> &l…...
R语言——taxize(第五部分)
taxize(第五部分) 3. taxize 文档中译3.71. nbn_synonyms(从 NBN 返回具有给定 id 的分类群名称的所有同义词)3.72. ncbi_children(在 NCBI 中搜索类群的子类群)3.73. ncbi_downstream(检索 NCB…...
负载均衡lvs
简介 ipvsadm 是 Linux 内核中的 IP 虚拟服务器(IPVS)管理工具。IPVS是 Linux 内核提供的一种负载均衡解决方案,它允许将入站的网络流量分发到多个后端服务器,以实现负载均衡和高可用性。IPVS通过在内核中维护一个虚拟服务器表&a…...
【腾讯云云上实验室】探索向量数据库背后的安全监控机制
当今数字化时代,数据安全成为了企业和个人最为关注的重要议题之一。随着数据规模的不断增长和数据应用的广泛普及,如何保护数据的安全性和隐私性成为了迫切的需求。 今天,我将带领大家一起探索腾讯云云上实验室所推出的向量数据库,…...
阅读笔记——《Removing RLHF Protections in GPT-4 via Fine-Tuning》
【参考文献】Zhan Q, Fang R, Bindu R, et al. Removing RLHF Protections in GPT-4 via Fine-Tuning[J]. arXiv preprint arXiv:2311.05553, 2023.【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。 目录 摘要 一、介绍 二、背景 三、方法…...
electron实现截图的功能
Electron是一种跨平台的桌面应用程序开发框架,可以使用HTML、CSS和JavaScript等Web技术构建桌面应用程序。下面是一种使用Electron实现截图的简单方法: 安装Electron和截图库 首先,需要安装Electron和一个截图库,例如electron-sc…...
11、动态数码管显示
数码管驱动方式 1、单片机直接扫描:硬件设备简单,但会消耗大量的单片机CPU时间 2、专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉他显示什么即可 #include <REGX52.H> //数组代表显示亮灯的内容0、1、2、3、4、5、…...
Linux的基本指令(三)
目录 前言 echo指令(简述) Linux的设计理念 输出重定向操作符 > 追加输出重定向操作符 >> 输入重定向操作符 < 补充知识 学前补充 more指令 less指令 head指令 tail指令 查看文件中间的内容 利用输出重定向实现 利用管道“ |…...
使用python 实现华为设备的SFTP文件传输
实验目的: 公司有一台CE12800的设备,管理地址位172.16.1.2,现在需要编写自动化脚本,通过SFTP实现简单的上传下载操作。 实验拓扑: 实验步骤: 步骤1:将本地电脑和ensp的设备进行桥接ÿ…...
高防cdn防护原理是什么,是否可以防护服务器吗
随着互联网业务的迅速发展,网络安全问题日益凸显。在这样的背景下,高防CDN作为一种有效的网络安全解决方案,受到了越来越多的关注。那么高防CDN的防护原理是什么呢?接下来就跟小德一起深入了解下吧! 1. 高防CDN的基本概念 我们要明确什么是…...
SELinux零知识学习三十五、SELinux策略语言之角色和用户(6)
接前一篇文章:SELinux零知识学习三十四、SELinux策略语言之角色和用户(5) 三、SELinux策略语言之角色和用户 SELinux提供了一种依赖于类型强制(类型增强,TE)的基于角色的访问控制(Role-Based Access Control),角色用于组域类型和限制域类型与用户之间的关系,SELinux…...
初学Flink 学后总结
最近开始学习Flink,一边学习一边记录,以下是基于【尚硅谷】Flink1.13实战教程总结的笔记,方便后面温习 目录 初始 Flink 一:基础概念 1.Flink是什么 2.Flink主要应用场景...
CSS新手入门笔记整理:CSS基本介绍
CSS,指的是“Cascading Style Sheet(层叠样式表)”,用于控制网页外观。 CSS引入方式 外部样式表 独立建立一个.CSS文件,在HTML中使用 link标签 来引用CSS文件。link标签放置在head标签内部。 语法 <link rel&qu…...
【华为OD】B\C卷真题 100%通过:需要打开多少监控器 C/C++实现
【华为OD】B\C卷真题 100%通过:需要打开多少监控器 C/C实现 目录 题目描述: 示例1 代码实现: 题目描述: 某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个…...
HarmonyOS开发(七):构建丰富页面
1、组件状态管理 1.1、概述 在应用中,界面一般都是动态的。界面会根据不同状态展示不一样的效果。 ArkUI作为一种声明式UI,具有状态驱动UI更新的特点,当用户进行界面交互或有外部事件引起状态改变时,状态的变会会触发组件的自动…...
LuatOS-SOC接口文档(air780E)--rsa - RSA加密解密
示例 -- 请在电脑上生成私钥和公钥, 当前最高支持4096bit, 一般来说2048bit就够用了 -- openssl genrsa -out privkey.pem 2048 -- openssl rsa -in privkey.pem -pubout -out public.pem -- privkey.pem 是私钥, public.pem 是公钥 -- 私钥用于 加密 和 签名, 通常保密, 放在…...
简易版王者荣耀
所有包和类 GameFrame类 package newKingOfHonor;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;im…...
功能测试进阶建议,学习思路讲解
1. 深入了解测试理论: 了解测试的原理、方法和最佳实践,包括黑盒测试、白盒测试、灰盒测试等。可以阅读相关的书籍或参加在线课程。 2. 学习相关测试工具: 掌握常用的测试工具,如缺陷发现工具、性能测试工具、安全测试工具等。可以…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
