【AI视频】Runway Gen-2与Gen-3:文本生视频详解 qq2890091630.blog.csdn.net
【AI视频】Runway Gen-2:图文生视频与运动模式详解 qq2890091630.blog.csdn.net
a camp tent sitting next to a river in the forest, in the style of 32k uhd, subtle, earthy tones, brian mashburn, high detailed, swiss style, romantic themes, clean and simple designs --ar 16:9 --s 250 --iw 2
左平移:
Horizonta
设置左拉满,“Horizontal”设置“-10.0”,表示水平方向上的左平移。右平移:
Horizonta
设置右拉满,“Horizontal”设置“10.0”,表示水平方向上的右平移。
下平移:
Vertical
设置左拉满,“Vertical”设置“-10.0”,表示垂直方向上的下平移。
上平移:
Vertical
设置右拉满,“Vertical”设置“10.0”,表示垂直方向上的上平移。左倾斜:
Pan
设置左拉满,“Pan”设置“-10.0”,表示水平方向上的左倾斜。右倾斜:
Pan
设置右拉满,“Pan”设置“10.0”,表示水平方向上的右倾斜。
下倾斜:
Tilt
设置左拉满,“Tilt”设置“-10.0”,表示垂直方向上的下倾斜。上倾斜:
Tilt
设置右拉满,“Tilt”设置“10.0”,表示垂直方向上的上倾斜。从近处向远处缩放:
Zoom
设置左拉满,“Zoom”设置“-10.0”,表示整体画面从近处向远处缩放。从远处向近处缩放:
Zoom
设置右拉满,“Zoom”设置“10.0”,表示整体画面从远处向近处缩放。左旋转:
Roll
设置左拉满,“Roll”设置“-10.0”,表示整体画面左旋转。右旋转:
Zoom
设置右拉满,“Zoom”设置“10.0”,表示整体画面右旋转。
本文详细探讨了 Runway Gen-2 的 Camera Control 功能,展示了这一先进工具如何通过精细的运镜技术,赋予视频创作者前所未有的创作自由度和表达能力。这不仅体现了当前 AI 视频生成技术的成熟度,也预示了 AI 在未来数字媒体和内容创作中的潜力。
import torch,torch.nn as nn,torch.optim as optim,cv2,numpy as np;class Generator(nn.Module):def __init__(self,z_dim,img_dim):super(Generator,self).__init__();self.gen=nn.Sequential(nn.Linear(z_dim,256),nn.LeakyReLU(0.2),nn.Linear(256,512),nn.LeakyReLU(0.2),nn.Linear(512,1024),nn.LeakyReLU(0.2),nn.Linear(1024,img_dim),nn.Tanh());def forward(self,x):return self.gen(x);class Discriminator(nn.Module):def __init__(self,img_dim):super(Discriminator,self).__init__();self.disc=nn.Sequential(nn.Linear(img_dim,1024),nn.LeakyReLU(0.2),nn.Linear(1024,512),nn.LeakyReLU(0.2),nn.Linear(512,256),nn.LeakyReLU(0.2),nn.Linear(256,1),nn.Sigmoid());def forward(self,x):return self.disc(x);z_dim,img_dim,lr,batch_size,epochs=100,64*64*3,0.0002,32,50000;generator=Generator(z_dim,img_dim);discriminator=Discriminator(img_dim);opt_gen,opt_disc=optim.Adam(generator.parameters(),lr=lr),optim.Adam(discriminator.parameters(),lr=lr);criterion=nn.BCELoss();def generate_noise(batch_size,z_dim):return torch.randn(batch_size,z_dim);def generate_video_frames(generator,z_dim,num_frames=30):frames=[];for _ in range(num_frames):noise=generate_noise(1,z_dim);frame=generator(noise).detach().numpy().reshape(64,64,3);frames.append((frame*255).astype(np.uint8));return frames;def save_video(frames,filename="output_video.mp4",fps=10):height,width,_=frames[0].shape;video=cv2.VideoWriter(filename,cv2.VideoWriter_fourcc(*'mp4v'),fps,(width,height));for frame in frames:video.write(cv2.cvtColor(frame,cv2.COLOR_RGB2BGR));video.release();for epoch in range(epochs):real_labels,fake_labels=torch.ones(batch_size,1),torch.zeros(batch_size,1);real_data=torch.randn(batch_size,img_dim);noise=generate_noise(batch_size,z_dim);fake_data=generator(noise);disc_real,disc_fake=discriminator(real_data).reshape(-1),discriminator(fake_data).reshape(-1);loss_disc_real,loss_disc_fake=criterion(disc_real,real_labels),criterion(disc_fake,fake_labels);loss_disc=(loss_disc_real+loss_disc_fake)/2;opt_disc.zero_grad();loss_disc.backward();opt_disc.step();output=discriminator(fake_data).reshape(-1);loss_gen=criterion(output,real_labels);opt_gen.zero_grad();loss_gen.backward();opt_gen.step();if epoch%100==0:print(f"Epoch [{epoch}/{epochs}] | Loss D: {loss_disc.item():.4f}, Loss G: {loss_gen.item():.4f}");if epoch%1000==0:frames=generate_video_frames(generator,z_dim);save_video(frames,f"generated_video_epoch_{epoch}.mp4");print("Training complete. Video generation finished.")