图像超分辨率:优化最近邻插值Super-Resolution by Predicting Offsets

news2024/11/26 2:30:27

文章目录

    • 3. Super-Resolution by Predicting Offsets
      • 3.1. 这篇论文用于处理栅格化图像的超分,不知道这样翻译对不对,
      • 3.2. 作者认为栅格图像的边缘比较规则,可以训练一个offset map移动栅格图像的 边缘点(背景和前景像素 移动 和交换)
      • 3.3 fusion

3. Super-Resolution by Predicting Offsets

3.1. 这篇论文用于处理栅格化图像的超分,不知道这样翻译对不对,

栅格化图像是锯齿形状的图像,如下
上面时栅格图像,很多锯齿。 放大尺寸的时候,最近邻插值的效果就是这种,观感不好。因此作者想办法优化
下面时混淆图像,边缘重叠不清晰

在这里插入图片描述

3.2. 作者认为栅格图像的边缘比较规则,可以训练一个offset map移动栅格图像的 边缘点(背景和前景像素 移动 和交换)

整体框架比较简单,三个卷积层:
在这里插入图片描述


def initialize_weights(net_l, scale=1):
    if not isinstance(net_l, list):
        net_l = [net_l]
    for net in net_l:
        for m in net.modules():
            if isinstance(m, nn.Conv2d):
                init.kaiming_normal_(m.weight, a=0, mode='fan_in')
                m.weight.data *= scale  # for residual block
                if m.bias is not None:
                    m.bias.data.zero_()
            elif isinstance(m, nn.Linear):
                init.kaiming_normal_(m.weight, a=0, mode='fan_in')
                m.weight.data *= scale
                if m.bias is not None:
                    m.bias.data.zero_()
            elif isinstance(m, nn.BatchNorm2d):
                init.constant_(m.weight, 1)
                init.constant_(m.bias.data, 0.0)


''' Checked '''
def NNresampling(lr, hr_shifts, mode='bilinear'):
    '''
    lr.shape = b, c, h, w
    hr_shifts.shape = b, 2, h*2, w*2
    mode: bilinear when training, nearest for testing
    '''
    b, c, h, w = lr.shape

    _coor_x = torch.arange(0, w * 2).repeat(b, 1, h * 2, 1).type_as(hr_shifts)
    _coor_y = torch.arange(0, h * 2).repeat(b, 1, w * 2, 1).transpose(2, 3).type_as(hr_shifts)

    sr_coor_x = _coor_x + hr_shifts[:, :1, :, :]
    sr_coor_x = 2.0 * sr_coor_x[:, :, :, :] / max(w * 2 - 1, 1) - 1.0

    sr_coor_y = _coor_y + hr_shifts[:, 1:, :, :]
    sr_coor_y = 2.0 * sr_coor_y[:, :, :, :] / max(h * 2 - 1, 1) - 1.0

    _coor_norm = torch.cat([sr_coor_x, sr_coor_y], dim=1)

    sr = F.grid_sample(lr.type_as(hr_shifts), _coor_norm.permute(0, 2, 3, 1), mode=mode)
    return sr

def NNresamplingx3(lr, hr_shifts, mode='bilinear'):
    '''
    lr.shape = b, c, h, w
    hr_shifts.shape = b, 2, h*2, w*2
    mode: bilinear when training, nearest for testing
    '''
    b, c, h, w = lr.shape

    _coor_x = torch.arange(0, w * 3).repeat(b, 1, h * 3, 1).type_as(hr_shifts)
    _coor_y = torch.arange(0, h * 3).repeat(b, 1, w * 3, 1).transpose(2, 3).type_as(hr_shifts)

    sr_coor_x = _coor_x + hr_shifts[:, :1, :, :]
    sr_coor_x = 2.0 * sr_coor_x[:, :, :, :] / max(w * 3 - 1, 1) - 1.0

    sr_coor_y = _coor_y + hr_shifts[:, 1:, :, :]
    sr_coor_y = 2.0 * sr_coor_y[:, :, :, :] / max(h * 3 - 1, 1) - 1.0

    _coor_norm = torch.cat([sr_coor_x, sr_coor_y], dim=1)

    sr = F.grid_sample(lr.type_as(hr_shifts), _coor_norm.permute(0, 2, 3, 1), mode=mode)
    return sr


