使用飞桨PaddlePaddle复现用于图像光源处理的深度重照明网络(DRN)

article/2025/9/24 4:20:17

使用飞桨PaddlePaddle复现用于图像光源处理的深度重照明网络(DRN)

  • 一、效果展示
  • 二、实现思路
    • 冠军模型:Wavelet Decomposed RelightNet (WDRN)
    • 经典模型:Norm-Relighting-U-Net (NRUNet)
    • 本次项目:Deep Relighting Network (DRN)
  • 三、模型结构复现
    • 1.DRN的大架构
    • 2.场景再转换网络
      • 卷积块
      • 反卷积块
      • 下采样模块
      • 残差块
      • 上采样模块
      • 将上述模块组装成场景再转换网络
      • 查看场景再转换网络结构
    • 3.阴影先验估计网络
      • 查看阴影先验估计网络结构
    • 4.阴影区鉴别器——重新渲染
    • 5.将上述模块组装成DRN
    • 6.查看DRN网络结构
  • 四、数据准备
    • 1.解压数据集
    • 2.数据集定义
    • 3.展示训练数据
  • 五、模型训练
    • 保存模型
  • 六、总结与展望
  • 个人简介

基于深度学习的图像重照明实践是“AI大陆”上实践类系列课程之一,项目实现任务为图像重照明,是人工智能计算机视觉图像处理领域的一个典型的图像增强任务。

本项目来源于“AIM 2020 Relighting Challenge Track 1 one-to-one relighting”,是一个图像处理类的国际挑战赛的一个子任务。AIM全称为Advances in Image Manipulation,由苏黎世联邦理工学院(ETH Zurich, Switzerland)主办,吸引了国内外80余支队伍参赛,受到了工业界中华为、高通、英伟达、谷歌等国际科技企业的资助。该竞赛今年共设有16个赛道,涵盖了图像、视频处理的多个热门研究方向。重光照技术广泛应用于增强现实、视觉特效和光照补偿中,该项技术的进步将极大促进计算机视觉与计算机图形学的发展。

本项目的主讲老师是中科院自动化研究所助研李成华老师,在成华老师的指导下,我基于飞桨PaddlePaddle复现深度重照明网络(DRN)

参考资料:

  • AI-Talks:入门级竞赛全流程讲解
  • b站:基于深度学习的图像重照明实践
  • CSDN:基于深度学习的图像重照明实践学习笔记
  • GitHub:Deep Relighting Network (DRN) for Image Light Source Manipulation

一、效果展示

图像重照明任务一般是给定一个输入图片,输出一个重照明后的图片,重照明就是说输出的图片中场景光照效果不同了。图像重照明相当于重新生成了一个图片,只是通过人工智能算法改变了输入图像中的像素值的大小,使得像素的亮度发生规律性的改变,整体看起来就是图像场景的光照发生了变化。

左边是输入,右边是模型输出,多看几张对比我们可以发现:

  1. 模型输出的图片清晰度相对输入图片来说较低,大部分图片都有一种模糊的感觉,特别是对应原图中的黑色区域会更加模糊,视觉体验极其不好;
  2. 从场景照明光源位置来看,基本发生了一致性的变化,比如输入图片场景的光源都是在正北方向(North),输出图片场景的光源都是在正东方向(East);
  3. 从场景照明光线色温来看,基本发生了比较一致性的变化,比如输入图片场景的色温偏冷色,输出图片场景的色温偏暖色。

二、实现思路

物体和光源的相对位置不同,所呈现出的阴影不同,如下图所示:

我们的目标是将输入图像从一组预定义的照明设置转换为另一组预定义的照明设置(光源位置的改变)。

大体上来说就是将输入图片放入我们的“黑盒”中从而得到输出图片,而这个“黑盒”就是我们所使用的模型(Neural Network),"黑盒"中则有着大量的参数需要我们去通过输入输出进行调整( W 1 W_1 W1 W 2 W_2 W2等),这也就是我们所常说的模型训练过程。

冠军模型:Wavelet Decomposed RelightNet (WDRN)

对应论文:WDRN : A Wavelet Decomposed RelightNet for Image Relighting

经典模型:Norm-Relighting-U-Net (NRUNet)

对应论文:AIM 2020: Scene Relighting and Illumination Estimation Challenge

本次项目:Deep Relighting Network (DRN)

对应GitHub仓库:Deep Relighting Network (DRN) for Image Light Source Manipulation

三、模型结构复现

将代码与论文里的模型结构一一对应:

Deep Relighting Networks for Image Light Source Manipulation

  • 论文地址:https://arxiv.org/abs/2008.08298
  • 代码仓库:https://github.com/WangLiwen1994/DeepRelight

1.DRN的大架构

以上是DRN的作者开源的用pytorch实现的代码,将代码与图片结合,思路就变得非常清晰了:

  1. 将输入图片分别送入场景再转换网络和阴影先验估计网络
  2. 把以上两个网络的输出进行重新渲染并得到输出结果

所以其实只要弄清楚这三者分别是怎么做的,DRN就能很快地搭建出来,论文里也详细说明了场景再转换网络、阴影先验估计网络和重新渲染是怎么实现的,下面用飞桨PaddlePaddle进行复现。

2.场景再转换网络

场景重构的目的是从图像中提取图像的固有结构信息,从而消除光照效应。

这是一个类似于Pix2Pix的自动编码器结构,如上图所示,该网络采用具有跳接的自动编码器结构来将浅特征传输到端部。首先,对输入图像进行下采样(由图中的“DBP”执行),以此找到场景的区别特征。在每次下采样过程之后,通道将加倍,以尽可能地保留信息。这些特征具有较大的感受野,包含了大量的全局信息,有利于光照估计和操纵。接下来,向上四个块采样(由图中的“UBP”操作)将特征映射回原始大小。最后特征映射进一步与由卷积层作用的特征选择过程聚合,卷积层将通道从64减少到32。

下面用PaddlePaddle实现这一过程:

# 导入必要的库
import paddle
import paddle.nn as nn

卷积块

场景再转换网络中,无论是下采样还是上采样的过程,都使用了卷积的操作,这里对卷积的操作做了小小的优化。

# 卷积块
class ConvBlock(nn.Layer):def __init__(self, input_size, output_size, kernel_size, stride, padding, bias=True, isuseBN=True, groups=1):super(ConvBlock, self).__init__()self.isuseBN = isuseBNself.conv = nn.Conv2D(input_size, output_size, kernel_size, stride, padding, bias_attr=bias,groups=groups)if self.isuseBN:self.bn = nn.InstanceNorm2D(output_size)self.act = nn.ReLU()def forward(self, x):out = self.conv(x)if self.isuseBN:out = self.bn(out)out = self.act(out)return out

反卷积块

场景再转换网络中,无论是下采样还是上采样的过程,都使用了反卷积的操作,这里对反卷积的操作做了小小的优化。

# 反卷积块
class DeconvBlock(nn.Layer):def __init__(self, input_size, output_size, kernel_size, stride, padding, isuseBN=True, bias=True):super(DeconvBlock, self).__init__()self.isuseBN = isuseBNself.deconv = nn.Conv2DTranspose(input_size, output_size, kernel_size, stride, padding, bias_attr=bias)if self.isuseBN:self.bn = nn.InstanceNorm2D(output_size)self.act = nn.ReLU()def forward(self, x):out = self.deconv(x)if self.isuseBN:out = self.bn(out)return self.act(out)

下采样模块

下采样其实是一种信息降维,可以起到简化问题的作用。

# 下采样模块
class DownBlock(nn.Layer):def __init__(self, input_size):super(DownBlock, self).__init__()output_size = input_size*2self.conv1 = ConvBlock(input_size, output_size, kernel_size=3, stride=2, padding=1, bias=True)self.conv2 = DeconvBlock(output_size, output_size, kernel_size=4, stride=2, padding=1, bias=True)self.conv3 = ConvBlock(output_size, output_size, kernel_size=3, stride=2, padding=1, bias=True)self.local_weight1 = ConvBlock(input_size, output_size, kernel_size=1, stride=1, padding=0, bias=True)self.local_weight2 = ConvBlock(output_size, output_size, kernel_size=1, stride=1, padding=0, bias=True)def forward(self, x):lr = self.conv1(x)hr = self.conv2(lr)residue = self.local_weight1(x) - hrl_residue = self.conv3(residue)lr_weight = self.local_weight2(lr)return lr_weight + l_residue

残差块

在上采样之前,作者将下采样的结果送入残差块。

class ResnetBlock(nn.Layer):def __init__(self, dim, padding_type, norm_layer, activation=nn.ReLU(), use_dropout=False):super(ResnetBlock, self).__init__()self.conv_block = self.build_conv_block(dim, padding_type, norm_layer, activation, use_dropout)def build_conv_block(self, dim, padding_type, norm_layer, activation, use_dropout):conv_block = []p = 0if (padding_type == 'reflect') or (padding_type == 'replicate'):conv_block += [nn.Pad2D([1, 1, 1, 1], mode=padding_type)]elif padding_type == 'zero':p = 1else:raise NotImplementedError('padding [%s] is not implemented' % padding_type)conv_block += [nn.Conv2D(dim, dim, kernel_size=3, padding=p),norm_layer(dim),activation]if use_dropout:conv_block += [nn.Dropout(0.5)]p = 0if (padding_type == 'reflect') or (padding_type == 'replicate'):conv_block += [nn.Pad2D([1, 1, 1, 1], mode=padding_type)]elif padding_type == 'zero':p = 1else:raise NotImplementedError('padding [%s] is not implemented' % padding_type)conv_block += [nn.Conv2D(dim, dim, kernel_size=3, padding=p),norm_layer(dim)]return nn.Sequential(*conv_block)def forward(self, x):out = x + self.conv_block(x)return out

上采样模块

使用上采样将特征映射回原始大小。

# 上采样模块
class UpBlock(nn.Layer):def __init__(self, input_size):super(UpBlock, self).__init__()output_size = input_size//2self.conv1 = DeconvBlock(input_size, output_size, kernel_size=4, stride=2, padding=1, bias=True)self.conv2 = ConvBlock(output_size, output_size, kernel_size=3, stride=2, padding=1, bias=True)self.conv3 = DeconvBlock(output_size, output_size, kernel_size=4, stride=2, padding=1, bias=True)self.local_weight1 = ConvBlock(input_size, output_size, kernel_size=1, stride=1, padding=0, bias=True)self.local_weight2 = ConvBlock(output_size, output_size, kernel_size=1, stride=1, padding=0, bias=True)def forward(self, x):hr = self.conv1(x)lr = self.conv2(hr)residue = self.local_weight1(x) - lrh_residue = self.conv3(residue)hr_weight = self.local_weight2(hr)return hr_weight + h_residue

将上述模块组装成场景再转换网络

import paddle.nn as nnclass BP_HDR(nn.Layer):def __init__(self, input_nc, output_nc, ngf=64, n_downsampling=4, n_blocks=9, norm_layer=nn.BatchNorm2D, padding_type='reflect'):assert (n_blocks >= 0)super(BP_HDR, self).__init__()activation = nn.ReLU()self.inlayer = nn.Sequential(nn.Pad2D([3, 3, 3, 3], mode=padding_type), nn.Conv2D(input_nc, ngf, kernel_size=7, padding=0), norm_layer(ngf), activation)### downsampleself.encoder = nn.Sequential()for i in range(n_downsampling):mult = 2 ** iself.encoder.add_sublayer(str(i), DownBlock(ngf * mult))### resnet blocksself.manipulate = nn.Sequential()mult = 2 ** n_downsamplingfor i in range(n_blocks):self.manipulate.add_sublayer(str(i), ResnetBlock(ngf * mult, padding_type=padding_type, activation=activation, norm_layer=norm_layer))### upsampleself.decoder = nn.Sequential()for i in range(n_downsampling):mult = 2 ** (n_downsampling - i)self.decoder.add_sublayer(str(i), UpBlock(ngf * mult))self.shortconect = nn.Sequential(nn.Pad2D([1, 1, 1, 1], mode=padding_type), nn.Conv2D(ngf*2, ngf, kernel_size=3, padding=0), nn.ReLU())def forward(self, input):m_in = self.inlayer(input)m = self.encoder(m_in)m = self.manipulate(m)m = self.decoder(m)m = paddle.concat([m_in,m], axis=1)m = self.shortconect(m)return m

