def check_mdconv_im2col_step_forward(): conv_offset = nn.Conv2d(inC, deformable_groups * 2 * kH * kW, kernel_size=(kH, kW), stride=(1, 1), padding=(1, 1), bias=True).cuda() conv_mask = nn.Conv2d(inC, deformable_groups * 1 * kH * kW, kernel_size=(kH, kW), stride=(1, 1), padding=(1, 1), bias=True).cuda() input = torch.randn(N, inC, inH, inW).cuda() offset = conv_offset(input) mask = conv_mask(input) groups = 2 dcn1 = ModulatedDeformConv(inC, outC, (kH, kW), stride=1, padding=1, dilation=1, groups=groups, deformable_groups=deformable_groups, im2col_step=1).cuda() dcn2 = ModulatedDeformConv(inC, outC, (kH, kW), stride=1, padding=1, dilation=1, groups=groups, deformable_groups=deformable_groups, im2col_step=2).cuda() dcn1.weight = dcn2.weight dcn1.bias = dcn2.bias output1 = dcn1(input, offset, mask) output2 = dcn2(input, offset, mask) d = (output1 - output2).abs().max() if d < 1e-10: print('mdconv im2col_step forward passed with {}'.format(d)) else: print('mdconv im2col_step forward failed with {}'.format(d)) print(output1) print(output2) print((output1 - output2).abs())
def check_mdconv_zero_offset(): conv_offset = nn.Conv2d(inC, deformable_groups * 2 * kH * kW, kernel_size=(kH, kW), stride=(1, 1), padding=(1, 1), bias=True).cuda() conv_mask = nn.Conv2d(inC, deformable_groups * 1 * kH * kW, kernel_size=(kH, kW), stride=(1, 1), padding=(1, 1), bias=True).cuda() dcn = ModulatedDeformConv(inC, outC, (kH, kW), stride=1, padding=1, dilation=1, groups=2, deformable_groups=deformable_groups, im2col_step=1).cuda() pcn = nn.Conv2d(inC, outC, (kH, kW), stride=1, padding=1, dilation=1, groups=2).cuda() pcn.weight = dcn.weight pcn.bias = dcn.bias print((pcn.weight.data - dcn.weight.data).abs().max()) conv_offset.weight.data.zero_() conv_offset.bias.data.zero_() conv_mask.weight.data.zero_() conv_mask.bias.data.zero_() input = torch.randn(N, inC, inH, inW).cuda() offset = conv_offset(input) mask = conv_mask(input) mask = torch.sigmoid(mask) mask *= 2 output_d = dcn(input, offset, mask) output_p = pcn(input) d = (output_d - output_p).abs().max() if d < 1e-5: print('mdconv zero offset passed with {}'.format(d)) else: print('mdconv zero offset failed with {}'.format(d)) # print(output_p) # print(output_d) print((output_d - output_p).abs())
def check_mdconv_zero_offset_identify(): conv_offset = nn.Conv2d(inC, deformable_groups * 2 * kH * kW, kernel_size=(kH, kW), stride=(1, 1), padding=(1, 1), bias=True).cuda() conv_mask = nn.Conv2d(inC, deformable_groups * 1 * kH * kW, kernel_size=(kH, kW), stride=(1, 1), padding=(1, 1), bias=True).cuda() groups = 2 dcn = ModulatedDeformConv(inC, outC, (kH, kW), stride=1, padding=1, dilation=1, groups=groups, deformable_groups=deformable_groups, im2col_step=1).cuda() conv_offset.weight.data.zero_() conv_offset.bias.data.zero_() conv_mask.weight.data.zero_() conv_mask.bias.data.zero_() conv_identify(dcn.weight, dcn.bias, groups) input = torch.randn(N, inC, inH, inW).cuda() offset = conv_offset(input) mask = conv_mask(input) mask = torch.sigmoid(mask) output = dcn(input, offset, mask) output *= 2 d = (input - output).abs().max() if d < 1e-10: print('mdconv zero offset identify passed with {}'.format(d)) else: print('mdconv zero offset identify failed with {}'.format(d)) # print(input) # print(output) print((input - output).abs())
def check_ddconv_zero_offset_identify(): conv_offset = nn.Conv2d(inC, deformable_groups * 2 * kH * kW, kernel_size=(kH, kW), stride=(1, 1), padding=(1, 1), bias=True).cuda() conv_mask = nn.Conv2d(inC, deformable_groups * 1 * kH * kW, kernel_size=(kH, kW), stride=(1, 1), padding=(1, 1), bias=True).cuda() stride = 1 padding = 1 groups = 2 dilation = 1 depth_offset = torch.zeros(N, 2 * kW * kH, inH, inW).int().cuda() * 2 groups = 2 dcn = ModulatedDeformConv(inC, outC, (kH, kW), stride=1, padding=1, dilation=1, groups=groups, deformable_groups=deformable_groups, im2col_step=1).cuda() input = torch.randn(N, inC, inH, inW).cuda() depth = torch.ones(N, 1, inH, inW).cuda() offset = conv_offset(input) mask = conv_mask(input) mask = torch.sigmoid(mask) output = dcn(input, offset, mask) output2 = _DepthDeformConv(input, depth, depth_offset, offset, mask, dcn.weight, dcn.bias, stride, padding, dilation, groups, deformable_groups, 2) # output2 = dcn2(input, depth, offset, mask) d = (output2 - output).abs().max() if d < 1e-10: print('ddconv zero offset identify passed with {}'.format(d)) else: print('ddconv zero offset identify failed with {}'.format(d)) # print(input) # print(output) print((output2 - output).abs())