【光照】Unity[光照贴图]在静态动态物体上的解决方案

谑拓旧剖分辨率是AIGC的阵痛

1.1 算力的三次方诅咒

分辨率对计算资源的吞噬是非线性的:

像素维度:分辨率×2 → 像素数×4

Attention维度:序列长度×4 → 计算量×16(O(N2))

内存维度:激活值×4 → 显存占用×4(中间状态爆炸)

综合效应:分辨率×2 → 总成本×64。

这意味着512×512到1024×1024不是"两倍工作量",而是64倍。

1.2 数据的沙漠

LAION-5B的统计真相:

短边<512像素的图像:87%

短边<1024像素的图像:98%

短边>2048像素的图像:0.3%

高分辨率图像不仅少,而且分布偏移。4K照片的拍摄设备、构图习惯、后期处理流程与手机快照完全不同。模型在512×512上学习到的"世界知识",在4K上可能完全失效。

1.3 频率的牢笼

奈奎斯特采样定理在深度学习中的残酷映射:

训练分辨率决定了模型能学习的最高频率。

512×512的模型,其latent空间通常是64×64。这意味着任何小于8像素的细节都无法被表达------不是模糊,是根本不存在。模型从未见过更细的纹理,它不知道"毛孔"应该长什么样。

1.4 第一个核心困局

训练分辨率是模型认知的"光速上限",推理分辨率是用户需求的"超光速幻想"。

所有架构演化,都是在这个物理限制下的工程妥协。

SD1.5:U-Net的困境,只能打补丁了。(2022)

"第一次把扩散模型带到可用的工业级质量"

2.1 架构的先天残疾

SD1.5的U-Net架构有三个致命设计:

Receptive Field的硬边界

U-Net的encoder-decoder结构,下采样到8×8时,每个特征点理论上能看到64×64的原始区域。但对于2048×2048的图像,64×64只是3%的画面。模型根本看不见全局,只能凭统计规律猜测。

Latent的密度陷阱

KL-VAE将512×512压缩到64×64×4,每个latent向量负责8×8像素的重建。这意味着:

纹理:可学习(重复模式)

结构:可学习(大尺度形状)

精确几何:不可学习(亚像素级定位)

Attention的局部性

U-Net的self-attention只在同分辨率特征图内进行,跨尺度的信息融合依赖skip connection的通道拼接。这种层次化而非全局化的设计,让SD1.5擅长"画得像",不擅长"画得对"。

2.2 推理端的绝望补救

面对用户的4K需求,SD1.5只能诉事后工程:

方案A:插值------数学的暴力

双三次插值将64×64 latent拉到256×256再解码。新像素完全由卷积核权重决定,零语义理解。

结果:建筑线条弯曲,文字无法辨认,人脸变成橡皮泥。

方案B:超分网络------幻觉的代价

ESRGAN作为后置处理器,用对抗学习"编造"高频细节。

结果:砖墙纹理逼真但重复,皮肤毛孔存在但位置错误,统计上合理,物理上荒谬。

方案C:Tiled生成------一致性的献祭

将4K画布切成16个512×512 tiles独立生成,切片堆叠。

结果:每个tile质量完美,拼接处光照突变,人物长出四个耳朵。

2.3 SD1.5的本质 verdict

SD1.5从未"理解"过高分辨率,它只是用低分辨率的认知,通过工程技巧伪装成高分辨率。

这种伪装在:

自然风景(低频主导):可接受

人脸特写(结构敏感):崩坏

文字排版(精确几何):灾难

新困局产生:U-Net的局部性无法突破,必须换架构。VAE的一致性也是崩坏的。

所以 SD1.5 的高分辨率不是"生成",而是"插值 + 幻觉"。

SDXL:分工的艺术(2023)

补上了 SD1.5 在"高频细节"和"结构一致性"上的缺口

3.1 架构层面的第一次革命

SDXL没有抛弃U-Net,但做了结构性分工:

更密的Latent空间

从64×64提升到更精细的表征(实际实现为更高效的VAE压缩),每个latent向量负责的像素区域减小,频率上限提升约40%。

这不是简单的"放大latent",而是重新训练VAE,让编码器学习更高效的语义压缩------用同样的比特数表达更多信息。

Base + Refiner的双阶段流水线

核心洞察:结构和纹理是不同频率的现象,应该用不同模型处理。

Base模型(U-Net):在相对低分辨率下运行,负责构图、语义、大尺度结构

Refiner模型(另一个U-Net):接收Base的输出作为条件,负责高频细节、纹理、局部对比度

这类似于传统图像处理中的拉普拉斯金字塔:Base处理低频,Refiner处理高频残差。

原生1024与可外推性

SDXL的训练分辨率达到1024×1024,且通过改进的位置编码(插值型),可以外推到2048×2048仍保持可用质量。

3.2 为什么分工有效?

从信号处理视角,SDXL的分解是频率解耦:

图像 = 低频结构(可压缩)+ 高频细节(可预测)

↓ ↓

Base模型 Refiner模型

(全局理解) (局部生成)

