论文阅读 PromptIR: Prompting for All-in-One Blind Image Restoration

论文阅读 PromptIR: Prompting for All-in-One Blind Image Restoration

作者:Syed Waqas Zamir, Aditya Arora, Salman Khan, Munawar Hayat, Fahad Shahbaz Khan, Ming-Hsuan Yang

机构:Mohamed bin Zayed University of AI, Linköping University

来源期刊:NeurIPS

发表时间:2023年
 

一、研究动机

        1.研究目标


        构建一个“All-in-One”盲图像复原网络,用单一模型、单次训练、无需先验地处理多种退化(去噪、去雨、去雾),并在各任务上均达到 SOTA 性能。

        2.过去方法


        任务专用网络:DnCNN、MPRNet、Restormer 等,每类退化需独立模型,存储/部署成本高。
         早期 All-in-One:AirNet 用对比学习额外训练退化编码器,两阶段训练、参数量大,且对退化表征耦合严重。
        通用视觉 Transformer:SwinIR、Uformer 等需针对任务微调,没考虑过退化统一。

         3.本文方法      


        核心思想:把“退化类型”当作可学习的轻量提示(prompt),在解码阶段动态注入网络,引导特征自适应恢复。
关键模块:
        Prompt Generation Module (PGM):根据输入特征实时生成退化条件提示。
        Prompt Interaction Module (PIM):将提示与图像特征做通道级拼接 + Transformer 融合,实现退化感知恢复。
        整体为 4 级 U 型 Transformer,仅在解码器侧插入 3 个 Prompt Block,即插即用、端到端单阶段训练。

        4.优势以及创新点


        ① 首个把提示学习引入低层视觉,用 <0.5% 的额外参数实现多任务统一。
        ② 无需退化先验或对比学习,训练友好。
        ③ 在 denoising/deraining/dehazing 三大任务 6 个公开测试集上,平均 PSNR 比 AirNet 高 0.86 dB,最高领先 2.64 dB;参数量仅 26 M,推理速度提升 1.7×。
        ④ Prompt Block 架构无关,可一键嵌入任意现有复原网络。

二、算法主要思想与原理详解

PromptIR架构概述
  1. Prompt 架构整体就是在Restormer 的架构基础上在每层采样之间加上了一个Prompt Block模块。
  2. 整体流程
    输入退化图 I ∈ R^(H×W×3)
    → 卷积提取浅层特征 F0
    → 4 级编码器(Transformer Block 数=[4,6,6,8])下采样到 1/8 分辨率
    → 解码器逐级上采样,每两级间插入 1 个 Prompt Block(共 3 个)
    → 输出复原图 Î

        3.Prompt Block 内部机制
        (1) PGM:动态生成提示
        Fl ∈ R^(Hi×Wi×C)
        → GAP → 向量 v ∈ R^C
        → 1×1 Conv 降维 → Softmax 得权重 w ∈ R^N(N=5 个 prompt components)
        → w 对可学习组件 Pc ∈ R^(N×H×W×C) 加权求和 → 输入条件提示 P

        (2) PIM:提示-特征交互
           通道拼接 → 送入标准 Transformer Block:
        – MDTA(Multi-Dconv Head Transposed Attention)
          在通道维计算自注意力,复杂度 O(C^2) 而非 O(HW^2),适合高分辨率。
          输出 Y = Wp·V·Softmax(K·Q/α)+X
        – GDFN(Gated-Dconv Feed-Forward)
          两路 1×1+3×3 深度卷积,一路 GeLU 激活后逐元乘,增强非线性且抑制噪声。
        → 3×3 Conv 输出增强特征 F̂l

三、实验结果

  1. 数据集
  2. 训练:BSD400+WED(denoising)、Rain100L(deraining)、SOTS-indoor(dehazing)合并,共约 7.7 万张128×128块。
  3. 测试:
    – BSD68、Urban100(denoising σ=15,25,50)
    – Rain100L(deraining)
    – SOTS-indoor(dehazing)
  4. 评价指标
    PSNR (dB) 、SSIM 

四.定性试验​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

去雨场景下的性能对比

单任务专用模型再对比:
 去雾:PromptIR 31.31 dB,比 AirNet 高 8.13 dB,比 Restormer 高 0.44 dB。
 去雨:37.04 dB,比 AirNet 高 2.13 dB。
 去噪 σ=50:29.39 dB(Urban100),比 AirNet 高 0.51 dB。 

去噪场景下的性能对比

定量结果(All-in-One 单模型)

全集成修复场景下的性能对比分析
去雾场景下的性能对比
图片去雨比较
图片去噪比较
  1.  去雾场景,PromptIR 彻底去除远处雾幕,建筑边缘无伪影;AirNet 有残留灰色雾墙。
     去雨场景,雨丝密度高时,PromptIR 无条纹残留,车牌文字清晰;AirNet 可见轻微雨痕。
     去噪 σ=50,纹理细节(砖缝、窗户)保持完整,无过度平滑。
  2. 消融实验
