init + inference.py патч
This commit is contained in:
382
data/MBD/model/densenetccnl.py
Normal file
382
data/MBD/model/densenetccnl.py
Normal file
@ -0,0 +1,382 @@
|
||||
# Densenet decoder encoder with intermediate fully connected layers and dropout
|
||||
|
||||
import torch
|
||||
import torch.backends.cudnn as cudnn
|
||||
import torch.nn as nn
|
||||
import torch.nn.functional as F
|
||||
import functools
|
||||
from torch.autograd import gradcheck
|
||||
from torch.autograd import Function
|
||||
from torch.autograd import Variable
|
||||
from torch.autograd import gradcheck
|
||||
from torch.autograd import Function
|
||||
import numpy as np
|
||||
|
||||
|
||||
def add_coordConv_channels(t):
|
||||
n,c,h,w=t.size()
|
||||
xx_channel=np.ones((h, w))
|
||||
xx_range=np.array(range(h))
|
||||
xx_range=np.expand_dims(xx_range,-1)
|
||||
xx_coord=xx_channel*xx_range
|
||||
yy_coord=xx_coord.transpose()
|
||||
|
||||
xx_coord=xx_coord/(h-1)
|
||||
yy_coord=yy_coord/(h-1)
|
||||
xx_coord=xx_coord*2 - 1
|
||||
yy_coord=yy_coord*2 - 1
|
||||
xx_coord=torch.from_numpy(xx_coord).float()
|
||||
yy_coord=torch.from_numpy(yy_coord).float()
|
||||
|
||||
if t.is_cuda:
|
||||
xx_coord=xx_coord.cuda()
|
||||
yy_coord=yy_coord.cuda()
|
||||
|
||||
xx_coord=xx_coord.unsqueeze(0).unsqueeze(0).repeat(n,1,1,1)
|
||||
yy_coord=yy_coord.unsqueeze(0).unsqueeze(0).repeat(n,1,1,1)
|
||||
|
||||
t_cc=torch.cat((t,xx_coord,yy_coord),dim=1)
|
||||
|
||||
return t_cc
|
||||
|
||||
|
||||
|
||||
class DenseBlockEncoder(nn.Module):
|
||||
def __init__(self, n_channels, n_convs, activation=nn.ReLU, args=[False]):
|
||||
super(DenseBlockEncoder, self).__init__()
|
||||
assert(n_convs > 0)
|
||||
|
||||
self.n_channels = n_channels
|
||||
self.n_convs = n_convs
|
||||
self.layers = nn.ModuleList()
|
||||
for i in range(n_convs):
|
||||
self.layers.append(nn.Sequential(
|
||||
nn.BatchNorm2d(n_channels),
|
||||
activation(*args),
|
||||
nn.Conv2d(n_channels, n_channels, 3, stride=1, padding=1, bias=False),))
|
||||
|
||||
def forward(self, inputs):
|
||||
outputs = []
|
||||
|
||||
for i, layer in enumerate(self.layers):
|
||||
if i > 0:
|
||||
next_output = 0
|
||||
for no in outputs:
|
||||
next_output = next_output + no
|
||||
outputs.append(next_output)
|
||||
else:
|
||||
outputs.append(layer(inputs))
|
||||
return outputs[-1]
|
||||
|
||||
# Dense block in encoder.
|
||||
class DenseBlockDecoder(nn.Module):
|
||||
def __init__(self, n_channels, n_convs, activation=nn.ReLU, args=[False]):
|
||||
super(DenseBlockDecoder, self).__init__()
|
||||
assert(n_convs > 0)
|
||||
|
||||
self.n_channels = n_channels
|
||||
self.n_convs = n_convs
|
||||
self.layers = nn.ModuleList()
|
||||
for i in range(n_convs):
|
||||
self.layers.append(nn.Sequential(
|
||||
nn.BatchNorm2d(n_channels),
|
||||
activation(*args),
|
||||
nn.ConvTranspose2d(n_channels, n_channels, 3, stride=1, padding=1, bias=False),))
|
||||
|
||||
def forward(self, inputs):
|
||||
outputs = []
|
||||
|
||||
for i, layer in enumerate(self.layers):
|
||||
if i > 0:
|
||||
next_output = 0
|
||||
for no in outputs:
|
||||
next_output = next_output + no
|
||||
outputs.append(next_output)
|
||||
else:
|
||||
outputs.append(layer(inputs))
|
||||
return outputs[-1]
|
||||
|
||||
class DenseTransitionBlockEncoder(nn.Module):
|
||||
def __init__(self, n_channels_in, n_channels_out, mp, activation=nn.ReLU, args=[False]):
|
||||
super(DenseTransitionBlockEncoder, self).__init__()
|
||||
self.n_channels_in = n_channels_in
|
||||
self.n_channels_out = n_channels_out
|
||||
self.mp = mp
|
||||
self.main = nn.Sequential(
|
||||
nn.BatchNorm2d(n_channels_in),
|
||||
activation(*args),
|
||||
nn.Conv2d(n_channels_in, n_channels_out, 1, stride=1, padding=0, bias=False),
|
||||
nn.MaxPool2d(mp),
|
||||
)
|
||||
def forward(self, inputs):
|
||||
# print(inputs.shape,'222222222222222',self.main(inputs).shape)
|
||||
return self.main(inputs)
|
||||
|
||||
|
||||
class DenseTransitionBlockDecoder(nn.Module):
|
||||
def __init__(self, n_channels_in, n_channels_out, activation=nn.ReLU, args=[False]):
|
||||
super(DenseTransitionBlockDecoder, self).__init__()
|
||||
self.n_channels_in = n_channels_in
|
||||
self.n_channels_out = n_channels_out
|
||||
self.main = nn.Sequential(
|
||||
nn.BatchNorm2d(n_channels_in),
|
||||
activation(*args),
|
||||
nn.ConvTranspose2d(n_channels_in, n_channels_out, 4, stride=2, padding=1, bias=False),
|
||||
)
|
||||
def forward(self, inputs):
|
||||
# print(inputs.shape,'333333333333',self.main(inputs).shape)
|
||||
return self.main(inputs)
|
||||
|
||||
## Dense encoders and decoders for image of size 128 128
|
||||
class waspDenseEncoder128(nn.Module):
|
||||
def __init__(self, nc=1, ndf = 32, ndim = 128, activation=nn.LeakyReLU, args=[0.2, False], f_activation=nn.Tanh, f_args=[]):
|
||||
super(waspDenseEncoder128, self).__init__()
|
||||
self.ndim = ndim
|
||||
|
||||
self.main = nn.Sequential(
|
||||
# input is (nc) x 128 x 128
|
||||
nn.BatchNorm2d(nc),
|
||||
nn.ReLU(True),
|
||||
nn.Conv2d(nc, ndf, 4, stride=2, padding=1),
|
||||
|
||||
# state size. (ndf) x 64 x 64
|
||||
DenseBlockEncoder(ndf, 6),
|
||||
DenseTransitionBlockEncoder(ndf, ndf*2, 2, activation=activation, args=args),
|
||||
|
||||
# state size. (ndf*2) x 32 x 32
|
||||
DenseBlockEncoder(ndf*2, 12),
|
||||
DenseTransitionBlockEncoder(ndf*2, ndf*4, 2, activation=activation, args=args),
|
||||
|
||||
# state size. (ndf*4) x 16 x 16
|
||||
DenseBlockEncoder(ndf*4, 16),
|
||||
DenseTransitionBlockEncoder(ndf*4, ndf*8, 2, activation=activation, args=args),
|
||||
|
||||
# state size. (ndf*4) x 8 x 8
|
||||
DenseBlockEncoder(ndf*8, 16),
|
||||
DenseTransitionBlockEncoder(ndf*8, ndf*8, 2, activation=activation, args=args),
|
||||
|
||||
# state size. (ndf*8) x 4 x 4
|
||||
DenseBlockEncoder(ndf*8, 16),
|
||||
DenseTransitionBlockEncoder(ndf*8, ndim, 4, activation=activation, args=args),
|
||||
f_activation(*f_args),
|
||||
)
|
||||
|
||||
def forward(self, input):
|
||||
input=add_coordConv_channels(input)
|
||||
output = self.main(input).view(-1,self.ndim)
|
||||
#print(output.size())
|
||||
return output
|
||||
|
||||
class waspDenseDecoder128(nn.Module):
|
||||
def __init__(self, nz=128, nc=1, ngf=32, lb=0, ub=1, activation=nn.ReLU, args=[False], f_activation=nn.Hardtanh, f_args=[]):
|
||||
super(waspDenseDecoder128, self).__init__()
|
||||
self.main = nn.Sequential(
|
||||
# input is Z, going into convolution
|
||||
nn.BatchNorm2d(nz),
|
||||
activation(*args),
|
||||
nn.ConvTranspose2d(nz, ngf * 8, 4, 1, 0, bias=False),
|
||||
|
||||
# state size. (ngf*8) x 4 x 4
|
||||
DenseBlockDecoder(ngf*8, 16),
|
||||
DenseTransitionBlockDecoder(ngf*8, ngf*8),
|
||||
|
||||
# state size. (ngf*4) x 8 x 8
|
||||
DenseBlockDecoder(ngf*8, 16),
|
||||
DenseTransitionBlockDecoder(ngf*8, ngf*4),
|
||||
|
||||
# state size. (ngf*2) x 16 x 16
|
||||
DenseBlockDecoder(ngf*4, 12),
|
||||
DenseTransitionBlockDecoder(ngf*4, ngf*2),
|
||||
|
||||
# state size. (ngf) x 32 x 32
|
||||
DenseBlockDecoder(ngf*2, 6),
|
||||
DenseTransitionBlockDecoder(ngf*2, ngf),
|
||||
|
||||
# state size. (ngf) x 64 x 64
|
||||
DenseBlockDecoder(ngf, 6),
|
||||
DenseTransitionBlockDecoder(ngf, ngf),
|
||||
|
||||
# state size (ngf) x 128 x 128
|
||||
nn.BatchNorm2d(ngf),
|
||||
activation(*args),
|
||||
nn.ConvTranspose2d(ngf, nc, 3, stride=1, padding=1, bias=False),
|
||||
f_activation(*f_args),
|
||||
)
|
||||
# self.smooth=nn.Sequential(
|
||||
# nn.Conv2d(nc, nc, 1, stride=1, padding=0, bias=False),
|
||||
# f_activation(*f_args),
|
||||
# )
|
||||
def forward(self, inputs):
|
||||
# return self.smooth(self.main(inputs))
|
||||
return self.main(inputs)
|
||||
|
||||
|
||||
|
||||
## Dense encoders and decoders for image of size 512 512
|
||||
class waspDenseEncoder512(nn.Module):
|
||||
def __init__(self, nc=1, ndf = 32, ndim = 128, activation=nn.LeakyReLU, args=[0.2, False], f_activation=nn.Tanh, f_args=[]):
|
||||
super(waspDenseEncoder512, self).__init__()
|
||||
self.ndim = ndim
|
||||
|
||||
self.main = nn.Sequential(
|
||||
# input is (nc) x 128 x 128 > *4
|
||||
nn.BatchNorm2d(nc),
|
||||
nn.ReLU(True),
|
||||
nn.Conv2d(nc, ndf, 4, stride=2, padding=1),
|
||||
|
||||
# state size. (ndf) x 64 x 64 > *4
|
||||
DenseBlockEncoder(ndf, 6),
|
||||
DenseTransitionBlockEncoder(ndf, ndf*2, 2, activation=activation, args=args),
|
||||
|
||||
# state size. (ndf*2) x 32 x 32 > *4
|
||||
DenseBlockEncoder(ndf*2, 12),
|
||||
DenseTransitionBlockEncoder(ndf*2, ndf*4, 2, activation=activation, args=args),
|
||||
|
||||
# state size. (ndf*4) x 16 x 16 > *4
|
||||
DenseBlockEncoder(ndf*4, 16),
|
||||
DenseTransitionBlockEncoder(ndf*4, ndf*8, 2, activation=activation, args=args),
|
||||
|
||||
# state size. (ndf*8) x 8 x 8 *4
|
||||
DenseBlockEncoder(ndf*8, 16),
|
||||
DenseTransitionBlockEncoder(ndf*8, ndf*8, 2, activation=activation, args=args),
|
||||
|
||||
# state size. (ndf*8) x 4 x 4 > *4
|
||||
DenseBlockEncoder(ndf*8, 16),
|
||||
DenseTransitionBlockEncoder(ndf*8, ndf*8, 4, activation=activation, args=args),
|
||||
f_activation(*f_args),
|
||||
|
||||
# state size. (ndf*8) x 2 x 2 > *4
|
||||
DenseBlockEncoder(ndf*8, 16),
|
||||
DenseTransitionBlockEncoder(ndf*8, ndim, 4, activation=activation, args=args),
|
||||
f_activation(*f_args),
|
||||
)
|
||||
|
||||
def forward(self, input):
|
||||
input=add_coordConv_channels(input)
|
||||
output = self.main(input).view(-1,self.ndim)
|
||||
# output = self.main(input).view(8,-1)
|
||||
# print(input.shape,'---------------------')
|
||||
#print(output.size())
|
||||
return output
|
||||
|
||||
class waspDenseDecoder512(nn.Module):
|
||||
def __init__(self, nz=128, nc=1, ngf=32, lb=0, ub=1, activation=nn.ReLU, args=[False], f_activation=nn.Tanh, f_args=[]):
|
||||
super(waspDenseDecoder512, self).__init__()
|
||||
self.main = nn.Sequential(
|
||||
# input is Z, going into convolution
|
||||
nn.BatchNorm2d(nz),
|
||||
activation(*args),
|
||||
nn.ConvTranspose2d(nz, ngf * 8, 4, 1, 0, bias=False),
|
||||
|
||||
# state size. (ngf*8) x 4 x 4
|
||||
DenseBlockDecoder(ngf*8, 16),
|
||||
DenseTransitionBlockDecoder(ngf*8, ngf*8),
|
||||
|
||||
# state size. (ngf*8) x 8 x 8
|
||||
DenseBlockDecoder(ngf*8, 16),
|
||||
DenseTransitionBlockDecoder(ngf*8, ngf*8),
|
||||
|
||||
# state size. (ngf*4) x 16 x 16
|
||||
DenseBlockDecoder(ngf*8, 16),
|
||||
DenseTransitionBlockDecoder(ngf*8, ngf*4),
|
||||
|
||||
# state size. (ngf*2) x 32 x 32
|
||||
DenseBlockDecoder(ngf*4, 12),
|
||||
DenseTransitionBlockDecoder(ngf*4, ngf*2),
|
||||
|
||||
# state size. (ngf) x 64 x 64
|
||||
DenseBlockDecoder(ngf*2, 6),
|
||||
DenseTransitionBlockDecoder(ngf*2, ngf),
|
||||
|
||||
# state size. (ngf) x 128 x 128
|
||||
DenseBlockDecoder(ngf, 6),
|
||||
DenseTransitionBlockDecoder(ngf, ngf),
|
||||
|
||||
# state size. (ngf) x 256 x 256
|
||||
DenseBlockDecoder(ngf, 6),
|
||||
DenseTransitionBlockDecoder(ngf, ngf),
|
||||
|
||||
# state size (ngf) x 512 x 512
|
||||
nn.BatchNorm2d(ngf),
|
||||
activation(*args),
|
||||
nn.ConvTranspose2d(ngf, nc, 3, stride=1, padding=1, bias=False),
|
||||
f_activation(*f_args),
|
||||
)
|
||||
# self.smooth=nn.Sequential(
|
||||
# nn.Conv2d(nc, nc, 1, stride=1, padding=0, bias=False),
|
||||
# f_activation(*f_args),
|
||||
# )
|
||||
def forward(self, inputs):
|
||||
# return self.smooth(self.main(inputs))
|
||||
return self.main(inputs)
|
||||
|
||||
|
||||
class dnetccnl(nn.Module):
|
||||
#in_channels -> nc | encoder first layer
|
||||
#filters -> ndf | encoder first layer
|
||||
#img_size(h,w) -> ndim
|
||||
#out_channels -> optical flow (x,y)
|
||||
|
||||
def __init__(self, img_size=448, in_channels=3, out_channels=2, filters=32,fc_units=100):
|
||||
super(dnetccnl, self).__init__()
|
||||
self.nc=in_channels
|
||||
self.nf=filters
|
||||
self.ndim=img_size
|
||||
self.oc=out_channels
|
||||
self.fcu=fc_units
|
||||
|
||||
self.encoder=waspDenseEncoder128(nc=self.nc+2,ndf=self.nf,ndim=self.ndim)
|
||||
self.decoder=waspDenseDecoder128(nz=self.ndim,nc=self.oc,ngf=self.nf)
|
||||
# self.fc_layers= nn.Sequential(nn.Linear(self.ndim, self.fcu),
|
||||
# nn.ReLU(True),
|
||||
# nn.Dropout(0.25),
|
||||
# nn.Linear(self.fcu,self.ndim),
|
||||
# nn.ReLU(True),
|
||||
# nn.Dropout(0.25),
|
||||
# )
|
||||
|
||||
def forward(self, inputs):
|
||||
|
||||
encoded=self.encoder(inputs)
|
||||
encoded=encoded.unsqueeze(-1).unsqueeze(-1)
|
||||
decoded=self.decoder(encoded)
|
||||
# print torch.max(decoded)
|
||||
# print torch.min(decoded)
|
||||
# print(decoded.shape,'11111111111111111',encoded.shape)
|
||||
|
||||
return decoded
|
||||
|
||||
class dnetccnl512(nn.Module):
|
||||
#in_channels -> nc | encoder first layer
|
||||
#filters -> ndf | encoder first layer
|
||||
#img_size(h,w) -> ndim
|
||||
#out_channels -> optical flow (x,y)
|
||||
|
||||
def __init__(self, img_size=448, in_channels=3, out_channels=2, filters=32,fc_units=100):
|
||||
super(dnetccnl512, self).__init__()
|
||||
self.nc=in_channels
|
||||
self.nf=filters
|
||||
self.ndim=img_size
|
||||
self.oc=out_channels
|
||||
self.fcu=fc_units
|
||||
|
||||
self.encoder=waspDenseEncoder512(nc=self.nc+2,ndf=self.nf,ndim=self.ndim)
|
||||
self.decoder=waspDenseDecoder512(nz=self.ndim,nc=self.oc,ngf=self.nf)
|
||||
# self.fc_layers= nn.Sequential(nn.Linear(self.ndim, self.fcu),
|
||||
# nn.ReLU(True),
|
||||
# nn.Dropout(0.25),
|
||||
# nn.Linear(self.fcu,self.ndim),
|
||||
# nn.ReLU(True),
|
||||
# nn.Dropout(0.25),
|
||||
# )
|
||||
|
||||
def forward(self, inputs):
|
||||
|
||||
encoded=self.encoder(inputs)
|
||||
encoded=encoded.unsqueeze(-1).unsqueeze(-1)
|
||||
decoded=self.decoder(encoded)
|
||||
# print torch.max(decoded)
|
||||
# print torch.min(decoded)
|
||||
# print(decoded.shape,'11111111111111111',encoded.shape)
|
||||
|
||||
return decoded
|
||||
Reference in New Issue
Block a user