查看场景再转换网络结构

model = BP_HDR(3, 32)
paddle.summary(model, (1, 3, 512, 512))
------------------------------------------------------------------------------Layer (type)        Input Shape          Output Shape         Param #    
==============================================================================Pad2D-121       [[1, 3, 512, 512]]    [1, 3, 518, 518]          0       Conv2D-289      [[1, 3, 518, 518]]   [1, 64, 512, 512]        9,472     BatchNorm2D-115   [[1, 64, 512, 512]]   [1, 64, 512, 512]         256      ReLU-255      [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Conv2D-290     [[1, 64, 512, 512]]   [1, 128, 256, 256]      73,856     
InstanceNorm2D-241 [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-256      [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-169    [[1, 64, 512, 512]]   [1, 128, 256, 256]         0       
Conv2DTranspose-73 [[1, 128, 256, 256]]  [1, 128, 512, 512]      262,272    
InstanceNorm2D-242 [[1, 128, 512, 512]]  [1, 128, 512, 512]        256      ReLU-257      [[1, 128, 512, 512]]  [1, 128, 512, 512]         0       DeconvBlock-73   [[1, 128, 256, 256]]  [1, 128, 512, 512]         0       Conv2D-292     [[1, 64, 512, 512]]   [1, 128, 512, 512]       8,320     
InstanceNorm2D-244 [[1, 128, 512, 512]]  [1, 128, 512, 512]        256      ReLU-259      [[1, 128, 512, 512]]  [1, 128, 512, 512]         0       ConvBlock-171    [[1, 64, 512, 512]]   [1, 128, 512, 512]         0       Conv2D-291     [[1, 128, 512, 512]]  [1, 128, 256, 256]      147,584    
InstanceNorm2D-243 [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-258      [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-170    [[1, 128, 512, 512]]  [1, 128, 256, 256]         0       Conv2D-293     [[1, 128, 256, 256]]  [1, 128, 256, 256]      16,512     
InstanceNorm2D-245 [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-260      [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-172    [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       DownBlock-25    [[1, 64, 512, 512]]   [1, 128, 256, 256]         0       Conv2D-294     [[1, 128, 256, 256]]  [1, 256, 128, 128]      295,168    
InstanceNorm2D-246 [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-261      [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-173    [[1, 128, 256, 256]]  [1, 256, 128, 128]         0       
Conv2DTranspose-74 [[1, 256, 128, 128]]  [1, 256, 256, 256]     1,048,832   
InstanceNorm2D-247 [[1, 256, 256, 256]]  [1, 256, 256, 256]        512      ReLU-262      [[1, 256, 256, 256]]  [1, 256, 256, 256]         0       DeconvBlock-74   [[1, 256, 128, 128]]  [1, 256, 256, 256]         0       Conv2D-296     [[1, 128, 256, 256]]  [1, 256, 256, 256]      33,024     
InstanceNorm2D-249 [[1, 256, 256, 256]]  [1, 256, 256, 256]        512      ReLU-264      [[1, 256, 256, 256]]  [1, 256, 256, 256]         0       ConvBlock-175    [[1, 128, 256, 256]]  [1, 256, 256, 256]         0       Conv2D-295     [[1, 256, 256, 256]]  [1, 256, 128, 128]      590,080    
InstanceNorm2D-248 [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-263      [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-174    [[1, 256, 256, 256]]  [1, 256, 128, 128]         0       Conv2D-297     [[1, 256, 128, 128]]  [1, 256, 128, 128]      65,792     
InstanceNorm2D-250 [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-265      [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-176    [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       DownBlock-26    [[1, 128, 256, 256]]  [1, 256, 128, 128]         0       Conv2D-298     [[1, 256, 128, 128]]   [1, 512, 64, 64]      1,180,160   
InstanceNorm2D-251  [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-266       [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-177    [[1, 256, 128, 128]]   [1, 512, 64, 64]          0       
Conv2DTranspose-75  [[1, 512, 64, 64]]   [1, 512, 128, 128]     4,194,816   
InstanceNorm2D-252 [[1, 512, 128, 128]]  [1, 512, 128, 128]       1,024     ReLU-267      [[1, 512, 128, 128]]  [1, 512, 128, 128]         0       DeconvBlock-75    [[1, 512, 64, 64]]   [1, 512, 128, 128]         0       Conv2D-300     [[1, 256, 128, 128]]  [1, 512, 128, 128]      131,584    
InstanceNorm2D-254 [[1, 512, 128, 128]]  [1, 512, 128, 128]       1,024     ReLU-269      [[1, 512, 128, 128]]  [1, 512, 128, 128]         0       ConvBlock-179    [[1, 256, 128, 128]]  [1, 512, 128, 128]         0       Conv2D-299     [[1, 512, 128, 128]]   [1, 512, 64, 64]      2,359,808   
InstanceNorm2D-253  [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-268       [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-178    [[1, 512, 128, 128]]   [1, 512, 64, 64]          0       Conv2D-301      [[1, 512, 64, 64]]    [1, 512, 64, 64]       262,656    
InstanceNorm2D-255  [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-270       [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-180     [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       DownBlock-27    [[1, 256, 128, 128]]   [1, 512, 64, 64]          0       Conv2D-302      [[1, 512, 64, 64]]   [1, 1024, 32, 32]      4,719,616   
InstanceNorm2D-256 [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        2,048     ReLU-271      [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       ConvBlock-181     [[1, 512, 64, 64]]   [1, 1024, 32, 32]          0       
Conv2DTranspose-76 [[1, 1024, 32, 32]]   [1, 1024, 64, 64]     16,778,240   
InstanceNorm2D-257 [[1, 1024, 64, 64]]   [1, 1024, 64, 64]        2,048     ReLU-272      [[1, 1024, 64, 64]]   [1, 1024, 64, 64]          0       DeconvBlock-76   [[1, 1024, 32, 32]]   [1, 1024, 64, 64]          0       Conv2D-304      [[1, 512, 64, 64]]   [1, 1024, 64, 64]       525,312    
InstanceNorm2D-259 [[1, 1024, 64, 64]]   [1, 1024, 64, 64]        2,048     ReLU-274      [[1, 1024, 64, 64]]   [1, 1024, 64, 64]          0       ConvBlock-183     [[1, 512, 64, 64]]   [1, 1024, 64, 64]          0       Conv2D-303     [[1, 1024, 64, 64]]   [1, 1024, 32, 32]      9,438,208   
InstanceNorm2D-258 [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        2,048     ReLU-273      [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       ConvBlock-182    [[1, 1024, 64, 64]]   [1, 1024, 32, 32]          0       Conv2D-305     [[1, 1024, 32, 32]]   [1, 1024, 32, 32]      1,049,600   
InstanceNorm2D-260 [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        2,048     ReLU-275      [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       ConvBlock-184    [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       DownBlock-28     [[1, 512, 64, 64]]   [1, 1024, 32, 32]          0       Pad2D-122      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-306     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-116   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-123      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-307     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-117   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-55   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-124      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-308     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-118   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-125      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-309     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-119   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-56   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-126      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-310     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-120   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-127      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-311     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-121   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-57   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-128      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-312     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-122   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-129      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-313     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-123   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-58   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-130      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-314     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-124   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-131      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-315     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-125   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-59   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-132      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-316     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-126   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-133      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-317     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-127   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-60   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-134      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-318     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-128   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-135      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-319     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-129   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-61   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-136      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-320     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-130   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-137      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-321     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-131   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-62   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-138      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-322     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-132   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-139      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-323     [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-133   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-63   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       
Conv2DTranspose-77 [[1, 1024, 32, 32]]    [1, 512, 64, 64]      8,389,120   
InstanceNorm2D-261  [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-276       [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       DeconvBlock-77   [[1, 1024, 32, 32]]    [1, 512, 64, 64]          0       Conv2D-324      [[1, 512, 64, 64]]    [1, 512, 32, 32]      2,359,808   
InstanceNorm2D-262  [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-277       [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-185     [[1, 512, 64, 64]]    [1, 512, 32, 32]          0       Conv2D-325     [[1, 1024, 32, 32]]    [1, 512, 32, 32]       524,800    
InstanceNorm2D-264  [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-279       [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-186    [[1, 1024, 32, 32]]    [1, 512, 32, 32]          0       
Conv2DTranspose-78  [[1, 512, 32, 32]]    [1, 512, 64, 64]      4,194,816   
InstanceNorm2D-263  [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-278       [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       DeconvBlock-78    [[1, 512, 32, 32]]    [1, 512, 64, 64]          0       Conv2D-326      [[1, 512, 64, 64]]    [1, 512, 64, 64]       262,656    
InstanceNorm2D-265  [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-280       [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-187     [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       UpBlock-25     [[1, 1024, 32, 32]]    [1, 512, 64, 64]          0       
Conv2DTranspose-79  [[1, 512, 64, 64]]   [1, 256, 128, 128]     2,097,408   
InstanceNorm2D-266 [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-281      [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       DeconvBlock-79    [[1, 512, 64, 64]]   [1, 256, 128, 128]         0       Conv2D-327     [[1, 256, 128, 128]]   [1, 256, 64, 64]       590,080    
InstanceNorm2D-267  [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-282       [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-188    [[1, 256, 128, 128]]   [1, 256, 64, 64]          0       Conv2D-328      [[1, 512, 64, 64]]    [1, 256, 64, 64]       131,328    
InstanceNorm2D-269  [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-284       [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-189     [[1, 512, 64, 64]]    [1, 256, 64, 64]          0       
Conv2DTranspose-80  [[1, 256, 64, 64]]   [1, 256, 128, 128]     1,048,832   
InstanceNorm2D-268 [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-283      [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       DeconvBlock-80    [[1, 256, 64, 64]]   [1, 256, 128, 128]         0       Conv2D-329     [[1, 256, 128, 128]]  [1, 256, 128, 128]      65,792     
InstanceNorm2D-270 [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-285      [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-190    [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       UpBlock-26      [[1, 512, 64, 64]]   [1, 256, 128, 128]         0       
Conv2DTranspose-81 [[1, 256, 128, 128]]  [1, 128, 256, 256]      524,416    
InstanceNorm2D-271 [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-286      [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       DeconvBlock-81   [[1, 256, 128, 128]]  [1, 128, 256, 256]         0       Conv2D-330     [[1, 128, 256, 256]]  [1, 128, 128, 128]      147,584    
InstanceNorm2D-272 [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-287      [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-191    [[1, 128, 256, 256]]  [1, 128, 128, 128]         0       Conv2D-331     [[1, 256, 128, 128]]  [1, 128, 128, 128]      32,896     
InstanceNorm2D-274 [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-289      [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-192    [[1, 256, 128, 128]]  [1, 128, 128, 128]         0       
Conv2DTranspose-82 [[1, 128, 128, 128]]  [1, 128, 256, 256]      262,272    
InstanceNorm2D-273 [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-288      [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       DeconvBlock-82   [[1, 128, 128, 128]]  [1, 128, 256, 256]         0       Conv2D-332     [[1, 128, 256, 256]]  [1, 128, 256, 256]      16,512     
InstanceNorm2D-275 [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-290      [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-193    [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       UpBlock-27     [[1, 256, 128, 128]]  [1, 128, 256, 256]         0       
Conv2DTranspose-83 [[1, 128, 256, 256]]  [1, 64, 512, 512]       131,136    
InstanceNorm2D-276 [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-291      [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       DeconvBlock-83   [[1, 128, 256, 256]]  [1, 64, 512, 512]          0       Conv2D-333     [[1, 64, 512, 512]]   [1, 64, 256, 256]       36,928     
InstanceNorm2D-277 [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-292      [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-194    [[1, 64, 512, 512]]   [1, 64, 256, 256]          0       Conv2D-334     [[1, 128, 256, 256]]  [1, 64, 256, 256]        8,256     
InstanceNorm2D-279 [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-294      [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-195    [[1, 128, 256, 256]]  [1, 64, 256, 256]          0       
Conv2DTranspose-84 [[1, 64, 256, 256]]   [1, 64, 512, 512]       65,600     
InstanceNorm2D-278 [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-293      [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       DeconvBlock-84   [[1, 64, 256, 256]]   [1, 64, 512, 512]          0       Conv2D-335     [[1, 64, 512, 512]]   [1, 64, 512, 512]        4,160     
InstanceNorm2D-280 [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-295      [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       ConvBlock-196    [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       UpBlock-28     [[1, 128, 256, 256]]  [1, 64, 512, 512]          0       Pad2D-140      [[1, 128, 512, 512]]  [1, 128, 514, 514]         0       Conv2D-336     [[1, 128, 514, 514]]  [1, 64, 512, 512]       73,792     ReLU-296      [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       
==============================================================================
Total params: 234,149,632
Trainable params: 234,075,648
Non-trainable params: 73,984
------------------------------------------------------------------------------
Input size (MB): 3.00
Forward/backward pass size (MB): 10306.71
Params size (MB): 893.21
Estimated Total Size (MB): 11202.92
------------------------------------------------------------------------------{'total_params': 234149632, 'trainable_params': 234075648}

3.阴影先验估计网络

不同的光源会产生不同的灯光效果,例如,产生不同的阴影和色温。为了产生目标光源的光效,作者设计了一种阴影先验估计网络,其结构如下图所示。

该网络采用与场景再转换网络类似的结构。

具体来说,有三大修改:

  1. 阴影先验估计网络放弃了跳跃连接,因为网络更加关注全局光效应。跳转连接直接将局部特征引入到输出中,使得网络对全局变化的学习变得迟钝。
  2. 它有另一个鉴别器,集中在阴影区域。
  3. 地面真目标是目标光源下的图像。

下面用PaddlePaddle实现这一过程:

import paddle.nn as nnclass BP_Light(nn.Layer):def __init__(self, input_nc, output_nc, ngf=64, n_downsampling=4, n_blocks=9, norm_layer=nn.BatchNorm2D, padding_type='reflect'):assert (n_blocks >= 0)super(BP_Light, self).__init__()activation = nn.ReLU()self.inlayer = nn.Sequential(nn.Pad2D([3, 3, 3, 3], mode=padding_type), nn.Conv2D(input_nc, ngf, kernel_size=7, padding=0), norm_layer(ngf), activation)### downsampleself.encoder = nn.Sequential()for i in range(n_downsampling):mult = 2 ** iself.encoder.add_sublayer(str(i), DownBlock(ngf * mult))### resnet blocksself.manipulate = nn.Sequential()mult = 2 ** n_downsamplingfor i in range(n_blocks):self.manipulate.add_sublayer(str(i), ResnetBlock(ngf * mult, padding_type=padding_type, activation=activation, norm_layer=norm_layer))### upsampleself.decoder = nn.Sequential()for i in range(n_downsampling):mult = 2 ** (n_downsampling - i)self.decoder.add_sublayer(str(i), UpBlock(ngf * mult))self.decoder.add_sublayer("dpad", nn.Pad2D([3, 3, 3, 3], mode=padding_type))self.decoder.add_sublayer("dconv", nn.Conv2D(ngf, output_nc, kernel_size=7, padding=0))self.decoder.add_sublayer("dtanh", nn.Tanh())def forward(self, input):m = self.inlayer(input)m = self.encoder(m)m = self.manipulate(m)for idx, layer in enumerate(self.decoder):m = layer(m)if idx == 3:breakreturn m

查看阴影先验估计网络结构

model = BP_Light(3, 32)
paddle.summary(model, (1, 3, 512, 512))
-------------------------------------------------------------------------------Layer (type)         Input Shape          Output Shape         Param #    
===============================================================================Pad2D-221       [[1, 3, 512, 512]]    [1, 3, 518, 518]          0       Conv2D-518       [[1, 3, 518, 518]]   [1, 64, 512, 512]        9,472     BatchNorm2D-210   [[1, 64, 512, 512]]   [1, 64, 512, 512]         256      ReLU-447       [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Conv2D-519      [[1, 64, 512, 512]]   [1, 128, 256, 256]      73,856     
InstanceNorm2D-426  [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-448       [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-300    [[1, 64, 512, 512]]   [1, 128, 256, 256]         0       
Conv2DTranspose-127 [[1, 128, 256, 256]]  [1, 128, 512, 512]      262,272    
InstanceNorm2D-427  [[1, 128, 512, 512]]  [1, 128, 512, 512]        256      ReLU-449       [[1, 128, 512, 512]]  [1, 128, 512, 512]         0       DeconvBlock-127   [[1, 128, 256, 256]]  [1, 128, 512, 512]         0       Conv2D-521      [[1, 64, 512, 512]]   [1, 128, 512, 512]       8,320     
InstanceNorm2D-429  [[1, 128, 512, 512]]  [1, 128, 512, 512]        256      ReLU-451       [[1, 128, 512, 512]]  [1, 128, 512, 512]         0       ConvBlock-302    [[1, 64, 512, 512]]   [1, 128, 512, 512]         0       Conv2D-520      [[1, 128, 512, 512]]  [1, 128, 256, 256]      147,584    
InstanceNorm2D-428  [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-450       [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-301    [[1, 128, 512, 512]]  [1, 128, 256, 256]         0       Conv2D-522      [[1, 128, 256, 256]]  [1, 128, 256, 256]      16,512     
InstanceNorm2D-430  [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-452       [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-303    [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       DownBlock-45     [[1, 64, 512, 512]]   [1, 128, 256, 256]         0       Conv2D-523      [[1, 128, 256, 256]]  [1, 256, 128, 128]      295,168    
InstanceNorm2D-431  [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-453       [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-304    [[1, 128, 256, 256]]  [1, 256, 128, 128]         0       
Conv2DTranspose-128 [[1, 256, 128, 128]]  [1, 256, 256, 256]     1,048,832   
InstanceNorm2D-432  [[1, 256, 256, 256]]  [1, 256, 256, 256]        512      ReLU-454       [[1, 256, 256, 256]]  [1, 256, 256, 256]         0       DeconvBlock-128   [[1, 256, 128, 128]]  [1, 256, 256, 256]         0       Conv2D-525      [[1, 128, 256, 256]]  [1, 256, 256, 256]      33,024     
InstanceNorm2D-434  [[1, 256, 256, 256]]  [1, 256, 256, 256]        512      ReLU-456       [[1, 256, 256, 256]]  [1, 256, 256, 256]         0       ConvBlock-306    [[1, 128, 256, 256]]  [1, 256, 256, 256]         0       Conv2D-524      [[1, 256, 256, 256]]  [1, 256, 128, 128]      590,080    
InstanceNorm2D-433  [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-455       [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-305    [[1, 256, 256, 256]]  [1, 256, 128, 128]         0       Conv2D-526      [[1, 256, 128, 128]]  [1, 256, 128, 128]      65,792     
InstanceNorm2D-435  [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-457       [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-307    [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       DownBlock-46     [[1, 128, 256, 256]]  [1, 256, 128, 128]         0       Conv2D-527      [[1, 256, 128, 128]]   [1, 512, 64, 64]      1,180,160   
InstanceNorm2D-436   [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-458        [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-308    [[1, 256, 128, 128]]   [1, 512, 64, 64]          0       
Conv2DTranspose-129  [[1, 512, 64, 64]]   [1, 512, 128, 128]     4,194,816   
InstanceNorm2D-437  [[1, 512, 128, 128]]  [1, 512, 128, 128]       1,024     ReLU-459       [[1, 512, 128, 128]]  [1, 512, 128, 128]         0       DeconvBlock-129    [[1, 512, 64, 64]]   [1, 512, 128, 128]         0       Conv2D-529      [[1, 256, 128, 128]]  [1, 512, 128, 128]      131,584    
InstanceNorm2D-439  [[1, 512, 128, 128]]  [1, 512, 128, 128]       1,024     ReLU-461       [[1, 512, 128, 128]]  [1, 512, 128, 128]         0       ConvBlock-310    [[1, 256, 128, 128]]  [1, 512, 128, 128]         0       Conv2D-528      [[1, 512, 128, 128]]   [1, 512, 64, 64]      2,359,808   
InstanceNorm2D-438   [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-460        [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-309    [[1, 512, 128, 128]]   [1, 512, 64, 64]          0       Conv2D-530       [[1, 512, 64, 64]]    [1, 512, 64, 64]       262,656    
InstanceNorm2D-440   [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-462        [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-311     [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       DownBlock-47     [[1, 256, 128, 128]]   [1, 512, 64, 64]          0       Conv2D-531       [[1, 512, 64, 64]]   [1, 1024, 32, 32]      4,719,616   
InstanceNorm2D-441  [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        2,048     ReLU-463       [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       ConvBlock-312     [[1, 512, 64, 64]]   [1, 1024, 32, 32]          0       
Conv2DTranspose-130 [[1, 1024, 32, 32]]   [1, 1024, 64, 64]     16,778,240   
InstanceNorm2D-442  [[1, 1024, 64, 64]]   [1, 1024, 64, 64]        2,048     ReLU-464       [[1, 1024, 64, 64]]   [1, 1024, 64, 64]          0       DeconvBlock-130   [[1, 1024, 32, 32]]   [1, 1024, 64, 64]          0       Conv2D-533       [[1, 512, 64, 64]]   [1, 1024, 64, 64]       525,312    
InstanceNorm2D-444  [[1, 1024, 64, 64]]   [1, 1024, 64, 64]        2,048     ReLU-466       [[1, 1024, 64, 64]]   [1, 1024, 64, 64]          0       ConvBlock-314     [[1, 512, 64, 64]]   [1, 1024, 64, 64]          0       Conv2D-532      [[1, 1024, 64, 64]]   [1, 1024, 32, 32]      9,438,208   
InstanceNorm2D-443  [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        2,048     ReLU-465       [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       ConvBlock-313    [[1, 1024, 64, 64]]   [1, 1024, 32, 32]          0       Conv2D-534      [[1, 1024, 32, 32]]   [1, 1024, 32, 32]      1,049,600   
InstanceNorm2D-445  [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        2,048     ReLU-467       [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       ConvBlock-315    [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       DownBlock-48      [[1, 512, 64, 64]]   [1, 1024, 32, 32]          0       Pad2D-222      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-535      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-211   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-223      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-536      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-212   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-100   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-224      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-537      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-213   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-225      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-538      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-214   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-101   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-226      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-539      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-215   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-227      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-540      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-216   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-102   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-228      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-541      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-217   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-229      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-542      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-218   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-103   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-230      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-543      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-219   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-231      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-544      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-220   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-104   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-232      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-545      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-221   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-233      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-546      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-222   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-105   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-234      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-547      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-223   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-235      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-548      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-224   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-106   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-236      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-549      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-225   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-237      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-550      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-226   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-107   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       Pad2D-238      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-551      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-227   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     Pad2D-239      [[1, 1024, 32, 32]]   [1, 1024, 34, 34]          0       Conv2D-552      [[1, 1024, 34, 34]]   [1, 1024, 32, 32]      9,438,208   BatchNorm2D-228   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]        4,096     ResnetBlock-108   [[1, 1024, 32, 32]]   [1, 1024, 32, 32]          0       
Conv2DTranspose-131 [[1, 1024, 32, 32]]    [1, 512, 64, 64]      8,389,120   
InstanceNorm2D-446   [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-468        [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       DeconvBlock-131   [[1, 1024, 32, 32]]    [1, 512, 64, 64]          0       Conv2D-553       [[1, 512, 64, 64]]    [1, 512, 32, 32]      2,359,808   
InstanceNorm2D-447   [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-469        [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-316     [[1, 512, 64, 64]]    [1, 512, 32, 32]          0       Conv2D-554      [[1, 1024, 32, 32]]    [1, 512, 32, 32]       524,800    
InstanceNorm2D-449   [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-471        [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-317    [[1, 1024, 32, 32]]    [1, 512, 32, 32]          0       
Conv2DTranspose-132  [[1, 512, 32, 32]]    [1, 512, 64, 64]      4,194,816   
InstanceNorm2D-448   [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-470        [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       DeconvBlock-132    [[1, 512, 32, 32]]    [1, 512, 64, 64]          0       Conv2D-555       [[1, 512, 64, 64]]    [1, 512, 64, 64]       262,656    
InstanceNorm2D-450   [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-472        [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-318     [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       UpBlock-42      [[1, 1024, 32, 32]]    [1, 512, 64, 64]          0       
Conv2DTranspose-133  [[1, 512, 64, 64]]   [1, 256, 128, 128]     2,097,408   
InstanceNorm2D-451  [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-473       [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       DeconvBlock-133    [[1, 512, 64, 64]]   [1, 256, 128, 128]         0       Conv2D-556      [[1, 256, 128, 128]]   [1, 256, 64, 64]       590,080    
InstanceNorm2D-452   [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-474        [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-319    [[1, 256, 128, 128]]   [1, 256, 64, 64]          0       Conv2D-557       [[1, 512, 64, 64]]    [1, 256, 64, 64]       131,328    
InstanceNorm2D-454   [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-476        [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-320     [[1, 512, 64, 64]]    [1, 256, 64, 64]          0       
Conv2DTranspose-134  [[1, 256, 64, 64]]   [1, 256, 128, 128]     1,048,832   
InstanceNorm2D-453  [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-475       [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       DeconvBlock-134    [[1, 256, 64, 64]]   [1, 256, 128, 128]         0       Conv2D-558      [[1, 256, 128, 128]]  [1, 256, 128, 128]      65,792     
InstanceNorm2D-455  [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-477       [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-321    [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       UpBlock-43       [[1, 512, 64, 64]]   [1, 256, 128, 128]         0       
Conv2DTranspose-135 [[1, 256, 128, 128]]  [1, 128, 256, 256]      524,416    
InstanceNorm2D-456  [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-478       [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       DeconvBlock-135   [[1, 256, 128, 128]]  [1, 128, 256, 256]         0       Conv2D-559      [[1, 128, 256, 256]]  [1, 128, 128, 128]      147,584    
InstanceNorm2D-457  [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-479       [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-322    [[1, 128, 256, 256]]  [1, 128, 128, 128]         0       Conv2D-560      [[1, 256, 128, 128]]  [1, 128, 128, 128]      32,896     
InstanceNorm2D-459  [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-481       [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-323    [[1, 256, 128, 128]]  [1, 128, 128, 128]         0       
Conv2DTranspose-136 [[1, 128, 128, 128]]  [1, 128, 256, 256]      262,272    
InstanceNorm2D-458  [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-480       [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       DeconvBlock-136   [[1, 128, 128, 128]]  [1, 128, 256, 256]         0       Conv2D-561      [[1, 128, 256, 256]]  [1, 128, 256, 256]      16,512     
InstanceNorm2D-460  [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-482       [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-324    [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       UpBlock-44      [[1, 256, 128, 128]]  [1, 128, 256, 256]         0       
Conv2DTranspose-137 [[1, 128, 256, 256]]  [1, 64, 512, 512]       131,136    
InstanceNorm2D-461  [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-483       [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       DeconvBlock-137   [[1, 128, 256, 256]]  [1, 64, 512, 512]          0       Conv2D-562      [[1, 64, 512, 512]]   [1, 64, 256, 256]       36,928     
InstanceNorm2D-462  [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-484       [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-325    [[1, 64, 512, 512]]   [1, 64, 256, 256]          0       Conv2D-563      [[1, 128, 256, 256]]  [1, 64, 256, 256]        8,256     
InstanceNorm2D-464  [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-486       [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-326    [[1, 128, 256, 256]]  [1, 64, 256, 256]          0       
Conv2DTranspose-138 [[1, 64, 256, 256]]   [1, 64, 512, 512]       65,600     
InstanceNorm2D-463  [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-485       [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       DeconvBlock-138   [[1, 64, 256, 256]]   [1, 64, 512, 512]          0       Conv2D-564      [[1, 64, 512, 512]]   [1, 64, 512, 512]        4,160     
InstanceNorm2D-465  [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-487       [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       ConvBlock-327    [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       UpBlock-45      [[1, 128, 256, 256]]  [1, 64, 512, 512]          0       
===============================================================================
Total params: 234,075,840
Trainable params: 234,001,856
Non-trainable params: 73,984
-------------------------------------------------------------------------------
Input size (MB): 3.00
Forward/backward pass size (MB): 9792.70
Params size (MB): 892.93
Estimated Total Size (MB): 10688.63
-------------------------------------------------------------------------------{'total_params': 234075840, 'trainable_params': 234001856}

4.阴影区鉴别器——重新渲染

阴影区域鉴别器采用与文献Image-to-Image Translation with Conditional Adversarial Networks相同的结构,堆叠四个步幅卷积层,逐步提取全局特征表示。

为了聚焦阴影区域,首先通过 z = m i n ( α , x ) z=min(α,x) z=minαx校正估计以聚焦低强度(暗,通常是阴影)区域,其中符号x表示估计的像素强度。术语z表示将输入到鉴别器的校正值。术语α是阴影灵敏度的预定义阈值(根据经验,它设置为0.059=15/255)。

阴影区鉴别器的输出是重新渲染器的输入,分别来自场景再转换和阴影先验网络的两个特征映射。

import paddle.nn as nnclass ConvBlock2D(nn.Layer):def __init__(self, input_nc, output_nc, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True,pad_type='zero', norm=None, acti='lrelu'):super(ConvBlock2D, self).__init__()self.use_bias = bias# initialize padding if pad_type == 'reflect':self.pad = nn.Pad2D([padding, padding, padding, padding], mode=pad_type)elif pad_type == 'zero':self.pad = nn.Pad2D([0, 0, 0, 0], mode='replicate')elif pad_type == 'replicate':self.pad = nn.Pad2D([padding, padding, padding, padding], mode=pad_type)else:assert 0, "Unsupported padding type: {}".format(pad_type)# initialize normalizationif norm == 'batch':self.norm = nn.BatchNorm2D(output_nc)elif norm == 'instance':self.norm = nn.InstanceNorm2D(output_nc)elif norm is None or norm == 'spectral':self.norm = Noneelse:assert 0, "Unsupported normalization: {}".format(norm)# initialize activationif acti == 'relu':self.acti = nn.ReLU()elif acti == 'lrelu':self.acti = nn.LeakyReLU()elif acti == 'prelu':self.acti = nn.PReLU()elif acti == 'elu':self.acti = nn.ELU()elif acti == 'tanh':self.acti = nn.Tanh()elif acti == 'sigmoid':self.acti = nn.Sigmoid()elif acti is None:self.acti = Noneelse:assert 0, "Unsupported activation: {}".format(acti)# initialize convolutionif norm == 'spectral':self.conv = nn.SpectralNorm(nn.Conv2d(input_nc, output_nc, kernel_size, stride, dilation=dilation, groups=groups,bias_attr=self.use_bias))else:self.conv = nn.Conv2D(input_nc, output_nc, kernel_size, stride, dilation=dilation, groups=groups,bias_attr=self.use_bias)def forward(self, x):x = self.conv(self.pad(x))if self.norm:x = self.norm(x)if self.acti:x = self.acti(x)return xclass FusionLayer(nn.Layer):def __init__(self, inchannel, outchannel, reduction=16):super(FusionLayer, self).__init__()self.mergeFeather = ConvBlock2D(inchannel, inchannel, kernel_size=3, stride=1, padding=1)self.avg_pool = nn.AdaptiveAvgPool2D(1)self.fc = nn.Sequential(nn.Linear(inchannel, inchannel // reduction, bias_attr=False),nn.ReLU(),nn.Linear(inchannel // reduction, inchannel, bias_attr=False),nn.Sigmoid())self.outlayer = ConvBlock2D(inchannel, outchannel, 1, 1, 0, bias=True)def forward(self, x):b, c = paddle.shape(x)[0], paddle.shape(x)[1]y = self.mergeFeather(x)y = self.avg_pool(y)y = paddle.reshape(y, [b, c])y = self.fc(y)y = paddle.reshape(y, [b, c, 1, 1])y = x * y.expand_as(x)y = y + xy = self.outlayer(y)return y
import paddle.nn as nnclass MultiDilationResnetBlock_attention(nn.Layer):def __init__(self, input_nc_each, kernel_size=3, stride=1, padding=1, dilation=1, groups=1, bias=True,pad_type='reflect', norm='instance', acti='relu', use_dropout=False):super(MultiDilationResnetBlock_attention, self).__init__()### hard code, 4 dilation levelsinput_nc = input_nc_each * 2self.branch1 = ConvBlock2D(input_nc, input_nc // 8, kernel_size=3, stride=1, padding=2, dilation=2, groups=1,bias=True, pad_type=pad_type, norm=norm, acti='relu')self.branch2 = ConvBlock2D(input_nc, input_nc // 8, kernel_size=3, stride=1, padding=3, dilation=3, groups=1,bias=True, pad_type=pad_type, norm=norm, acti='relu')self.branch3 = ConvBlock2D(input_nc, input_nc // 8, kernel_size=3, stride=1, padding=4, dilation=4, groups=1,bias=True, pad_type=pad_type, norm=norm, acti='relu')self.branch4 = ConvBlock2D(input_nc, input_nc // 8, kernel_size=3, stride=1, padding=5, dilation=5, groups=1,bias=True, pad_type=pad_type, norm=norm, acti='relu')self.branch5 = ConvBlock2D(input_nc, input_nc // 8, kernel_size=3, stride=1, padding=6, dilation=6, groups=1,bias=True, pad_type=pad_type, norm=norm, acti='relu')self.branch6 = ConvBlock2D(input_nc, input_nc // 8, kernel_size=3, stride=1, padding=8, dilation=8, groups=1,bias=True, pad_type=pad_type, norm=norm, acti='relu')self.branch7 = ConvBlock2D(input_nc, input_nc // 8, kernel_size=3, stride=1, padding=10, dilation=10, groups=1,bias=True, pad_type=pad_type, norm=norm, acti='relu')self.branch8 = ConvBlock2D(input_nc, input_nc // 8, kernel_size=3, stride=1, padding=12, dilation=12, groups=1,bias=True, pad_type=pad_type, norm=norm, acti='relu')self.fusion = FusionLayer(inchannel=input_nc, outchannel=input_nc_each, reduction=8)def forward(self, x_hdr, x_relight):x = paddle.concat([x_hdr, x_relight], axis=1)d1 = self.branch1(x)d2 = self.branch2(x)d3 = self.branch3(x)d4 = self.branch4(x)d5 = self.branch5(x)d6 = self.branch6(x)d7 = self.branch7(x)d8 = self.branch8(x)d9 = paddle.concat((d1, d2, d3, d4, d5, d6, d7, d8), axis=1)out = x_relight + self.fusion(d9)return out

5.将上述模块组装成DRN

import paddle.nn as nnclass DRN(nn.Layer):def __init__(self, input_nc, output_nc, ngf=64, n_downsampling=4, n_blocks=9, norm_layer=nn.BatchNorm2D,padding_type='reflect'):super(DRN, self).__init__()self.toHDR = BP_HDR(input_nc, output_nc, ngf=32, n_downsampling=n_downsampling, n_blocks=n_blocks, norm_layer=norm_layer,padding_type=padding_type)self.estLight = BP_Light(input_nc, output_nc, ngf=32, n_downsampling=n_downsampling, n_blocks=n_blocks, norm_layer=norm_layer,padding_type=padding_type)self.toHDR_channel = nn.Sequential(nn.Pad2D([1, 1, 1, 1], mode='reflect'), nn.Conv2D(32, 64, kernel_size=3, padding=0), nn.ReLU())self.estLight_channel = nn.Sequential(nn.Pad2D([1, 1, 1, 1], mode='reflect'), nn.Conv2D(32, 64, kernel_size=3, padding=0), nn.ReLU())self.comb =MultiDilationResnetBlock_attention(ngf)self.out = nn.Sequential(nn.Pad2D([3, 3, 3, 3], mode='reflect'), nn.Conv2D(ngf, output_nc, kernel_size=7, padding=0), nn.Tanh())def forward(self, input):# print(input.shape)m_hdr = self.toHDR(input)m_estLight = self.estLight(input)m_hdr = self.toHDR_channel(m_hdr)m_estLight = self.estLight_channel(m_estLight)m_fea = self.comb(x_hdr=m_hdr, x_relight=m_estLight)out = self.out(m_fea)return out

6.查看DRN网络结构

model = DRN(3, 3)
paddle.summary(model, (1, 3, 512, 512))
-------------------------------------------------------------------------------------------------Layer (type)                  Input Shape          Output Shape         Param #    
=================================================================================================Pad2D-743                [[1, 3, 512, 512]]    [1, 3, 518, 518]          0       Conv2D-1527               [[1, 3, 518, 518]]   [1, 32, 512, 512]        4,736     BatchNorm2D-533            [[1, 32, 512, 512]]   [1, 32, 512, 512]         128      ReLU-1318                [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Conv2D-1528              [[1, 32, 512, 512]]   [1, 64, 256, 256]       18,496     InstanceNorm2D-1233          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1319               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-785             [[1, 32, 512, 512]]   [1, 64, 256, 256]          0       Conv2DTranspose-337          [[1, 64, 256, 256]]   [1, 64, 512, 512]       65,600     InstanceNorm2D-1234          [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-1320               [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       DeconvBlock-337            [[1, 64, 256, 256]]   [1, 64, 512, 512]          0       Conv2D-1530              [[1, 32, 512, 512]]   [1, 64, 512, 512]        2,112     InstanceNorm2D-1236          [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-1322               [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       ConvBlock-787             [[1, 32, 512, 512]]   [1, 64, 512, 512]          0       Conv2D-1529              [[1, 64, 512, 512]]   [1, 64, 256, 256]       36,928     InstanceNorm2D-1235          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1321               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-786             [[1, 64, 512, 512]]   [1, 64, 256, 256]          0       Conv2D-1531              [[1, 64, 256, 256]]   [1, 64, 256, 256]        4,160     InstanceNorm2D-1237          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1323               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-788             [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       DownBlock-113             [[1, 32, 512, 512]]   [1, 64, 256, 256]          0       Conv2D-1532              [[1, 64, 256, 256]]   [1, 128, 128, 128]      73,856     InstanceNorm2D-1238          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1324               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-789             [[1, 64, 256, 256]]   [1, 128, 128, 128]         0       Conv2DTranspose-338          [[1, 128, 128, 128]]  [1, 128, 256, 256]      262,272    InstanceNorm2D-1239          [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-1325               [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       DeconvBlock-338            [[1, 128, 128, 128]]  [1, 128, 256, 256]         0       Conv2D-1534              [[1, 64, 256, 256]]   [1, 128, 256, 256]       8,320     InstanceNorm2D-1241          [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-1327               [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-791             [[1, 64, 256, 256]]   [1, 128, 256, 256]         0       Conv2D-1533              [[1, 128, 256, 256]]  [1, 128, 128, 128]      147,584    InstanceNorm2D-1240          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1326               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-790             [[1, 128, 256, 256]]  [1, 128, 128, 128]         0       Conv2D-1535              [[1, 128, 128, 128]]  [1, 128, 128, 128]      16,512     InstanceNorm2D-1242          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1328               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-792             [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       DownBlock-114             [[1, 64, 256, 256]]   [1, 128, 128, 128]         0       Conv2D-1536              [[1, 128, 128, 128]]   [1, 256, 64, 64]       295,168    InstanceNorm2D-1243           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1329                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-793             [[1, 128, 128, 128]]   [1, 256, 64, 64]          0       Conv2DTranspose-339           [[1, 256, 64, 64]]   [1, 256, 128, 128]     1,048,832   InstanceNorm2D-1244          [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-1330               [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       DeconvBlock-339             [[1, 256, 64, 64]]   [1, 256, 128, 128]         0       Conv2D-1538              [[1, 128, 128, 128]]  [1, 256, 128, 128]      33,024     InstanceNorm2D-1246          [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-1332               [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-795             [[1, 128, 128, 128]]  [1, 256, 128, 128]         0       Conv2D-1537              [[1, 256, 128, 128]]   [1, 256, 64, 64]       590,080    InstanceNorm2D-1245           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1331                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-794             [[1, 256, 128, 128]]   [1, 256, 64, 64]          0       Conv2D-1539               [[1, 256, 64, 64]]    [1, 256, 64, 64]       65,792     InstanceNorm2D-1247           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1333                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-796              [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       DownBlock-115             [[1, 128, 128, 128]]   [1, 256, 64, 64]          0       Conv2D-1540               [[1, 256, 64, 64]]    [1, 512, 32, 32]      1,180,160   InstanceNorm2D-1248           [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-1334                [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-797              [[1, 256, 64, 64]]    [1, 512, 32, 32]          0       Conv2DTranspose-340           [[1, 512, 32, 32]]    [1, 512, 64, 64]      4,194,816   InstanceNorm2D-1249           [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-1335                [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       DeconvBlock-340             [[1, 512, 32, 32]]    [1, 512, 64, 64]          0       Conv2D-1542               [[1, 256, 64, 64]]    [1, 512, 64, 64]       131,584    InstanceNorm2D-1251           [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-1337                [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-799              [[1, 256, 64, 64]]    [1, 512, 64, 64]          0       Conv2D-1541               [[1, 512, 64, 64]]    [1, 512, 32, 32]      2,359,808   InstanceNorm2D-1250           [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-1336                [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-798              [[1, 512, 64, 64]]    [1, 512, 32, 32]          0       Conv2D-1543               [[1, 512, 32, 32]]    [1, 512, 32, 32]       262,656    InstanceNorm2D-1252           [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-1338                [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-800              [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       DownBlock-116              [[1, 256, 64, 64]]    [1, 512, 32, 32]          0       Pad2D-744                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1544               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-534             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-745                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1545               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-535             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-253             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-746                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1546               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-536             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-747                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1547               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-537             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-254             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-748                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1548               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-538             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-749                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1549               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-539             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-255             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-750                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1550               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-540             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-751                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1551               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-541             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-256             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-752                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1552               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-542             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-753                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1553               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-543             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-257             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-754                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1554               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-544             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-755                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1555               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-545             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-258             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-756                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1556               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-546             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-757                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1557               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-547             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-259             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-758                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1558               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-548             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-759                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1559               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-549             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-260             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-760                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1560               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-550             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-761                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1561               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-551             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-261             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Conv2DTranspose-341           [[1, 512, 32, 32]]    [1, 256, 64, 64]      2,097,408   InstanceNorm2D-1253           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1339                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       DeconvBlock-341             [[1, 512, 32, 32]]    [1, 256, 64, 64]          0       Conv2D-1562               [[1, 256, 64, 64]]    [1, 256, 32, 32]       590,080    InstanceNorm2D-1254           [[1, 256, 32, 32]]    [1, 256, 32, 32]         512      ReLU-1340                [[1, 256, 32, 32]]    [1, 256, 32, 32]          0       ConvBlock-801              [[1, 256, 64, 64]]    [1, 256, 32, 32]          0       Conv2D-1563               [[1, 512, 32, 32]]    [1, 256, 32, 32]       131,328    InstanceNorm2D-1256           [[1, 256, 32, 32]]    [1, 256, 32, 32]         512      ReLU-1342                [[1, 256, 32, 32]]    [1, 256, 32, 32]          0       ConvBlock-802              [[1, 512, 32, 32]]    [1, 256, 32, 32]          0       Conv2DTranspose-342           [[1, 256, 32, 32]]    [1, 256, 64, 64]      1,048,832   InstanceNorm2D-1255           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1341                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       DeconvBlock-342             [[1, 256, 32, 32]]    [1, 256, 64, 64]          0       Conv2D-1564               [[1, 256, 64, 64]]    [1, 256, 64, 64]       65,792     InstanceNorm2D-1257           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1343                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-803              [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       UpBlock-113               [[1, 512, 32, 32]]    [1, 256, 64, 64]          0       Conv2DTranspose-343           [[1, 256, 64, 64]]   [1, 128, 128, 128]      524,416    InstanceNorm2D-1258          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1344               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       DeconvBlock-343             [[1, 256, 64, 64]]   [1, 128, 128, 128]         0       Conv2D-1565              [[1, 128, 128, 128]]   [1, 128, 64, 64]       147,584    InstanceNorm2D-1259           [[1, 128, 64, 64]]    [1, 128, 64, 64]         256      ReLU-1345                [[1, 128, 64, 64]]    [1, 128, 64, 64]          0       ConvBlock-804             [[1, 128, 128, 128]]   [1, 128, 64, 64]          0       Conv2D-1566               [[1, 256, 64, 64]]    [1, 128, 64, 64]       32,896     InstanceNorm2D-1261           [[1, 128, 64, 64]]    [1, 128, 64, 64]         256      ReLU-1347                [[1, 128, 64, 64]]    [1, 128, 64, 64]          0       ConvBlock-805              [[1, 256, 64, 64]]    [1, 128, 64, 64]          0       Conv2DTranspose-344           [[1, 128, 64, 64]]   [1, 128, 128, 128]      262,272    InstanceNorm2D-1260          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1346               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       DeconvBlock-344             [[1, 128, 64, 64]]   [1, 128, 128, 128]         0       Conv2D-1567              [[1, 128, 128, 128]]  [1, 128, 128, 128]      16,512     InstanceNorm2D-1262          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1348               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-806             [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       UpBlock-114               [[1, 256, 64, 64]]   [1, 128, 128, 128]         0       Conv2DTranspose-345          [[1, 128, 128, 128]]  [1, 64, 256, 256]       131,136    InstanceNorm2D-1263          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1349               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       DeconvBlock-345            [[1, 128, 128, 128]]  [1, 64, 256, 256]          0       Conv2D-1568              [[1, 64, 256, 256]]   [1, 64, 128, 128]       36,928     InstanceNorm2D-1264          [[1, 64, 128, 128]]   [1, 64, 128, 128]         128      ReLU-1350               [[1, 64, 128, 128]]   [1, 64, 128, 128]          0       ConvBlock-807             [[1, 64, 256, 256]]   [1, 64, 128, 128]          0       Conv2D-1569              [[1, 128, 128, 128]]  [1, 64, 128, 128]        8,256     InstanceNorm2D-1266          [[1, 64, 128, 128]]   [1, 64, 128, 128]         128      ReLU-1352               [[1, 64, 128, 128]]   [1, 64, 128, 128]          0       ConvBlock-808             [[1, 128, 128, 128]]  [1, 64, 128, 128]          0       Conv2DTranspose-346          [[1, 64, 128, 128]]   [1, 64, 256, 256]       65,600     InstanceNorm2D-1265          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1351               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       DeconvBlock-346            [[1, 64, 128, 128]]   [1, 64, 256, 256]          0       Conv2D-1570              [[1, 64, 256, 256]]   [1, 64, 256, 256]        4,160     InstanceNorm2D-1267          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1353               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-809             [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       UpBlock-115              [[1, 128, 128, 128]]  [1, 64, 256, 256]          0       Conv2DTranspose-347          [[1, 64, 256, 256]]   [1, 32, 512, 512]       32,800     InstanceNorm2D-1268          [[1, 32, 512, 512]]   [1, 32, 512, 512]         64       ReLU-1354               [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       DeconvBlock-347            [[1, 64, 256, 256]]   [1, 32, 512, 512]          0       Conv2D-1571              [[1, 32, 512, 512]]   [1, 32, 256, 256]        9,248     InstanceNorm2D-1269          [[1, 32, 256, 256]]   [1, 32, 256, 256]         64       ReLU-1355               [[1, 32, 256, 256]]   [1, 32, 256, 256]          0       ConvBlock-810             [[1, 32, 512, 512]]   [1, 32, 256, 256]          0       Conv2D-1572              [[1, 64, 256, 256]]   [1, 32, 256, 256]        2,080     InstanceNorm2D-1271          [[1, 32, 256, 256]]   [1, 32, 256, 256]         64       ReLU-1357               [[1, 32, 256, 256]]   [1, 32, 256, 256]          0       ConvBlock-811             [[1, 64, 256, 256]]   [1, 32, 256, 256]          0       Conv2DTranspose-348          [[1, 32, 256, 256]]   [1, 32, 512, 512]       16,416     InstanceNorm2D-1270          [[1, 32, 512, 512]]   [1, 32, 512, 512]         64       ReLU-1356               [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       DeconvBlock-348            [[1, 32, 256, 256]]   [1, 32, 512, 512]          0       Conv2D-1573              [[1, 32, 512, 512]]   [1, 32, 512, 512]        1,056     InstanceNorm2D-1272          [[1, 32, 512, 512]]   [1, 32, 512, 512]         64       ReLU-1358               [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       ConvBlock-812             [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       UpBlock-116              [[1, 64, 256, 256]]   [1, 32, 512, 512]          0       Pad2D-762               [[1, 64, 512, 512]]   [1, 64, 514, 514]          0       Conv2D-1574              [[1, 64, 514, 514]]   [1, 32, 512, 512]       18,464     ReLU-1359               [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       BP_HDR-15                [[1, 3, 512, 512]]   [1, 32, 512, 512]          0       Pad2D-763                [[1, 3, 512, 512]]    [1, 3, 518, 518]          0       Conv2D-1575               [[1, 3, 518, 518]]   [1, 32, 512, 512]        4,736     BatchNorm2D-552            [[1, 32, 512, 512]]   [1, 32, 512, 512]         128      ReLU-1360                [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Conv2D-1576              [[1, 32, 512, 512]]   [1, 64, 256, 256]       18,496     InstanceNorm2D-1273          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1361               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-813             [[1, 32, 512, 512]]   [1, 64, 256, 256]          0       Conv2DTranspose-349          [[1, 64, 256, 256]]   [1, 64, 512, 512]       65,600     InstanceNorm2D-1274          [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-1362               [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       DeconvBlock-349            [[1, 64, 256, 256]]   [1, 64, 512, 512]          0       Conv2D-1578              [[1, 32, 512, 512]]   [1, 64, 512, 512]        2,112     InstanceNorm2D-1276          [[1, 64, 512, 512]]   [1, 64, 512, 512]         128      ReLU-1364               [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       ConvBlock-815             [[1, 32, 512, 512]]   [1, 64, 512, 512]          0       Conv2D-1577              [[1, 64, 512, 512]]   [1, 64, 256, 256]       36,928     InstanceNorm2D-1275          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1363               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-814             [[1, 64, 512, 512]]   [1, 64, 256, 256]          0       Conv2D-1579              [[1, 64, 256, 256]]   [1, 64, 256, 256]        4,160     InstanceNorm2D-1277          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1365               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-816             [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       DownBlock-117             [[1, 32, 512, 512]]   [1, 64, 256, 256]          0       Conv2D-1580              [[1, 64, 256, 256]]   [1, 128, 128, 128]      73,856     InstanceNorm2D-1278          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1366               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-817             [[1, 64, 256, 256]]   [1, 128, 128, 128]         0       Conv2DTranspose-350          [[1, 128, 128, 128]]  [1, 128, 256, 256]      262,272    InstanceNorm2D-1279          [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-1367               [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       DeconvBlock-350            [[1, 128, 128, 128]]  [1, 128, 256, 256]         0       Conv2D-1582              [[1, 64, 256, 256]]   [1, 128, 256, 256]       8,320     InstanceNorm2D-1281          [[1, 128, 256, 256]]  [1, 128, 256, 256]        256      ReLU-1369               [[1, 128, 256, 256]]  [1, 128, 256, 256]         0       ConvBlock-819             [[1, 64, 256, 256]]   [1, 128, 256, 256]         0       Conv2D-1581              [[1, 128, 256, 256]]  [1, 128, 128, 128]      147,584    InstanceNorm2D-1280          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1368               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-818             [[1, 128, 256, 256]]  [1, 128, 128, 128]         0       Conv2D-1583              [[1, 128, 128, 128]]  [1, 128, 128, 128]      16,512     InstanceNorm2D-1282          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1370               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-820             [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       DownBlock-118             [[1, 64, 256, 256]]   [1, 128, 128, 128]         0       Conv2D-1584              [[1, 128, 128, 128]]   [1, 256, 64, 64]       295,168    InstanceNorm2D-1283           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1371                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-821             [[1, 128, 128, 128]]   [1, 256, 64, 64]          0       Conv2DTranspose-351           [[1, 256, 64, 64]]   [1, 256, 128, 128]     1,048,832   InstanceNorm2D-1284          [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-1372               [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       DeconvBlock-351             [[1, 256, 64, 64]]   [1, 256, 128, 128]         0       Conv2D-1586              [[1, 128, 128, 128]]  [1, 256, 128, 128]      33,024     InstanceNorm2D-1286          [[1, 256, 128, 128]]  [1, 256, 128, 128]        512      ReLU-1374               [[1, 256, 128, 128]]  [1, 256, 128, 128]         0       ConvBlock-823             [[1, 128, 128, 128]]  [1, 256, 128, 128]         0       Conv2D-1585              [[1, 256, 128, 128]]   [1, 256, 64, 64]       590,080    InstanceNorm2D-1285           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1373                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-822             [[1, 256, 128, 128]]   [1, 256, 64, 64]          0       Conv2D-1587               [[1, 256, 64, 64]]    [1, 256, 64, 64]       65,792     InstanceNorm2D-1287           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1375                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-824              [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       DownBlock-119             [[1, 128, 128, 128]]   [1, 256, 64, 64]          0       Conv2D-1588               [[1, 256, 64, 64]]    [1, 512, 32, 32]      1,180,160   InstanceNorm2D-1288           [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-1376                [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-825              [[1, 256, 64, 64]]    [1, 512, 32, 32]          0       Conv2DTranspose-352           [[1, 512, 32, 32]]    [1, 512, 64, 64]      4,194,816   InstanceNorm2D-1289           [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-1377                [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       DeconvBlock-352             [[1, 512, 32, 32]]    [1, 512, 64, 64]          0       Conv2D-1590               [[1, 256, 64, 64]]    [1, 512, 64, 64]       131,584    InstanceNorm2D-1291           [[1, 512, 64, 64]]    [1, 512, 64, 64]        1,024     ReLU-1379                [[1, 512, 64, 64]]    [1, 512, 64, 64]          0       ConvBlock-827              [[1, 256, 64, 64]]    [1, 512, 64, 64]          0       Conv2D-1589               [[1, 512, 64, 64]]    [1, 512, 32, 32]      2,359,808   InstanceNorm2D-1290           [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-1378                [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-826              [[1, 512, 64, 64]]    [1, 512, 32, 32]          0       Conv2D-1591               [[1, 512, 32, 32]]    [1, 512, 32, 32]       262,656    InstanceNorm2D-1292           [[1, 512, 32, 32]]    [1, 512, 32, 32]        1,024     ReLU-1380                [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       ConvBlock-828              [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       DownBlock-120              [[1, 256, 64, 64]]    [1, 512, 32, 32]          0       Pad2D-764                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1592               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-553             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-765                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1593               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-554             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-262             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-766                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1594               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-555             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-767                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1595               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-556             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-263             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-768                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1596               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-557             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-769                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1597               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-558             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-264             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-770                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1598               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-559             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-771                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1599               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-560             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-265             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-772                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1600               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-561             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-773                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1601               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-562             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-266             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-774                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1602               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-563             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-775                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1603               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-564             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-267             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-776                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1604               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-565             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-777                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1605               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-566             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-268             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-778                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1606               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-567             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-779                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1607               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-568             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-269             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Pad2D-780                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1608               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-569             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     Pad2D-781                [[1, 512, 32, 32]]    [1, 512, 34, 34]          0       Conv2D-1609               [[1, 512, 34, 34]]    [1, 512, 32, 32]      2,359,808   BatchNorm2D-570             [[1, 512, 32, 32]]    [1, 512, 32, 32]        2,048     ResnetBlock-270             [[1, 512, 32, 32]]    [1, 512, 32, 32]          0       Conv2DTranspose-353           [[1, 512, 32, 32]]    [1, 256, 64, 64]      2,097,408   InstanceNorm2D-1293           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1381                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       DeconvBlock-353             [[1, 512, 32, 32]]    [1, 256, 64, 64]          0       Conv2D-1610               [[1, 256, 64, 64]]    [1, 256, 32, 32]       590,080    InstanceNorm2D-1294           [[1, 256, 32, 32]]    [1, 256, 32, 32]         512      ReLU-1382                [[1, 256, 32, 32]]    [1, 256, 32, 32]          0       ConvBlock-829              [[1, 256, 64, 64]]    [1, 256, 32, 32]          0       Conv2D-1611               [[1, 512, 32, 32]]    [1, 256, 32, 32]       131,328    InstanceNorm2D-1296           [[1, 256, 32, 32]]    [1, 256, 32, 32]         512      ReLU-1384                [[1, 256, 32, 32]]    [1, 256, 32, 32]          0       ConvBlock-830              [[1, 512, 32, 32]]    [1, 256, 32, 32]          0       Conv2DTranspose-354           [[1, 256, 32, 32]]    [1, 256, 64, 64]      1,048,832   InstanceNorm2D-1295           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1383                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       DeconvBlock-354             [[1, 256, 32, 32]]    [1, 256, 64, 64]          0       Conv2D-1612               [[1, 256, 64, 64]]    [1, 256, 64, 64]       65,792     InstanceNorm2D-1297           [[1, 256, 64, 64]]    [1, 256, 64, 64]         512      ReLU-1385                [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       ConvBlock-831              [[1, 256, 64, 64]]    [1, 256, 64, 64]          0       UpBlock-117               [[1, 512, 32, 32]]    [1, 256, 64, 64]          0       Conv2DTranspose-355           [[1, 256, 64, 64]]   [1, 128, 128, 128]      524,416    InstanceNorm2D-1298          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1386               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       DeconvBlock-355             [[1, 256, 64, 64]]   [1, 128, 128, 128]         0       Conv2D-1613              [[1, 128, 128, 128]]   [1, 128, 64, 64]       147,584    InstanceNorm2D-1299           [[1, 128, 64, 64]]    [1, 128, 64, 64]         256      ReLU-1387                [[1, 128, 64, 64]]    [1, 128, 64, 64]          0       ConvBlock-832             [[1, 128, 128, 128]]   [1, 128, 64, 64]          0       Conv2D-1614               [[1, 256, 64, 64]]    [1, 128, 64, 64]       32,896     InstanceNorm2D-1301           [[1, 128, 64, 64]]    [1, 128, 64, 64]         256      ReLU-1389                [[1, 128, 64, 64]]    [1, 128, 64, 64]          0       ConvBlock-833              [[1, 256, 64, 64]]    [1, 128, 64, 64]          0       Conv2DTranspose-356           [[1, 128, 64, 64]]   [1, 128, 128, 128]      262,272    InstanceNorm2D-1300          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1388               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       DeconvBlock-356             [[1, 128, 64, 64]]   [1, 128, 128, 128]         0       Conv2D-1615              [[1, 128, 128, 128]]  [1, 128, 128, 128]      16,512     InstanceNorm2D-1302          [[1, 128, 128, 128]]  [1, 128, 128, 128]        256      ReLU-1390               [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       ConvBlock-834             [[1, 128, 128, 128]]  [1, 128, 128, 128]         0       UpBlock-118               [[1, 256, 64, 64]]   [1, 128, 128, 128]         0       Conv2DTranspose-357          [[1, 128, 128, 128]]  [1, 64, 256, 256]       131,136    InstanceNorm2D-1303          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1391               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       DeconvBlock-357            [[1, 128, 128, 128]]  [1, 64, 256, 256]          0       Conv2D-1616              [[1, 64, 256, 256]]   [1, 64, 128, 128]       36,928     InstanceNorm2D-1304          [[1, 64, 128, 128]]   [1, 64, 128, 128]         128      ReLU-1392               [[1, 64, 128, 128]]   [1, 64, 128, 128]          0       ConvBlock-835             [[1, 64, 256, 256]]   [1, 64, 128, 128]          0       Conv2D-1617              [[1, 128, 128, 128]]  [1, 64, 128, 128]        8,256     InstanceNorm2D-1306          [[1, 64, 128, 128]]   [1, 64, 128, 128]         128      ReLU-1394               [[1, 64, 128, 128]]   [1, 64, 128, 128]          0       ConvBlock-836             [[1, 128, 128, 128]]  [1, 64, 128, 128]          0       Conv2DTranspose-358          [[1, 64, 128, 128]]   [1, 64, 256, 256]       65,600     InstanceNorm2D-1305          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1393               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       DeconvBlock-358            [[1, 64, 128, 128]]   [1, 64, 256, 256]          0       Conv2D-1618              [[1, 64, 256, 256]]   [1, 64, 256, 256]        4,160     InstanceNorm2D-1307          [[1, 64, 256, 256]]   [1, 64, 256, 256]         128      ReLU-1395               [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       ConvBlock-837             [[1, 64, 256, 256]]   [1, 64, 256, 256]          0       UpBlock-119              [[1, 128, 128, 128]]  [1, 64, 256, 256]          0       Conv2DTranspose-359          [[1, 64, 256, 256]]   [1, 32, 512, 512]       32,800     InstanceNorm2D-1308          [[1, 32, 512, 512]]   [1, 32, 512, 512]         64       ReLU-1396               [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       DeconvBlock-359            [[1, 64, 256, 256]]   [1, 32, 512, 512]          0       Conv2D-1619              [[1, 32, 512, 512]]   [1, 32, 256, 256]        9,248     InstanceNorm2D-1309          [[1, 32, 256, 256]]   [1, 32, 256, 256]         64       ReLU-1397               [[1, 32, 256, 256]]   [1, 32, 256, 256]          0       ConvBlock-838             [[1, 32, 512, 512]]   [1, 32, 256, 256]          0       Conv2D-1620              [[1, 64, 256, 256]]   [1, 32, 256, 256]        2,080     InstanceNorm2D-1311          [[1, 32, 256, 256]]   [1, 32, 256, 256]         64       ReLU-1399               [[1, 32, 256, 256]]   [1, 32, 256, 256]          0       ConvBlock-839             [[1, 64, 256, 256]]   [1, 32, 256, 256]          0       Conv2DTranspose-360          [[1, 32, 256, 256]]   [1, 32, 512, 512]       16,416     InstanceNorm2D-1310          [[1, 32, 512, 512]]   [1, 32, 512, 512]         64       ReLU-1398               [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       DeconvBlock-360            [[1, 32, 256, 256]]   [1, 32, 512, 512]          0       Conv2D-1621              [[1, 32, 512, 512]]   [1, 32, 512, 512]        1,056     InstanceNorm2D-1312          [[1, 32, 512, 512]]   [1, 32, 512, 512]         64       ReLU-1400               [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       ConvBlock-840             [[1, 32, 512, 512]]   [1, 32, 512, 512]          0       UpBlock-120              [[1, 64, 256, 256]]   [1, 32, 512, 512]          0       BP_Light-15               [[1, 3, 512, 512]]   [1, 32, 512, 512]          0       Pad2D-783               [[1, 32, 512, 512]]   [1, 32, 514, 514]          0       Conv2D-1623              [[1, 32, 514, 514]]   [1, 64, 512, 512]       18,496     ReLU-1401               [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       Pad2D-784               [[1, 32, 512, 512]]   [1, 32, 514, 514]          0       Conv2D-1624              [[1, 32, 514, 514]]   [1, 64, 512, 512]       18,496     ReLU-1402               [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       Pad2D-785               [[1, 128, 512, 512]]  [1, 128, 516, 516]         0       Conv2D-1625              [[1, 128, 516, 516]]  [1, 16, 512, 512]       18,448     InstanceNorm2D-1313          [[1, 16, 512, 512]]   [1, 16, 512, 512]         32       ReLU-1403               [[1, 16, 512, 512]]   [1, 16, 512, 512]          0       ConvBlock2D-141            [[1, 128, 512, 512]]  [1, 16, 512, 512]          0       Pad2D-786               [[1, 128, 512, 512]]  [1, 128, 518, 518]         0       Conv2D-1626              [[1, 128, 518, 518]]  [1, 16, 512, 512]       18,448     InstanceNorm2D-1314          [[1, 16, 512, 512]]   [1, 16, 512, 512]         32       ReLU-1404               [[1, 16, 512, 512]]   [1, 16, 512, 512]          0       ConvBlock2D-142            [[1, 128, 512, 512]]  [1, 16, 512, 512]          0       Pad2D-787               [[1, 128, 512, 512]]  [1, 128, 520, 520]         0       Conv2D-1627              [[1, 128, 520, 520]]  [1, 16, 512, 512]       18,448     InstanceNorm2D-1315          [[1, 16, 512, 512]]   [1, 16, 512, 512]         32       ReLU-1405               [[1, 16, 512, 512]]   [1, 16, 512, 512]          0       ConvBlock2D-143            [[1, 128, 512, 512]]  [1, 16, 512, 512]          0       Pad2D-788               [[1, 128, 512, 512]]  [1, 128, 522, 522]         0       Conv2D-1628              [[1, 128, 522, 522]]  [1, 16, 512, 512]       18,448     InstanceNorm2D-1316          [[1, 16, 512, 512]]   [1, 16, 512, 512]         32       ReLU-1406               [[1, 16, 512, 512]]   [1, 16, 512, 512]          0       ConvBlock2D-144            [[1, 128, 512, 512]]  [1, 16, 512, 512]          0       Pad2D-789               [[1, 128, 512, 512]]  [1, 128, 524, 524]         0       Conv2D-1629              [[1, 128, 524, 524]]  [1, 16, 512, 512]       18,448     InstanceNorm2D-1317          [[1, 16, 512, 512]]   [1, 16, 512, 512]         32       ReLU-1407               [[1, 16, 512, 512]]   [1, 16, 512, 512]          0       ConvBlock2D-145            [[1, 128, 512, 512]]  [1, 16, 512, 512]          0       Pad2D-790               [[1, 128, 512, 512]]  [1, 128, 528, 528]         0       Conv2D-1630              [[1, 128, 528, 528]]  [1, 16, 512, 512]       18,448     InstanceNorm2D-1318          [[1, 16, 512, 512]]   [1, 16, 512, 512]         32       ReLU-1408               [[1, 16, 512, 512]]   [1, 16, 512, 512]          0       ConvBlock2D-146            [[1, 128, 512, 512]]  [1, 16, 512, 512]          0       Pad2D-791               [[1, 128, 512, 512]]  [1, 128, 532, 532]         0       Conv2D-1631              [[1, 128, 532, 532]]  [1, 16, 512, 512]       18,448     InstanceNorm2D-1319          [[1, 16, 512, 512]]   [1, 16, 512, 512]         32       ReLU-1409               [[1, 16, 512, 512]]   [1, 16, 512, 512]          0       ConvBlock2D-147            [[1, 128, 512, 512]]  [1, 16, 512, 512]          0       Pad2D-792               [[1, 128, 512, 512]]  [1, 128, 536, 536]         0       Conv2D-1632              [[1, 128, 536, 536]]  [1, 16, 512, 512]       18,448     InstanceNorm2D-1320          [[1, 16, 512, 512]]   [1, 16, 512, 512]         32       ReLU-1410               [[1, 16, 512, 512]]   [1, 16, 512, 512]          0       ConvBlock2D-148            [[1, 128, 512, 512]]  [1, 16, 512, 512]          0       Pad2D-793               [[1, 128, 512, 512]]  [1, 128, 512, 512]         0       Conv2D-1633              [[1, 128, 512, 512]]  [1, 128, 510, 510]      147,584    LeakyReLU-29              [[1, 128, 510, 510]]  [1, 128, 510, 510]         0       ConvBlock2D-149            [[1, 128, 512, 512]]  [1, 128, 510, 510]         0       AdaptiveAvgPool2D-15          [[1, 128, 510, 510]]    [1, 128, 1, 1]           0       Linear-29                    [[1, 128]]            [1, 16]             2,048     ReLU-1411                    [[1, 16]]             [1, 16]               0       Linear-30                    [[1, 16]]             [1, 128]            2,048     Sigmoid-15                    [[1, 128]]            [1, 128]              0       Pad2D-794               [[1, 128, 512, 512]]  [1, 128, 512, 512]         0       Conv2D-1634              [[1, 128, 512, 512]]  [1, 64, 512, 512]        8,256     LeakyReLU-30              [[1, 64, 512, 512]]   [1, 64, 512, 512]          0       ConvBlock2D-150            [[1, 128, 512, 512]]  [1, 64, 512, 512]          0       FusionLayer-15             [[1, 128, 512, 512]]  [1, 64, 512, 512]          0       
MultiDilationResnetBlock_attention-15          []           [1, 64, 512, 512]          0       Pad2D-795               [[1, 64, 512, 512]]   [1, 64, 518, 518]          0       Conv2D-1635              [[1, 64, 518, 518]]    [1, 3, 512, 512]        9,411     Tanh-30                 [[1, 3, 512, 512]]    [1, 3, 512, 512]          0       
=================================================================================================
Total params: 117,483,107
Trainable params: 117,409,123
Non-trainable params: 73,984
-------------------------------------------------------------------------------------------------
Input size (MB): 3.00
Forward/backward pass size (MB): 16055.44
Params size (MB): 448.16
Estimated Total Size (MB): 16506.60
-------------------------------------------------------------------------------------------------{'total_params': 117483107, 'trainable_params': 117409123}

四、数据准备

1.解压数据集

!unzip -oq /home/aistudio/data/data71049/data.zip -d work/

2.数据集定义

import paddle
from paddle.io import Dataset
from paddle.vision.transforms import Compose, Resize, ColorJitter, ToTensor, Normalize
from paddle.vision import transformsimport os
import os.path
from os import listdir
from os.path import join
import cv2
import numpy as np
from PIL import Image, ImageOps, ImageEnhance
import randomclass TraindataFromTrack1(Dataset):def __init__(self):super(TraindataFromTrack1, self).__init__()self.image_folder = "/home/aistudio/work/data/input"self.target_folder = "/home/aistudio/work/data/target"self.image_filenames_input = [join(self.image_folder, x) for x in listdir(self.image_folder) ifself.is_image_file(x)]self.image_filenames_target = [join(self.target_folder, x) for x in listdir(self.target_folder) ifself.is_image_file(x)]self.augmentation = ColorJitter(0.2, 0.2, 0.2, 0.2)print("data folder: %s; find %d images" % (self.image_folder, len(self.image_filenames_input)))print("data folder: %s; find %d images" % (self.target_folder, len(self.image_filenames_target)))def is_image_file(swlf, filename):return any(filename.endswith(extension) for extension in [".bmp", ".png", ".jpg", ".jpeg"])def get_img_flipAug(self, index):InputFile = self.image_filenames_input[index]InTargetFile = self.image_filenames_target[index]img_input = Image.open(InputFile).resize((512, 512))img_input = img_input.convert("RGB")img_target = Image.open(InTargetFile).resize((512, 512))img_target = img_target.convert("RGB")return img_input, img_targetdef __getitem__(self, index):img_input, img_target = self.get_img_flipAug(index)img_input = np.asarray(img_input,dtype='float32')img_target = np.asarray(img_target,dtype='float32')# print(img_input.shape)img_input = np.transpose(img_input, (2,0,1))img_target = np.transpose(img_target, (2,0,1))# print(img_input.shape)return img_input, img_targetdef __len__(self):return len(self.image_filenames_input)traindataFromTrack1 = TraindataFromTrack1()
data folder: /home/aistudio/work/data/input; find 168 images
data folder: /home/aistudio/work/data/target; find 168 images

3.展示训练数据

# 取出第一个数据
inputs, targer = traindataFromTrack1[0]# 将CHW转换成HWC
inputs = np.transpose(inputs, (1,2,0))
targer = np.transpose(targer, (1,2,0))
inputs = Image.fromarray(np.uint8(inputs))
targer = Image.fromarray(np.uint8(targer))# 展示输入数据与目标输出
display(inputs)
display(inputs.size)
display(targer)
display(targer.size)

在这里插入图片描述

(512, 512)

在这里插入图片描述

(512, 512)

五、模型训练

# 模型封装
model = paddle.Model(DRN(3, 3))
model.prepare(paddle.optimizer.Adam(learning_rate=0.0002,beta1=0.5,parameters=model.parameters()),paddle.nn.MSELoss())callback = paddle.callbacks.VisualDL(log_dir='visualdl_log_dir')# 启动模型训练,指定训练数据集,设置训练轮次,设置每次数据集计算的批次大小,设置日志格式
model.fit(traindataFromTrack1,epochs=10,batch_size=1,verbose=1,callbacks=callback,)
l.prepare(paddle.optimizer.Adam(learning_rate=0.0002,beta1=0.5,parameters=model.parameters()),paddle.nn.MSELoss())callback = paddle.callbacks.VisualDL(log_dir='visualdl_log_dir')# 启动模型训练,指定训练数据集,设置训练轮次,设置每次数据集计算的批次大小,设置日志格式
model.fit(traindataFromTrack1,epochs=10,batch_size=1,verbose=1,callbacks=callback,)
The loss value printed in the log is the current step, and the metric is the average value of previous step.
Epoch 1/10
step 168/168 [==============================] - loss: 1308.8942 - 781ms/step        
Epoch 2/10
step 168/168 [==============================] - loss: 773.7590 - 779ms/step           
Epoch 3/10
step 168/168 [==============================] - loss: 997.8239 - 781ms/step         
Epoch 4/10
step 168/168 [==============================] - loss: 2062.1763 - 779ms/step        
Epoch 5/10
step 168/168 [==============================] - loss: 23303.9004 - 780ms/step        
Epoch 6/10
step 168/168 [==============================] - loss: 2337.3169 - 780ms/step        
Epoch 7/10
step 168/168 [==============================] - loss: 7284.5688 - 781ms/step        
Epoch 8/10
step 168/168 [==============================] - loss: 5248.8242 - 780ms/step        
Epoch 9/10
step 168/168 [==============================] - loss: 11754.9814 - 780ms/step       
Epoch 10/10
step 168/168 [==============================] - loss: 1588.9448 - 780ms/step        

保存模型

model.save('checkpoint/model_final')

六、总结与展望

讲讲复现的过程中遇到的一些困难以及解决思路:

  • 作者是用Pytorch来实现DRN的,Pytorch与PaddlePaddle有相似之处,但是有一些细节需要注意,比如卷积的api,Pytorch里是小写的d,而PaddlePaddle里的卷积用的是大写的D;又比如pytorch里的cat与PaddlePaddle里的concat。这里需要细心地查阅两个框架的api文档,从不同中找到相同之处。
  • 数据处理上,训练集的图片是4通道的,但论文上的输入是3通道的,因此舍去图片的第四通道,而图片有4个通道应该是虚幻引擎的问题;另一点就是注意区分NCHW格式与NHWC格式,以及两者的转换。
  • 最后还是数据集上,比赛用的数据集有16G,比较大,这里为了简化问题,只选择了168张图片做训练,但Loss降不下去的原因应该不止这一个,还需要继续调参优化。

个人简介

北京联合大学 机器人学院 自动化专业 2018级 本科生 郑博培

百度飞桨开发者技术专家 PPDE

百度飞桨官方帮帮团、答疑团成员

深圳柴火创客空间 认证会员

百度大脑 智能对话训练师

我在AI Studio上获得至尊等级,点亮9个徽章,来互关呀!!!

https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378


http://chatgpt.dhexx.cn/article/xekShHpg.shtml

相关文章

弱监督学习框架 Detectron2/DRN-WSOD-pytorch 在服务器/windows上配置安装及使用

最近做弱监督学习研究,进行相关分析。发现Detectron2是一个不错的框架,其中也有model zoo相当多种类的预训练模型可以拿来直接用。但是安装配置使用中碰到了许多坑。跟各位小伙伴们分享。 推荐使用Linux Ubuntu16.04以上版本安装,虚拟机不太…

大话深度残差网络(DRN)ResNet网络原理

—— 原文发布于本人的微信公众号“大数据与人工智能Lab”(BigdataAILab),欢迎关注。 一说起“深度学习”,自然就联想到它非常显著的特点“深、深、深”(重要的事说三遍),通过很深层次的网络实现…

DRN: A Deep Reinforcement Learning Framework for News Recommendation学习

欢迎转载,请注明出处https://blog.csdn.net/ZJKL_Silence/article/details/85798935。 本文提出了(基于深度Q-learning 的推荐框架)基于强化学习的推荐系统框架来解决三个问题: 1)首先,使用DQN网络来有效建…

【超分辨率】(DRN)Closed-loop Matters: Dual Regression Networks for Single Image Super-Resolution

论文名称:Closed-loop Matters: Dual Regression Networks for Single Image Super-Resolution 论文下载地址:https://arxiv.org/pdf/2003.07018.pdf 论文代码地址:https://github.com/guoyongcs/DRN 但是代码有问题 论文标题: 1…

CNN经典模型:深度残差网络(DRN)ResNet

一说起“深度学习”,自然就联想到它非常显著的特点“深、深、深”(重要的事说三遍),通过很深层次的网络实现准确率非常高的图像识别、语音识别等能力。因此,我们自然很容易就想到:深的网络一般会比浅的网络…

2021-11-11SR-DRN

闭环问题:单张图像超分辨的对偶回归网络(DRN) SR主要是要学习LR和HR之间的某种映射来重建相应的HR图像。 一、SISR存在的两个潜在的问题: 1.学习从LR到HR的映射是一个病态的逆问题。一张LR图像可以对应多张HR图像,也就是说存在…

DNN

文章目录 前向传播从感知机到神经网络DNN的基本结构DNN前向传播算法数学原理 DNN前向传播算法反向传播算法(BP)DNN反向传播算法要解决的问题 DNN反向传播算法的基本思路DNN反向传播算法过程损失函数和激活函数的选择均方差损失函数Sigmoid激活函数的问题使用交叉熵损失函数Sigm…

DRCN神经网络

1 DRCN DRCN(Deeply-Recurisive Convolutional Network),一种利用深度递归卷积网络。DRCN与之前的VDSR都是来自首尔国立大学计算机视觉实验室的工作。该网络将插值后的图像作为输入,并像SRCNN中一样预测目标图像。 该网络分为三个部分&…

DRM(一):什么是DRM

之前说了要一起学习一下与安全紧密相关的业务事项,于是这就开始了。 今天就来看看与版权保护相关的技术:DRM 内容基本上来自:【DRM架构介绍】 还是我推荐的那个号–》内核工匠,确实内容不错,学到很多。 1、DRM是什…

推荐系统强化学习DRN

文章目录 强化学习的基本概念强化学习推荐系统框架强化学习推荐模型的特点 深度强化学习推荐模型中的DQNDRN的学习过程DRN竞争梯度下降算法 强化学习的基本概念 强化学习的基本概念就是一个智能体通过与环境进行交互,不断学习强化自己的智力,来指导自己的…

DRN - 扩张残留网络(图像分类和语义分割)

DRN - 扩张残留网络(图像分类和语义分割) 原标题 | Review: DRN — Dilated Residual Networks (Image Classification & Semantic Segmentation) 作者 | Sik-Ho Tsang 翻译 | had_in(电子科技大学) 编辑 | Pita 本文回顾…

DRN——强化学习与推荐系统结合

强化学习是近年来机器学习领域非常热门的研究话题,它的研究起源于机器人领域,针对智能体在不断变化的环境 中决策和学习的过程进行建模。在智能体的学习过程中,会完成收集外部反馈,改变自身状态,再根据自身状态对下一步的行动进行决策&#x…

【Pytorch深度学习实战】(7)深度残差网络(DRN)

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

图像超分辨率 之 DRN 论文解读与感想

图像超分辨率 之 DRN (Closed-loop Matters: Dual Regression Networks for Single Image Super-Resolution)论文解读与感想 DRN是在2020年顶会(CVPR)上发表的一篇想法简单,但是结果非常不错的文章。 先来说一下文章的切入点: …

关于CSRF攻击及mvc中的解决方案 [ValidateAntiForgeryToken]

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 二.CSRF可以做什么&#xff…

CSRF简介

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 二.CSRF可以做什么&#xf…

django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方案

现象 表单界面如下&#xff1a; 在点击提交之后&#xff0c;出现如下错误页面&#xff1a; HTML的代码如下&#xff1a; contact_form.html <!DOCTYPE HTML PUBLIC ><html> <head><title>Contact us</title> </head><body><h1&…

Django CSRF验证失败. 请求被中断.

项目场景&#xff1a; Python版本&#xff1a;3.7 Django版本&#xff1a;3.1.7 问题描述&#xff1a; 出现了CSRF验证失败. 请求被中断. 原因分析&#xff1a; 在Django中有个设定&#xff0c;防止跨域来请求。比如有爬虫&#xff0c;爬虫不是从网站根目录开始搜寻&#x…

detail: “CSRF Failed: CSRF token missing or incorrect 问题解决方法

如果你尝试了所有方法之后还是没用&#xff0c;那定位你的Ajax方法&#xff1a; 1&#xff0c;var $crf_token $(‘[name“csrfmiddlewaretoken”]’).attr(‘value’) 2&#xff0c;headers:{“X-CSRFToken”: $crf_token} 原因分析&#xff1a; 这是由于你的django,有一个…

CSRF防御之token认证

一、CSRF是什么&#xff1f; CSRF&#xff08;Cross-site request forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求伪造。攻击者盗用你的身份&#xff0c;以你的名义发送恶意请求。CSRF能够做的事情包括&#xff1a;以你名义发送邮件&#xff0c;发消息&#xf…