随着扩散模型在文生图和图生图领域的蓬勃发展,各路大神各显神通,无论是在质量上还是速度上都有了很大的提升,对prompt的理解也更深入了,现在已经不需要很复杂的提示词就已经能生成非常好质量的图片。
在速度这一块,随着LCM模型的推出,生成速度已经来到了秒级的速度。平均生成一张图片的推理步数可以控制在3步左右,更激进的Stability AI也推出了SDXL Turbo,同样一张图片,只需单步推理,当然在这种条件下生成的图片和传统的多步生成图片的效果还是存在一定差异的。
所以在这种背景下,流式图片生成就应运而生了,比如视频的实时风格化,文字生成图片随着prompt的输入而实时变化。所以很多应用就可以大胆畅想了,虽然现在的效果离预期还有一定的距离,但是不妨我们尝鲜,先睹为快。
首先是基于LCM模型的LCM-REAL,能够将流式视频进行实时风格变换
radames/Real-Time-Latent-Consistency-Model: Demo showcasing ~real-time Latent Consistency Model pipeline with Diffusers and a MJPEG stream server (github.com)
还有最近推出的流式扩散模型框架Streamdiffusion,可以通过pipline实现各种各样的功能,比如文生图,图生图,实时风格变换等等,今天我们就来重点体验一下它的两个实时生图的功能,一个是实时屏幕捕捉然后进行风格变换,另外一个就是图片随prompt的变化而进行实时变化。
首先我们还是安装好虚拟环境:
git clone https://github.com/cumulo-autumn/StreamDiffusion.git
python -m venv .venv
# Windows
.\.venv\Scripts\activate
# Linux
source .venv/bin/activate
然后安装相应的pytorch版本,主要根据你的cuda版本来对应安装即可,我这边安装的是
pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
最后就是安装StreamDiffusion
pip install git+https://github.com/cumulo-autumn/StreamDiffusion.git@main#egg=streamdiffusion[tensorrt]
python -m streamdiffusion.tools.install-tensorrt
# If you use Windows, you need to install pywin32
pip install pywin32
到这一步,基本就安装完毕了,可以直接启动我们的灵魂画手工具,在安装目录下的example\screen\main.py
如果启动中报错
(images / 2 + 0.5).clamp(0, 1) 报错RuntimeError: "clamp_scalar_cpu" not implemented for 'Half'
可以修改虚拟环境下streamdiffusion库里面的image_utils.py,修改如下,主要是先将数据转换成浮点,然后再进行计算
然后我们启动,输入模型,然后输入相应的prompt即可
python .\examples\screen\main.py --model_id_or_path “your model id” --prompt "1girl with brown dog hair, thick glasses, smiling"
启动成功后就可以看到屏幕捕捉实时显示的画面了,激动人心的时候终于来,我们来开始进行灵魂创作。
对比下,可能是我的画工实在有限,连AI都不知道该如何反应了,不过还别说,挺好玩的。不要灰心,不要气馁,我们继续。下面这个就稍微强那么一丢丢。
经过多次的尝试,终于让灵魂画手有了自己的灵魂。
妈妈再也不用担心我画画了。
我还测试了一个好玩的,直接用马赛克图像来生成,用随机的颜色来填充512*512的视频,生成视频的代码如下:
import cv2
import numpy as np
from skimage.metrics import structural_similarity
# 设置参数
frame_size = 512
block_size = 2
fps = 25
frames = fps * 5
# 创建视频对象
video = cv2.VideoWriter('smooth_video.avi', cv2.VideoWriter_fourcc(*'XVID'), fps, (frame_size,frame_size))
# 生成第一帧
last_frame = np.random.randint(0,256,size=(frame_size,frame_size,3),dtype=np.uint8)
# 计算两帧间平滑度
from skimage.metrics import structural_similarity
def measure_smoothness(frame1, frame2):
min_size = min(frame1.shape[0], frame1.shape[1])
if frame1.ndim == 3:
channel_size = min_size // frame1.shape[2]
if channel_size < 7:
return 0
if min_size % 2 == 0:
min_size -= 1
win_size = min_size
return structural_similarity(frame1, frame2, gaussian_weights=True,
win_size=win_size,
channel_axis=2)
# 生成每一帧
for i in range(frames):
# 深拷贝前一帧
current_frame = last_frame.copy()
# 小幅随机扰动
for x in range(0,current_frame.shape[0],block_size):
for y in range(0,current_frame.shape[1],block_size):
disturbance = np.random.randint(-16,16,size=(3,)).astype(np.uint8)
current_frame[x:x+block_size,y:y+block_size] += disturbance
# 检查平滑度
if i > 0:
smoothness = measure_smoothness(last_frame, current_frame)
while smoothness < 0.95:
current_frame = last_frame.copy()
disturbance = np.random.randint(-16,16,size=(3,)).astype(np.uint8)
current_frame[x:x+block_size,y:y+block_size] += disturbance
smoothness = measure_smoothness(last_frame, current_frame)
# 写入帧
video.write(current_frame)
last_frame = current_frame
# 释放资源
video.release()
视频风格化的结果如下:
第二个应用就和SDXL Turbo展示的效果比较相似了,我们启动demo文件夹下的用例
cd view
npm i
npm run build
cd ../server
然后激活虚拟环境,启动main.py,效果如下,可以看到,虽然prompt的输入,生成的图片也在实时的发生变化,受限于显卡的规格,最终的效果也只能差强人意吧。
其实可以畅想一下这种流式图像应用,在制作动画的时候,对于动作的捕捉也不再那么依赖了,只要准备好分镜头,实时表演即可。这样也不失为一种视频生成方式。
对于这种流式的图像视频AGC,大家有什么看法吗?欢迎大家关注留言评论。