图像重采样 (Image Rescaling,LR) 任务联合优化图像下采样和上采样操作,通过对图像分辨率的下降和还原,可以用于节省存储空间或传输带宽。在实际应用中,例如图集服务的多档位分发,下采样得到的低分辨率图像往往会进行有损压缩,而有损压缩往往导致现有算法的性能大幅下降。
近期,字节跳动 - 火山引擎多媒体实验室首次尝试了有损压缩下的图像重采样性能优化,设计了一种非对称可逆重采样框架,基于该框架下的两点观察,进一步提出了抗压缩图像重采样模型 SAIN。该研究将一组可逆网络模块解耦成重采样和压缩模拟两个部分,使用混合高斯分布建模分辨率下降和压缩失真造成的联合信息损失,结合可微的 JPEG 算子进行端到端训练,大幅提升了对于常见压缩算法的鲁棒性。
目前对于图像重采样的研究,SOTA 方法是基于可逆网络 (Invertible Network) 构建一个双射函数 (bijective function),其正运算将高分辨率 (HR) 图像转换为低分辨率 (LR) 图像和一系列服从标准正态分布的隐变量,逆运算则随机采样隐变量,结合 LR 图像进行上采样还原。
由于可逆网络的特性,下采样和上采样算子保持高度的对称性 (symmetry),这就导致受压缩的 LR 图像难以通过原本学得的上采样算子进行还原。为了增强对于有损压缩的鲁棒性,该研究提出了一个基于非对称可逆框架的抗压缩图像重采样模型 SAIN (Self-Asymmetric Invertible Network)。
SAIN 模型的核心创新点如下:
SAIN 模型进行了 JPEG 和 WebP 压缩下的性能验证,在多个公开数据集上的表现大幅领先 SOTA 模型,相关研究已经入选 AAAI 2023 Oral。


图 1 Dual-IRN 模型图。
为了提升抗压缩性能,该研究首先设计了一种非对称式的可逆图像重采样框架,提出了 baseline 方案 Dual-IRN 模型,深入分析了该方案的不足之处后,进一步优化提出了 SAIN 模型。如上图所示,Dual-IRN 模型包含两个分支,其中 D-IRN 和 U-IRN 为两组可逆网络,分别学习 HR 图像与压缩前 / 压缩后 LR 图像之间的双射。
在训练阶段,Dual-IRN 模型通过可微的 JPEG 算子传递两个分支之间的梯度。而在测试阶段,模型通过 D-IRN 进行下采样获得高质量的 LR 图像,经过现实环境中的真实压缩后,再通过具有压缩感知 (compression-aware) 的 U-IRN 完成压缩恢复和上采样。
这样的非对称式框架,使得上采样和下采样的算子避免了严格的可逆关系,从根源上解决了压缩算法破坏上下采样过程对称性带来的问题,相对于 SOTA 的对称式方案大幅提升了抗压缩性能。
随后,研究人员对 Dual-IRN 模型展开进一步的分析,观察到以下两个现象:
基于以上分析,研究人员从多个方面对模型进行优化,最终得到的 SAIN 模型不仅网络参数量下降了将近一半,并且还取得了进一步的性能提升。

图 2 SAIN 模型图。
SAIN 模型的架构如上图所示,主要进行了以下四个方面的改进:
1. 整体框架方面。基于中间层特征的相似性,将一组可逆网络模块解耦成重采样和压缩模拟两个部分,形成自非对称 (self-asymmetric) 架构,避免使用两组完整的可逆网络。在测试阶段,使用正变换

取得高质量的 LR 图像,先使用逆变换

进行压缩恢复,再使用逆变换

进行上采样。
2. 网络结构方面。基于压缩损失能够借助高频信息恢复的假设提出 E-InvBlock,在模块中增加一个加性变换,使得共享大量运算的前提下可以高效地建模压缩前 / 压缩后的两组 LR 图像。
3. 信息损失建模方面。基于隐变量的真实分布,提出使用可学习的混合高斯分布建模下采样和有损压缩带来的联合信息损失,通过重参数化技巧端到端优化分布参数。
4. 目标函数方面。设计了多个损失函数,用于约束网络的可逆性、提高重建精度,同时在损失函数中引入真实压缩操作以增强对真实压缩方案的鲁棒性。
评估数据集为 DIV2K 验证集和 Set5、Set14、BSD100 和 Urban100 四个标准测试集。
量化评估指标为:
在表 1 和图 3 的对比实验中,SAIN 在所有数据集上的 PSNR 和 SSIM 分数都大幅领先 SOTA 的图像重采样模型。在比较低的 QF 下,现有方法普遍出现严重的性能下降,而 SAIN 模型仍然保持最优性能。

表 1 对比实验,在 DIV2K 数据集上比较不同 JPEG 压缩质量 (QF) 下的重建质量 (PSNR / SSIM)。

图 3 对比实验,在四个标准测试集上比较不同 JPEG QF 下的重建质量 (PSNR)。
在图 4 的可视化结果中,可以明显看出 SAIN 还原的 HR 图像更加清晰、准确。

图 4 不同方法在 JPEG 压缩下的可视化结果对比 (×4 倍率)。
在表 2 的消融实验中,研究人员还比较了其他几种结合真实压缩进行训练的候选方案。这些候选方案相较于完全对称的现有模型 (IRN) 具有更高的抗压缩性能,但在参数量和准确率上仍不如 SAIN 模型。

表 2 针对整体框架和训练策略的消融实验。
在图 5 的可视化结果中,研究人员对比了 WebP 压缩失真下不同图像重采样模型的重建结果。可以发现,SAIN 模型在 WebP 压缩方案下同样表现出了最高的重建分数,能够清晰准确地还原图像细节,证明了 SAIN 对于不同压缩方案的兼容性。

图 5 不同方法在 WebP 压缩下的定性和定量对比 (×2 倍率)。
除此之外,该研究还针对混合高斯分布、E-InvBlock 和损失函数等部分进行了消融实验,证明了这些改进对于结果的正向贡献。
火山引擎多媒体实验室针对抗压缩图像重采样提出了一个基于非对称可逆框架的模型:SAIN。该模型包含重采样和压缩模拟两个部分,使用混合高斯分布建模分辨率下降和压缩失真造成的联合信息损失,结合可微的 JPEG 算子进行端到端训练,提出 E-InvBlock 来增强模型拟合能力,大幅提升了对于常见压缩算法的鲁棒性。
火山引擎多媒体实验室是字节跳动旗下的研究团队,致力于探索多媒体领域的前沿技术,参与国际标准化工作,其众多创新算法及软硬件解决方案已经广泛应用在抖音、西瓜视频等产品的多媒体业务,并向火山引擎的企业级客户提供技术服务。实验室成立以来,多篇论文入选国际顶会和旗舰期刊,并获得数项国际级技术赛事冠军、行业创新奖及最佳论文奖。
未来,研究团队会继续优化图像重采样模型在有损压缩下的性能,并且进一步探索抗压缩视频重采样、任意倍率重采样等更加复杂的应用情景。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#