精华内容
下载资源
问答
  • 长子网划分VLSM
    2021-01-05 22:18:57

    原理
    子网划分的目的是将一个大的网络划分成若干个小的网络,而划分又可以分为定长划分(每个子网中的可用主机IP地址数相同)和变长划分(每个子网中的可用主机IP地址数可以不相同),对于定长划分比较简单,在此主要分析下变长划分。
    实例分析1

    例:某单位有5个部门,需建立5个子网,其中部门A、B有60台主机,部门C有25台主机,部门D、E分别有10台主机,现有一个内部C类地址:192.168.1.0.请为该单位进行IP地址划分。

    解答

    首先分析,需要5个子网,则需要拿出3个主机位(23=8),才能满足,此时每个子网中主机位只有5位,最多能有25-2=30个,而部门A需要60台主机,显然不能通过这方法进行分配,于是就需要采用变长分配方式分配了。

    对于这种分配,一般首先应该把需求多的分配之后才分配需求少的,A、B都需要60台,那么就需要6位主机位,那么8位中剩下的2位就是主机位了。这里我们从低地址向高地址分配,那么这两位子网位就是00;
    接着为B分配60台也是需要6位主机位,那么两位子网位应该是01(因为00被A用了);
    接着为C分配,C需要25台,那么至少要保留5个主机位,所以剩余的3位子网号应该取100(因为0开头的分配给AB了);
    然后为D、E分配,它们均需要10台主机,即需要4个主机位,剩余的子网号就应该是1010和1011(原理和上面一样) 因此得出答案:
    子网A:192.168.1.0/26 子网B:192.168.1.64/26 子网C:192.168.1.128/27
    子网D:192.168.1.160/28 子网E:192.168.1.176/28
    地址分配顺序不固定,答案不唯一.

    案例分析2
    考虑互联3个子网(子网1、子网2和子网3)的一台路由器。假定在这3个子网的每个子网中的所有接口要求具有前缀200.6.16.0/24。还假定子网1要求支持多达50个接口,子网2要求支持多达100个接口和子网3要求支持多达10个接口。提供3个满足这些限制的网络地址(形式为a.b.c.d/x)
    解答

    分析可知该题也是需要采用变长子网

    子网名 支持接口数 分配IP地址数 主机位数 网络前缀数
    子网1 50 64 6 32-6=26
    子网2 100 128 7 32-7=25
    子网3 10 16 4 32-4=28
    按照地址需求从多到少分配,分配结果如下表。(原理和1相同)
    子网名 分配IP地址块数
    子网2 200.6.16.0/25
    子网1 200.6.16.128/26
    子网3 200.6.16.192/28
    地址分配顺序不固定,答案不唯一,比如如下答案也正确:
    子网1:200.6.16.0.0/26
    子网2:200.6.16.128/25
    子网3:200.6.16.64/28

    更多相关内容
  • 如题 ``` html: <div class="box"></div> ...本意是想app的高度被撑开为400px,从而使得box2中设置height: 100%,使box2高度也变成400px, 但是box2高度却是0,感到费解,求高手指教。
  • 这些数字代表图形坐标系中的“左,底,宽,”``,其范围从图的左下角的 0 到图的右上角的 1。 例如,我们可以通过将 x 和 y 位置设置为 0.65(也就是说,从图形宽度的 65% 和高度的 65% 开始), x 和 y 范围为 ...

    8.11 多个子图

    原文:Multiple Subplots

    译者:飞龙

    协议:CC BY-NC-SA 4.0

    本节是《Python 数据科学手册》(Python Data Science Handbook)的摘录。

    有时,并排比较不同的数据视图会很有帮助。为此,Matplotlib 具有子图的概念:可以在单个图形中一起存在的较小轴域分组。这些子图可能是插图,绘图网格或其他更复杂的布局。在本节中,我们将探讨在 Matplotlib 中创建子图的四个例程。

    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.style.use('seaborn-white')
    import numpy as np
    

    plt.axes:手动创建子图

    创建轴域的最基本方法是使用plt.axes函数。正如我们之前看到的,默认情况下,这会创建一个填充整个图形的标准轴域对象。plt.axes也有一个可选参数,它是图坐标系中四个数字的列表。这些数字代表图形坐标系中的“左,底,宽,高”``,其范围从图的左下角的 0 到图的右上角的 1。

    例如,我们可以通过将xy位置设置为 0.65(也就是说,从图形宽度的 65% 和高度的 65% 开始),xy范围为 0.2(即轴域的大小是图形宽度的 20% 和高度的 20%),在另一个轴域的右上角创建一个插入的轴域:

    ax1 = plt.axes()  # 标准轴域
    ax2 = plt.axes([0.65, 0.65, 0.2, 0.2])
    

    png

    在面向对象的接口中,这个命令的等价物是fig.add_axes()。 让我们用它来创建两个垂直堆叠的轴:

    fig = plt.figure()
    ax1 = fig.add_axes([0.1, 0.5, 0.8, 0.4],
                       xticklabels=[], ylim=(-1.2, 1.2))
    ax2 = fig.add_axes([0.1, 0.1, 0.8, 0.4],
                       ylim=(-1.2, 1.2))
    
    x = np.linspace(0, 10)
    ax1.plot(np.sin(x))
    ax2.plot(np.cos(x));
    

    png

    我们现在有两个刚刚接触的轴域(顶部没有刻度标签):上面板的底部(位置为 0.5)匹配下面板的顶部(位置为 0.1 + 0.4)。

    plt.subplot:子图的简单网格

    子图的对齐的列或行是一个常见的需求,Matplotlib 有几个便利例程,使它们易于创建。其中最低级别是plt.subplot(),它在网格中创建一个子图。如你所见,此命令接受三个整数参数 - 行数,列数和要在此图案中创建的绘图的索引,从左上角到右下角:

    for i in range(1, 7):
        plt.subplot(2, 3, i)
        plt.text(0.5, 0.5, str((2, 3, i)),
                 fontsize=18, ha='center')
    

    png

    命令plt.subplots_adjust可用于调整这些图之间的间距。下面的代码使用等效的面向对象命令fig.add_subplot()

    fig = plt.figure()
    fig.subplots_adjust(hspace=0.4, wspace=0.4)
    for i in range(1, 7):
        ax = fig.add_subplot(2, 3, i)
        ax.text(0.5, 0.5, str((2, 3, i)),
               fontsize=18, ha='center')
    

    png

    我们使用了plt.subplots_adjusthspacewspace参数,它们沿图的高度和宽度指定间距,以子图大小为单位(这里,间距是子图宽度和高度的 40%。

    plt.subplots:一次创建整个网格

    在创建大型子图网格时,刚才描述的方法会变得相当繁琐,特别是如果你想在内部绘图上隐藏x轴和y轴标签。为此,plt.subplots()是更容易使用的工具(注意subplots末尾的s)。 该函数不创建单个子图,而是在一行中创建完整的子图网格,并在 NumPy 数组中返回它们。参数是行数和列数,以及可选关键字sharexsharey,它们允许你指定不同轴之间的关系。

    在这里,我们将创建2x3子图的网格,其中同一行中的所有轴域共享其y轴刻度,并且同一列中的所有轴域共享其x轴刻度:

    fig, ax = plt.subplots(2, 3, sharex='col', sharey='row')
    

    png

    请注意,通过指定sharexsharey,我们会自动删除网格上的内部标签,来使绘图更清晰。生成的轴域网格实例在 NumPy 数组中返回,允许使用标准数组索引表示法,方便地指定所需的轴域:

    # ax 是二维数组,由 [row, col] 索引
    for i in range(2):
        for j in range(3):
            ax[i, j].text(0.5, 0.5, str((i, j)),
                          fontsize=18, ha='center')
    fig
    

    png

    plt.subplot()相比,plt.subplots()与 Python 传统的基于 0 的索引更加一致。

    plt.GridSpec:更加复杂的排列

    为了超越常规网格,转向跨越多行和列的子图,plt.GridSpec()是最好的工具。
    plt.GridSpec()对象本身不会创建一个图;它只是一个方便的接口,可以通过plt.subplot()命令识别。例如,具有指定宽度和高度间距的,两行和三列网格的gridspec如下所示:

    grid = plt.GridSpec(2, 3, wspace=0.4, hspace=0.3)
    

    从这里我们可以使用熟悉的 Python 切片语法来指定子图位置和范围:

    plt.subplot(grid[0, 0])
    plt.subplot(grid[0, 1:])
    plt.subplot(grid[1, :2])
    plt.subplot(grid[1, 2]);
    

    png

    这种类型的灵活网格对齐具有广泛的用途。我最经常在创建多轴域直方图时使用它,如下图所示:

    # 创建一些正态分布的数据
    mean = [0, 0]
    cov = [[1, 1], [1, 2]]
    x, y = np.random.multivariate_normal(mean, cov, 3000).T
    
    # 使用 gridspec 建立轴域
    fig = plt.figure(figsize=(6, 6))
    grid = plt.GridSpec(4, 4, hspace=0.2, wspace=0.2)
    main_ax = fig.add_subplot(grid[:-1, 1:])
    y_hist = fig.add_subplot(grid[:-1, 0], xticklabels=[], sharey=main_ax)
    x_hist = fig.add_subplot(grid[-1, 1:], yticklabels=[], sharex=main_ax)
    
    # 主要轴域上的散点图
    main_ax.plot(x, y, 'ok', markersize=3, alpha=0.2)
    
    # 附加轴域上的直方图
    x_hist.hist(x, 40, histtype='stepfilled',
                orientation='vertical', color='gray')
    x_hist.invert_yaxis()
    
    y_hist.hist(y, 40, histtype='stepfilled',
                orientation='horizontal', color='gray')
    y_hist.invert_xaxis()
    

    png

    这种类型的分布与其外边距一起绘制,这是很常见的,它在 Seaborn 包中有自己的绘图 API; 详细信息请参阅“使用 Seaborn 进行可视化”。

    展开全文
  • flex布局下,子元素高度问题。

    千次阅读 2021-05-24 13:52:05
    在父元素添加了align-items之后,子元素的高度,由自身内容决定...但当右边字体超出一行的时候,父容器被撑,但子元素还是自身高度,就会导致一下情况。 我这里我本来想给icon加个height:100%,占满父元素的,但是

    在父元素添加了align-items之后,子元素的高度,由自身内容决定。当不添加align-items时,父元素高度由最高子元素决定,不够的就占满。如下图:

    在这里插入图片描述

    去掉父元素的align-items之后。

    在这里插入图片描述

    在这里插入图片描述
    这是我在维护他人代码时发现的问题。如图,为了使icon与文字底部对齐,每一行都是flex布局row, 然后align-items:flex-end。但当右边字体超出一行的时候,父容器被撑高,但子元素还是自身高度,就会导致一下情况。
    在这里插入图片描述
    我这里我本来想给icon加个height:100%,占满父元素的,但是后来发现不管用。仔细想想,因为父元素没有固定高度,肯定是不行的。然后就发现了flex布局下,子元素高度的问题。我稍微修改了一下。去掉了每行的align-items,给字体外部容器添加了justify-content:flex-end;
    在这里插入图片描述
    还是有点丑,拍卖时间应该换行,但预展时间和拍卖时间属于一块数据,所以想不到办法了。

    我还是不太懂表达,可能是我的水平太菜了,还是要多锻炼一下,不但要会敲代码,学会的东西,遇到的问题,还是要和别人分享一下,我感觉懂得这么去表达,那么问问题的时候才能问到要点,这样的自身学习也是一种帮助。

    展开全文
  • 下面会介绍如何在这个模型基础上再增加一个子模块用来放大图像,从而构建一个完整的超分重建模型。 3. 基于子像素卷积放大图像尺寸 子像素卷积(Sub-pixel convolution)是一种巧妙的图像及特征图放大方法,又叫做...


    向AI转型的程序员都关注了这个号????????????

    人工智能大数据与深度学习  公众号:datayx


    一.  图像超分辨率重建概述

    1. 概念

    图像分辨率是一组用于评估图像中蕴含细节信息丰富程度的性能参数,包括时间分辨率、空间分辨率及色阶分辨率等,体现了成像系统实际所能反映物体细节信息的能力。相较于低分辨率图像,高分辨率图像通常包含更大的像素密度、更丰富的纹理细节及更高的可信赖度。但在实际上情况中,受采集设备与环境、网络传输介质与带宽、图像退化模型本身等诸多因素的约束,我们通常并不能直接得到具有边缘锐化、无成块模糊的理想高分辨率图像。提升图像分辨率的最直接的做法是对采集系统中的光学硬件进行改进,但是由于制造工艺难以大幅改进并且制造成本十分高昂,因此物理上解决图像低分辨率问题往往代价太大。由此,从软件和算法的角度着手,实现图像超分辨率重建的技术成为了图像处理和计算机视觉等多个领域的热点研究课题。

    图像的超分辨率重建技术指的是将给定的低分辨率图像通过特定的算法恢复成相应的高分辨率图像。具体来说,图像超分辨率重建技术指的是利用数字图像处理、计算机视觉等领域的相关知识,借由特定的算法和处理流程,从给定的低分辨率图像中重建出高分辨率图像的过程。其旨在克服或补偿由于图像采集系统或采集环境本身的限制,导致的成像图像模糊、质量低下、感兴趣区域不显著等问题。

    简单来理解超分辨率重建就是将小尺寸图像变为大尺寸图像,使图像更加“清晰”。具体效果如下图所示:

    可以看到,通过特定的超分辨率重建算法,使得原本模糊的图像变得清晰了。读者可能会疑惑,直接对低分辨率图像进行“拉伸”不就可以了吗?答案是可以的,但是效果并不好。传统的“拉伸”型算法主要采用近邻搜索等方式,即对低分辨率图像中的每个像素采用近邻查找或近邻插值的方式进行重建,这种手工设定的方式只考虑了局部并不能满足每个像素的特殊情况,难以恢复出低分辨率图像原本的细节信息。因此,一系列有效的超分辨率重建算法开始陆续被研究学者提出,重建能力不断加强,直至今日,依托深度学习技术,图像的超分辨率重建已经取得了非凡的成绩,在效果上愈发真实和清晰。

    2. 应用领域

    1955年,Toraldo di Francia在光学成像领域首次明确定义了超分辨率这一概念,主要是指利用光学相关的知识,恢复出衍射极限以外的数据信息的过程。1964年左右,Harris和Goodman则首次提出了图像超分辨率这一概念,主要是指利用外推频谱的方法合成出细节信息更丰富的单帧图像的过程。1984 年,在前人的基础上,Tsai和 Huang 等首次提出使用多帧低分辨率图像重建出高分辨率图像的方法后, 超分辨率重建技术开始受到了学术界和工业界广泛的关注和研究。

    图像超分辨率重建技术在多个领域都有着广泛的应用范围和研究意义。主要包括:

    (1) 图像压缩领域

    在视频会议等实时性要求较高的场合,可以在传输前预先对图片进行压缩,等待传输完毕,再由接收端解码后通过超分辨率重建技术复原出原始图像序列,极大减少存储所需的空间及传输所需的带宽。

    (2) 医学成像领域

    对医学图像进行超分辨率重建,可以在不增加高分辨率成像技术成本的基础上,降低对成像环境的要求,通过复原出的清晰医学影像,实现对病变细胞的精准探测,有助于医生对患者病情做出更好的诊断。

    (3) 遥感成像领域

    高分辨率遥感卫星的研制具有耗时长、价格高、流程复杂等特点,由此研究者将图像超分辨率重建技术引入了该领域,试图解决高分辨率的遥感成像难以获取这一挑战,使得能够在不改变探测系统本身的前提下提高观测图像的分辨率。

    (4) 公共安防领域

    公共场合的监控设备采集到的视频往往受到天气、距离等因素的影响,存在图像模糊、分辨率低等问题。通过对采集到的视频进行超分辨率重建,可以为办案人员恢复出车牌号码、清晰人脸等重要信息,为案件侦破提供必要线索。

    (5) 视频感知领域

    通过图像超分辨率重建技术,可以起到增强视频画质、改善视频的质量,提升用户的视觉体验的作用。

    3. 研究进展

    按照时间和效果进行分类,可以将超分辨率重建算法分为传统算法和深度学习算法两类。

    3.1 传统超分辨率重建算法

    传统的超分辨率重建算法主要依靠基本的数字图像处理技术进行重建,常见的有如下几类:

    (1) 基于插值的超分辨率重建

    基于插值的方法将图像上每个像素都看做是图像平面上的一个点,那么对超分辨率图像的估计可以看做是利用已知的像素信息为平面上未知的像素信息进行拟合的过程,这通常由一个预定义的变换函数或者插值核来完成。基于插值的方法计算简单、易于理解,但是也存在着一些明显的缺陷。

    首先,它假设像素灰度值的变化是一个连续的、平滑的过程,但实际上这种假设并不完全成立。其次,在重建过程中,仅根据一个事先定义的转换函数来计算超分辨率图像,不考虑图像的降质退化模型,往往会导致复原出的图像出现模糊、锯齿等现象。常见的基于插值的方法包括最近邻插值法、双线性插值法和双立方插值法等。

    (2) 基于退化模型的超分辨率重建

    此类方法从图像的降质退化模型出发,假定高分辨率图像是经过了适当的运动变换、模糊及噪声才得到低分辨率图像。这种方法通过提取低分辨率图像中的关键信息,并结合对未知的超分辨率图像的先验知识来约束超分辨率图像的生成。常见的方法包括迭代反投影法、凸集投影法和最大后验概率法等。

    (3) 基于学习的超分辨率重建

    基于学习的方法则是利用大量的训练数据,从中学习低分辨率图像和高分辨率图像之间某种对应关系,然后根据学习到的映射关系来预测低分辨率图像所对应的高分辨率图像,从而实现图像的超分辨率重建过程。常见的基于学习的方法包括流形学习、稀疏编码方法。

    3.2 基于深度学习的超分辨率重建算法

    机器学习是人工智能的一个重要分支,而深度学习则是机器学习中最主要的一个算法,其旨在通过多层非线性变换,提取数据的高层抽象特征,学习数据潜在的分布规律,从而获取对新数据做出合理的判断或者预测的能力。随着人工智能和计算机硬件的不断发展,Hinton等人在2006年提出了深度学习这一概念,其旨在利用多层非线性变换提取数据的高层抽象特征。凭借着强大的拟合能力,深度学习开始在各个领域崭露头角,特别是在图像与视觉领域,卷积神经网络大放异,这也使得越来越多的研究者开始尝试将深度学习引入到超分辨率重建领域。

    2014年,Dong等人首次将深度学习应用到图像超分辨率重建领域,他们使用一个三层的卷积神经网络学习低分辨率图像与高分辨率图像之间映射关系,自此,在超分辨率重建率领域掀起了深度学习的浪潮,他们的设计的网络模型命名为SRCNN(Super-Resolution Convolutional Neural Network)。

    SRCNN采用了插值的方式先将低分辨率图像进行放大,再通过模型进行复原。Shi等人则认为这种预先采用近邻插值的方式本身已经影响了性能,如果从源头出发,应该从样本中去学习如何进行放大,他们基于这个原理提出了ESPCN (Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network)算法。该算法在将低分辨率图像送入神经网络之前,无需对给定的低分辨率图像进行一个上采样过程,而是引入一个亚像素卷积层(Sub-pixel convolution layer),来间接实现图像的放大过程。这种做法极大降低了SRCNN的计算量,提高了重建效率。

    这里需要注意到,不管是SRCNN还是ESPCN,它们均使用了MSE作为目标函数来训练模型。2017年,Christian Ledig等人从照片感知角度出发,通过对抗网络来进行超分重建(论文题目:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network)。他们认为,大部分深度学习超分算法采用的MSE损失函数会导致重建的图像过于平滑,缺乏感官上的照片真实感。他们改用生成对抗网络(Generative Adversarial Networks, GAN)来进行重建,并且定义了新的感知目标函数,算法被命名为SRGAN,由一个生成器和一个判别器组成。生成器负责合成高分辨率图像,判别器用于判断给定的图像是来自生成器还是真实样本。通过一个博弈的对抗过程,使得生成器能够将给定的低分辨率图像重建为高分辨率图像。在SRGAN这篇论文中,作者同时提出了一个对比算法,名为SRResNet。SRResNet依然采用了MSE作为最终的损失函数,与以往不同的是,SRResNet采用了足够深的残差卷积网络模型,相比于其它的残差学习重建算法,SRResNet本身也能够取得较好的效果。

    由于SRGAN这篇论文同时提出了两种当前主流模式的深度学习超分重建算法,因此,接下来将以SRGAN这篇论文为主线,依次讲解SRResNet和SRGAN算法实现原理,并采用Pytorch深度学习框架完成上述两个算法的复现。

    二.  SRResNet算法原理和Pytorch实现

    1. 超分重建基本处理流程

    最早的采用深度学习进行超分重建的算法是SRCNN算法,其原理很简单,对于输入的一张低分辨率图像,SRCNN首先使用双立方插值将其放大至目标尺寸,然后利用一个三层的卷积神经网络去拟合低分辨率图像与高分辨率图像之间的非线性映射,最后将网络输出的结果作为重建后的高分辨率图像。尽管原理简单,但是依托深度学习模型以及大样本数据的学习,在性能上超过了当时一众传统的图像处理算法,开启了深度学习在超分辨率领域的研究征程。SRCNN的网络结构如图2所示。

    SRCNN作为早期开创性的研究论文,也为后面的工作奠定了处理超分问题的基本流程:

    (1) 寻找大量真实场景下图像样本;

    (2) 对每张图像进行下采样处理降低图像分辨率,一般有2倍下采样、3倍下采样、4倍下采样等。如果是2倍下采样,则图像长宽均变成原来的1/2.。下采样前的图像作为高分辨率图像H,下采样后的图像作为低分辨率图像L,L和H构成一个有效的图像对用于后期模型训练;

    (3) 训练模型时,对低分辨率图像L进行放大还原为高分辨率图像SR,然后与原始的高分辨率图像H进行比较,其差异用来调整模型的参数,通过迭代训练,使得差异最小。实际情况下,研究学者提出了多种损失函数用来定义这种差异,不同的定义方式也会直接影响最终的重建效果;

    (4) 训练完的模型可以用来对新的低分辨率图像进行重建,得到高分辨率图像。

    从实际操作上来看,整个超分重建分为两步:图像放大和修复。所谓放大就是采用某种方式(SRCNN采用了插值上采样)将图像放大到指定倍数,然后再根据图像修复原理,将放大后的图像映射为目标图像。超分辨率重建不仅能够放大图像尺寸,在某种意义上具备了图像修复的作用,可以在一定程度上削弱图像中的噪声、模糊等。因此,超分辨率重建的很多算法也被学者迁移到图像修复领域中,完成一些诸如jpep压缩去燥、去模糊等任务。

    简化版的超分重建处理流程如图3所示,当然,图像放大和修复两个步骤的顺序可以任意互换。

    2. 构建深度网络模型提高超分重建性能

    SRCNN只采用了3个卷积层来实现超分重建,有文献指出如果采用更深的网络结构模型,那么可以重建出更高质量的图像,因为更深的网络模型可以抽取出更高级的图像特征,这种深层模型对图像可以更好的进行表达。在SRCNN之后,有不少研究人员尝试加深网络结构以期取得更佳的重建性能,但是越深的模型越不能很好的收敛,无法得到期望的结果。部分研究学者通过迁移学习来逐步的增加模型深度,但这种方式加深程度有限。因此,亟需一种有效的模型,使得构建深层网络模型变得容易并且有效。这个问题直到2015年由何凯明团队提出ResNet网络才得以有效解决。

    ResNet中文名字叫作深度残差网络,主要作用是图像分类。现在在图像分割、目标检测等领域都有很广泛的运用。ResNet在传统卷积神经网络中加入了残差学习(residual learning),解决了深层网络中梯度弥散和精度下降(训练集)的问题,使网络能够越来越深,既保证了精度,又控制了速度。

    ResNet可以直观的来理解其背后的意义。以往的神经网络模型每一层学习的是一个 y = f(x) 的映射,可以想象的到,随着层数不断加深,每个函数映射出来的y误差逐渐累计,误差越来越大,梯度在反向传播的过程中越来越发散。这时候,如果改变一下每层的映射关系,改为 y = f(x) + x,也就是在每层的结束加上原始输入,此时输入是x,输出是f(x)+x,那么自然的f(x)趋向于0,或者说f(x)是一个相对较小的值,这样,即便层数不断加大,这个误差f(x)依然控制在一个较小值,整个模型训练时不容易发散。

    上图为残差网络的原理图,可以看到一根线直接跨越两层网络(跳链),将原始数据x带入到了输出中,此时F(x)预测的是一个差值。有了残差学习这种强大的网络结构,就可以按照SRCNN的思路构建用于超分重建的深度神经网络。SRResNet算法主干部分就采用了这种网络结构,如下图所示:

    上述模型采用了多个深度残差模块进行图像的特征抽取,多次运用跳链技术将输入连接到网络输出,这种结构能够保证整个网络的稳定性。由于采用了深度模型,相比浅层模型能够更有效的挖掘图像特征,在性能上可以超越浅层模型算法(SRResNet使用了16个残差模块)。注意到,上述模型每层仅仅改变了图像的通道数,并没有改变图像的尺寸大小,从这个意义上来说这个网络可以认为是前面提到的修复模型。下面会介绍如何在这个模型基础上再增加一个子模块用来放大图像,从而构建一个完整的超分重建模型。

    3.  基于子像素卷积放大图像尺寸

    子像素卷积(Sub-pixel convolution)是一种巧妙的图像及特征图放大方法,又叫做pixel shuffle(像素清洗)。在深度学习超分辨率重建中,常见的扩尺度方法有直接上采样,双线性插值,反卷积等等。ESPCN算法中提出了一种超分辨率扩尺度方法,即为子像素卷积方法,该方法后续也被应用在了SRResNet和SRGAN算法中。因此,这里需要先介绍子像素卷积的原理及实现方式。

    采用CNN对特征图进行放大一般会采用deconvolution等方法,这种方法通常会带入过多人工因素,而子像素卷积会大大降低这个风险。因为子像素卷积放大使用的参数是需要学习的,相比那些手工设定的方式,这种通过样本学习的方式其放大性能更加准确。

    具体实现原理如下图所示:

    上图很直观得表达了子像素卷积的流程。假设,如果想对原图放大3倍,那么需要生成出3^2=9个同等大小的特征图,也就是通道数扩充了9倍(这个通过普通的卷积操作即可实现)。然后将九个同等大小的特征图拼成一个放大3倍的大图,这就是子像素卷积操作了。

    实现时先将原始特征图通过卷积扩展其通道数,如果是想放大4倍,那么就需要将通道数扩展为原来的16倍。特征图做完卷积后再按照特定的格式进行排列,即可得到一张大图,这就是所谓的像素清洗。通过像素清洗,特征的通道数重新恢复为原来输入时的大小,但是每个特征图的尺寸变大了。这里注意到每个像素的扩展方式由对应的卷积来决定,此时卷积的参数是需要学习的,因此,相比于手工设计的放大方式,这种基于学习的放大方式能够更好的去拟合像素之间的关系。

    SRResNet模型也利用子像素卷积来放大图像,具体的,在图5所示模型后面添加两个子像素卷积模块,每个子像素卷积模块使得输入图像放大2倍,因此这个模型最终可以将图像放大4倍,如下图所示:

    4.  SRResNet结构剖析

    SRResNet使用深度残差网络来构建超分重建模型,主要包含两部分:深度残差模型、子像素卷积模型。深度残差模型用来进行高效的特征提取,可以在一定程度上削弱图像噪点。子像素卷积模型主要用来放大图像尺寸。完整的SRResNet网络结果如下图所示:

    上图中,k表示卷积核大小,n表示输出通道数,s表示步长。除了深度残差模块和子像素卷积模块以外,在整个模型输入和输出部分均添加了一个卷积模块用于数据调整和增强。

    需要注意的是,SRResNet模型使用MSE作为目标函数,也就是通过模型还原出来的高分辨率图像与原始高分辨率图像的均方误差,公式如下:

    MSE也是目前大部分超分重建算法采用的目标函数。后面我们会看到,使用该目标函数重建的超分图像并不能很好的符合人眼主观感受,SRGAN算法正是基于此进行的改进。

    5. Pytorch实现

    本节将从源码出发,完成SRResNet算法的建模、训练和推理。本文基于深度学习框架Pytorch来完成所有的编码工作,读者在阅读本文代码前需要熟悉Pytorch基本操作命令。

    代码,模型,数据集获取方式

    关注微信公众号 datayx  然后回复 超分 即可获取。

    AI项目体验地址 https://loveai.tech

    该工程比较大,主要是包含了用于训练的COCO2014数据集。提供这样一个完整的工程包是为了方便读者只需要下载和解压就可以直接运行,而不需要再去额外的寻找数据集和测试集。代码里也提供了已经训练好的.pth模型文件。

    训练结果

    训练共用时5小时19分6秒(2块GTX 1080Ti显卡),训练完成后保存的模型共17.8M。下图展示了训练过程中的损失函数变化。可以看到,随着训练的进行,损失函数逐渐开始收敛,在结束的时候基本处在收敛平稳点。

    下图展示了训练过程中训练数据超分重建的效果图,依次展示epoch=1、60和130时的效果,每张图像共三行,第一行为低分辨率图像,第二行为当前模型重建出的超分图像,第三行为实际的真实原始清晰图像。可以看到,随着迭代次数的增加,超分还原的效果越来越好,到了第99个epoch的时候还原出来的图像已经大幅削弱了块状噪点的影响,图像更加的平滑和清晰。

    三.  SRGAN算法原理和Pytorch实现

    SRResNet算法是一个单模型算法,从图像输入到图像输出中间通过各个卷积模块的操作完成,整个结构比较清晰。但是SRResNet也有不可避免的缺陷,就是它采用了MSE作为最终的目标函数,而这个MSE是直接通过衡量模型输出和真值的像素差异来计算的,SRGAN算法指出,这种目标函数会使得超分重建出的图像过于平滑,尽管PSNR和SSIM值会比较高,但是重建出来的图像并不能够很好的符合人眼主观感受,丢失了细节纹理信息。下面给出一张图来说明SRResNet算法和SRGAN算法超分重建效果的不同之处:

    从图上可以看到,原图因为分辨率较低,产生了模糊并且丢失了大量的细节信息,双线性插值无法有效的去模糊,而SRResNet算法尽管能够一定程度上去除模糊,但是其纹理细节不清晰。最后会发现,SRGAN算法不仅去除了模糊,而且还逼真的重建出了水面上的纹理细节,使得重建的图片视觉上与真值图非常吻合。

    那怎么让模型在纹理细节丢失的情况下“无中生有”的重建出这些信息呢?答案就是生成对抗网络(Generative Adversarial
    Network, GAN)。

    1. 生成对抗网络(GAN)

     GAN的主要灵感来源于博弈论中博弈的思想,应用到深度学习上来说,就是构造两个深度学习模型:生成网络G(Generator)和判别网络D(Discriminator),然后两个模型不断博弈,进而使G生成逼真的图像,而D具有非常强的判断图像真伪的能力。生成网络和判别网络的主要功能是:

    • G是一个生成式的网络,它通过某种特定的网络结构以及目标函数来生成图像;

    • D是一个判别网络,判别一张图片是不是“真实的”,即判断输入的照片是不是由G生成;

    G的作用就是尽可能的生成逼真的图像来迷惑D,使得D判断失败;而D的作用就是尽可能的挖掘G的破绽,来判断图像到底是不是由G生成的“假冒伪劣”。整个过程就好比两个新手下棋博弈,随着对弈盘数的增加,一个迷惑手段越来越高明,而另一个甄别本领也越来越强大,最后,两个新手都变成了高手。这个时候再让G去和其它的人下棋,可以想到G迷惑的本领已经超越了一众普通棋手。

    以上就是GAN算法的原理。运用在图像领域,例如风格迁移,超分重建,图像补全,去噪等,运用GAN可以避免损失函数设计的困难,不管三七二十一,只要有一个基准,直接加上判别器,剩下的就交给对抗训练。相比其他所有模型, GAN可以产生更加清晰,真实的样本。

    2. 感知损失

    为了防止重建图像过度平滑,SRGAN重新定义了损失函数,并将其命名为感知损失(Perceptual loss)。感知损失有两部分构成:

    感知损失=内容损失+对抗损失

    对抗损失就是重建出来的图片被判别器正确判断的损失,这部分内容跟一般的GAN定义相同。SRGAN的一大创新点就是提出了内容损失,SRGAN希望让整个网络在学习的过程中更加关注重建图片和原始图片的语义特征差异,而不是逐个像素之间的颜色亮度差异。以往我们在计算超分重建图像和原始高清图像差异的时候是直接在像素图像上进行比较的,用的MSE准则。SRGAN算法提出者认为这种方式只会过度的让模型去学习这些像素差异,而忽略了重建图像的固有特征。实际的差异计算应该在图像的固有特征上计算。但是这种固有特征怎么表示呢?其实很简单,已经有很多模型专门提出来提取图像固有特征然后进行分类等任务。我们只需要把这些模型中的特征提取模块截取出来,然后去计算重建图像和原始图像的特征,这些特征就是语义特征了,然后再在特征层上进行两幅图像的MSE计算。在众多模型中,SRGAN选用了VGG19模型,其截取的模型命名为truncated_vgg19。所谓模型截断,也就是只提取原始模型的一部分,然后作为一个新的单独的模型进行使用。

    至此重新整理下内容损失计算方式:

    • 通过SRResNet模型重建出高清图像SR;

    • 通过truncated_vgg19模型对原始高清图像H和重建出的高清图像SR分别进行计算,得到两幅图像对应的特征图H_fea和SR_fea;

    • 计算H_fea和SR_fea的MSE值;

    从上述计算方式上看出,原来的计算方式是直接计算H和SR的MSE值,而改用新的内容损失后只需要利用truncated_vgg19模型对图像多作一次推理得到特征图,再在特征图上进行计算。

    3. SRGAN结构剖析

    SRGAN分为两部分:生成器模型(Generator)和判别器模型(Discriminator)。

    生成器模型采用了SRResNet完全一样的结构,只是在计算损失函数时需要利用截断的VGG19模型进行计算。这里注意,截断的VGG19模型只是用来计算图像特征,其本身并不作为一个子模块加在生成器后面。可以将此处的VGG19模型理解为静止的(梯度不更新的),只是用它来计算一下特征而已,其使用与一般的图像滤波器sobel、canny算子等类似。

    判别器模型结构如下所示:

     Pytorch实现

    Pytorch实现沿用前面SRResNet的设计框架。由于SRGAN算法的生成器部分采用的是与SRResNet模型完全一样的结构,因此我们在训练时就可以直接使用前面训练好的SRResNet模型对生成器进行初始化以加快整个算法的收敛。

    代码,模型,数据集获取方式

    关注微信公众号 datayx  然后回复 超分 即可获取。

    AI项目体验地址 https://loveai.tech

    下图分别展示了整个训练过程中内容损失、生成损失和判别损失的变化曲线。

    从上图中可以看到,相对SRResNet的收敛曲线,SRGAN非常不平稳,判别损失和生成损失此消彼长,这说明判别器和生成器正在做着激烈的对抗。一般来说,生成对抗网络相比普通的网络其训练难度更大,我们无法通过查看loss来说明gan训练得怎么样。目前也有不少文献开始尝试解决整个问题,使得GAN算法的训练进程可以更加明显。

    尽管不能从loss损失函数变化曲线上看出训练进程,我们还可以从每次epoch的训练样本重建效果上进行查看。下图分别显示了epoch=1、25和50 部分训练样本重建效果图,第一行为低分辨率图,第二行为超分重建图,第三行为原始高清图。

    从训练图上可以看到,在epoch=50即训练结束的时候,其生成到的超分图已经非常接近原始高清图,重建出的图像视觉感受更加突出,细节较丰富,相比SRResNet的过度平滑,其生成的图像更符合真实场景效果。

    测试效果如下:

    低分辨率证件照测试效果图,从左到右从上到下依次为:原图、bicubic上采样、SRResNet超分重建、SRGAN超分重建


    阅读过本文的人还看了以下文章:

    TensorFlow 2.0深度学习案例实战

    基于40万表格数据集TableBank,用MaskRCNN做表格检测

    《基于深度学习的自然语言处理》中/英PDF

    Deep Learning 中文版初版-周志华团队

    【全套视频课】最全的目标检测算法系列讲解,通俗易懂!

    《美团机器学习实践》_美团算法团队.pdf

    《深度学习入门:基于Python的理论与实现》高清中文PDF+源码

    特征提取与图像处理(第二版).pdf

    python就业班学习视频,从入门到实战项目

    2019最新《PyTorch自然语言处理》英、中文版PDF+源码

    《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码

    《深度学习之pytorch》pdf+附书源码

    PyTorch深度学习快速实战入门《pytorch-handbook》

    【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》

    《Python数据分析与挖掘实战》PDF+完整源码

    汽车行业完整知识图谱项目实战视频(全23课)

    李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材

    笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!

    《神经网络与深度学习》最新2018版中英PDF+源码

    将机器学习模型部署为REST API

    FashionAI服装属性标签图像识别Top1-5方案分享

    重要开源!CNN-RNN-CTC 实现手写汉字识别

    yolo3 检测出图像中的不规则汉字

    同样是机器学习算法工程师,你的面试为什么过不了?

    前海征信大数据算法:风险概率预测

    【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类

    VGG16迁移学习,实现医学图像识别分类工程项目

    特征工程(一)

    特征工程(二) :文本数据的展开、过滤和分块

    特征工程(三):特征缩放,从词袋到 TF-IDF

    特征工程(四): 类别特征

    特征工程(五): PCA 降维

    特征工程(六): 非线性特征提取和模型堆叠

    特征工程(七):图像特征提取和深度学习

    如何利用全新的决策树集成级联结构gcForest做特征工程并打分?

    Machine Learning Yearning 中文翻译稿

    蚂蚁金服2018秋招-算法工程师(共四面)通过

    全球AI挑战-场景分类的比赛源码(多模型融合)

    斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

    python+flask搭建CNN在线识别手写中文网站

    中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程

    不断更新资源

    深度学习、机器学习、数据分析、python

     搜索公众号添加: datayx  


    机大数据技术与机器学习工程

     搜索公众号添加: datanlp

    长按图片,识别二维码

    展开全文
  • 鸟哥的博客,PHP7达到最高性能的几个Tips。 第一点: 那么,为什么开启opcache会提高性能。 先阐述三个概念: ...CGI本身只能解析请求,返回结果。...来一个请求就回fork一个子进程。 2.真正解析PH...
  • div高度设置100%无效的问题

    千次阅读 2019-08-06 15:13:00
    今天遇到一个问题,给div设置高度 height: 100%;却没有生效,在f12审查元素的时候可以看到高度字占据了半屏,并没有占据100%全屏,也就是说,div高度设置100%无效。...错误原因,根本在于没有浏览器是计算元素...
  • 第一讲:性能计算基础知识讲解

    千次阅读 2019-12-29 17:09:57
    回顾过去15年,HPC一直是增长最快的IT市场之一,其增长速度有时甚至超过了...首先,我们从性能计算概念开始,逐步深入到技术细节,掌握HPC关键技术和方案选型、设计等综合能力。 什么是性能计算,涉及哪些...
  • 多少个子序列? 一、分析枚举的效率 二、初步优化 问题三:怎么用对称轴向两边扩的方法找到偶回文?(容易操作的) 那么请问,加进去的符号,有什么要求么?是不是必须在原字符中没出现过?请思考 小结: 三、...
  • 这是Baell等人在2010年基于六个不同靶点通量筛选实验结果,并将其中频繁出现(≥4次)的化合物和相关结构总结为包含480个子结构的筛选规则。但这类规则主要针对的是化学易反应化合物,且PAINS规则本身也有很大局限...
  • 多元化集团尽管在数据分析赛道是难度系数项目,但其数字化管控道路依然有路可循,目前也有不少多元化集团在数字化管控探索并取得成功。
  • java 包 和 resource 包 不会自动颜色,因为这个问题我们班好多人也有,自己也保存一下问题解决方法。   首先,引发这个问题是因为创建了子工程,但是有可能马虎,或者种种原因,造成工程创建错误,需要删除...
  • 超硬核!数据结构学霸笔记,考试面试吹牛就靠它

    万次阅读 多人点赞 2021-03-26 11:11:21
    那数据量1000,一般O(N*N)就差不多了,数据量更小就可以用复杂度更的算法。大概就这样估算。 当 n 很大时,指数阶算法和多项式阶算法在所需时间上非常 悬殊。因此,只要有人能将现有指数阶算法中的任何一个算法化 ...
  • 必须知道的python专属骚技巧25例

    万次阅读 多人点赞 2021-03-16 11:17:43
    >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81] map()作为阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,...
  • 可用性能并发量解决方案汇总整理

    千次阅读 多人点赞 2018-10-30 14:21:50
    网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很的要求,已经不是原来...
  • 超硬核!操作系统学霸笔记,考试复习面试全靠它

    万次阅读 多人点赞 2021-03-22 18:43:49
    2)引入的原因: 终端用户的需要:当终端用户想要暂停自己程序的运行的时候 父进程请求:当父进程想要挂起某个子进程的时候 负荷调节的需要:当实时系统中的工作负荷较重,系统可以将某些不重要的进程挂起,保证...
  • 超硬核!兔兔阿里p7学长给的面试知识库

    万次阅读 多人点赞 2021-05-26 22:14:07
    我统计了BAT笔试面试出现频率最高的五道题,学会了总能碰到一道 当年,学姐把这份Java总结给我,我在22k的校招王者局乱杀 超硬核万字!web前端学霸笔记 面试经验系列历史文章: 这个系列离结束差的还特别多,会...
  • 超硬核!小白读了这篇文章,就能在算法圈混了

    万次阅读 多人点赞 2021-03-29 10:21:58
    我想到了另一个理论:猴子理论,只要一只猴子一直敲打计算机,理论上会有一天,它能敲出一本圣经出来,但是这个概率小到宇宙毁灭也很难敲出来。。 真的不知道这个排序应该叫做天才还是垃圾哈哈哈,但是闲的...
  • 面试官:为啥加了索引查询会快?

    万次阅读 多人点赞 2020-07-05 23:56:59
    果子:在需要查询的列上加索引 面试官:那你知道为什么加索引可以查询快吗? 果子:。。。思考中。。。 今天我们就来聊一聊,为什么加了索引查询会快? 什么是索引? 在关系数据库中,索引是一种单独的、物理...
  • 牛逼!Java 从入门到精通,超全汇总版

    万次阅读 多人点赞 2021-05-06 19:40:33
    文章目录Java 基础Head First JavaJava 核心技术卷一...Java 虚拟机Java 虚拟机规范HotSpot 实战自己动手写 Java 虚拟机MySQLMySQL 基础教程SQL 基础教程深入浅出 MySQLMySQL 必知必会SQL 必知必会性能 MySQLMySQL
  • 但是,这会导致数据集中原有的小目标小,导致模型的泛化性能下降。 Backbone部分主要由CSP模块组成,通过CSPDarknet53进行特征提取。 在Neck中使用FPN和路径聚合网络(PANet)来聚合该阶段的图像特征。 最后,网络...
  • 在增长完服务链路之后,还要尽量的缩短访问链路,比如可以在CDN层面就返回的就尽量不要继续往下走了,如果可以在缓存层面返回的就不要去访问数据库了,尽可能地每次的访问链路短,可以一步解决的事情就一步解决...
  • Redis--慢原因及排查方法

    万次阅读 2020-05-18 00:22:03
    Redis速度是很快的,性能很。但是,Redis有时候会存在执行很慢、性能很差的情况。本文介绍Redis为什么会慢、解决方案。 Redis是单线程操作,如果在Redis中执行耗时较长的操作,就会阻塞其他请求了。 Redis客户端...
  • .NET应用秒微服务

    万次阅读 2018-06-05 09:10:09
    对业务代码0侵入,因此不需要考虑SDK和应用如何结合,不存在较的学习曲线和耗费较长的开发周期。这种作为基础设施层服务的存在,称为ServiceMesh。通过ServiceMesh,类似.NET或NodeJS等常见的Web应用不用考虑语言...
  • Netty:性能、可用的NIO通信框架

    千次阅读 2017-11-29 14:14:36
    Netty:性能、可用的NIO通信框架前言最近在做老钥匙箱的重构,一个要解决的关键问题是:如何一台服务器同时支撑成千上万个tcp长连接?老的钥匙箱项目基于jdk的bio通信,一直以来,存在内存占用过多、CPU使用率...
  • 上面我们有说到子网这个关键词,实际上我们所处的网络,是由无数个子网络构成的。广播的时候,也只有同一个子网里面的计算机能够收到。 假如没有子网这种划分的话,计算机 A 通过广播的方式发一个数据包给计算机 B...
  • 本文根据DBAplus社群第74期线上分享整理而成,文末...大家好,关于性能并发服务这个概念大家应该也都比较熟悉了,今天我主要是想讲一下对于如何做一个性能并发服务架构的一些自己的思考。本次分享主要包括三...
  • B树最大高度推导

    千次阅读 2019-12-31 20:51:32
    的很矮,就需要每一层节点最多,他充实起来 节点个数 层数 1 0 m 1 m 2 m^2 m 2 2 m 3 m^3 m 3 3 … m h − 1 m^{h-1} m h − 1 h-1 ...
  • 风险评估首先要确定资产的重要性,由于该U盘中存储有核心数据,安全性要求,因此该U盘重要性赋值就 B.如果公司制定了U盘的安全使用制度,小张的U盘就不具有脆弱性 C.如果小张的计算机在接入U盘时没断网线,木马...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,642
精华内容 44,656
关键字:

如何让个子变高