|
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 |
|
|