| | import torch |
| | import torch.nn as nn |
| | import torch.nn.functional as F |
| | from collections import OrderedDict |
| | import numpy as np |
| |
|
| |
|
| | class Flatten(nn.Module): |
| | def __init__(self): |
| | super(Flatten, self).__init__() |
| |
|
| | def forward(self, x): |
| | """ |
| | Arguments: |
| | x: a float tensor with shape [batch_size, c, h, w]. |
| | Returns: |
| | a float tensor with shape [batch_size, c*h*w]. |
| | """ |
| |
|
| | |
| | x = x.transpose(3, 2).contiguous() |
| |
|
| | return x.view(x.size(0), -1) |
| |
|
| |
|
| | class PNet(nn.Module): |
| | def __init__(self): |
| | super(PNet, self).__init__() |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | self.features = nn.Sequential( |
| | OrderedDict( |
| | [ |
| | ("conv1", nn.Conv2d(3, 10, 3, 1)), |
| | ("prelu1", nn.PReLU(10)), |
| | ("pool1", nn.MaxPool2d(2, 2, ceil_mode=True)), |
| | ("conv2", nn.Conv2d(10, 16, 3, 1)), |
| | ("prelu2", nn.PReLU(16)), |
| | ("conv3", nn.Conv2d(16, 32, 3, 1)), |
| | ("prelu3", nn.PReLU(32)), |
| | ] |
| | ) |
| | ) |
| |
|
| | self.conv4_1 = nn.Conv2d(32, 2, 1, 1) |
| | self.conv4_2 = nn.Conv2d(32, 4, 1, 1) |
| |
|
| | weights = np.load("align/pnet.npy", allow_pickle=True)[()] |
| | for n, p in self.named_parameters(): |
| | p.data = torch.FloatTensor(weights[n]) |
| |
|
| | def forward(self, x): |
| | """ |
| | Arguments: |
| | x: a float tensor with shape [batch_size, 3, h, w]. |
| | Returns: |
| | b: a float tensor with shape [batch_size, 4, h', w']. |
| | a: a float tensor with shape [batch_size, 2, h', w']. |
| | """ |
| | x = self.features(x) |
| | a = self.conv4_1(x) |
| | b = self.conv4_2(x) |
| | a = F.softmax(a) |
| | return b, a |
| |
|
| |
|
| | class RNet(nn.Module): |
| | def __init__(self): |
| | super(RNet, self).__init__() |
| |
|
| | self.features = nn.Sequential( |
| | OrderedDict( |
| | [ |
| | ("conv1", nn.Conv2d(3, 28, 3, 1)), |
| | ("prelu1", nn.PReLU(28)), |
| | ("pool1", nn.MaxPool2d(3, 2, ceil_mode=True)), |
| | ("conv2", nn.Conv2d(28, 48, 3, 1)), |
| | ("prelu2", nn.PReLU(48)), |
| | ("pool2", nn.MaxPool2d(3, 2, ceil_mode=True)), |
| | ("conv3", nn.Conv2d(48, 64, 2, 1)), |
| | ("prelu3", nn.PReLU(64)), |
| | ("flatten", Flatten()), |
| | ("conv4", nn.Linear(576, 128)), |
| | ("prelu4", nn.PReLU(128)), |
| | ] |
| | ) |
| | ) |
| |
|
| | self.conv5_1 = nn.Linear(128, 2) |
| | self.conv5_2 = nn.Linear(128, 4) |
| |
|
| | weights = np.load("align/rnet.npy", allow_pickle=True)[()] |
| | for n, p in self.named_parameters(): |
| | p.data = torch.FloatTensor(weights[n]) |
| |
|
| | def forward(self, x): |
| | """ |
| | Arguments: |
| | x: a float tensor with shape [batch_size, 3, h, w]. |
| | Returns: |
| | b: a float tensor with shape [batch_size, 4]. |
| | a: a float tensor with shape [batch_size, 2]. |
| | """ |
| | x = self.features(x) |
| | a = self.conv5_1(x) |
| | b = self.conv5_2(x) |
| | a = F.softmax(a) |
| | return b, a |
| |
|
| |
|
| | class ONet(nn.Module): |
| | def __init__(self): |
| | super(ONet, self).__init__() |
| |
|
| | self.features = nn.Sequential( |
| | OrderedDict( |
| | [ |
| | ("conv1", nn.Conv2d(3, 32, 3, 1)), |
| | ("prelu1", nn.PReLU(32)), |
| | ("pool1", nn.MaxPool2d(3, 2, ceil_mode=True)), |
| | ("conv2", nn.Conv2d(32, 64, 3, 1)), |
| | ("prelu2", nn.PReLU(64)), |
| | ("pool2", nn.MaxPool2d(3, 2, ceil_mode=True)), |
| | ("conv3", nn.Conv2d(64, 64, 3, 1)), |
| | ("prelu3", nn.PReLU(64)), |
| | ("pool3", nn.MaxPool2d(2, 2, ceil_mode=True)), |
| | ("conv4", nn.Conv2d(64, 128, 2, 1)), |
| | ("prelu4", nn.PReLU(128)), |
| | ("flatten", Flatten()), |
| | ("conv5", nn.Linear(1152, 256)), |
| | ("drop5", nn.Dropout(0.25)), |
| | ("prelu5", nn.PReLU(256)), |
| | ] |
| | ) |
| | ) |
| |
|
| | self.conv6_1 = nn.Linear(256, 2) |
| | self.conv6_2 = nn.Linear(256, 4) |
| | self.conv6_3 = nn.Linear(256, 10) |
| |
|
| | weights = np.load("align/onet.npy", allow_pickle=True)[()] |
| | for n, p in self.named_parameters(): |
| | p.data = torch.FloatTensor(weights[n]) |
| |
|
| | def forward(self, x): |
| | """ |
| | Arguments: |
| | x: a float tensor with shape [batch_size, 3, h, w]. |
| | Returns: |
| | c: a float tensor with shape [batch_size, 10]. |
| | b: a float tensor with shape [batch_size, 4]. |
| | a: a float tensor with shape [batch_size, 2]. |
| | """ |
| | x = self.features(x) |
| | a = self.conv6_1(x) |
| | b = self.conv6_2(x) |
| | c = self.conv6_3(x) |
| | a = F.softmax(a) |
| | return c, b, a |
| |
|