Base只需要"知道"画面有张脸,Refiner负责"画"出毛孔。这种解耦让:

Base的attention负担减轻(分辨率固定)

Refiner的生成空间受限(已有结构指导),幻觉减少

3.3 SDXL的新边界

仍然无法突破的墙:

U-Net的receptive field问题依旧,只是被Refiner部分缓解

两阶段串行,推理时间×2

外推到4K时,Refiner的局部性导致细节与结构脱节(如头发丝漂浮在空中)

新困局产生:U-Net的局部性是天生的,必须彻底换架构。

FLUX:Transformer的全局视野(2024)

补上了 U-Net 架构无法突破的"全局视野"缺口

4.1 为什么必须是DiT?

FLUX的架构切换(U-Net → DiT)不是追热点,而是物理必然:

Attention的全局性

DiT的self-attention是全连接的:每个patch能看见所有其他patch。对于2048×2048的图像(256×256 patches),这意味着任意两点间的信息传递只需一层。

对比U-Net:信息从左上角传到右下角需要经过4次下采样-上采样循环,每次都有信息损失。

Scaling的友好性

Transformer的性能随计算量可预测提升(scaling law)。U-Net的卷积结构在达到一定深度后收益递减,而DiT可以通过增加层数、头数、维度持续改进。

位置编码的外推性

FLUX采用RoPE(旋转位置编码),其设计本质是相对位置编码。这使得:

训练时:模型学习的是"距离为k的 patches 如何交互"

推理时:任意距离的交互都遵循同一函数,自然外推

4.2 FLUX的三重突破

更密的Latent

相比SDXL,FLUX的latent空间进一步压缩效率提升,在同等计算预算下能表达更高频率。

单阶段端到端

不再需要SDXL的Base+Refiner分工,单个DiT同时处理结构和细节。这得益于attention的全局性------模型自己学会了在需要时关注全局,在需要时聚焦局部。

Tiled生成的质变

FLUX的tiled效果远超SDXL,因为:

边界patch的attention可以看到相邻tile的上下文(若实现为 overlapping attention)

光照、风格的统计特性由全局attention隐式约束,无需显式同步

4.3 FLUX的物理极限

Attention2的诅咒依旧

DiT解决了U-Net的局部性,但没有解决计算复杂度。2048×2048的图像在latent空间为256×256,attention矩阵大小为65536×65536,单精度存储需16GB,计算不可行。

单尺度的频率天花板

FLUX仍然是单尺度latent。虽然比SDXL更密,但固定的压缩比意味着频率上限固定。想要真正的4K细节,必须接受更大的latent,进而触发显存爆炸。

新困局产生:全局性有了,但算力不够;想要更密latent,但内存不够。需要更高效的注意力或多尺度架构。

Z-Image:轻量与多尺度的平衡(2024-2025)

"成本、速度、落地"

5.1 阿里的工程判断

Z-Image的设计哲学与FLUX不同:

不是"更大更强",而是"刚好够用,极致高效"。

这是基于阿里云的产品场景:

淘宝商品图:需要1024-2048,但要求结构稳定(不能变形)、推理快速(实时生成)

钉钉文档插图:需要轻量部署

通义APP:需要低功耗

5.2 架构层面的创新

轻量DiT

比FLUX更少的层数、更小的维度:

浅层:宽attention,捕获全局

深层:窄attention+MLP,细化局部

这种异构设计让同样计算量下,有效receptive field更大。

多尺度特征融合(核心创新)

Z-Image不依赖单尺度latent,而是在DiT内部显式维护多分辨率特征:

输入图像 → 多尺度编码(1×, 1/2×, 1/4×, 1/8×)

跨尺度attention(每个尺度能看到其他尺度)

渐进式上采样 + 特征融合

输出

这类似于传统计算机视觉中的图像金字塔,但完全可学习、端到端训练。

效果:

高频:从1×尺度获取

结构:从1/8×尺度获取

一致性:跨尺度attention保证

高效注意力变体

采用局部-全局混合attention:

局部窗口:计算密集型,但O(N)复杂度

全局token:可学习的"汇总"token,数量固定(如64个),与图像尺寸无关

这让Z-Image的显存占用与分辨率线性相关,而非平方相关。

5.3 Z-Image的定位

维度 Z-Image FLUX SDXL

设计目标 产品落地 质量极限 工业稳定

架构 轻量异构DiT 标准DiT U-Net分工

多尺度 显式融合 隐式单尺度 两阶段分工

Attention 局部-全局混合 标准全局 局部层次

外推能力 强(2K-4K) 很强(4K+) 弱(<2K)

推理速度 最快 中等 最慢(双阶段)

工程成本 最低 高 中

适用场景 实时生成 专业创作 传统工业

5.4 Z-Image的妥协

为了效率牺牲的质量:

极端复杂场景(如拥挤街道)的全局一致性弱于FLUX

最高频率细节(如毛发、织物纹理)不如FLUX真实

艺术性、创造力略逊于大规模DiT

但这是正确的工程选择:

对于90%的商业场景,"90分质量、100分速度"比"100分质量、50分速度"更有价值。

位置编码演化的总览

