NTIRE2023-RTSR-Track2 冠军方案详解

news2025/1/12 9:46:15

编辑 | Happy
首发 | AIWalker
链接 | https://mp.weixin.qq.com/s/JQ5g9yn_OdjR8hi_tWc4jA

alt

arXiv:2305.02126 , cvpr2023 , code , video

本文了一个实时&轻量图像超分方案Bicubic++,它通过下采样模块降低图像分辨率以减少计算量,在网络尾部采用X6上采样进行图像重建,同时还构建了一个三阶段训练方案。在测试集上, 所提方案比Bicubic指标高~1dB,同时推理速度~1.17ms@RTX3090、2.9ms@RTX3070 (注:fp16精度,720p输入,4K输出)。此外,Bicubic++取得了NTRIE2023-RTSR-Track2 X3超分竞赛冠军,也是所有方案中最快的,所提方案与其他轻量化方案的性能对比可参考下图。值得称道的就是,Bicubic++具有与Bicubic相当快的处理速度,故很有机会成为新的工业标准。

alt

评价标准

由于Bicubic++是面向NTIRE2023-RTSR竞赛而设计,在正式介绍方案之前,我们先介绍了一下该竞赛的评价标准。

其中, 分别表示模型与Bicubic上采样的PSNR指标,t表示模型推理耗时(720p->4K)。此外,由于实时性要求,t必须小于30ms。计算公式就比较简单了,详细信息可参考calc_scoring.

def score(psnr, runtime, psnr_interp=31.697655):
    diff = max(psnr - psnr_interp)
    if diff == 0:
        return 0
    else:
        cte = 0.1
        return ((2 ** diff) * 2) / (cte * (runtime ** 0.5))

本文方案

alt

上图给出了本文方案整体架构示意图,基于此,作者进行参数微调并尝试了不同的训练策略对最大化上述指标。

架构设计

在架构设计过程中,我们发现: 网络的速度并不直接依赖于参数量,而是与Activation相关。因此,更低分辨率的特征可以极大的降低Activation。此外,已有研究表明: 当与上采样操作协同学习时,下采样操作具有正向影响。因此,作者选择先采用stride卷积下采样,然后采用X6上采样以加速网络推理。在某种意义上讲,更低分辨率的特征提取可以认为是一种在空间上数据压缩方式,由于它与上采样协同训练,故该压缩是可逆的。

alt

除了上面作者提到的stride卷积进行下采样外,作者还尝试了上图所提到的降采样方案,如Depth2Space、DWT。经综合考量后,最终选型stride卷积。

alt

在网络结构方面,我们期望采用了最优的通道数以最大化模型推理速度。我们观测到:通道数与推理延迟并非严格的线性关系,见上图。由于可变通道数导致的延迟提升超过了其性能提升,我们决定网络通道数设置为相同通道数。结合上图同时保持算法实时性,作者将模型通道数设置为32。需要注意的是:为了得到最终的模型,作者以非最优通道数(34)模型开始,然后采用全局剪枝得到通道数为32的模型。

除此之外,作者注意到:卷积的bias项被忽视了,它会占据一定比例的整体延迟。因移除bias而导致的延迟减少要超越其导致的PSNR微弱降低。因此,作者在最终的模型中移除了bias参数

上述发现可以概括为如下几点:

  • 处理的数据量与推理延迟强相关,而非参数量;
  • 模块间的通道数变动会降低延迟性能;
  • 对于硬件来说,通道数与延迟之间存在一些 sweet spots,合理的利用可以一定程度提升模型性能;
  • bias会占据一定比例的延迟耗时。

Three-stage Training Pipeline

作者构建了一个三阶段训练范式:

  • Stage1 Slim: 采用更大的通道数进行训练。此时,ch=34, m=2, R=1, DS表示stride卷积。此时所有卷积均带有bias参数。
alt
  • Stage2 Slimer: 全局结构化剪枝。基于上一步所得checkpoint参考上图执行全局结构化剪枝。需要注意的是: 此时剪枝准则并非参数大小或拟合程度,而是验证集上的PSNR指标
  • Stage3 Slimmest: 移除卷积的bias参数项。在经过步骤二后,模型通道数从34减少到了32,加载上一步的checkpoint同时移除bias参数后对整个网络进行再次微调。

训练加速技巧

