【图像超分辨率重建】——“SISR 中的Edge-Based 损失函数”论文精读

2023-05-16

2018-Edge-Based Loss Function For Single Image Super Resolution

基本信息

作者: George Seif, Dimitrios Androutsos
期刊: IEEE INTERNATIONAL CONFERENCE ON ACOUSTICS, SPEECH AND SIGNAL PROCESSING (ICASSP)
引用: 10
摘要: 近年来,卷积神经网络在单幅图像的超分辨率任务上表现出最先进的性能。尽管这些提出的网络显示了高质量的重建结果,但使用均方误差(MSE)损失函数进行训练往往会产生过于平滑和模糊的图像。MSE没有考虑图像结构,而这些结构对于实现人类感知的高图像质量往往是很重要的。我们提出了一个新的基于边缘的损失函数来改善图像的超分辨率重构。我们的损失函数直接优化了重建图像的边缘像素,从而驱动训练有素的网络产生高质量的突出边缘,从而使图像更加清晰。大量的定量和定性结果表明,我们提出的损失函数明显优于MSE。

1.简介

  • MSE的缺陷:在基于深度学习的超分辨中,大部分都使用MSE损失函数,虽然基于MSE的损失函数已经显示出前景,但它们确实存在一些缺点。已经证明MSE与人类观察者判断的感知质量没有很好的相关性,这是因为MSE没有考虑到图像中嵌入的任何突出特征。突出的特征,如结构和纹理,已被证明与人类感知的图像质量高度相关,并且对计算机视觉任务非常有用。如果没有这些结构,网络就没有上下文的指导来重建图像,而只能依靠原始像素值。
  • 最近提出的新的损失函数:基于特征的损失函数,MAE+MSE+MS-SSIM组合损失,边缘图像与SR图像的MSE作损失等。
  • 本文提出的损失函数:在上述提出的损失上进行改进,提出边缘损失,使图像边缘得到了更大的重视。

2.边缘损失函数

2.1.方法

  • 像素损失成分促进了重建图像的整体准确性,即像素值与原始图像的值直接相似。这确保了图像的颜色、光照或整体对比度没有重大变化。
  • 结构损失部分指导网络产生突出的图像结构,这些结构对人类观察者来说被认为是重要的感知。特别是,我们建议使用边缘作为我们结构损失的基础。

边缘损失

 loss  edges  = ∑ x = 1 W ∑ y = 1 H E i , j ⋅ ( ∣ Y i , j − X i , j ∣ ) W H . \text { loss }_{\text {edges }}=\frac{\sum_{x=1}^W \sum_{y=1}^H E_{i, j} \cdot\left(\left|Y_{i, j}-X_{i, j}\right|\right)}{W H} .  loss edges =WHx=1Wy=1HEi,j(Yi,jXi,j).

像素损失

 loss  pixels  = ∑ x = 1 W ∑ y = 1 H ( ∣ Y i , j − X i , j ∣ ) W H \text { loss }_{\text {pixels }}=\frac{\sum_{x=1}^W \sum_{y=1}^H\left(\left|Y_{i, j}-X_{i, j}\right|\right)}{W H}  loss pixels =WHx=1Wy=1H(Yi,jXi,j)

总损失

loss ⁡ total  = α ⋅ loss ⁡ pixels  + ( 1 − α ) ⋅ loss ⁡ edges  \operatorname{loss}_{\text {total }}=\alpha \cdot \operatorname{loss}_{\text {pixels }}+(1-\alpha) \cdot \operatorname{loss}_{\text {edges }} losstotal =αlosspixels +(1α)lossedges 

边缘损失为计算MAE(L1)前使用Canny边缘检测结果E进行乘积,像素损失为MAE损失,最终以0.3:0.7的比例综合为总损失
(注意:Matalb使用Canny算法输出是0/1的矩阵,opencv输出0/255矩阵)

2.2.实施细节

以VDSR为基础,所有训练设置与其相同,使用Kears(Tensorflow)实现,使用Y通道计算PSNR和SSIM。

3.实验结果

  • 我们的损失函数与VDSR的性能超过了用MSE训练的原始VDSR。此外,用我们的基于边缘的损失函数训练VDSR,使它的性能超过了其他通常用他们所选择的损失函数表现更好的架构,如用MSE的DRCN[8]和用Charbonnier的LapSRN。
  • 对于有许多边缘的图像,我们的边缘损失比MSE取得了更大的改进。特别是,我们的损失在X2尺度上显示出最大的改进,因为输入图像,一个X2二立方升尺度的LR图像,有许多突出的边缘,已经接近于原始的HR边缘。对于更大的尺度,如X4,许多原始的HR边缘要么被严重扭曲,要么从图像中完全消失,从而使边缘重建更具挑战性。
    在这里插入图片描述

4.结论

我们提出了一个基于边缘的损失函数来解决在SISR中重建突出边缘的挑战。与其他方法相比,我们的方法使用定义明确的边缘作为网络训练的结构指导,以帮助优化边缘重建。实验结果表明,我们的损失函数在数量上和质量上都优于最先进的模型中使用的其他函数。我们的结果可以通过使用地面真实的边缘来进一步改善

代码实现

