CVPR 2024 | FreeU:扩散U-Net的“免费午餐“,无需训练即可提升生成质量!

发布时间:2026/9/14 23:31:05

CVPR 2024 | FreeU:扩散U-Net的“免费午餐“,无需训练即可提升生成质量! 这篇论文最有趣的地方不是又加了一个模块而是它直接告诉你你已经在用的U-Net结构里就藏着一个可以即插即用、零成本、零参数提升效果的秘密武器——只需要两行代码。论文: FreeU: Free Lunch in Diffusion U-Net作者: Chenyang Si, Ziqi Huang, Yuming Jiang, Ziwei Liu发表单位: S-Lab, Nanyang Technological University发表: CVPR 2024论文链接: CVPR 2024 PDF | arXiv:2309.11497代码链接: GitHub - ChenyangSi/FreeU一、引言扩散模型Diffusion Model在过去几年彻底改变了图像生成领域Stable Diffusion、DALL·E 等产品已经走向大众。然而如何在推理阶段进一步提升生成质量而不需要重新训练、不需要增加参数、不需要额外的计算开销始终是一个极具吸引力的研究方向。FreeUFree Lunch in Diffusion U-Net正是在这个背景下提出的。它发现扩散U-Net架构中存在一个被忽视的潜力点——通过对主干特征和跳跃连接特征进行巧妙的重加权可以在零成本下显著提升生成质量。核心贡献揭示U-Net内部工作机制发现主干网络主要负责去噪而跳跃连接主要引入高频特征导致网络忽视主干语义提出FreeU方法通过两个简单的缩放因子在推理阶段即可提升生成质量广泛的适用性可与Stable Diffusion、DreamBooth、ModelScope、Rerender、ReVersion等多种扩散模型即插即用二、核心动机扩散U-Net的核心设计是编码器-解码器结构 跳跃连接skip connection。编码器负责提取特征解码器负责去噪重建跳跃连接则将编码器的特征直接传递给解码器的对应层级。然而作者通过深入的实验分析发现了一个关键问题跳跃连接引入的高频特征淹没了主干网络的语义信息。解码器在拼接跳跃特征后更多地依赖这些细节信息而忽略了主干网络中更重要的去噪语义。这是一个非常反直觉的发现——在CV领域跳跃连接通常被视为一种好东西如ResNet但在这个特定的扩散去噪场景中跳跃连接带来的高频细节反而干扰了去噪过程。基于这一发现FreeU的解决思路非常直接放大主干特征的权重同时衰减跳跃连接中的高频噪声。三、方法3.1 模块整体设计图1FreeU整体框架FreeU的核心思想可以概括为两个操作均在扩散U-Net的解码器decoder阶段执行Backbone Rescale主干重缩放对解码器主干特征的前半部分通道进行放大Skip Fourier Filter跳跃傅里叶滤波对跳跃连接传入的特征进行频域低通滤波这两个操作分别在解码器的前两个阶段即通道数为1280和640的层级执行。前向过程简述解码器每层先弹出一个跳跃连接特征res_hidden_states根据当前层级通道数对主干特征hidden_states的前一半通道乘以缩放因子b1或b2对跳跃特征res_hidden_states做傅里叶低通滤波scale参数为s1或s2拼接后进入ResNet处理3.2 核心操作Fourier Filter傅里叶滤波傅里叶滤波是FreeU中处理跳跃连接高频特征的核心操作。其数学原理如下x filtered F − 1 ( F ( x ) ⊙ M ) x_{\text{filtered}} \mathcal{F}^{-1}(\mathcal{F}(x) \odot M)xfiltered​F−1(F(x)⊙M)其中F \mathcal{F}F为二维FFTF − 1 \mathcal{F}^{-1}F−1为逆FFTM MM为频域掩码。掩码的构建方式为在频谱中心区域低频设置缩放系数s ss其余区域保持为1。M c , j { s , ∣ j − H / 2 ∣ ≤ τ ∧ ∣ c − W / 2 ∣ ≤ τ 1 , otherwise M_{c,j} \begin{cases} s, |j - H/2| \leq \tau \land |c - W/2| \leq \tau \\ 1, \text{otherwise} \end{cases}Mc,j​{s,1,​∣j−H/2∣≤τ∧∣c−W/2∣≤τotherwise​其中τ \tauτ为频率阈值论文中取1s ss为衰减系数1。importtorchimporttorch.fftasfftdefFourier_filter(x,threshold,scale): 对特征图进行频域低通滤波 :param x: 输入特征图 [B, C, H, W] :param threshold: 频域滤波阈值保留中心的频率范围 :param scale: 低频区域缩放系数1 表示衰减 :return: 滤波后的特征图 dtypex.dtype xx.type(torch.float32)# 正向FFT将空间域转换到频域x_freqfft.fftn(x,dim(-2,-1))x_freqfft.fftshift(x_freq,dim(-2,-1))# 将零频率移到中心B,C,H,Wx_freq.shape masktorch.ones((B,C,H,W)).to(x.device)# 构建频域掩码中心区域设置为scale其余保持为1crow,ccolH//2,W//2mask[...,crow-threshold:crowthreshold,ccol-threshold:ccolthreshold]scale x_freqx_freq*mask# 逆FFT从频域回到空间域x_freqfft.ifftshift(x_freq,dim(-2,-1))x_filteredfft.ifftn(x_freq,dim(-2,-1)).real x_filteredx_filtered.type(dtype)returnx_filtered关键理解当scale 1时中心低频区域被衰减这意味着保留更多高频细节的同时整体降低了跳跃连接特征的幅度从而让主干语义更有话语权。3.3 核心操作Backbone Rescale主干重缩放主干重缩放的操作更为简单直接对解码器特征的前一半通道即来自主干网络的特征乘以缩放因子。以通道数为1280的第一阶段为例# 对前640个通道主干特征进行缩放hidden_states[:,:640]hidden_states[:,:640]*b1其中b1 1论文推荐值为1.2-1.6用于增强主干特征的贡献。3.4 完整FreeU解码器前向过程FreeU通过monkey-patch的方式注入到解码器的UpBlock中在跳跃连接拼接前执行两个操作defregister_free_upblock2d(model,b11.2,b21.4,s10.9,s20.2): 将FreeU注入到Unet的UpBlock2D中 :param model: diffusers模型 :param b1: 第一阶段主干缩放因子通道数1280 :param b2: 第二阶段主干缩放因子通道数640 :param s1: 第一阶段跳跃连接滤波系数 :param s2: 第二阶段跳跃连接滤波系数 defup_forward(self):defforward(hidden_states,res_hidden_states_tuple,tembNone,upsample_sizeNone):forresnetinself.resnets:# 弹出跳跃连接特征res_hidden_statesres_hidden_states_tuple[-1]res_hidden_states_tupleres_hidden_states_tuple[:-1]# ---------- FreeU核心操作 ----------# 仅在前两个解码器阶段执行ifhidden_states.shape[1]1280:# 放大主干特征前640通道hidden_states[:,:640]hidden_states[:,:640]*self.b1# 对跳跃特征做傅里叶滤波res_hidden_statesFourier_filter(res_hidden_states,threshold1,scaleself.s1)ifhidden_states.shape[1]640:# 放大主干特征前320通道hidden_states[:,:320]hidden_states[:,:320]*self.b2# 对跳跃特征做傅里叶滤波res_hidden_statesFourier_filter(res_hidden_states,threshold1,scaleself.s2)# ------------------------------------# 拼接并送入ResNethidden_statestorch.cat([hidden_states,res_hidden_states],dim1)hidden_statesresnet(hidden_states,temb)ifself.upsamplersisnotNone:forupsamplerinself.upsamplers:hidden_statesupsampler(hidden_states,upsample_size)returnhidden_statesreturnforward# 遍历所有up_blocks替换forward函数fori,upsample_blockinenumerate(model.unet.up_blocks):ifisinstance_str(upsample_block,UpBlock2D):upsample_block.forwardup_forward(upsample_block)setattr(upsample_block,b1,b1)setattr(upsample_block,b2,b2)setattr(upsample_block,s1,s1)setattr(upsample_block,s2,s2)3.5 即插即用模块说明属性说明模块名称FreeUFree Lunch in Diffusion U-Net核心创新通过Backbone Rescale和Skip Fourier Filter两个操作在零成本下重加权U-Net的主干与跳跃连接特征提出动机U-Net的跳跃连接引入高频特征导致网络忽视主干语义影响去噪质量适用任务文本到图像生成、文本到视频生成、个性化生成DreamBooth、图像修复、视频重渲染等所有基于扩散U-Net的生成任务缝合位置扩散模型U-Net解码器的UpBlockUpBlock2D和CrossAttnUpBlock2D前向过程中跳跃连接拼接之前参数量0额外参数——仅通过运行时缩放因子调整不引入任何可学习参数内存开销0额外内存——不增加显存占用推理时间几乎无增加——仅增加少量FFT计算3.6 推荐参数作者为不同的Stable Diffusion版本提供了推荐参数模型版本b1b2s1s2SD 1.41.31.40.90.2SD 1.51.51.60.90.2SD 2.11.41.60.90.2SDXL1.31.40.90.2参数调节范围建议b1: 1 ≤ b1 ≤ 1.2或更高视效果调整b2: 1.2 ≤ b2 ≤ 1.6s1: s1 ≤ 1s2: s2 ≤ 1四、实验结果4.1 图像生成质量对比FreeU在多种扩散模型上均取得了显著的生成质量提升。以下是Stable Diffusion 2.1的对比图2SD-XL 生成结果对比无FreeU vs 有FreeU图3ModelScope 生成结果对比无FreeU vs 有FreeU从对比图中可以明显看出使用FreeU后的生成结果在以下方面得到了改善细节丰富度纹理和边缘细节更加清晰色彩饱和度颜色更加鲜艳自然构图合理性减少了解码器因忽略主干语义而产生的结构性错误4.2 多模型泛化性FreeU的优势不仅限于Stable Diffusion还在以下模型中得到了验证模型任务类型效果Stable Diffusion文本到图像显著提升SD-XL高分辨率文本到图像4096×4096显著提升DreamBooth个性化文本到图像显著提升ModelScope文本到视频显著提升Rerender视频到视频显著提升ReVersion关系反转生成显著提升ControlNet条件控制生成显著提升LCMLatent Consistency Model快速采样显著提升4.3 消融实验FreeU的两项操作各自独立有效且联合使用时效果最佳配置效果描述仅Backbone Rescale改善生成质量增强主干语义贡献仅Skip Fourier Filter改善生成质量减少跳跃连接噪声干扰FreeU两者结合效果最佳两项操作协同增强五、总结与思考FreeU的核心价值在于它揭示了一个简单但深刻的事实扩散U-Net的设计并非完美其内部特征流动存在可优化的空间。核心贡献总结揭示了U-Net内部机制的盲区跳跃连接的高频特征可能淹没主干语义零成本即插即用无需训练、无需参数、无需额外显存仅靠两个缩放因子广泛的模型兼容性可无缝集成到几乎所有基于U-Net的扩散模型中个人评价FreeU的设计哲学值得每个扩散模型从业者学习——在做加法之前先看看已有的结构里有没有被浪费的潜力。它用最简单的操作乘法 FFT解决了生成质量提升这一难题体现了大道至简的工程美学。适用任务所有基于扩散U-Net的生成任务文本到图像、图像到图像、文本到视频、个性化生成等在解码器的跳跃连接拼接前插入Backbone Rescale和Skip Fourier Filter操作即可零成本提升生成质量。六、快速上手6.1 基础依赖层Fourier Filterimporttorchimporttorch.fftasfftdefFourier_filter(x,threshold,scale):频域低通滤波——衰减跳跃连接中的高频特征dtypex.dtype xx.type(torch.float32)# 正向FFT 移位x_freqfft.fftn(x,dim(-2,-1))x_freqfft.fftshift(x_freq,dim(-2,-1))B,C,H,Wx_freq.shape masktorch.ones((B,C,H,W)).to(x.device)# 中心低频区域设为scalecrow,ccolH//2,W//2mask[...,crow-threshold:crowthreshold,ccol-threshold:ccolthreshold]scale x_freqx_freq*mask# 逆移位 逆FFTx_freqfft.ifftshift(x_freq,dim(-2,-1))x_filteredfft.ifftn(x_freq,dim(-2,-1)).realreturnx_filtered.type(dtype)6.2 工具函数类型检查defisinstance_str(x:object,cls_name:str): 检查对象x的继承链中是否有类名为cls_name的类 用于monkey-patch时不依赖具体的类实现 for_clsinx.__class__.__mro__:if_cls.__name__cls_name:returnTruereturnFalse6.3 核心模块注入FreeU到UpBlock2Ddefregister_free_upblock2d(model,b11.2,b21.4,s10.9,s20.2): 将FreeU注入到扩散模型U-Net的UpBlock2D中 参数: model: diffusers的StableDiffusionPipeline对象 b1: 第一阶段1280通道主干缩放因子 b2: 第二阶段640通道主干缩放因子 s1: 第一阶段跳跃连接滤波系数 s2: 第二阶段跳跃连接滤波系数 defup_forward(self):defforward(hidden_states,res_hidden_states_tuple,tembNone,upsample_sizeNone):forresnetinself.resnets:# 弹出跳跃连接特征res_hidden_statesres_hidden_states_tuple[-1]res_hidden_states_tupleres_hidden_states_tuple[:-1]# ---- FreeU核心操作仅前两个解码器阶段----ifhidden_states.shape[1]1280:hidden_states[:,:640]hidden_states[:,:640]*self.b1 res_hidden_statesFourier_filter(res_hidden_states,threshold1,scaleself.s1)ifhidden_states.shape[1]640:hidden_states[:,:320]hidden_states[:,:320]*self.b2 res_hidden_statesFourier_filter(res_hidden_states,threshold1,scaleself.s2)# --------------------------------------------hidden_statestorch.cat([hidden_states,res_hidden_states],dim1)hidden_statesresnet(hidden_states,temb)ifself.upsamplersisnotNone:forupsamplerinself.upsamplers:hidden_statesupsampler(hidden_states,upsample_size)returnhidden_statesreturnforwardfori,upsample_blockinenumerate(model.unet.up_blocks):ifisinstance_str(upsample_block,UpBlock2D):upsample_block.forwardup_forward(upsample_block)setattr(upsample_block,b1,b1)setattr(upsample_block,b2,b2)setattr(upsample_block,s1,s1)setattr(upsample_block,s2,s2)6.4 核心模块注入FreeU到CrossAttnUpBlock2Ddefregister_free_crossattn_upblock2d(model,b11.2,b21.4,s10.9,s20.2): 将FreeU注入到扩散模型U-Net的CrossAttnUpBlock2D中 适用于带有交叉注意力的Upsampling块 defup_forward(self):defforward(hidden_states,res_hidden_states_tuple,tembNone,encoder_hidden_statesNone,cross_attention_kwargsNone,upsample_sizeNone,attention_maskNone,encoder_attention_maskNone,):forresnet,attninzip(self.resnets,self.attentions):res_hidden_statesres_hidden_states_tuple[-1]res_hidden_states_tupleres_hidden_states_tuple[:-1]# ---- FreeU核心操作 ----ifhidden_states.shape[1]1280:hidden_states[:,:640]hidden_states[:,:640]*self.b1 res_hidden_statesFourier_filter(res_hidden_states,threshold1,scaleself.s1)ifhidden_states.shape[1]640:hidden_states[:,:320]hidden_states[:,:320]*self.b2 res_hidden_statesFourier_filter(res_hidden_states,threshold1,scaleself.s2)# -----------------------hidden_statestorch.cat([hidden_states,res_hidden_states],dim1)hidden_statesresnet(hidden_states,temb)hidden_statesattn(hidden_states,encoder_hidden_statesencoder_hidden_states,cross_attention_kwargscross_attention_kwargs,)[0]ifself.upsamplersisnotNone:forupsamplerinself.upsamplers:hidden_statesupsampler(hidden_states,upsample_size)returnhidden_statesreturnforwardfori,upsample_blockinenumerate(model.unet.up_blocks):ifisinstance_str(upsample_block,CrossAttnUpBlock2D):upsample_block.forwardup_forward(upsample_block)setattr(upsample_block,b1,b1)setattr(upsample_block,b2,b2)setattr(upsample_block,s1,s1)setattr(upsample_block,s2,s2)6.5 完整使用示例importtorchfromdiffusersimportStableDiffusionPipeline# 1. 加载模型model_idstabilityai/stable-diffusion-2-1pipelineStableDiffusionPipeline.from_pretrained(model_id,torch_dtypetorch.float16).to(cuda)# 2. 注册FreeUSD 2.1推荐参数register_free_upblock2d(pipeline,b11.4,b21.6,s10.9,s20.2)register_free_crossattn_upblock2d(pipeline,b11.4,b21.6,s10.9,s20.2)# 3. 生成图像promptA fantasy landscape, trending on artstationtorch.manual_seed(42)imagepipeline(prompt,num_inference_steps25).images[0]image.save(freeu_result.png)注FreeU通过monkey-patch方式注入不影响原始模型权重随时可通过重新加载模型恢复基线行为。如需对比效果先用b11.0, b21.0, s11.0, s21.0生成基线再用推荐参数生成FreeU版本。
延伸阅读

更多相关文章

2026/9/4 12:25:28

C语言指针进阶 学习笔记

职坐标学习C语言指针进阶 学习笔记一、字符指针1. 核心概念定义:char *ptr;,指向字符类型数据的指针。基本用法:可以指向单个字符,也可以指向字符数组(字符串)。2. 字符串常量与字符数组 这是字符指针中最容…

2026/9/12 14:37:47

国产桌面Agent横评:LobsterAI在4个工程师敏感指标上的突围表现

深度解析:桌面AI助理技术选型的四大核心指标与工程实践 当桌面级AI助理从概念走向落地,技术选型的核心矛盾已从「能否实现」转向「如何控风险」。本文基于数十个企业级部署案例,拆解国内主流产品的技术方案,为工程师提供深度选型…

2026/9/11 8:20:36

无线动能开关|商业商超灵活氛围控灯方案

一.系统概述大型商超、购物中心、连锁商铺专柜迭代更新频繁,商品陈列、专柜布局、橱窗场景经常调整,对灯光控制的灵活性要求极高。传统固定布线开关点位死板,专柜移位、业态更新时需要重新布线改开关,施工周期长、影响门店营业&am…

2026/9/14 23:26:14

全栈创新提升AI硬件竞争力

一句话刚说完, 紧接着立刻有话音响起并表示, “小维小维, 我有点热”, 随后一台风扇就开始自动调整挡位, 然后伴随作出调整, 送出的风也跟着加大了。这是深圳集贤科技有限公司展厅内的日常演示场景 , 存在这样的一种情况 , 看似仅仅只不过是一次并不怎么复杂的对话 , 然而实际上…

2026/9/14 23:26:14

配电网韧性提升:移动储能预布局与动态调度两阶段优化实战

台风还有48小时登陆,你手里有3台移动储能车,该把车提前停到哪几个节点?这道题看起来像"选个车位",实际上是把配电网韧性、随机优化、时序耦合全部串起来的硬骨头。我最近在IEEE33节点系统上完整复现了一套"移动储能…

2026/9/14 23:26:14

单调栈算法:最少操作次数转换数组问题解析

1. 题目背景与核心问题解析这道题目来自某编程竞赛的第174场双周赛第二题,编号3810。题目要求我们计算将一个初始数组通过特定操作转换成目标数组所需的最少操作次数。这类数组操作问题在实际编程面试和算法竞赛中非常常见,考察的是对数组特性的理解以及…

2026/9/14 23:26:14

AUTOSAR诊断功能全解析:从CanTp到Dem的集成与调试实战

干过几年AUTOSAR项目的人都会有同感:整个架构里最绕、最讲"配置功夫"的,往往不是OS,也不是RTE,而是诊断功能。刚接触AUTOSAR诊断栈时,我也天真地以为"无非是Dcm、Dem、CanTp三个模块连起来就完事"…

2026/9/14 23:21:14

Paimon数据湖删除操作问题解析与解决方案

1. 问题背景与现象定位最近在使用Paimon进行数据湖管理时,遇到了一个棘手问题:合并引擎(merge-engine)无法按分区或主键删除数据。具体表现为执行DELETE操作后,目标数据仍然存在于表中,或者出现部分数据残留…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码