import torch import torch.nn as nn class MonStereoModel(nn.Module): def __init__(self, input_size, output_size=2, linear_size=512, p_dropout=0.2, num_stage=3, device='cuda'): super(MonStereoModel, self).__init__() self.num_stage = num_stage self.stereo_size = input_size self.mono_size = int(input_size / 2) self.output_size = output_size - 1 self.linear_size = linear_size self.p_dropout = p_dropout self.num_stage = num_stage self.linear_stages = [] self.device = device # Initialize weights # Preprocessing self.w1 = nn.Linear(self.stereo_size, self.linear_size) self.batch_norm1 = nn.BatchNorm1d(self.linear_size) # Internal loop for _ in range(num_stage): self.linear_stages.append(MyLinearSimple(self.linear_size, self.p_dropout)) self.linear_stages = nn.ModuleList(self.linear_stages) # Post processing self.w2 = nn.Linear(self.linear_size, self.linear_size) self.w3 = nn.Linear(self.linear_size, self.linear_size) self.batch_norm3 = nn.BatchNorm1d(self.linear_size) # ------------------------Other---------------------------------------------- # Auxiliary self.w_aux = nn.Linear(self.linear_size, 1) # Final self.w_fin = nn.Linear(self.linear_size, self.output_size) # NO-weight operations self.relu = nn.ReLU(inplace=True) self.dropout = nn.Dropout(self.p_dropout) def forward(self, x): y = self.w1(x) y = self.batch_norm1(y) y = self.relu(y) y = self.dropout(y) for i in range(self.num_stage): y = self.linear_stages[i](y) # Auxiliary task y = self.w2(y) aux = self.w_aux(y) # Final layers y = self.w3(y) y = self.batch_norm3(y) y = self.relu(y) y = self.dropout(y) y = self.w_fin(y) # Cat with auxiliary task y = torch.cat((y, aux), dim=1) return y class MyLinearSimple(nn.Module): def __init__(self, linear_size, p_dropout=0.5): super(MyLinearSimple, self).__init__() self.l_size = linear_size self.relu = nn.ReLU(inplace=True) self.dropout = nn.Dropout(p_dropout) self.w1 = nn.Linear(self.l_size, self.l_size) self.batch_norm1 = nn.BatchNorm1d(self.l_size) self.w2 = nn.Linear(self.l_size, self.l_size) self.batch_norm2 = nn.BatchNorm1d(self.l_size) def forward(self, x): y = self.w1(x) y = self.batch_norm1(y) y = self.relu(y) y = self.dropout(y) y = self.w2(y) y = self.batch_norm2(y) y = self.relu(y) y = self.dropout(y) out = x + y return out class MonolocoModel(nn.Module): """ Architecture inspired by https://github.com/una-dinosauria/3d-pose-baseline Pytorch implementation from: https://github.com/weigq/3d_pose_baseline_pytorch """ def __init__(self, input_size, output_size=2, linear_size=256, p_dropout=0.2, num_stage=3): super(MonolocoModel, self).__init__() self.input_size = input_size self.output_size = output_size self.linear_size = linear_size self.p_dropout = p_dropout self.num_stage = num_stage # process input to linear size self.w1 = nn.Linear(self.input_size, self.linear_size) self.batch_norm1 = nn.BatchNorm1d(self.linear_size) self.linear_stages = [] for _ in range(num_stage): self.linear_stages.append(MyLinear(self.linear_size, self.p_dropout)) self.linear_stages = nn.ModuleList(self.linear_stages) # post processing self.w2 = nn.Linear(self.linear_size, self.output_size) self.relu = nn.ReLU(inplace=True) self.dropout = nn.Dropout(self.p_dropout) def forward(self, x): # pre-processing y = self.w1(x) y = self.batch_norm1(y) y = self.relu(y) y = self.dropout(y) # linear layers for i in range(self.num_stage): y = self.linear_stages[i](y) y = self.w2(y) return y class MyLinear(nn.Module): def __init__(self, linear_size, p_dropout=0.5): super(MyLinear, self).__init__() self.l_size = linear_size self.relu = nn.ReLU(inplace=True) self.dropout = nn.Dropout(p_dropout) self.w1 = nn.Linear(self.l_size, self.l_size) self.batch_norm1 = nn.BatchNorm1d(self.l_size) self.w2 = nn.Linear(self.l_size, self.l_size) self.batch_norm2 = nn.BatchNorm1d(self.l_size) def forward(self, x): y = self.w1(x) y = self.batch_norm1(y) y = self.relu(y) y = self.dropout(y) y = self.w2(y) y = self.batch_norm2(y) y = self.relu(y) y = self.dropout(y) out = x + y return out