个人总结

  • 一种新的损失函数——边缘损失函数
  • 一种新的思想超分思想——组合加权损失函数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【图像超分辨率重建】——“SISR 中的Edge-Based 损失函数”论文精读 的相关文章

  • Prometheus的使用

    原文链接 Prometheus 是一个开放性的监控解决方案 xff0c 用户可以非常方便的安装和使用 Prometheus 并且能够非常方便的对其进行扩展 在Prometheus的架构设计中 xff0c Prometheus Server
  • Java中restTemplate携带Header请求

    原文链接 RestTemplate是Spring提供的用于发送HTTP请求的客户端工具 现在我们要在Java中使restTemplate携带Header请求 创建请求 创建请求头 xff1a span class token class n
  • SpringBoot整合ElasticSearch

    原文链接 ElasticSearch是个开源分布式搜索引擎 xff0c 提供搜集 分析 存储数据三大功能 它的特点有 xff1a 分布式 xff0c 零配置 xff0c 自动发现 xff0c 索引自动分片 xff0c 索引副本机制 xff0
  • Python将二维数组输出为图片

    原文链接 使用Python读取二维数组 xff0c 将二维数组输出为图片 xff0c 并保存在本地 代码如下 xff1a span class token comment coding 61 utf8 span span class tok
  • 如何使用Tin快速搭建Gitlab-ce?(史上最简单方法)

    GitLab是Git代码版本管理平台 xff0c 相比于GitHub xff0c GitLab还免费支持私人仓库 GitLab ce是gitlab的开源版本 目前网上Gitlab ce的安装方法有很多 xff0c 但大同小异都需要安装各种依
  • 堆叠降噪自动编码器 Stacked Denoising Auto Encoder(SDAE)

    原文链接 自动编码器 xff08 Auto Encoder xff0c AE xff09 自动编码器 xff08 Auto Encoder xff0c AE xff09 自编码器 xff08 autoencoder xff09 是神经网络的
  • PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法

    原文链接 1 通道数问题 xff1a 描述一个像素点 xff0c 如果是灰度 xff0c 那么只需要一个数值来描述它 xff0c 就是单通道 如果有RGB三种颜色来描述它 xff0c 就是三通道 最初输入的图片样本的 channels xf
  • Python中LSTM回归神经网络的时间序列预测

    原文链接 这个问题是国际航空乘客预测问题 xff0c 数据是1949年1月到1960年12月国际航空公司每个月的乘客数量 xff08 单位 xff1a 千人 xff09 xff0c 共有12年144个月的数据 网盘链接 提取码 xff1a
  • pip安装时 fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory

    原文链接 使用pip安装模块 xff0c 出现错误 xff1a c users anaconda3 include pyconfig h 68 fatal error C1083 无法打开包括文件 io h No such file or
  • linux 程序被Killed,查看原因

    原文链接 1 查看信息 xff1a 输入以下程序 xff1a dmesg egrep i B100 39 killed process 39 可以输出最近killed的信息 2 设定kill优先度 xff1a xff08 1 xff09 完
  • Kafka的幂等性与事务性理解

    最近在深入理解Flink的Exactly Once xff0c 发现Flink Checkpoint只能保障Flink程序内部的一致性 xff0c 无法保证Sink到外部系统的Exactly Once语义 但是Sink到外部如果实现了Two
  • 为什么不直接操作State,而是要额外定义一个变量

    最近浏览Flink文章的时候发现一个现象 xff0c 就是在操作State的时候 xff0c 很多文章里面并不会直接操作State xff0c 而是会定义一个相似的变量去操作 xff0c 在 snapshot 和 recover 的时候讲变
  • 了解下SparkSQL中的笛卡尔积

    虽然应该尽量避免使用笛卡尔积 xff0c 因为要全量匹配 xff0c 所以运算的效率十分低下 xff0c 但是有些业务有必须得用 xff0c 所以在此了解下SparkSQL中的笛卡尔积 SparkSQL中计算笛卡尔积时有两种Join方式 x
  • 在Redis集群模式下使用pipeline进行批量操作

    最近开始又接触到了Redis xff0c 之前在工作中使用Redis的时候 xff0c 由于QPS不高 xff0c 都是直接get set搞定了 这次遇到的业务数据量比较大 xff0c 更新也很频繁 xff0c Redis使用是集群模式 x
  • RDD计算时是把数据全部加载至内存么

    RDD的本质 RDD的本质是一个函数 而RDD的变换不过是函数的嵌套 RDD有两类 输入的RDD 典型如KafkaRDD JdbcRDD转换的RDD 如MapPartitionsRDD RDD的处理流程 以如下代码为例 sc textFil
  • mysql中limit用法详解

    Mysql中limit的用法详解 在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢 xff1f 不用担心 xff0c mysql 已经为我们提供了这样一个功能 xff0c 尽管语法逻辑很
  • 练习代码遇到的零碎知识

    一 xff0c c 43 43 中使用malloc 时 xff0c 出现error malloc was not declared in this scope 1 书写错误 2 没有引用相应的库 解决方法 xff1a 引入stdlib h库
  • ThreadLocal是干嘛用的?

    ThreadLocal是通过将变量设置成Thread的局部变量 xff0c 即使用该变量的线程提供一个独立的副本 xff0c 可以独立修改 xff0c 不会影响其他线程的副本 xff0c 这样来解决多线程的并发问题 ThreadLocal主
  • linux下命令清空回收站

    命令行强制清空回收站 回收站其实就是一个文件夹 xff0c 存放被删掉的文件 ubuntu 回收站的具体位置是 xff1a HOME local share Trash 进到这个目录下直接rm掉所有文件 xff1a sudo rm fr H
  • python语言print()用法应用详解 及格式化输出

    目录 一 print 函数概述 1 1print基本语法 xff1a 1 2 print参数的具体例子 1 2 1 objects基本语法 1 2 2 sep基本语法 1 2 3 end基本语法 1 2 4 file的基本语法 二 格式化输

随机推荐