除了主要架构的变化之外,还有语义模块位置编码的演化。

因为

位置编码的演化,就是 AIGC 模型空间认知能力的演化。

SD1.5 靠卷积"猜位置",SDXL 开始显式编码位置,FLUX 建立了可外推的全局坐标系,而 Z-Image 则在工程成本下构建了多尺度的高效位置体系。

高分辨率生成的突破,不仅来自更大的模型或更强的 attention,更来自"模型终于知道自己在画布的哪里"。

代际 架构 空间位置编码 时间位置编码 文本位置编码 特点

SD1.5 U-Net 无显式 2D PE(卷积隐式) sin-cos CLIP 1D 局部性强,无法外推

SDXL U-Net++ 显式 2D sin-cos sin-cos++ 双编码器 1D 多尺度增强,但仍局部主导

FLUX DiT 2D RoPE(可外推) RoPE/sin-cos Transformer 1D 真正的全局坐标系

Z-Image 轻量 DiT 多尺度 + 局部相对 + 全局抽象 sin-cos Transformer 1D 工程最优,线性成本

回顾四代架构:

SD1.5(U-Net):证明了扩散模型可行,但暴露了局部性局限

SDXL(U-Net+分工):用工程分工绕过局限,但复杂度爆炸

FLUX(DiT):用Transformer解决局部性,但算力瓶颈显现

Z-Image(轻量DiT+多尺度):用效率优化平衡质量与成本

每一步都不是"更好"的简单替代,而是在约束条件下的当前最优。

SD1.5:低算力时代的最优

SDXL:高频细节的最优

FLUX:全局一致性的最优

Z-Image:成本与落地性的最优

这或许是AI工程化的终极真理:

没有最好的架构,只有最合适的架构。

把一些成熟的传统算法,适配到现有的模型架构里去,永远不会过时。

之所以说传统算法永不过时,并不是怀旧,而是工程现实。

无论模型架构如何迭代,分辨率、算力、频率上限这些物理约束始终横在那里------它们不会因为你换了 U?Net、换了 DiT、换了多尺度结构就自动消失。

而传统算法恰恰能在这些"结构性短板"上提供一种稳定、可控、可解释的补偿路径:

不依赖大规模数据,不受模型形态限制,却能在关键环节把模型无法表达的细节补回来。

基于这样的判断,博主开始尝试把传统图像处理重新嵌入到现代 AIGC 推理链路中,

探索一种不依赖重训、不依赖超分、却能真正吃下高分辨率的方案。

这条路并不轻松,但确实走通了。

为了让模型在高分辨率下保持结构稳定、细节可信,博主实现了一套纯传统算法的分辨率适配方案,

可以作为插件无缝接入各种开源模型架构。

虽然还不够完美,但已经证明这条路线是可行的,而且潜力巨大。

例如 GFPGAN 的原生分辨率只有 512×512,但通过这套方案,不需要超分、不需要重训,就能稳定支持 4K 人脸修复

,质量和成本都在可控范围内。

facefusion LivePortrait 等模型同样能直接受益。

在训练场景下,它可以作为结构先验;

在推理场景下,它可以作为轻量插件。

理论上再做一次二次微调,效果会更进一步。

这套方案也可以写成纯 C 的算法库部署到移动端,只是工作量巨大,目前精力有限,还没完全落地。

但方向是明确的:传统算法与现代模型的结合,仍然有很大的工程空间。

一起努力吧。

博主之前为了把推理性能压榨到极限,也做了不少"苦活".

特别是把移植到TF,然后用TF写个猥琐发育的Chunked Flash Attention in Keras,

那时Flash Attention 还没发布,

而TF这个版本也是后来整理开源了,

毕竟我已经抛弃TensorFlow/Keras转投PyTorch了。

SD1.5 时代,为了推理速度和显存压到极限,博主做了很多"优化"(苦活):

TO C 性价比为王:

权重预计算(减少重复计算)

Flash Attention(降低 attention 显存)

FP16/INT8 量化(端侧可运行)

跨框架迁移(TF ? Torch ? ONNX ? TFLite)

端侧蒸馏 Encoder,实现 1 秒级推理

多模型并行部署,显存复用

后来回到广东,给某游戏大厂做了大量游戏场景的定制化 LoRA,彻底拥抱 PyTorch。

TO B 质量为王

超高分辨率 显存要挤到极限

干净的脏 素材细节要求极高

高保真生成 设定一致性必须严格

语义可控 小数据训练,泛化性不能丢

但无论 TO C 还是 TO B,问题本质都一样:

算法研发,就是用小资源干大事。

在这之间有些算法做出来了,但没开源。

后来大厂开源了他们的版本,打法粗暴,一地鸡毛。

但无可厚非,毕竟这些年博主从开源项目中也学到了不少。

只是在那时就意识到:

不跟大厂硬钢 → 拿不到资源

跟在大厂后面 → 肉汤喝不到,锅还被砸

也是下了决心,选择了裸辞。

不再关注战场发生什么,只问自己:

我想做什么,想达成什么。

现在回头看,选择是对的,但路还很长,还得继续推进。