Wan2.1 VAE进阶:利用卷积神经网络优化图像编码器性能

高级版的万二点一变分自编码器进阶, 使用卷积神经网络来提升图像编码器性能。

近期在对图像生成模型不断进行尝试时, 我察觉到了一个颇具趣味的优化路径。众多朋友于使用诸如Wan2.1这类模型之际, 或许会更在意解码器生成图片所呈现出的效果, 然而实际上编码器部分, 也就是那个将图片压缩成为潜在向量的所谓"压缩器", 对于最终生成时的质量产生的影响也是颇为显著的。原版的编码器结构在面对处理复杂纹理或者高分辨率细节之时, 有时会显现出有那么点力不从心的状况。

这使我联想到, 可否将编码器之中那些基础性的卷积层, 替换为更为现代、更为强大的卷积神经网络(CNN)架构呢? 像大家所熟知的这些便是。从理论层面来讲, 更强的特征提取能力, 理应能够产生更精准的图像压缩以及更高质量的重建。

撸起袖子就开干, 我耗用了些许时间, 试着把各异的CNN骨干网络整合至Wan2.1 VAE的编码器里头, 还开展了一组一连串对比试验有结果竟有一些着实让人惊喜的变动就这篇文章我要跟你分享一下此过程还要直观地呈现一下换了"心脏"的编码器究竟能令图像重建质量提高多少。

  1. 为什么需要优化VAE的编码器?

在朝着深入技术细节迈进之前, 我们必须要先弄明白, 究竟为何要致力于在编码器方面付出精力呢。Wan2.1 VAE, 也就是大多数的变分自编码器, 其运行的大致流程能够简便地被理解为有着两步: 第一部中的编码器把一幅图片给"提炼"成一个处于较低维度的、具备核心信息的潜在类型向量;第二部中的解码器接着靠着这个当作提炼结果展现的内容去试试尽量达到原来图片的模样, 使其被复原出来。

在这段历程当中, 编码器所扮演的角色具备着相当关键的意义。它宛如一位观察者, 同时又像是一位总结者, 关于图片里何种细节具备重要性, 哪些是能够予以略微忽略不计的, 均是取决于它。要是它的那种"概括"能力并非很强, 致使关键信息出现了丢失的情况, 那么不管解码器究竟有多么厉害, 被重建制作出来后的图片必然是难以避免地会出现模糊不清、产生失真现象, 或者还有可能丢失掉某些细节之处。

常规的原版VAE的编码器, 一般是由好几层标准的卷积层以及池化层进行堆叠构成的, 结构是比较简单的。这样的一种设计, 在早期的时候是具备一定效果的, 然而, 面对当下我们对于图像质量日益提升的标准要求, 诸如期望生成更为清晰清晰, 细节更加丰富丰富, 纹理更加逼真逼真, 这样一来, 基础架构或许就显得很普通平常了。

而像这样的现代 CNN, 它们在图像分类等任务方面, 证明了自身具备强大的特征提取能力。借助残差连接,解决了深层网络训练困难的问题, 能够学习到更为丰富的层次化特性。并且在模型精度以及计算效率之间, 取得了良好的平衡。将它们的思想或者结构, 引入到 VAE 编码器之中, 目的在于让这个"观察者"变得更加敏锐、更为高效, 进而捕获并留存更多对图像重建有帮助的信息。

简而言之, 对编码器加以优化, 目的在于使从图片到达潜在向量这一过程所形成的"压缩包", 打的更为精致优良, 以保证再进行解压(解码)操作的时候, 能够最大限度地恢复原本面貌。

  1. 核心思路:如何集成现代CNN架构

换下编码器听着像是挺繁杂费事儿一项工作, 不过实际上想法能够十分明晰, 我们勿要自开始去规划一个全新的神经网络, 而是借助前人成果, 针对现有的已然成熟的既定框架做适应情况的调整改变。

2.1 架构选型:与的特点

我主要尝试了两种风格的网络:和。

其核心为残差块, 此残差块借助一条"快捷通道", 以使输入信息能够径直绕至后续若干层, 如此这般有效缓和了深度网络里的梯度消失难题, 进而致使网络能够构建得极为深邃, 深邃网络意含更为强大的特征表示本领, 就编码器而言, 更深层次的网络能够按层次地提取从边缘、纹理直至物体部件的多尺度特征情况, 这般情况对于精确重建复杂图像颇具助益。

具有亮点之处在于其复合缩放法子, 它并非如传统做法那般单独去增加深度, 并非单独去增加宽度, 也并非单独去增加分辨率, 而是运用一个固定的比例系数来均衡地对这三个维度予以缩放, 如此这般所得到的模型, 在等同计算量的情形下往往就能获取更高的精度, 对于VAE这种需要将生成质量与计算效率进行平衡的模型而言, 是一个极具吸引力的选择, 它有可能让我们用更少的计算该项开销,从而获取更好的编码效果。

2.2 适配与改造:让CNN成为VAE编码器