class V3_10(nn.Module):
    def __init__(self, input_channel=3, l1_c=16, l1_k=5, l2_c=16, l2_k=5, l3_c=2, l3_k=5, offset_up_type='bilinear'):
        super(V3_10, self).__init__()

        '''First Conv'''
        self.conv_first = []
        self.conv_first.append(nn.Conv2d(input_channel, l1_c, l1_k, padding=l1_k // 2))
        self.conv_first.append(nn.ReLU())
        arch_util.initialize_weights(self.conv_first, 0.1)

        '''Second Conv'''
        self.conv_second = []
        self.conv_second.append(nn.Conv2d(l1_c, l2_c, l2_k, padding=l2_k // 2))
        self.conv_second.append(nn.ReLU())
        arch_util.initialize_weights(self.conv_second, 0.1)


        if offset_up_type == 'bilinear':
            self.offset_up  = nn.Upsample(scale_factor=3, mode='bilinear')
        elif offset_up_type == 'nearest':
            self.offset_up  = nn.UpsamplingNearest2d(scale_factor=3)

        '''Last Conv'''
        self.conv_last = []
        self.conv_last.append(nn.Conv2d(l2_c, l3_c, l3_k, padding=l3_k // 2))
        arch_util.initialize_weights(self.conv_last, 0.1)

        self.conv_first = nn.Sequential(*self.conv_first)
        self.conv_second = nn.Sequential(*self.conv_second)
        self.conv_last = nn.Sequential(*self.conv_last)

    def forward(self, x, warp_type='nearest'):
        ''' When you test, warp_type = nearest '''

        # Offset SR
        fea_1     = self.conv_first(x)
        fea_2     = self.conv_second(fea_1)
        fea_up    = self.offset_up(fea_2)
        offset    = self.conv_last(fea_up) # 这里类似一个光流了,表示的像素的位移

        '''For x2'''
        offset_sr = NNresampling(x, offset, mode=warp_type) # warp操作
        '''For x3'''
        # offset_sr = NNresamplingx3(x, offset, mode=warp_type)

        output = torch.cat([offset_sr, offset], dim=1)
        return None, output

3.3 fusion

offset net只对边缘进行了处理,大部分是0。对于平坦区域,可以采用Lanczos等插值方法,
对于边缘图像, 求出最近邻插值的图 和 net得到的offset,类似得到一个光流 ,然后NNresampling函数进行重映射操作(用到F.grid_sample函数)

然后两者进行blending处理,得到最终的 sr图像

在这里插入图片描述

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

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

相关文章

能率携手梦想改造家,打造适老化住宅新典范

家装改造类节目《梦想改造家》第九季温情回归,日本一级建筑设计师本间贵史携手知名燃热品牌能率,与节目组一起关注民生,走进由一家五口组成的“足不出户的家”,共启老宅改造计划,倾情助力普通家庭拥抱生活与梦想&#…

(Matlab实现)蚂蚁狮子优化算法在电力系统中的应用

目录 1 知识一网打尽 2 蚂蚁狮子优化算法在电力系统经济调度中的应用 3 运行结果 4 Matlab代码实现 1 知识一网打尽 这里总结一位博主的电力系统经济调度目录 蚂蚁狮子优化算法(完整Matlab代码实现) 多目标蚂蚁狮子优化算法(Matlab代码…

拒绝灵感焦虑,藏在UI设计师书签里的宝藏网站!

都在说UI设计“越来越吃香”,导致其他门类的设计师一心想转行。 上次和入行8年的UI大佬聊天,她告诉小摹3条UI设计师必备能力: 审美能力和眼界:一个界面好不好看最后都是UI来定,为了不背锅,UI一定要有国际流…

dolphinscheduler2.0.5性能手动测试

目录🐬官方配置文件说明🐬测试并发量🐠线程数量设置100🐠线程数量设置200🐠线程数量设置500🐬测试结论🐬官方配置文件说明 官方说明 master.exec.threads: master工作线程数量,用于…

【2013】408联考数据结构真题整理

2013年 1 题目 解析 原始:升序 升序 变 升序 尾插法 改编:升序 升序 变 降序 头插法 2 题目 答案:C 解析 3 题目 答案:B 解析 二叉排序树,或者是空树,或者是满足以下性质的二叉树: …

基于PHP+MySQL音乐网站的设计与实现

随着时代的发展,音乐已经逐渐成为了人们生活中必不可少的一种调剂品,人们对音乐的追求也越来越强烈,为此我通过PHP和MYSQL开发了本音乐网站 本音乐网站是一个综合性的音乐分享网站,它主要实现了娱乐新闻,上榜歌手,音乐试听,音乐下载,下载排行,音乐库,在线留言等基本的音乐共享功…

Matplotlib绘制折线图、散点图、柱状图、直方图、饼图代码

一、折线图 以折线的上升或下降来表示统计数量的增减变化的统计图 特点:能够显示数据的变化趋势,反映事物的变化情况(变化)函数:plt.plot(x, y) import matplotlib.pyplot as plt import randomfrom pylab import mpl mpl.rcParams["f…

day31 文件上传js验证mimeuser.ini语言特性

前言 #知识点: 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini妙用 4、文件上传-PHP语言特性 #详细点: 1、检测层面:前端,后端等 2、检测内容:文件头,完整性,二次渲染…

基于MATLABsimulink的《电路原理》课程仿真实验平台开发

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1选题背景及意义 1 1.2设计内容 1 1.3设计思想 2 第二章 MATLAB简介 3 2.1 MATLAB程序设计 3 2.2 Simulink仿真 4 2.2.1 Simulink 启动 4 2.2.2 Simulink 模块库及模块操作 4 2.2.3 仿真参数设置 6 2.3图形用户界面(GUI&…

基于STM32的温控风扇

本设计是基于STM32的温控风扇,主要实现以下功能: 温度控制风速,四个挡位,停止、低速、中速、高速 按键可切换模式,可手动切换挡位,四个挡位,停止、低速、中速、高速 按键设置温度值&#xff0c…

网络刷卡器开发,刷新移动物联新生活

在物联网应用需求和身份校验普及的影响下,沐渥自主研发生产了一款基于网络协议传输的读卡设备——网络刷卡器,这是一款体积小巧,方便携带,即插即用,无需安装驱动,采用USB通讯,即刻响应对接客户的…

Linux系统漏洞本地提权

目录 一、实验项目名称 二、实验目的 三、实验内容 四、实验环境 五、实验步骤 六、实验结果 七、实验总结 一、实验项目名称 Linux系统漏洞本地提权及跳板设置实验 二、实验目的 1.msf工具的使用; 2.“脏牛”漏洞CVE-2016-5195漏洞利用方法。 三、实验…

MCE | 铁死亡——调节性细胞死亡

多细胞生物中,调节性细胞死亡过程 (RCD) 是细胞维持组织形态和功能必不可少的稳态机制。此前研究较多的调节性细胞死亡包括三大类:细胞凋亡、自噬和坏死。 “铁死亡”这一概念最早在 2012 年由 Dr. Brent R Stockwell 提出,它是一种铁离子依赖…

ORM概念

ORM概念 ORM是Object Relational Mapping 对象关系映射。简单来说,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就实现操作数据库表。 ORM(Object Relation Mapping)对象关系映射 思想:将关系数据库中表中的记录映射为对…

百货集团数字化转型方案

一、案例简述 后疫情时代对零售业,特别是百货和购物中心造成了巨大冲击,驱使实体零售业拥抱数字化转型。从总体上看,实体零售企业对于数字化转型的必要性已有充分的认知及一定的实践操作,但数字化仍处于起步阶段,线上…

”消费全返“是割韭菜,非也,广告电商引领全新“全返”模式

谈及消费全返,大家可能会避而不谈,因为有“云联惠”这个实实在在的案例发生,各大企业都怕进局子,现在都不弄消费全返了。说到“云联惠”,为什么它能在短时间内火得这么快,因为他们以“全返”为阙头&#xf…

驱动开发2

P 19 驱动设计的思想:面向对象/分层/分离 用结构体来表示某个对象 分离思想 将某个有很多类似操作的写在一起,这样我们根据参数就可以替换不同的步骤了 1、上下分层 将设计硬件的比如 初始化gpio、设置GPIO写成board.c 同用的就写在drv.c里面 2、左右分…

python数据分析与可视化

//注:绿色为正确答案,红色为错误答案,粉色为本人做错之后,系统给出的答案,可能有些题本人未标记,但是是可以区分的,题目中存在重复题目,下面有三张图的代码建议交代码块,…

中小企业知识管理难题怎么做?天翎与群晖携手给出最优解

编者按:在知识经济越来越重要的今天,做好知识管理对企业来说至关重要,但是中小企业的知识管理之路,比起大企业更加困难,该如何应对呢?本文分析了现代中小企业面临的知识管理困境,并进一步提出天…

Spring:AOP通知获取数据(13)

AOP通知获取数据AOP通知获取参数非环绕通知获取参数方式环绕通知获取参数方式AOP通知获取返回值环绕通知获取返回值返回后通知获取返回值AOP通知获取数据的案例AOP通知获取参数 非环绕通知获取参数方式 在方法上添加JoinPoint,通过JoinPoint来获取参数, 这里只使用…