164 def __init__(self, last_stride, bn_norm, with_ibn, with_nl, block, layers, non_layers, radix=1,
167 dilated=False, dilation=1,
168 deep_stem=False, stem_width=64, avg_down=False,
169 rectified_conv=False, rectify_avg=False,
170 avd=False, avd_first=False,
171 final_drop=0.0, dropblock_prob=0,
176 self.
inplanes = stem_width * 2
if deep_stem
else 64
188 from rfconv
import RFConv2d
189 conv_layer = RFConv2d
191 conv_layer = nn.Conv2d
192 conv_kwargs = {
'average_mode': rectify_avg}
if rectified_conv
else {}
195 conv_layer(3, stem_width, kernel_size=3, stride=2, padding=1, bias=
False, **conv_kwargs),
196 get_norm(bn_norm, stem_width),
197 nn.ReLU(inplace=
True),
198 conv_layer(stem_width, stem_width, kernel_size=3, stride=1, padding=1, bias=
False, **conv_kwargs),
199 get_norm(bn_norm, stem_width),
200 nn.ReLU(inplace=
True),
201 conv_layer(stem_width, stem_width * 2, kernel_size=3, stride=1, padding=1, bias=
False, **conv_kwargs),
204 self.
conv1 = conv_layer(3, 64, kernel_size=7, stride=2, padding=3,
205 bias=
False, **conv_kwargs)
207 self.
relu = nn.ReLU(inplace=
True)
208 self.
maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
209 self.
layer1 = self.
_make_layer(block, 64, layers[0], 1, bn_norm, with_ibn=with_ibn, is_first=
False)
211 if dilated
or dilation == 4:
213 dilation=2, dropblock_prob=dropblock_prob)
215 dilation=4, dropblock_prob=dropblock_prob)
217 self.
layer3 = self.
_make_layer(block, 256, layers[2], 2, bn_norm, with_ibn=with_ibn,
218 dilation=1, dropblock_prob=dropblock_prob)
219 self.
layer4 = self.
_make_layer(block, 512, layers[3], 1, bn_norm, with_ibn=with_ibn,
220 dilation=2, dropblock_prob=dropblock_prob)
222 self.
layer3 = self.
_make_layer(block, 256, layers[2], 2, bn_norm, with_ibn=with_ibn,
223 dropblock_prob=dropblock_prob)
224 self.
layer4 = self.
_make_layer(block, 512, layers[3], last_stride, bn_norm, with_ibn=with_ibn,
225 dropblock_prob=dropblock_prob)
227 for m
in self.modules():
228 if isinstance(m, nn.Conv2d):
229 n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
230 m.weight.data.normal_(0, math.sqrt(2. / n))
231 elif isinstance(m, nn.BatchNorm2d):
232 m.weight.data.fill_(1)
240 def _make_layer(self, block, planes, blocks, stride=1, bn_norm="BN", with_ibn=False,
241 dilation=1, dropblock_prob=0.0, is_first=True):
243 if stride != 1
or self.
inplanes != planes * block.expansion:
247 down_layers.append(nn.AvgPool2d(kernel_size=stride, stride=stride,
248 ceil_mode=
True, count_include_pad=
False))
250 down_layers.append(nn.AvgPool2d(kernel_size=1, stride=1,
251 ceil_mode=
True, count_include_pad=
False))
252 down_layers.append(nn.Conv2d(self.
inplanes, planes * block.expansion,
253 kernel_size=1, stride=1, bias=
False))
255 down_layers.append(nn.Conv2d(self.
inplanes, planes * block.expansion,
256 kernel_size=1, stride=stride, bias=
False))
257 down_layers.append(get_norm(bn_norm, planes * block.expansion))
258 downsample = nn.Sequential(*down_layers)
261 if dilation == 1
or dilation == 2:
262 layers.append(block(self.
inplanes, planes, bn_norm, with_ibn, stride, downsample=downsample,
266 dilation=1, is_first=is_first, rectified_conv=self.
rectified_conv,
268 dropblock_prob=dropblock_prob,
271 layers.append(block(self.
inplanes, planes, bn_norm, with_ibn, stride, downsample=downsample,
275 dilation=2, is_first=is_first, rectified_conv=self.
rectified_conv,
277 dropblock_prob=dropblock_prob,
280 raise RuntimeError(
"=> unknown dilation size: {}".format(dilation))
282 self.
inplanes = planes * block.expansion
283 for i
in range(1, blocks):
284 layers.append(block(self.
inplanes, planes, bn_norm, with_ibn,
290 dropblock_prob=dropblock_prob,
293 return nn.Sequential(*layers)