-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodel.py
106 lines (92 loc) · 4.72 KB
/
model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from torch import nn
# Basically ripped from their git
# https://github.com/richzhang/colorization
class ConvNet(nn.Module):
def __init__(self, custom_loss, norm_layer=nn.BatchNorm2d):
super(ConvNet, self).__init__()
self.l_cent = 50.
self.l_norm = 100.
self.ab_norm = 110.
self.custom_loss = custom_loss
model1 = [nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1, bias=True), ]
model1 += [nn.ReLU(True), ]
model1 += [nn.Conv2d(64, 64, kernel_size=3, stride=2, padding=1, bias=True), ]
model1 += [nn.ReLU(True), ]
model1 += [norm_layer(64), ]
model2 = [nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1, bias=True), ]
model2 += [nn.ReLU(True), ]
model2 += [nn.Conv2d(128, 128, kernel_size=3, stride=2, padding=1, bias=True), ]
model2 += [nn.ReLU(True), ]
model2 += [norm_layer(128), ]
model3 = [nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1, bias=True), ]
model3 += [nn.ReLU(True), ]
model3 += [nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1, bias=True), ]
model3 += [nn.ReLU(True), ]
model3 += [nn.Conv2d(256, 256, kernel_size=3, stride=2, padding=1, bias=True), ]
model3 += [nn.ReLU(True), ]
model3 += [norm_layer(256), ]
model4 = [nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1, bias=True), ]
model4 += [nn.ReLU(True), ]
model4 += [nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1, bias=True), ]
model4 += [nn.ReLU(True), ]
model4 += [nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1, bias=True), ]
model4 += [nn.ReLU(True), ]
model4 += [norm_layer(512), ]
model5 = [nn.Conv2d(512, 512, kernel_size=3, dilation=2, stride=1, padding=2, bias=True), ]
model5 += [nn.ReLU(True), ]
model5 += [nn.Conv2d(512, 512, kernel_size=3, dilation=2, stride=1, padding=2, bias=True), ]
model5 += [nn.ReLU(True), ]
model5 += [nn.Conv2d(512, 512, kernel_size=3, dilation=2, stride=1, padding=2, bias=True), ]
model5 += [nn.ReLU(True), ]
model5 += [norm_layer(512), ]
model6 = [nn.Conv2d(512, 512, kernel_size=3, dilation=2, stride=1, padding=2, bias=True), ]
model6 += [nn.ReLU(True), ]
model6 += [nn.Conv2d(512, 512, kernel_size=3, dilation=2, stride=1, padding=2, bias=True), ]
model6 += [nn.ReLU(True), ]
model6 += [nn.Conv2d(512, 512, kernel_size=3, dilation=2, stride=1, padding=2, bias=True), ]
model6 += [nn.ReLU(True), ]
model6 += [norm_layer(512), ]
model7 = [nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1, bias=True), ]
model7 += [nn.ReLU(True), ]
model7 += [nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1, bias=True), ]
model7 += [nn.ReLU(True), ]
model7 += [nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1, bias=True), ]
model7 += [nn.ReLU(True), ]
model7 += [norm_layer(512), ]
model8 = [nn.ConvTranspose2d(512, 256, kernel_size=4, stride=2, padding=1, bias=True), ]
model8 += [nn.ReLU(True), ]
model8 += [nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1, bias=True), ]
model8 += [nn.ReLU(True), ]
model8 += [nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1, bias=True), ]
model8 += [nn.ReLU(True), ]
if self.custom_loss:
model8 += [nn.Conv2d(256, 322, kernel_size=1, stride=1, padding=0, bias=True), ]
else:
model8 += [nn.Conv2d(256, 2, kernel_size=1, stride=1, padding=0, bias=True), ]
self.model1 = nn.Sequential(*model1)
self.model2 = nn.Sequential(*model2)
self.model3 = nn.Sequential(*model3)
self.model4 = nn.Sequential(*model4)
self.model5 = nn.Sequential(*model5)
self.model6 = nn.Sequential(*model6)
self.model7 = nn.Sequential(*model7)
self.model8 = nn.Sequential(*model8)
self.softmax = nn.LogSoftmax(dim=1)
self.upsample4 = nn.Upsample(scale_factor=4, mode='bilinear', align_corners=False)
# Output is HxWxQ where Q = 313 or the number of bins of ab pairs
# Might want to also not upscale it before doing computations as it's more efficient
# to upscale the result after? Maybe?
def normalize_l(self, input_l):
return (input_l - self.l_cent) / self.l_norm
def forward(self, input_l):
x = self.model1(self.normalize_l(input_l))
x = self.model2(x)
x = self.model3(x)
x = self.model4(x)
x = self.model5(x)
x = self.model6(x)
x = self.model7(x)
x = self.model8(x)
if self.custom_loss:
x = self.softmax(x)
return self.upsample4(x)