不能用预先做好训练的分类网络直接当作编码器, 这是不行的。因为分类网络的最终目的是输出一个类别标签, 然而VAE编码器需要输出两样东西, 即均值(mu)和方差(), 来凭借它们确定潜在空间的分布。

所以,我们的改造通常包括这几步:

去除处在最上面位置的分类头, 也就是把原本网络最后的全连接层以及分类层给去掉。剖析特征图的维度, 就是去观测网络处于末端位置的卷积层输出的特征图大小以及通道数量。这对于我们潜在向量的维度基础起到了决定性作用。增添适配层, 即在处于特征图之后的位置, 添加一个或者多个全连接层或者卷积层, 把特征图进行"放平"处理并映射到我们期望达到的潜在向量维度(mu和)。对下采样予以考量, VAE编码器自身就是一个下采样的过程。我们得保证替换后的CNN, 它整体的下采样倍数, 一般是靠步幅为2的卷积或者池化层达成的, 要跟原版VAE设计相适配, 借此确保潜在空间大小具备合理性。

如此这般的过程, 略微近似于给一个具备强大能力的引擎, 也就是CNN骨干, 去定制一套适配的传动以及输出系统, 此即适配层, 进而使得它能够极为完美地适配我们所拥有的名为VAE的这辆车。

  1. 实验设置与效果对比

我设计了一个用以公平地比较不同编码器所带来效果的简单对比实验, 我固定了Wan2.1 VAE的解码器部分以及训练超参数,仅替换编码器模块, 随后在同一个数据集上展开训练与评估标点符号。

3.将实验配置的可视化呈现为, 对原始图像、基线模型的重建图像, 以及两个实验模型各自产生的重建图像,展开直接且全面同时多类别进行对照比较。另外就是对量化指标展开对比分析。

在测试集上跑完后,我们得到了下面这组平均数据:

编码器架构PSNR (dB)SSIM

原始编码器 (基线)

28.5

0.892

-34 编码器

29.8

0.912

-B3 编码器

30.1

0.918

从数字方面能够清晰明了地瞧见提升, 不管是PSNR, 还是SSIM, 集成了现代CNN的编码器都明显超越了基线模型, 特别是-B3, 在两个指标上都稍微胜出, 这表明更具强大力量的特征提取网络, 确实学到了更具成效的图像表示, 致使解码器能够依照这些更为丰富的"线索"开展更精确的重建。

3.3 视觉效果对比

冰冷的是数字, 最直观的是视觉对比。我挑选了一张测试图片, 这张图片细节比较丰富, 下面是四个版本的对比:

(此处为文字描述,实际文章中应放置对比图片网格)

一言以蔽之, 基线模型所展现出的重建成果, 仿佛是"晓得那里存在着一张脸庞", 然而运用了新型编码器的模型, 却好似是"明白那张脸庞的具体细节究竟是怎样的"。后者所重建生成的图像, 于细节的留存方面, 以及纹理的真实感觉上, 还有整体的生动活泼性层面, 均呈现出了质的跨越提升。

  1. 实现要点与代码示意

若看到效果有所提升, 或许你也会萌生动手尝试的想法。在此处, 我会分享一下把 -34集进到VAE编码器具里的关键代码小段, 期望能给你一份确切的参考。

首批起见, 我们所需构建的是, 一个以骨干为基础而架构起的全然最新式样的编码器, 于此情形之下, 运用框架拿其当作示例来予以呈现。

python 复制代码
import torch
import torch.nn as nn
import torchvision.models as models
class ResNetVAEEncoder(nn.Module):
    def __init__(self, latent_dim=512, pretrained=True):
        super(ResNetVAEEncoder, self).__init__()
        
        # 加载预训练的ResNet-34骨干,并移除最后的全连接层
        resnet = models.resnet34(pretrained=pretrained)
        # 丢弃原始ResNet的avgpool和fc层
        self.feature_extractor = nn.Sequential(*list(resnet.children())[:-2])
        
        # 获取ResNet最终特征图的通道数 (对于ResNet-34是512)
        self.feature_channels = 512
        # 假设经过ResNet和我们的提取后,特征图尺寸被下采样了32倍
        # 我们需要根据输入图像尺寸和实际下采样倍数来计算这里的flat_dim
        # 例如,输入256x256,下采样32倍后特征图为8x8
        self.flat_features_dim = self.feature_channels * 8 * 8
        
        # 将特征图展平并映射到潜在分布参数
        self.fc_mu = nn.Linear(self.flat_features_dim, latent_dim)
        self.fc_logvar = nn.Linear(self.flat_features_dim, latent_dim)
        
    def forward(self, x):
        # 提取特征
        features = self.feature_extractor(x)
        # 展平
        batch_size = features.size(0)
        flat = features.view(batch_size, -1)
        
        # 计算均值和对数方差
        mu = self.fc_mu(flat)
        logvar = self.fc_logvar(flat)
        
        return mu, logvar

