Spaces:
Running
on
Zero
Running
on
Zero
| import torch | |
| import torch.nn as nn | |
| import torch.nn.functional as F | |
| import torchvision.models as models | |
| import numpy as np | |
| # net_stride output_size | |
| # 128 2x2 | |
| # 64 4x4 | |
| # 32 8x8 | |
| # pip regression, resnet101 | |
| class Pip_resnet101(nn.Module): | |
| def __init__(self, resnet, num_nb, num_lms=68, input_size=256, net_stride=32): | |
| super(Pip_resnet101, self).__init__() | |
| self.num_nb = num_nb | |
| self.num_lms = num_lms | |
| self.input_size = input_size | |
| self.net_stride = net_stride | |
| self.conv1 = resnet.conv1 | |
| self.bn1 = resnet.bn1 | |
| self.maxpool = resnet.maxpool | |
| self.sigmoid = nn.Sigmoid() | |
| self.layer1 = resnet.layer1 | |
| self.layer2 = resnet.layer2 | |
| self.layer3 = resnet.layer3 | |
| self.layer4 = resnet.layer4 | |
| if self.net_stride == 128: | |
| self.layer5 = nn.Conv2d(2048, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn5 = nn.BatchNorm2d(512) | |
| self.layer6 = nn.Conv2d(512, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn6 = nn.BatchNorm2d(512) | |
| # init | |
| nn.init.normal_(self.layer5.weight, std=0.001) | |
| if self.layer5.bias is not None: | |
| nn.init.constant_(self.layer5.bias, 0) | |
| nn.init.constant_(self.bn5.weight, 1) | |
| nn.init.constant_(self.bn5.bias, 0) | |
| nn.init.normal_(self.layer6.weight, std=0.001) | |
| if self.layer6.bias is not None: | |
| nn.init.constant_(self.layer6.bias, 0) | |
| nn.init.constant_(self.bn6.weight, 1) | |
| nn.init.constant_(self.bn6.bias, 0) | |
| elif self.net_stride == 64: | |
| self.layer5 = nn.Conv2d(2048, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn5 = nn.BatchNorm2d(512) | |
| # init | |
| nn.init.normal_(self.layer5.weight, std=0.001) | |
| if self.layer5.bias is not None: | |
| nn.init.constant_(self.layer5.bias, 0) | |
| nn.init.constant_(self.bn5.weight, 1) | |
| nn.init.constant_(self.bn5.bias, 0) | |
| elif self.net_stride == 32: | |
| pass | |
| else: | |
| print('No such net_stride!') | |
| exit(0) | |
| self.cls_layer = nn.Conv2d(2048, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.x_layer = nn.Conv2d(2048, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.y_layer = nn.Conv2d(2048, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_x_layer = nn.Conv2d(2048, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_y_layer = nn.Conv2d(2048, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| nn.init.normal_(self.cls_layer.weight, std=0.001) | |
| if self.cls_layer.bias is not None: | |
| nn.init.constant_(self.cls_layer.bias, 0) | |
| nn.init.normal_(self.x_layer.weight, std=0.001) | |
| if self.x_layer.bias is not None: | |
| nn.init.constant_(self.x_layer.bias, 0) | |
| nn.init.normal_(self.y_layer.weight, std=0.001) | |
| if self.y_layer.bias is not None: | |
| nn.init.constant_(self.y_layer.bias, 0) | |
| nn.init.normal_(self.nb_x_layer.weight, std=0.001) | |
| if self.nb_x_layer.bias is not None: | |
| nn.init.constant_(self.nb_x_layer.bias, 0) | |
| nn.init.normal_(self.nb_y_layer.weight, std=0.001) | |
| if self.nb_y_layer.bias is not None: | |
| nn.init.constant_(self.nb_y_layer.bias, 0) | |
| def forward(self, x): | |
| x = self.conv1(x) | |
| x = self.bn1(x) | |
| x = F.relu(x) | |
| x = self.maxpool(x) | |
| x = self.layer1(x) | |
| x = self.layer2(x) | |
| x = self.layer3(x) | |
| x = self.layer4(x) | |
| if self.net_stride == 128: | |
| x = F.relu(self.bn5(self.layer5(x))) | |
| x = F.relu(self.bn6(self.layer6(x))) | |
| elif self.net_stride == 64: | |
| x = F.relu(self.bn5(self.layer5(x))) | |
| else: | |
| pass | |
| x1 = self.cls_layer(x) | |
| x2 = self.x_layer(x) | |
| x3 = self.y_layer(x) | |
| x4 = self.nb_x_layer(x) | |
| x5 = self.nb_y_layer(x) | |
| return x1, x2, x3, x4, x5 | |
| # net_stride output_size | |
| # 128 2x2 | |
| # 64 4x4 | |
| # 32 8x8 | |
| # pip regression, resnet50 | |
| class Pip_resnet50(nn.Module): | |
| def __init__(self, resnet, num_nb, num_lms=68, input_size=256, net_stride=32): | |
| super(Pip_resnet50, self).__init__() | |
| self.num_nb = num_nb | |
| self.num_lms = num_lms | |
| self.input_size = input_size | |
| self.net_stride = net_stride | |
| self.conv1 = resnet.conv1 | |
| self.bn1 = resnet.bn1 | |
| self.maxpool = resnet.maxpool | |
| self.sigmoid = nn.Sigmoid() | |
| self.layer1 = resnet.layer1 | |
| self.layer2 = resnet.layer2 | |
| self.layer3 = resnet.layer3 | |
| self.layer4 = resnet.layer4 | |
| if self.net_stride == 128: | |
| self.layer5 = nn.Conv2d(2048, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn5 = nn.BatchNorm2d(512) | |
| self.layer6 = nn.Conv2d(512, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn6 = nn.BatchNorm2d(512) | |
| # init | |
| nn.init.normal_(self.layer5.weight, std=0.001) | |
| if self.layer5.bias is not None: | |
| nn.init.constant_(self.layer5.bias, 0) | |
| nn.init.constant_(self.bn5.weight, 1) | |
| nn.init.constant_(self.bn5.bias, 0) | |
| nn.init.normal_(self.layer6.weight, std=0.001) | |
| if self.layer6.bias is not None: | |
| nn.init.constant_(self.layer6.bias, 0) | |
| nn.init.constant_(self.bn6.weight, 1) | |
| nn.init.constant_(self.bn6.bias, 0) | |
| elif self.net_stride == 64: | |
| self.layer5 = nn.Conv2d(2048, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn5 = nn.BatchNorm2d(512) | |
| # init | |
| nn.init.normal_(self.layer5.weight, std=0.001) | |
| if self.layer5.bias is not None: | |
| nn.init.constant_(self.layer5.bias, 0) | |
| nn.init.constant_(self.bn5.weight, 1) | |
| nn.init.constant_(self.bn5.bias, 0) | |
| elif self.net_stride == 32: | |
| pass | |
| else: | |
| print('No such net_stride!') | |
| exit(0) | |
| self.cls_layer = nn.Conv2d(2048, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.x_layer = nn.Conv2d(2048, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.y_layer = nn.Conv2d(2048, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_x_layer = nn.Conv2d(2048, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_y_layer = nn.Conv2d(2048, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| nn.init.normal_(self.cls_layer.weight, std=0.001) | |
| if self.cls_layer.bias is not None: | |
| nn.init.constant_(self.cls_layer.bias, 0) | |
| nn.init.normal_(self.x_layer.weight, std=0.001) | |
| if self.x_layer.bias is not None: | |
| nn.init.constant_(self.x_layer.bias, 0) | |
| nn.init.normal_(self.y_layer.weight, std=0.001) | |
| if self.y_layer.bias is not None: | |
| nn.init.constant_(self.y_layer.bias, 0) | |
| nn.init.normal_(self.nb_x_layer.weight, std=0.001) | |
| if self.nb_x_layer.bias is not None: | |
| nn.init.constant_(self.nb_x_layer.bias, 0) | |
| nn.init.normal_(self.nb_y_layer.weight, std=0.001) | |
| if self.nb_y_layer.bias is not None: | |
| nn.init.constant_(self.nb_y_layer.bias, 0) | |
| def forward(self, x): | |
| x = self.conv1(x) | |
| x = self.bn1(x) | |
| x = F.relu(x) | |
| x = self.maxpool(x) | |
| x = self.layer1(x) | |
| x = self.layer2(x) | |
| x = self.layer3(x) | |
| x = self.layer4(x) | |
| if self.net_stride == 128: | |
| x = F.relu(self.bn5(self.layer5(x))) | |
| x = F.relu(self.bn6(self.layer6(x))) | |
| elif self.net_stride == 64: | |
| x = F.relu(self.bn5(self.layer5(x))) | |
| else: | |
| pass | |
| x1 = self.cls_layer(x) | |
| x2 = self.x_layer(x) | |
| x3 = self.y_layer(x) | |
| x4 = self.nb_x_layer(x) | |
| x5 = self.nb_y_layer(x) | |
| return x1, x2, x3, x4, x5 | |
| # net_stride output_size | |
| # 128 2x2 | |
| # 64 4x4 | |
| # 32 8x8 | |
| # pip regression, resnet18 | |
| class Pip_resnet18(nn.Module): | |
| def __init__(self, resnet, num_nb, num_lms=68, input_size=256, net_stride=32): | |
| super(Pip_resnet18, self).__init__() | |
| self.num_nb = num_nb | |
| self.num_lms = num_lms | |
| self.input_size = input_size | |
| self.net_stride = net_stride | |
| self.conv1 = resnet.conv1 | |
| self.bn1 = resnet.bn1 | |
| self.maxpool = resnet.maxpool | |
| self.sigmoid = nn.Sigmoid() | |
| self.layer1 = resnet.layer1 | |
| self.layer2 = resnet.layer2 | |
| self.layer3 = resnet.layer3 | |
| self.layer4 = resnet.layer4 | |
| if self.net_stride == 128: | |
| self.layer5 = nn.Conv2d(512, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn5 = nn.BatchNorm2d(512) | |
| self.layer6 = nn.Conv2d(512, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn6 = nn.BatchNorm2d(512) | |
| # init | |
| nn.init.normal_(self.layer5.weight, std=0.001) | |
| if self.layer5.bias is not None: | |
| nn.init.constant_(self.layer5.bias, 0) | |
| nn.init.constant_(self.bn5.weight, 1) | |
| nn.init.constant_(self.bn5.bias, 0) | |
| nn.init.normal_(self.layer6.weight, std=0.001) | |
| if self.layer6.bias is not None: | |
| nn.init.constant_(self.layer6.bias, 0) | |
| nn.init.constant_(self.bn6.weight, 1) | |
| nn.init.constant_(self.bn6.bias, 0) | |
| elif self.net_stride == 64: | |
| self.layer5 = nn.Conv2d(512, 512, kernel_size=3, stride=2, padding=1) | |
| self.bn5 = nn.BatchNorm2d(512) | |
| # init | |
| nn.init.normal_(self.layer5.weight, std=0.001) | |
| if self.layer5.bias is not None: | |
| nn.init.constant_(self.layer5.bias, 0) | |
| nn.init.constant_(self.bn5.weight, 1) | |
| nn.init.constant_(self.bn5.bias, 0) | |
| elif self.net_stride == 32: | |
| pass | |
| elif self.net_stride == 16: | |
| self.deconv1 = nn.ConvTranspose2d(512, 512, kernel_size=4, stride=2, padding=1, bias=False) | |
| self.bn_deconv1 = nn.BatchNorm2d(512) | |
| nn.init.normal_(self.deconv1.weight, std=0.001) | |
| if self.deconv1.bias is not None: | |
| nn.init.constant_(self.deconv1.bias, 0) | |
| nn.init.constant_(self.bn_deconv1.weight, 1) | |
| nn.init.constant_(self.bn_deconv1.bias, 0) | |
| else: | |
| print('No such net_stride!') | |
| exit(0) | |
| self.cls_layer = nn.Conv2d(512, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.x_layer = nn.Conv2d(512, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.y_layer = nn.Conv2d(512, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_x_layer = nn.Conv2d(512, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_y_layer = nn.Conv2d(512, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| nn.init.normal_(self.cls_layer.weight, std=0.001) | |
| if self.cls_layer.bias is not None: | |
| nn.init.constant_(self.cls_layer.bias, 0) | |
| nn.init.normal_(self.x_layer.weight, std=0.001) | |
| if self.x_layer.bias is not None: | |
| nn.init.constant_(self.x_layer.bias, 0) | |
| nn.init.normal_(self.y_layer.weight, std=0.001) | |
| if self.y_layer.bias is not None: | |
| nn.init.constant_(self.y_layer.bias, 0) | |
| nn.init.normal_(self.nb_x_layer.weight, std=0.001) | |
| if self.nb_x_layer.bias is not None: | |
| nn.init.constant_(self.nb_x_layer.bias, 0) | |
| nn.init.normal_(self.nb_y_layer.weight, std=0.001) | |
| if self.nb_y_layer.bias is not None: | |
| nn.init.constant_(self.nb_y_layer.bias, 0) | |
| def forward(self, x): | |
| x = self.conv1(x) | |
| x = self.bn1(x) | |
| x = F.relu(x) | |
| x = self.maxpool(x) | |
| x = self.layer1(x) | |
| x = self.layer2(x) | |
| x = self.layer3(x) | |
| x = self.layer4(x) | |
| if self.net_stride == 128: | |
| x = F.relu(self.bn5(self.layer5(x))) | |
| x = F.relu(self.bn6(self.layer6(x))) | |
| elif self.net_stride == 64: | |
| x = F.relu(self.bn5(self.layer5(x))) | |
| elif self.net_stride == 16: | |
| x = F.relu(self.bn_deconv1(self.deconv1(x))) | |
| else: | |
| pass | |
| x1 = self.cls_layer(x) | |
| x2 = self.x_layer(x) | |
| x3 = self.y_layer(x) | |
| x4 = self.nb_x_layer(x) | |
| x5 = self.nb_y_layer(x) | |
| return x1, x2, x3, x4, x5 | |
| class Pip_mbnetv2(nn.Module): | |
| def __init__(self, mbnet, num_nb, num_lms=68, input_size=256, net_stride=32): | |
| super(Pip_mbnetv2, self).__init__() | |
| self.num_nb = num_nb | |
| self.num_lms = num_lms | |
| self.input_size = input_size | |
| self.net_stride = net_stride | |
| self.features = mbnet.features | |
| self.sigmoid = nn.Sigmoid() | |
| self.cls_layer = nn.Conv2d(1280, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.x_layer = nn.Conv2d(1280, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.y_layer = nn.Conv2d(1280, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_x_layer = nn.Conv2d(1280, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_y_layer = nn.Conv2d(1280, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| nn.init.normal_(self.cls_layer.weight, std=0.001) | |
| if self.cls_layer.bias is not None: | |
| nn.init.constant_(self.cls_layer.bias, 0) | |
| nn.init.normal_(self.x_layer.weight, std=0.001) | |
| if self.x_layer.bias is not None: | |
| nn.init.constant_(self.x_layer.bias, 0) | |
| nn.init.normal_(self.y_layer.weight, std=0.001) | |
| if self.y_layer.bias is not None: | |
| nn.init.constant_(self.y_layer.bias, 0) | |
| nn.init.normal_(self.nb_x_layer.weight, std=0.001) | |
| if self.nb_x_layer.bias is not None: | |
| nn.init.constant_(self.nb_x_layer.bias, 0) | |
| nn.init.normal_(self.nb_y_layer.weight, std=0.001) | |
| if self.nb_y_layer.bias is not None: | |
| nn.init.constant_(self.nb_y_layer.bias, 0) | |
| def forward(self, x): | |
| x = self.features(x) | |
| x1 = self.cls_layer(x) | |
| x2 = self.x_layer(x) | |
| x3 = self.y_layer(x) | |
| x4 = self.nb_x_layer(x) | |
| x5 = self.nb_y_layer(x) | |
| return x1, x2, x3, x4, x5 | |
| class Pip_mbnetv3(nn.Module): | |
| def __init__(self, mbnet, num_nb, num_lms=68, input_size=256, net_stride=32): | |
| super(Pip_mbnetv3, self).__init__() | |
| self.num_nb = num_nb | |
| self.num_lms = num_lms | |
| self.input_size = input_size | |
| self.net_stride = net_stride | |
| self.features = mbnet.features | |
| self.conv = mbnet.conv | |
| self.sigmoid = nn.Sigmoid() | |
| self.cls_layer = nn.Conv2d(960, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.x_layer = nn.Conv2d(960, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.y_layer = nn.Conv2d(960, num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_x_layer = nn.Conv2d(960, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| self.nb_y_layer = nn.Conv2d(960, num_nb*num_lms, kernel_size=1, stride=1, padding=0) | |
| nn.init.normal_(self.cls_layer.weight, std=0.001) | |
| if self.cls_layer.bias is not None: | |
| nn.init.constant_(self.cls_layer.bias, 0) | |
| nn.init.normal_(self.x_layer.weight, std=0.001) | |
| if self.x_layer.bias is not None: | |
| nn.init.constant_(self.x_layer.bias, 0) | |
| nn.init.normal_(self.y_layer.weight, std=0.001) | |
| if self.y_layer.bias is not None: | |
| nn.init.constant_(self.y_layer.bias, 0) | |
| nn.init.normal_(self.nb_x_layer.weight, std=0.001) | |
| if self.nb_x_layer.bias is not None: | |
| nn.init.constant_(self.nb_x_layer.bias, 0) | |
| nn.init.normal_(self.nb_y_layer.weight, std=0.001) | |
| if self.nb_y_layer.bias is not None: | |
| nn.init.constant_(self.nb_y_layer.bias, 0) | |
| def forward(self, x): | |
| x = self.features(x) | |
| x = self.conv(x) | |
| x1 = self.cls_layer(x) | |
| x2 = self.x_layer(x) | |
| x3 = self.y_layer(x) | |
| x4 = self.nb_x_layer(x) | |
| x5 = self.nb_y_layer(x) | |
| return x1, x2, x3, x4, x5 | |
| if __name__ == '__main__': | |
| pass | |