百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

PULSE:一种基于隐式空间的图像超分辨率算法

connygpt 2024-08-28 14:13 12 浏览


作者: Kabuto

分享一篇 CVPR 2020 录用论文:PULSE: Self-Supervised Photo Upsampling via Latent Space Exploration of Generative Models,作者提出了一种新的图像超分辨率方法,区别于有监督的PSNR-based和GANs-based方法,该方法是一种无监督的方法,即只需要低分辨率的图片就可以恢复高质量、高分辨率的图片。


目前代码已经开源:

https://github.com/adamian98/pulse


论文信息:

作者均来自于杜克大学。


1. Motivation


图像超分辨率任务的基本目标就是把一张低分辨率的图像超分成其对应的高分辨率图像。无论是基于PNSR还是GAN的监督学习方法,或多或少都会用到pixel-wise误差损失函数,而这往往会导致生成的图像比较平滑,一些细节效果不是很好。于是作者换了一个思路:**以往的方法都是从LR,逐渐恢复和生成HR;如果能找到一个高分辨率图像HR的Manifold,并从该Manifold中搜寻到一张高分辨率的图像使其下采样能恢复到LR,那么搜寻到的那张图像就是LR超分辨率后的结果。**所以本篇文章主要解决了以下的两个问题:

  • 如何找到一个高分辨率图像的Manifold?
  • 如何在高分辨率图像的Manifold上搜寻到一张图片使其下采样能恢复LR?

  • 2. Method


    假设高分辨率图像的Manifold是,是M上的一个高分辨率图片,给定一个低分辨率图像,如果可以通过下采样操作DS恢复LR,那么就可以认为是LR的超分辨率结果,该问题定义如下:

    即当两者的差值小于某个阈值时。令,那么本文任务其实就是找到一个如下图所示:

    以上就是本篇文章的核心内容,下面我们结合代码来看一下具体是怎么实现的。

    首先我们需要一个生成模型来近似高分辨率的Manifold,在本文中,作者采用的是StyleGAN的预训练模型:

    StyleGAN的生成器网络中有两个部分,一个是Mapping Network用于将latent code映射为style code,一个Synthesis Network用于将映射后得到的style code用于指导图像的生成。这里需要注意的是,本篇文章只是使用了StyleGAN的预训练模型,并不训练更新其参数。加载两个部分的参数之后,随机构造100000个随机latent code,经过Mapping Network,用得到新的latent code计算均值与方差:

    latent = torch.randn((1000000,512),dtype=torch.float32, device="cuda")
    latent_out = torch.nn.LeakyReLU(5)(mapping(latent))
    self.gaussian_fit = {"mean": latent_out.mean(0), "std": latent_out.std(0)}
    

    这个均值与方差就可以用来映射新的latent code。接下就是随机初始化latent code和noise(StyleGAN需要):

    # 初始化latent code
    latent = torch.randn((batch_size, 18, 512), dtype=torch.float, requires_grad=True, device='cuda')
    # 初始化noise
    for i in range(18): # [?, 1, 4, 4] -> [?, 1, 1024, 1024]
        res = (batch_size, 1, 2**(i//2+2), 2**(i//2+2))
        new_noise = torch.randn(res, dtype=torch.float, device='cuda')
        if (i < num_trainable_noise_layers):  # num_trainable_noise_layers
            new_noise.requires_grad = True
        noise_vars.append(new_noise)
                       
    noise.append(new_noise)
    

    **从这里我们可以看出,模型优化的其实是latent code与noise的前5层,而不是模型参数。**初始化完成了之后就可以执行前向了:

    # 根据之前的求得的均值和方差,映射latent code
    latent_in = self.lrelu(latent_in*self.gaussian_fit["std"] + self.gaussian_fit["mean"])
    # 加载Synthesis Network用于生产图像
    # 把图像结果从[-1, 1]修改到[0, 1]
    gen_im = (self.synthesis(latent_in, noise)+1)/2
    

    根据原始的低分辨率图像和生成的高分辨率图像计算loss。在代码中,loss由两个部分组成:

    其中L2损失是将生成的高分辨率图像gen_im通过bicubic下采样恢复LR,并与输入的LR计算pixel-wise误差,GEOCROSS是测地线距离。

    
    

    最后优化器选择的是球面优化器:

    # opt = SphericalOptimizer(torch.optim.Adam, [x], lr=0.01)
    
    class SphericalOptimizer(Optimizer):
        def __init__(self, optimizer, params, **kwargs):
            self.opt = optimizer(params, **kwargs)
            self.params = params
            with torch.no_grad():
                self.radii = {param: (param.pow(2).sum(tuple(range(2,param.ndim)),keepdim=True)+1e-9).sqrt() for param in params}
    
        @torch.no_grad()
        def step(self, closure=None):
            loss = self.opt.step(closure)
            for param in self.params:
                param.data.div_((param.pow(2).sum(tuple(range(2,param.ndim)),keepdim=True)+1e-9).sqrt())
                param.mul_(self.radii[param])
    
            return loss
    


    3. Result


    从结果可以看出,PULSE生成的图像细节更丰富,包括头发丝、眼睛和牙齿这些比较细微的地方都能生成的很好。而且对于有噪声的LR,也能生成的很好,说明该算法有很强的鲁棒性:

    最终的比较指标采用的是MOS:

    4. Questions


    PULSE是一个无监督的图像超分辨率模型,其图像的质量其实很大程度上取决于所选取的生成模型的好坏。另一方面,由于PULSE的基础原理就是找到一个高分辨率的图像,使其下采样之后能恢复LR,那么意味着结果不唯一,可能生成的图像很清楚,但是已经失去了身份信息:

    5. Resource


  • PaperPULSE:https://arxiv.org/pdf/2003.03808.pdfStyleGAN: https://arxiv.org/abs/1812.04948Random Vectors in High Dimen- sions: https://www.sci-hub.ren/10.1017/9781108231596.006
  • Github: https://github.com/adamian98/pulse.git
  • 相关推荐

    3分钟让你的项目支持AI问答模块,完全开源!

    hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

    干货|程序员的副业挂,12个平台分享

    1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

    Github标星超200K,这10个可视化面板你知道几个

    在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

    开箱即用的炫酷中后台前端开源框架第二篇

    #头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

    搭建React+AntDeign的开发环境和框架

    搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

    基于.NET 5实现的开源通用权限管理平台

    ??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

    StreamPark - 大数据流计算引擎

    使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

    教你使用UmiJS框架开发React

    1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

    简单在线流程图工具在用例设计中的运用

    敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

    【开源分享】神奇的大数据实时平台框架,让Flink&amp;Spark开发更简单

    这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

    聊聊规则引擎的调研及实现全过程

    摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

    【开源推荐】Diboot 2.0.5 发布,自动化开发助理

    一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

    微软推出Copilot Actions,使用人工智能自动执行重复性任务

    IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

    Electron 使用Selenium和WebDriver

    本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

    Quick &#39;n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

    一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...