接下来, 你要把这个新的编码器, 跟原有的Wan2.1 VAE解码器组合到一块儿。在此假设, 你有一个现成的类。

python 复制代码
class ImprovedVAE(nn.Module):
    def __init__(self, latent_dim=512):
        super(ImprovedVAE, self).__init__()
        self.encoder = ResNetVAEEncoder(latent_dim=latent_dim)
        self.decoder = VAEDecoder(latent_dim=latent_dim) # 你的原始解码器
        
    def reparameterize(self, mu, logvar):
        # 标准重参数化技巧
        std = torch.exp(0.5 * logvar)
        eps = torch.randn_like(std)
        return mu + eps * std
        
    def forward(self, x):
        mu, logvar = self.encoder(x)
        z = self.reparameterize(mu, logvar)
        recon_x = self.decoder(z)
        return recon_x, mu, logvar

训练之时, 损失函数一般涵盖两部分内容, 其一为重建损失, 像MSE或者L1损失这种, 其二是KL散度损失, 目的在于去规范潜在空间。

python 复制代码
def vae_loss(recon_x, x, mu, logvar):
    # 重建损失
    recon_loss = nn.functional.mse_loss(recon_x, x, reduction='sum')
    # KL散度损失
    kl_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
    return recon_loss + kl_loss

几点实操建议:

确保你输入图片的尺寸, 要与编码器期望的尺寸相互匹配, 通常所接收的输入, 你或许需要去调整调整或者适配适配。self.需要依据你实际的下采样倍数, 精准精确地计算特征图计算, 不然全连接层就会报错显示维度错误。一开始的时候, 可以冻结骨干的前几层, 仅仅只训练后面的一层适配层以及解码器, 等稳定维持稳定之后再解冻进而全部全部进行微调, 这样这般训练会更加高效有效。潜在维度的大小, 得要根据你的所求所进行具体调整, 太大的话会致使导致训练困难麻烦, 太小的话又会限制表达能力本领。5. 总结与展望。

将这一整圈折腾完毕之后, 我的体会是, 针对于诸如Wan2.1 VAE这般的生成模型来讲, 编码器实现升级的的确确是一个有投入价值的优化要点, 就如同给相机配备一个更为高级的镜头一样, 尽管主体没有发生改变, 不过捕捉画面的能力瞬间提升到了一个新的层次。从相应的实验来看, 这些为识别任务所设计的现代CNN架构,它那强大的特征提取能力同样能够给生成任务带来益处, 使得重建的图像在细节方面更加扎实, 在质感方面更加真实。

诚然, 这并非表明盲目替换便毫无问题。更大的模型往往意味着更多的参数以及计算量, 你得权衡效果的提升与推理速度、显存占用之间的关联。此外, 怎样把不同架构的CNN更契合、更有效地融入到VAE的框架里, 像是处理多尺度特征、设计更合理的适配层, 这些均存在探索的余地。

在我自身而言, 接下来或许会去尝试某些更为轻量然而性能并不逊色的架构, 亦或是一些最新的视觉方面的变体式样, 瞧瞧在移动端或者资源受到限制的场景之中, 能不能寻觅到一个更为优良的平衡点。生成式AI的这个世界变化速率相当迅疾, 不过其核心思维常常是彼此贯通相似的: 运用更优型的工具以实现对数据进行理解以及表达。要是你也正在从事VAE或者与之相关的生成类模型加以研究探索, 不妨也着手动手试验一下去让编码器得到优化改进, 说不定会出现令人始料未及惊喜收获。

相关推荐
小白说大模型1 天前
人工智能:深度学习中的卷积神经网络(CNN)实战应用
人工智能·深度学习·cnn
小保CPP1 天前
OpenCV C++基于CNN模型的场景文本检测(OCR)
c++·人工智能·opencv·计算机视觉·cnn·ocr·光学字符识别
HyperAI超神经3 天前
15亿参数挑战机器人控制,MiniCPM-RobotManip正式开源;覆盖文本/图/视频/动作序列,英伟达发布全模态模型Cosmos3-Edge
人工智能·深度学习·机器人·多模态·图像生成·具身智能·智能体
西柚研究生1234565 天前
创建自己的数据集(GoogLeNet)
深度学习·神经网络·cnn
不懒不懒7 天前
路面类型识别 — CNN-LSTM 完整流程:基于车辆振动数据的端到端深度学习
深度学习·cnn·lstm
没有梦想的咸鱼185-1037-166310 天前
AI-Python机器学习与深度学习技术:CNN/Transformer/扩散模型、SHAP可解释及Hermes智能体自动化
人工智能·python·深度学习·机器学习·chatgpt·cnn·transformer
matlab代码13 天前
基于CNN卷积神经网络交通标志识别系统 (GUI界面 数字图像处理)【源码48期】
人工智能·神经网络·cnn·交通标志识别
2zcode13 天前
项目文档:基于MATLAB深度卷积神经网络的肺癌CT影像智能检测系统设计与实现
深度学习·matlab·cnn