(self,
in_channels,
out_channels,
kernel_size=3,
stride=1,
padding=1,
bias=False)
| 5 | |
| 6 | class DeformableConv2d(nn.Module): |
| 7 | def __init__(self, |
| 8 | in_channels, |
| 9 | out_channels, |
| 10 | kernel_size=3, |
| 11 | stride=1, |
| 12 | padding=1, |
| 13 | bias=False): |
| 14 | |
| 15 | super(DeformableConv2d, self).__init__() |
| 16 | |
| 17 | assert type(kernel_size) == tuple or type(kernel_size) == int |
| 18 | |
| 19 | kernel_size = kernel_size if type(kernel_size) == tuple else (kernel_size, kernel_size) |
| 20 | self.stride = stride if type(stride) == tuple else (stride, stride) |
| 21 | self.padding = padding |
| 22 | |
| 23 | self.offset_conv = nn.Conv2d(in_channels, |
| 24 | 2 * kernel_size[0] * kernel_size[1], |
| 25 | kernel_size=kernel_size, |
| 26 | stride=stride, |
| 27 | padding=self.padding, |
| 28 | bias=True) |
| 29 | |
| 30 | nn.init.constant_(self.offset_conv.weight, 0.) |
| 31 | nn.init.constant_(self.offset_conv.bias, 0.) |
| 32 | |
| 33 | self.modulator_conv = nn.Conv2d(in_channels, |
| 34 | 1 * kernel_size[0] * kernel_size[1], |
| 35 | kernel_size=kernel_size, |
| 36 | stride=stride, |
| 37 | padding=self.padding, |
| 38 | bias=True) |
| 39 | |
| 40 | nn.init.constant_(self.modulator_conv.weight, 0.) |
| 41 | nn.init.constant_(self.modulator_conv.bias, 0.) |
| 42 | |
| 43 | self.regular_conv = nn.Conv2d(in_channels, |
| 44 | out_channels=out_channels, |
| 45 | kernel_size=kernel_size, |
| 46 | stride=stride, |
| 47 | padding=self.padding, |
| 48 | bias=bias) |
| 49 | |
| 50 | def forward(self, x): |
| 51 | #h, w = x.shape[2:] |
nothing calls this directly
no outgoing calls
no test coverage detected