Spaces:
Runtime error
Runtime error
| import torch.nn as nn | |
| from isegm.model import ops | |
| class ConvHead(nn.Module): | |
| def __init__( | |
| self, | |
| out_channels, | |
| in_channels=32, | |
| num_layers=1, | |
| kernel_size=3, | |
| padding=1, | |
| norm_layer=nn.BatchNorm2d, | |
| ): | |
| super(ConvHead, self).__init__() | |
| convhead = [] | |
| for i in range(num_layers): | |
| convhead.extend( | |
| [ | |
| nn.Conv2d(in_channels, in_channels, kernel_size, padding=padding), | |
| nn.ReLU(), | |
| norm_layer(in_channels) | |
| if norm_layer is not None | |
| else nn.Identity(), | |
| ] | |
| ) | |
| convhead.append(nn.Conv2d(in_channels, out_channels, 1, padding=0)) | |
| self.convhead = nn.Sequential(*convhead) | |
| def forward(self, *inputs): | |
| return self.convhead(inputs[0]) | |
| class SepConvHead(nn.Module): | |
| def __init__( | |
| self, | |
| num_outputs, | |
| in_channels, | |
| mid_channels, | |
| num_layers=1, | |
| kernel_size=3, | |
| padding=1, | |
| dropout_ratio=0.0, | |
| dropout_indx=0, | |
| norm_layer=nn.BatchNorm2d, | |
| ): | |
| super(SepConvHead, self).__init__() | |
| sepconvhead = [] | |
| for i in range(num_layers): | |
| sepconvhead.append( | |
| SeparableConv2d( | |
| in_channels=in_channels if i == 0 else mid_channels, | |
| out_channels=mid_channels, | |
| dw_kernel=kernel_size, | |
| dw_padding=padding, | |
| norm_layer=norm_layer, | |
| activation="relu", | |
| ) | |
| ) | |
| if dropout_ratio > 0 and dropout_indx == i: | |
| sepconvhead.append(nn.Dropout(dropout_ratio)) | |
| sepconvhead.append( | |
| nn.Conv2d( | |
| in_channels=mid_channels, | |
| out_channels=num_outputs, | |
| kernel_size=1, | |
| padding=0, | |
| ) | |
| ) | |
| self.layers = nn.Sequential(*sepconvhead) | |
| def forward(self, *inputs): | |
| x = inputs[0] | |
| return self.layers(x) | |
| class SeparableConv2d(nn.Module): | |
| def __init__( | |
| self, | |
| in_channels, | |
| out_channels, | |
| dw_kernel, | |
| dw_padding, | |
| dw_stride=1, | |
| activation=None, | |
| use_bias=False, | |
| norm_layer=None, | |
| ): | |
| super(SeparableConv2d, self).__init__() | |
| _activation = ops.select_activation_function(activation) | |
| self.body = nn.Sequential( | |
| nn.Conv2d( | |
| in_channels, | |
| in_channels, | |
| kernel_size=dw_kernel, | |
| stride=dw_stride, | |
| padding=dw_padding, | |
| bias=use_bias, | |
| groups=in_channels, | |
| ), | |
| nn.Conv2d( | |
| in_channels, out_channels, kernel_size=1, stride=1, bias=use_bias | |
| ), | |
| norm_layer(out_channels) if norm_layer is not None else nn.Identity(), | |
| _activation(), | |
| ) | |
| def forward(self, x): | |
| return self.body(x) | |