图片去雾比较
消融实验

        无 Prompt Block:平均 PSNR 降 0.38 dB。  固定 Prompt:再降 0.19 dB。 Prompt 放在编码器+解码器:性能反而下降 0.92 dB,说明“解码器单侧注入”最佳。  未见噪声水平 σ=35:AirNet 仅 13.64 dB,PromptIR 21.03 dB,差距 7.4 dB,验证泛化能力。

五、结论

PromptIR 首次把提示学习引入图像复原,用极轻量插件实现“一个模型、三种退化、盲设置”下的新 SOTA。未来工作将:

  1. 把 Prompt Block 拓展到更多退化(模糊、低分辨率、混合失真)以逼近“通用复原大模型”
  2. 结合物理退化模型与对抗训练,进一步提升极端场景鲁棒性

Read more

前端文件上传处理:别再让用户等待了!

前端文件上传处理:别再让用户等待了! 毒舌时刻 文件上传?听起来就像是前端工程师为了显得自己很专业而特意搞的一套复杂流程。你以为随便加个input[type=file]就能实现文件上传?别做梦了!到时候你会发现,大文件上传会导致页面崩溃,用户体验极差。 你以为FormData就能解决所有问题?别天真了!FormData在处理大文件时会导致内存溢出,而且无法显示上传进度。还有那些所谓的文件上传库,看起来高大上,用起来却各种问题。 为什么你需要这个 1. 用户体验:良好的文件上传处理可以提高用户体验,减少用户等待时间。 2. 性能优化:合理的文件上传策略可以减少服务器负担,提高上传速度。 3. 错误处理:完善的错误处理可以避免上传失败时的用户困惑。 4. 安全保障:安全的文件上传处理可以防止恶意文件上传,保障系统安全。 5. 功能丰富:支持多文件上传、拖拽上传、进度显示等功能,满足不同场景的需求。 反面教材 // 1. 简单文件上传 <input type="file&

Spring MVC 全面详解(Java 主流 Web 开发框架)

Spring MVC 全面详解(Java 主流 Web 开发框架) 一、Spring MVC 是什么 & 定位 Spring MVC 是 Spring Framework 框架的核心模块之一,是一款基于MVC 设计模式的轻量级 Java Web 开发框架,也是目前 Java 后端主流的 Web 开发技术(没有之一)。 价值:简化 Java Web 开发,将 Web 开发中的「请求接收、参数封装、业务处理、响应返回」等流程标准化、解耦化; 理念:遵循 约定优于配置 + 面向接口编程,兼顾灵活性和开发效率; 特性:

前端错误处理最佳实践:别让你的应用崩溃了!

前端错误处理最佳实践:别让你的应用崩溃了! 毒舌时刻 错误处理?听起来就像是前端工程师为了显得自己很专业而特意搞的一套复杂流程。你以为随便加个try-catch就能解决所有错误?别做梦了!到时候你会发现,错误处理的代码比业务代码还多,维护起来比业务代码还麻烦。 你以为console.error就能记录所有错误?别天真了!console.error只会在控制台打印错误,用户根本看不到,也无法帮助你分析错误原因。还有那些所谓的错误监控工具,看起来高大上,用起来却各种问题。 为什么你需要这个 1. 提高用户体验:良好的错误处理可以避免应用崩溃,提高用户体验。 2. 减少生产环境问题:及时捕获和处理错误可以减少生产环境中的问题。 3. 便于调试:良好的错误处理可以帮助你更快地定位和解决问题。 4. 提高代码可靠性:错误处理可以提高代码的可靠性,减少意外情况的发生。 5. 监控和分析:错误处理可以帮助你监控和分析应用的运行状态,发现潜在问题。 反面教材 // 1. 忽略错误 function fetchData() { fetch('/api/data') .the

Rust WebAssembly与Three.js结合的3D数据可视化实战:高性能粒子系统

Rust WebAssembly与Three.js结合的3D数据可视化实战:高性能粒子系统

Rust WebAssembly与Three.js结合的3D数据可视化实战:高性能粒子系统 一、引言 💡3D数据可视化是现代Web应用的高级场景之一,广泛应用于数据分析、科学计算、游戏开发、虚拟仿真等领域。传统的JavaScript+WebGL/Three.js方案在处理大量数据(如百万级粒子)时,性能往往难以满足要求。Rust WebAssembly的高性能和内存安全特性,使得它非常适合优化3D数据可视化的核心算法,提高应用的响应速度和渲染帧率。 本章将深入探讨Rust WebAssembly与Three.js结合的3D数据可视化开发,介绍WebGL/Three.js的基本概念,讲解Rust Wasm与WebGL的交互方式,重点实现一个高性能粒子系统,支持粒子的创建、更新、删除,以及各种动画效果。最后,本章还将介绍如何优化粒子系统的性能,如何打包和部署项目。 二、WebGL与Three.js基础 2.1 WebGL概述 WebGL是一种基于OpenGL ES的Web图形库,允许开发者在Web浏览器中使用GPU加速渲染3D图形。WebGL的核心是着色器语言(GLSL)