为尽可能充分利用硬件性能训练如此小的模型,所有的训练流程都需要进行适当调整。这是因为:模型前向与反向过程几乎不怎么耗时,验证集的访存反而会成为实际瓶颈。为加速验证,作者采用48张图进行验证,设置bs为8。考虑到访存瓶颈,作者在训练阶段将训练数据与验证数据均加载到RAM中已减少数据IO。

通过上述调整,1000epoch训练仅需1小时(单个Tesla V100)。此外,由于模型比较小,选择相当小的训练数据(如DIV2K)是可行的,也不会影响验证精度。

本文实验

alt

上表从不同维度对所提方案进行了消融分析,简单汇总如下:

  • 对比Q-T,可以看到:stride卷积具有更优指标;
  • 对比T&A,可以看到:相比ReLU,LeakyReLU可以带来明显PSNR提升且耗时几乎不变;
  • 对比A&E,可以看到:移除bias可以取得更高得分;
  • 对比1-4&E,可以看到:m=2,R=1可以取得最佳得分;
  • 对比PRB,可以看到:基于ch=34进行剪枝可以取得最高得分.

此外,为验证所提训练方案的有效性,作者还对比了A->G, E->H, A->F->I, A->E->H->J等不同优化路线。

alt
alt

上表&图给出了所提方案同其他典型轻量化方案(如FSRCNN、ESPCN、ABPN、XLSR、SXCAT等)的客观与主观效果对比。

alt
alt

上表&图给出了所提方案在NTIRE2023-RTSR竞赛数据集上的客观指标与主观指标。很明显,Bicubic++以显著优势超过了第二名方案。

推荐阅读

  1. ChatGPT聊图像超分,总结确实挺到位,哈哈
  2. 大核分解与注意力机制的巧妙结合,图像超分多尺度注意网络MAN
  3. CVPR2023 | 非局部注意力、局部自注意力、样条注意力协同助力图像复原达成新 SOTA!
  4. NAFNet :无需非线性激活,真“反直觉”!但复原性能也是真强!
  5. CVPR 2022 Oral | MLP进军底层视觉!谷歌提出MAXIM模型刷榜多个图像处理任务
  6. ELAN | 比SwinIR快4倍,图像超分中更高效Transformer应用探索
  7. CNN与Transformer相互促进,助力ACT进一步提升超分性能
  8. CVPR2022 | Restormer: 刷新多个low-level任务指标
  9. Transformer在图像复原领域的降维打击!ETH提出SwinIR:各项任务全面领先

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言绘制染色体变异位置分布图,RIdeogram包

变异位点染色体分布图 今天分享的内容是通过RIdeogram包绘制染色体位点分布图,并介绍一种展示差异位点的方法。 在遗传学研究中,通过测序等方式获得了基因组上某些位置的基因型信息。 如下表,第一列是变异位点的ID,第二列是染色体…

Python 字典的定义

视频版教程 Python3零基础7天入门实战视频教程 字典dict 字典也是Python提供的一种常用的数据结构,它用于存放具有映射关系的数据。 字典的定义 比如有成绩表数据——语文:68,数学:98,英语: 76,这组数据看上去像两个列表&…

每天几道Java面试题:集合(第四天)

目录 第四幕 、第一场)大厦楼下门口第二场)大门口 友情提醒 背面试题很枯燥,加入一些戏剧场景故事人物来加深记忆。PS:点击文章目录可直接跳转到文章指定位置。 第四幕 、 第一场)大厦楼下门口 【面试者老王,门卫甲…

浅谈C++|STL之stack+queue+priority_queue篇

一.stack基本概念 栈(Stack)是一种常见的线性数据结构,遵循后进先出(Last-In-First-Out,LIFO)的原则。类似于我们在现实生活中堆叠书本或盘子的方式,最后放入的元素最先被取出。 在栈中&#…

【基于多输出方向的同步异步日志系统】

本项目涉及的到所有源码见以下链接: https://gitee.com/ace-zhe/wz_log 一、项目简介 1.日志的概念(白话版) 日志类似于日记,通常是指对完成某件事情的过程中状态等的记录,而计算机中的日志是指日志数据&#xff0c…

Python实现的mqtt客户端工具分享,小巧且超轻量级(python+tkinter+paho.mqtt)

mqtt协议调试时需要个客户端工具,但网上找的体积包都很大,都不够小巧和便携。于是趁周末时间用python搞出来了个客户端工具,使用pythontinkerpaho.mqtt实现。源码量很少但功能不弱,相当的轻量级。分享给有需要的小伙伴&#xff0c…

