| |
| |
|
|
| import numpy as np |
| import torch |
| import torch.nn as nn |
| import torch.nn.functional as F |
| import os |
| import functools |
| from torch.autograd import Variable |
| from util.image_pool import ImagePool |
| from .base_model import BaseModel |
| from . import networks |
| import math |
|
|
|
|
| class Mapping_Model_with_mask(nn.Module): |
| def __init__(self, nc, mc=64, n_blocks=3, norm="instance", padding_type="reflect", opt=None): |
| super(Mapping_Model_with_mask, self).__init__() |
|
|
| norm_layer = networks.get_norm_layer(norm_type=norm) |
| activation = nn.ReLU(True) |
| model = [] |
|
|
| tmp_nc = 64 |
| n_up = 4 |
|
|
| for i in range(n_up): |
| ic = min(tmp_nc * (2 ** i), mc) |
| oc = min(tmp_nc * (2 ** (i + 1)), mc) |
| model += [nn.Conv2d(ic, oc, 3, 1, 1), norm_layer(oc), activation] |
|
|
| self.before_NL = nn.Sequential(*model) |
|
|
| if opt.NL_res: |
| self.NL = networks.NonLocalBlock2D_with_mask_Res( |
| mc, |
| mc, |
| opt.NL_fusion_method, |
| opt.correlation_renormalize, |
| opt.softmax_temperature, |
| opt.use_self, |
| opt.cosin_similarity, |
| ) |
| print("You are using NL + Res") |
|
|
| model = [] |
| for i in range(n_blocks): |
| model += [ |
| networks.ResnetBlock( |
| mc, |
| padding_type=padding_type, |
| activation=activation, |
| norm_layer=norm_layer, |
| opt=opt, |
| dilation=opt.mapping_net_dilation, |
| ) |
| ] |
|
|
| for i in range(n_up - 1): |
| ic = min(64 * (2 ** (4 - i)), mc) |
| oc = min(64 * (2 ** (3 - i)), mc) |
| model += [nn.Conv2d(ic, oc, 3, 1, 1), norm_layer(oc), activation] |
| model += [nn.Conv2d(tmp_nc * 2, tmp_nc, 3, 1, 1)] |
| if opt.feat_dim > 0 and opt.feat_dim < 64: |
| model += [norm_layer(tmp_nc), activation, nn.Conv2d(tmp_nc, opt.feat_dim, 1, 1)] |
| |
| self.after_NL = nn.Sequential(*model) |
| |
| |
| def forward(self, input, mask): |
| x1 = self.before_NL(input) |
| del input |
| x2 = self.NL(x1, mask) |
| del x1, mask |
| x3 = self.after_NL(x2) |
| del x2 |
|
|
| return x3 |
|
|
| class Mapping_Model_with_mask_2(nn.Module): |
| def __init__(self, nc, mc=64, n_blocks=3, norm="instance", padding_type="reflect", opt=None): |
| super(Mapping_Model_with_mask_2, self).__init__() |
|
|
| norm_layer = networks.get_norm_layer(norm_type=norm) |
| activation = nn.ReLU(True) |
| model = [] |
|
|
| tmp_nc = 64 |
| n_up = 4 |
|
|
| for i in range(n_up): |
| ic = min(tmp_nc * (2 ** i), mc) |
| oc = min(tmp_nc * (2 ** (i + 1)), mc) |
| model += [nn.Conv2d(ic, oc, 3, 1, 1), norm_layer(oc), activation] |
|
|
| for i in range(2): |
| model += [ |
| networks.ResnetBlock( |
| mc, |
| padding_type=padding_type, |
| activation=activation, |
| norm_layer=norm_layer, |
| opt=opt, |
| dilation=opt.mapping_net_dilation, |
| ) |
| ] |
|
|
| print("Mapping: You are using multi-scale patch attention, conv combine + mask input") |
|
|
| self.before_NL = nn.Sequential(*model) |
|
|
| if opt.mapping_exp==1: |
| self.NL_scale_1=networks.Patch_Attention_4(mc,mc,8) |
|
|
| model = [] |
| for i in range(2): |
| model += [ |
| networks.ResnetBlock( |
| mc, |
| padding_type=padding_type, |
| activation=activation, |
| norm_layer=norm_layer, |
| opt=opt, |
| dilation=opt.mapping_net_dilation, |
| ) |
| ] |
|
|
| self.res_block_1 = nn.Sequential(*model) |
|
|
| if opt.mapping_exp==1: |
| self.NL_scale_2=networks.Patch_Attention_4(mc,mc,4) |
|
|
| model = [] |
| for i in range(2): |
| model += [ |
| networks.ResnetBlock( |
| mc, |
| padding_type=padding_type, |
| activation=activation, |
| norm_layer=norm_layer, |
| opt=opt, |
| dilation=opt.mapping_net_dilation, |
| ) |
| ] |
| |
| self.res_block_2 = nn.Sequential(*model) |
| |
| if opt.mapping_exp==1: |
| self.NL_scale_3=networks.Patch_Attention_4(mc,mc,2) |
| |
|
|
| model = [] |
| for i in range(2): |
| model += [ |
| networks.ResnetBlock( |
| mc, |
| padding_type=padding_type, |
| activation=activation, |
| norm_layer=norm_layer, |
| opt=opt, |
| dilation=opt.mapping_net_dilation, |
| ) |
| ] |
|
|
| for i in range(n_up - 1): |
| ic = min(64 * (2 ** (4 - i)), mc) |
| oc = min(64 * (2 ** (3 - i)), mc) |
| model += [nn.Conv2d(ic, oc, 3, 1, 1), norm_layer(oc), activation] |
| model += [nn.Conv2d(tmp_nc * 2, tmp_nc, 3, 1, 1)] |
| if opt.feat_dim > 0 and opt.feat_dim < 64: |
| model += [norm_layer(tmp_nc), activation, nn.Conv2d(tmp_nc, opt.feat_dim, 1, 1)] |
| |
| self.after_NL = nn.Sequential(*model) |
| |
| |
| def forward(self, input, mask): |
| x1 = self.before_NL(input) |
| x2 = self.NL_scale_1(x1,mask) |
| x3 = self.res_block_1(x2) |
| x4 = self.NL_scale_2(x3,mask) |
| x5 = self.res_block_2(x4) |
| x6 = self.NL_scale_3(x5,mask) |
| x7 = self.after_NL(x6) |
| return x7 |
|
|
| def inference_forward(self, input, mask): |
| x1 = self.before_NL(input) |
| del input |
| x2 = self.NL_scale_1.inference_forward(x1,mask) |
| del x1 |
| x3 = self.res_block_1(x2) |
| del x2 |
| x4 = self.NL_scale_2.inference_forward(x3,mask) |
| del x3 |
| x5 = self.res_block_2(x4) |
| del x4 |
| x6 = self.NL_scale_3.inference_forward(x5,mask) |
| del x5 |
| x7 = self.after_NL(x6) |
| del x6 |
| return x7 |