多模態——使用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的地方以指導生成,但是在該項目中,暫時還沒找到文本編碼器。希望隨著技術的發展,通過文本來指導圖片生成視頻的,或利用部分關鍵幀來生成連續視頻的技術,可以早日成熟并普及。在今后的學習中,看到有趣的開源項目,我也會試著體驗并與大家分享。