论文写作指导手册

TIPS:最近我们上线了“AI写作大师”,后续会继续围绕论文、文章、文案写相关的文章,来验证写作大师能力如何,敬请持续关注( openrabbit.net)~ 一、论文选题 选题是论文研究的第一步&a…

Prometheus+Grafana可视化监控【Nginx状态】

文章目录 一、安装Docker二、安装Nginx(Docker容器方式)三、安装Prometheus四、安装Grafana五、Pronetheus和Grafana相关联六、安装nginx_exporter七、Grafana添加Nginx监控模板 一、安装Docker 注意:我这里使用之前写好脚本进行安装Docker,如果已经有D…

软件测试中常见的难题

1、需求定义: 需求可能不完整或者不准确,这会导致测试人员无法测试应用程序的所有功能。 例如:在一个电子商务网站上,可能需要测试的某些操作并未在需求中列出,导致测试人员无法测试到这些操作。 对策:测…

MySQL实现单个字段根据特定字符拆分

1.字段内容 2.想得到的效果 步骤1中,每一条记录的FJ字段,根据分号,拆分成多条,如下图所示: 3.具体实现 说明: SELECT DISTINCTsubstring_index(substring_index(a.要拆分的字段, 分隔字符, b.help_top…

自动化项目实战:用requests库自动保存王者荣耀英雄皮肤到本地,文末附源码下载!

前言 王者荣耀是一款备受欢迎的手机游戏,拥有众多精美的英雄皮肤。如果你想获取这些皮肤的图片或者其他相关信息,可以利用Python编写一个简单的爬虫来实现。 安装第三方库 首先,我们需要安装Python的requests和BeautifulSoup库。可以使用…

系列六、Nginx配置实例之反向代理2

一、目标 浏览器网页中访问http://${Linux服务器的IP}:9001/basketball/index.html,浏览器中打印"篮球8080!!!"; 浏览器网页中访问http://${Linux服务器的IP}:9001/football/index.html,浏览器中打印"足球8081!!!"&#…

[NLP] LLM---<训练中文LLama2(五)>对SFT后的LLama2进行DPO训练

当前关于LLM的共识 大型语言模型(LLM)使 NLP 中微调模型的过程变得更加复杂。最初,当 ChatGPT 等模型首次出现时,最主要的方法是先训练奖励模型,然后优化 LLM 策略。从人类反馈中强化学习(RLHF&#xff09…

[字符串和内存函数]错误信息报告函数strerror详解

strerror介绍 strerror是一个C库函数,用于将错误代码转换为对的错误信息字符串。它接受一个整数参数errno,返回一个指向错误信息字符串的指针。 errno是一个全局变量,可以直接使用。它在C语言中用于表示发生错误时的错误码。它是一个整数&…

笔记1.4 计算机网络性能

1. 速率 速率即数据率(data rate)或称数据传输速率或比特率 单位时间(秒)传输信息(比特)量 计算机网络中最重要的一个性能指标 单位:bps、kbps、Mbps k 10^3、M 10^6、G 10^9 速率往往…

autosar 诊断入门

AUTOSAR (汽车开放系统架构) 是一个国际汽车行业的开放和标准化的软件架构。它的主要目标是为了创建一种独立于硬件的软件架构,以提高汽车电子系统的模块化和可重用性。 AUTOSAR架构主要分为两个部分:AUTOSAR Runtime Environment (RTE) 和 AUTOSAR Soft…

HTTP各版本差异

HTTP1.0 无法复用连接 HTTP1.0为每个请求单独新开一个TCP连接 #mermaid-svg-9N3exXRS4VvT4bWF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9N3exXRS4VvT4bWF .error-icon{fill:#552222;}#mermaid-svg-9N3exXRS…

集成电路运算放大器[23-9-16]

目录 1、结构组成:差分放大电路、电压放大电路、功率放大电路。 2、同相放大器: 3、反相放大器:一个正电压放大并变为负电压。 4、差分放大电路:输入两个不同的电压,两者的差值乘以放大系数得到输 出电压。 1、结构组…

2.策略模式

UML图 代码 main.cpp #include "Strategy.h" #include "Context.h"void test() {Context* pContext nullptr;/* StrategyA */pContext new Context(new StrategyA());pContext->contextInterface();/* StrategyB */pContext new Context(new Strat…

MybatisPlus(5)

前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 上篇讲了增删的操作,这篇讲修改操作中的一个问题以及它对应的…