Skip to content
This repository was archived by the owner on Jun 22, 2022. It is now read-only.

Commit 269bccc

Browse files
author
minerva-ml
committed
updtead to solution 2
1 parent 342fc4b commit 269bccc

File tree

14 files changed

+755
-373
lines changed

14 files changed

+755
-373
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ In this open source solution you will find references to the [neptune.ml](https:
2525
| link to code | CV | LB |
2626
|:---:|:---:|:---:|
2727
|solution 1|0.541|0.573|
28+
|solution 2|0.661|0.679|
2829

2930
## Start experimenting with ready-to-use code
3031
You can jump start your participation in the competition by using our starter pack. Installation instruction below will guide you through the setup.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import torch.nn as nn
2+
from torchvision.models import resnet101
3+
4+
5+
class Resnet101(nn.Module):
6+
def __init__(self, pretrained):
7+
super().__init__()
8+
self.model = resnet101(pretrained=pretrained)
9+
for p in self.model.parameters():
10+
p.requires_grad = False
11+
self.model.fc = nn.Linear(in_features=self.model.fc.in_features, out_features=1)
12+
self.model.avgpool = nn.AdaptiveAvgPool2d(1)
13+
14+
def forward(self, input):
15+
x = self.model(input)
16+
return x.squeeze()

common_blocks/architectures/encoders.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
from copy import deepcopy
2+
3+
import torch
4+
from torch.autograd import Variable
15
from torch import nn
26
import torchvision
37
import pretrainedmodels
@@ -93,11 +97,12 @@ def __init__(self, encoder_depth, pretrained='imagenet', pool0=False):
9397
self.encoder = pretrainedmodels.__dict__['se_resnext101_32x4d'](num_classes=1000, pretrained=pretrained)
9498
else:
9599
raise NotImplementedError('only 50, 101 version of Resnet are implemented')
100+
96101
if pool0:
97102
self.conv1 = nn.Sequential(self.encoder.layer0.conv1,
98103
self.encoder.layer0.bn1,
99104
self.encoder.layer0.relu1,
100-
self.encoder.layer0.pool0)
105+
self.encoder.layer0.pool)
101106
else:
102107
self.conv1 = nn.Sequential(self.encoder.layer0.conv1,
103108
self.encoder.layer0.bn1,
@@ -162,3 +167,14 @@ def forward(self, x):
162167
encoder5 = self.encoder5(transition3)
163168

164169
return encoder2, encoder3, encoder4, encoder5
170+
171+
172+
def get_encoder_channel_nr(encoder):
173+
encoder_clone = deepcopy(encoder)
174+
x = Variable(torch.ones((1, 3, 256, 256)))
175+
if torch.cuda.is_available():
176+
encoder_clone = encoder_clone.cuda()
177+
x = x.cuda()
178+
encoder2, encoder3, encoder4, encoder5 = encoder_clone(x)
179+
encoder_channel_nr = [encoder2.shape[1], encoder3.shape[1], encoder4.shape[1], encoder5.shape[1]]
180+
return encoder_channel_nr

common_blocks/architectures/large_kernel_matters.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from torch.nn import functional as F
33

44
from .base import GlobalConvolutionalNetwork, BoundaryRefinement, DeconvConv2dBnRelu
5-
from .encoders import ResNetEncoders
5+
from .encoders import get_encoder_channel_nr
66

77

88
class LargeKernelMatters(nn.Module):
@@ -11,34 +11,29 @@ class LargeKernelMatters(nn.Module):
1111
https://arxiv.org/pdf/1703.02719.pdf
1212
"""
1313

14-
def __init__(self, encoder_depth, num_classes, kernel_size=9, internal_channels=21, use_relu=False, pool0=False,
15-
pretrained=False, dropout_2d=0.0):
14+
def __init__(self, encoder, num_classes, kernel_size=9, internal_channels=21, use_relu=False, pool0=False,
15+
dropout_2d=0.0):
1616
super().__init__()
1717

1818
self.dropout_2d = dropout_2d
19+
self.pool0 = pool0
1920

20-
self.encoders = ResNetEncoders(encoder_depth, pretrained=pretrained, pool0=pool0)
21+
self.encoder = encoder
22+
encoder_channel_nr = get_encoder_channel_nr(self.encoder)
2123

22-
if encoder_depth in [18, 34]:
23-
bottom_channel_nr = 512
24-
elif encoder_depth in [50, 101, 152]:
25-
bottom_channel_nr = 2048
26-
else:
27-
raise NotImplementedError('only 18, 34, 50, 101, 152 version of Resnet are implemented')
28-
29-
self.gcn2 = GlobalConvolutionalNetwork(in_channels=bottom_channel_nr // 8,
24+
self.gcn2 = GlobalConvolutionalNetwork(in_channels=encoder_channel_nr[0],
3025
out_channels=internal_channels,
3126
kernel_size=kernel_size,
3227
use_relu=use_relu)
33-
self.gcn3 = GlobalConvolutionalNetwork(in_channels=bottom_channel_nr // 4,
28+
self.gcn3 = GlobalConvolutionalNetwork(in_channels=encoder_channel_nr[1],
3429
out_channels=internal_channels,
3530
kernel_size=kernel_size,
3631
use_relu=use_relu)
37-
self.gcn4 = GlobalConvolutionalNetwork(in_channels=bottom_channel_nr // 2,
32+
self.gcn4 = GlobalConvolutionalNetwork(in_channels=encoder_channel_nr[2],
3833
out_channels=internal_channels,
3934
kernel_size=kernel_size,
4035
use_relu=use_relu)
41-
self.gcn5 = GlobalConvolutionalNetwork(in_channels=bottom_channel_nr,
36+
self.gcn5 = GlobalConvolutionalNetwork(in_channels=encoder_channel_nr[3],
4237
out_channels=internal_channels,
4338
kernel_size=kernel_size,
4439
use_relu=use_relu)
@@ -79,10 +74,18 @@ def __init__(self, encoder_depth, num_classes, kernel_size=9, internal_channels=
7974
self.deconv3 = DeconvConv2dBnRelu(in_channels=internal_channels, out_channels=internal_channels)
8075
self.deconv2 = DeconvConv2dBnRelu(in_channels=internal_channels, out_channels=internal_channels)
8176

77+
self.deconv1 = DeconvConv2dBnRelu(in_channels=internal_channels, out_channels=internal_channels)
78+
self.dec_br0_1 = BoundaryRefinement(in_channels=internal_channels,
79+
out_channels=internal_channels,
80+
kernel_size=3)
81+
self.dec_br0_2 = BoundaryRefinement(in_channels=internal_channels,
82+
out_channels=internal_channels,
83+
kernel_size=3)
84+
8285
self.final = nn.Conv2d(internal_channels, num_classes, kernel_size=1, padding=0)
8386

8487
def forward(self, x):
85-
encoder2, encoder3, encoder4, encoder5 = self.encoders(x)
88+
encoder2, encoder3, encoder4, encoder5 = self.encoder(x)
8689
encoder5 = F.dropout2d(encoder5, p=self.dropout_2d)
8790

8891
gcn2 = self.enc_br2(self.gcn2(encoder2))
@@ -95,4 +98,7 @@ def forward(self, x):
9598
decoder3 = self.deconv3(self.dec_br3(decoder4 + gcn3))
9699
decoder2 = self.dec_br1(self.deconv2(self.dec_br2(decoder3 + gcn2)))
97100

101+
if self.pool0:
102+
decoder2 = self.dec_br0_2(self.deconv1(self.dec_br0_1(decoder2)))
103+
98104
return self.final(decoder2)

common_blocks/architectures/pspnet.py

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import torch
44

55
from .base import Conv2dBnRelu
6-
from .encoders import ResNetEncoders
6+
from .encoders import get_encoder_channel_nr
77

88

99
class PSPModule(nn.Module):
@@ -42,48 +42,43 @@ def forward(self, x):
4242

4343
class PSPNet(nn.Module):
4444
def __init__(self,
45-
encoder_depth,
45+
encoder,
4646
num_classes=2,
4747
sizes=(1, 2, 3, 6),
48-
deep_features_size=1024,
4948
dropout_2d=0.2,
50-
pretrained=False,
5149
use_hypercolumn=False,
5250
pool0=False):
5351
super().__init__()
5452
self.num_classes = num_classes
5553
self.dropout_2d = dropout_2d
5654
self.use_hypercolumn = use_hypercolumn
55+
self.pool0 = pool0
5756

58-
self.encoders = ResNetEncoders(encoder_depth, pretrained=pretrained, pool0=pool0)
57+
self.encoder = encoder
58+
encoder_channel_nr = get_encoder_channel_nr(self.encoder)
59+
bottom_channel_nr = encoder_channel_nr[3]
5960

60-
if encoder_depth in [18, 34]:
61-
bottom_channel_nr = 512
62-
elif encoder_depth in [50, 101, 152]:
63-
bottom_channel_nr = 2048
64-
else:
65-
raise NotImplementedError('only 18, 34, 50, 101, 152 version of Resnet are implemented')
66-
67-
self.psp = PSPModule(bottom_channel_nr, deep_features_size, sizes)
61+
self.psp = PSPModule(bottom_channel_nr, bottom_channel_nr, sizes)
6862

69-
self.up4 = PSPUpsample(deep_features_size, deep_features_size // 2)
70-
self.up3 = PSPUpsample(deep_features_size // 2, deep_features_size // 4)
71-
self.up2 = PSPUpsample(deep_features_size // 4, deep_features_size // 8)
72-
self.up1 = PSPUpsample(deep_features_size // 8, deep_features_size // 16)
63+
self.up4 = PSPUpsample(bottom_channel_nr, bottom_channel_nr // 2)
64+
self.up3 = PSPUpsample(bottom_channel_nr // 2, bottom_channel_nr // 4)
65+
self.up2 = PSPUpsample(bottom_channel_nr // 4, bottom_channel_nr // 8)
66+
self.up1 = PSPUpsample(bottom_channel_nr // 8, bottom_channel_nr // 16)
7367

7468
if self.use_hypercolumn:
75-
self.final = nn.Sequential(Conv2dBnRelu(15 * bottom_channel_nr // 8, bottom_channel_nr // 8),
76-
nn.Conv2d(bottom_channel_nr // 8, num_classes, kernel_size=1, padding=0))
69+
self.up0 = PSPUpsample(15 * bottom_channel_nr // 16, 15 * bottom_channel_nr // 16)
70+
self.final = nn.Sequential(Conv2dBnRelu(15 * bottom_channel_nr // 16, bottom_channel_nr // 16),
71+
nn.Conv2d(bottom_channel_nr // 16, num_classes, kernel_size=1, padding=0))
7772
else:
78-
self.final = nn.Sequential(Conv2dBnRelu(bottom_channel_nr // 8, bottom_channel_nr // 8),
79-
nn.Conv2d(bottom_channel_nr // 8, num_classes, kernel_size=1, padding=0))
73+
self.up0 = PSPUpsample(bottom_channel_nr // 16, bottom_channel_nr // 16)
74+
self.final = nn.Sequential(Conv2dBnRelu(bottom_channel_nr // 16, bottom_channel_nr // 16),
75+
nn.Conv2d(bottom_channel_nr // 16, num_classes, kernel_size=1, padding=0))
8076

8177
def forward(self, x):
82-
encoder2, encoder3, encoder4, encoder5 = self.encoders(x)
78+
encoder2, encoder3, encoder4, encoder5 = self.encoder(x)
8379
encoder5 = F.dropout2d(encoder5, p=self.dropout_2d)
8480

8581
psp = self.psp(encoder5)
86-
8782
up4 = self.up4(psp)
8883
up3 = self.up3(up4)
8984
up2 = self.up2(up3)
@@ -96,5 +91,8 @@ def forward(self, x):
9691
], 1)
9792
drop = F.dropout2d(hypercolumn, p=self.dropout_2d)
9893
else:
99-
drop = F.dropout2d(up4, p=self.dropout_2d)
100-
return self.final(drop)
94+
drop = F.dropout2d(up1, p=self.dropout_2d)
95+
96+
if self.pool0:
97+
drop = self.up0(drop)
98+
return self.final(drop)

0 commit comments

Comments
 (0)