概览
基于1.3B模型开发的,主要包括tile和depth两个模型。tile模型可以将模糊的视频变得高清,改变细节,保证原有视频模样;depth模型则可以保证视频中的大致轮廓,有更多的创作空间。
主要的实现细节
为什么选择这个而不是控制网?控制网增加了大量的推理成本,而且很难训练好。有许多提议的替代方案或修改方案,但大多数实施起来很复杂,而且训练起来也不容易。这种方法在推理过程中非常轻量(如果融合了 lora,则几乎免费),相对容易训练,实施起来也很简单。沿着输入通道维度连接控制特征并使用 lora 训练整个模型,可以以优化的方式自动集成控制信号,而无需任何麻烦的架构搜索。
训练方法
像 flux 工具一样 ,扩展扩散模型输入层以添加新通道,将新通道清零,并将旧输入层的权重和偏差复制到新层的噪声通道。在输入层 + transformer 块中添加 lora。一个小但重要的优化是为输入层 lora 权重设置更高的学习率,这使它能够更快地捕捉到控制信号并避免典型的控制网训练问题,即缓慢预热然后在逃离零初始化时突然收敛。控制视频通过 vae(缩放!不要犯 ip2p 未缩放的潜在错误!)进行编码,然后沿通道维度与嘈杂的潜在输入连接。
推理
对于 comfyui,lora 中包含一个特殊的“reshape_weight”键,可自动将新的控制通道添加到模型,然后使用 InstructPixToPixConditioning 节点进行调节。要在您自己的代码中实现:以与训练相同的方式扩展输入层,然后加载预训练的 lora。在每个采样步骤(正条件和负条件都一样)中,沿通道维度将条件潜伏层连接到噪声潜伏层。
拓展知识(ZERO CONV)
Zero卷积是一种特殊的卷积操作,主要用于在不引入额外参数的情况下,保持输入特征图的维度不变。以下是Zero卷积的作用和计算方式
作用
-
保持维度:Zero卷积确保输入和输出的特征图尺寸一致。
-
参数效率:通过不引入额外参数,Zero卷积减少了模型的计算负担。
-
初始化:Zero卷积的权重初始化为零,确保初始状态下对输入特征图没有影响。
计算方式
Zero卷积的计算与普通卷积类似,但权重初始化为零。具体步骤如下:
-
卷积操作:对输入特征图进行卷积,使用零初始化的卷积核。
-
输出特征图:由于卷积核初始为零,初始输出特征图也为零。
-
训练过程:在训练中,卷积核的权重会逐渐更新,学习到有用的特征。
代码示例
import torch
import torch.nn as nn
class ZeroConv2d(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
super(ZeroConv2d, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
self.conv.weight.data.zero_() # 初始化权重为零
self.conv.bias.data.zero_() # 初始化偏置为零
def forward(self, x):
return self.conv(x)
# 使用示例
zero_conv = ZeroConv2d(3, 3, 3, padding=1)
input_tensor = torch.randn(1, 3, 64, 64)
output_tensor = zero_conv(input_tensor)
print(output_tensor)