论文笔记SR——GFN

Gated Fusion Network for Joint Image Deblurring and Super-Resolution

Abstract

由于传感器和物体之间的相对运动,由移动或静止相机捕获的图像不可避免地会受到运动模糊的影响。本文主要关注存在运动模糊的超分辨任务。提出了一种深度门控融合卷积神经网络,可以从具有严重模糊的单个图像中生成清晰的高分辨率图像。

Introduction

单图像超分辨率(SISR)旨在从一个低分辨率(LR)帧恢复高分辨率(HR)图像。真实世界的图像经常受到非均匀运动模糊的影响。SR和去模糊通常是分开处理的,但在这里中,我们的目标是解决从给定的模糊LR输入生成清晰HR图像的联合问题。

传统的顺序解决方法(例如先SR再去模糊)存在许多问题:①误差累积,即第一模型的估计误差将在第二模型中传播和放大。②分步网络没有充分利用两个任务之间的相关性。例如,特征提取和图像重建步骤执行两次并导致计算冗余。③资源消耗。两步式方法无法应用于资源受限的应用程序。

作者提出了一个基于双分支架构的门控融合网络(GFN)来解决SR和去模糊的联合问题。GFN包含两个分支:一个分支旨在对LR输入图像进行去模糊,另一个分支生成清晰的HR输出图像。此外,为了自适应融合去模糊和超分辨率分支提出了一个门模块,门模块在特征级上对两个分支结果进行融合以避免去模糊图像的误差累积,然后将融合的特征馈送到图像重建模块中以生成清晰的HR输出图像。

Gated Fusion Network     

3.1 Network architecture

模型基于双分支架构,由四个主要模块组成:

(1)Debluring module    去模糊模块

去模糊模块旨在从输入模糊LR图像恢复清晰LR图像。去模块模块中采用了非对称残差编码器 - 解码器架构来扩大感受域。

① 编码器部分主要使用残差结构,包含三部分,每部分具有6个ResBlock,其中最后一个ResBlock的输入为该部分的最初输入特征+上一个ResBlock的输出特征,而后接上一个跨步卷积层(stride=2的卷积层),用于将特征下采样(1/2倍)

② 解码器采用两个转置卷积层来扩大特征图的空间分辨率。

PS:转置卷积?

转置卷积层可以看做是卷积层的一种逆运算,属于自适应上采样的一种。

常规卷积层的卷积运算可以写为,其中C为中非零元素为卷积核的权重,此线性操作把一个16维的输入向量,经过卷积运算后输出一个4维的向量,最后再转变为一个2*2的输出矩阵。反向传播时误差通过损失loss乘以进行反向传播, 在反向传播的时候,输入为4维的向量,输出为16维的向量,其连接方式与前向传播一致。

转置卷积过程则为正向传播把4维的向量空间映射到16维的向量空间,反向传播把16维的向量空间映射到4维的向量空间,即前向传播和反向传播分别通过乘以获得。

直接使用nn.ConvTranspose2d

③ 经过解码器得到输出特征,然后将其输入到门模块中进行特征融合。

④ 最后使用两个卷积层来重建去模糊的低清晰度图片

(2)Super-resolution feature extraction module     SR特征提取模块

使用8个ResBlock来提取图像SR特征,为了保证空间信息,作者没有使用任何池化或跨步卷积层。得到特征记为

(3)Gate module 门模块

SR特征对空间细节(静态的)有更好的体现,去模糊特征则对运动区域有更好的响应.

其中⊗表示逐元素乘法,门模块包含两个卷积层

看了一下原文的实现,是直接将使用cat进行拼接,然后交给两层卷积层得到门模块的输出结果,然后使用mul和add得到结果,感觉有点简单粗暴。

(4)Reconstruction module 重建模块

门模块的融合特征在重建模块作为输入,经过8个ResBlock和两个PixelShuffling层,扩大分辨率,然后两个卷积层来重建最终图像

3.2 Loss functions

使用MSE loss,针对每个blurry LR都有对应的HR图像H 和LR图像L, 从而:

 

summary

① 使用两个分支四个模块。将去模糊和SR分别进行处理,结果交由门模块进行融合,得到结果由重建模块进行重建图像。这是不是就是说,我可以把多个问题逐个处理然后由门模块进行融合,比如说图像中的pose不同,我是不是就可以把正例和其它多个pose样本放到两条分支中进行处理这样子。

② 训练过程分两步训练。第一步不使用门模块,分别训练其余三个模块,第二步加入门模块,整体训练。

转载于:https://www.cnblogs.com/mjhr/p/11233754.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请逐行注释下面的代码:class riscv_instr_base_test extends uvm_test; riscv_instr_gen_config cfg; string test_opts; string asm_file_name = "riscv_asm_test"; riscv_asm_program_gen asm_gen; string instr_seq; int start_idx; uvm_coreservice_t coreservice; uvm_factory factory; uvm_component_utils(riscv_instr_base_test) function new(string name="", uvm_component parent=null); super.new(name, parent); void'($value$plusargs("asm_file_name=%0s", asm_file_name)); void'($value$plusargs("start_idx=%0d", start_idx)); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); coreservice = uvm_coreservice_t::get(); factory = coreservice.get_factory(); uvm_info(gfn, "Create configuration instance", UVM_LOW) cfg = riscv_instr_gen_config::type_id::create("cfg"); uvm_info(gfn, "Create configuration instance...done", UVM_LOW) uvm_config_db#(riscv_instr_gen_config)::set(null, "*", "instr_cfg", cfg); if(cfg.asm_test_suffix != "") asm_file_name = {asm_file_name, ".", cfg.asm_test_suffix}; // Override the default riscv instruction sequence if($value$plusargs("instr_seq=%0s", instr_seq)) begin factory.set_type_override_by_name("riscv_instr_sequence", instr_seq); end if (riscv_instr_pkg::support_debug_mode) begin factory.set_inst_override_by_name("riscv_asm_program_gen", "riscv_debug_rom_gen", {gfn, ".asm_gen.debug_rom"}); end endfunction function void report_phase(uvm_phase phase); uvm_report_server rs; int error_count; rs = uvm_report_server::get_server(); error_count = rs.get_severity_count(UVM_WARNING) + rs.get_severity_count(UVM_ERROR) + rs.get_severity_count(UVM_FATAL); if (error_count == 0) begin uvm_info("", "TEST PASSED", UVM_NONE); end else begin uvm_info("", "TEST FAILED", UVM_NONE); end uvm_info("", "TEST GENERATION DONE", UVM_NONE); super.report_phase(phase); endfunction virtual function void apply_directed_instr(); endfunction task run_phase(uvm_phase phase); int fd; for(int i = 0; i < cfg.num_of_tests; i++) begin string test_name; randomize_cfg(); riscv_instr::create_instr_list(cfg); riscv_csr_instr::create_csr_filter(cfg); asm_gen = riscv_asm_program_gen::type_id::create("asm_gen", , gfn); asm_gen.cfg = cfg; asm_gen.get_directed_instr_stream(); test_name = $sformatf("%0s_%0d.S", asm_file_name, i+start_idx); apply_directed_instr(); uvm_info(gfn, "All directed instruction is applied", UVM_LOW) asm_gen.gen_program(); asm_gen.gen_test_file(test_name); end endtask virtual function void randomize_cfg(); DV_CHECK_RANDOMIZE_FATAL(cfg); uvm_info(`gfn, $sformatf("riscv_instr_gen_config is randomized:\n%0s", cfg.sprint()), UVM_LOW) endfunction endclass
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值