import torch import torch.nn.functional as F class Losses(object): def __init__(self, classify_size_average=True, args_gpu=0): self.classify_size_average = classify_size_average self.args_gpu = args_gpu self.kernel_r = torch.ones(2, 1, 3, 3).cuda(self.args_gpu) self.kernel_cross_17 = torch.tensor( [[[[0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [1., 1., 1., 1., 1., 1., 1., 1., 1.], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0]]], [[[0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [1., 1., 1., 1., 1., 1., 1., 1., 1.], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0], [0, 0, 0, 0, 1., 0, 0, 0, 0]]]]).cuda(self.args_gpu) self.kernel = torch.tensor([[[[0, 1., 0], [1., 1., 1.], [0, 1., 0]]], [[[0, 1., 0], [1., 1., 1.], [0, 1., 0]]]]).cuda(self.args_gpu) # self.kernel = torch.ones(2, 1, 3, 3).cuda(self.args_gpu) self.kernel_2_1 = torch.tensor([[[[1.], [-1.]]], [[[1.], [-1.]]]]).cuda(self.args_gpu) self.kernel_1_2 = torch.tensor([[[[1., -1.]]], [[[1., -1.]]]]).cuda(self.args_gpu) # self.lambda_ = 0.1 self.lambda_ = 0.5 self.matrices_2 = torch.full((1024, 960), 2, dtype=torch.float).cuda(self.args_gpu) self.matrices_0 = torch.full((1024, 960), 0, dtype=torch.float).cuda(self.args_gpu) self.fiducial_point_gaps = [2, 3, 4, 5, 6, 10, 12, 15, 20, 30] self.fiducial_point_gaps_v2 = [2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60] def line_cross(self, input, target, size_average=False): input_rectangles_h = F.conv2d(input, self.kernel_1_2, padding=0, groups=2) target_rectangles_h = F.conv2d(target, self.kernel_1_2, padding=0, groups=2) input_arget_rectangles_h = F.mse_loss(input_rectangles_h, target_rectangles_h, size_average=size_average) input_rectangles_o = F.conv2d(input, self.kernel_2_1, padding=0, groups=2) target_rectangles_o = F.conv2d(target, self.kernel_2_1, padding=0, groups=2) input_arget_rectangles_o = F.mse_loss(input_rectangles_o, target_rectangles_o, size_average=size_average) loss_rectangles = input_arget_rectangles_h + input_arget_rectangles_o return loss_rectangles def loss_line_cross(self, input, target, size_average=False): i_t = target - input loss_local = torch.mean(torch.pow(F.conv2d(F.pad(i_t, (1, 1, 1, 1), mode='replicate'), self.kernel, padding=0, groups=2) - i_t*5, 2)) # loss_local = torch.mean(torch.abs(F.conv2d(i_t, self.kernel, padding=1, groups=2) - i_t*5)) # loss_local = torch.mean(torch.pow(F.conv2d(i_t, self.kernel, padding=1, groups=2) - i_t*5, 2)) input_rectangles_h = F.conv2d(input, self.kernel_1_2, padding=0, groups=2) target_rectangles_h = F.conv2d(target, self.kernel_1_2, padding=0, groups=2) input_arget_rectangles_h = F.mse_loss(input_rectangles_h, target_rectangles_h, size_average=size_average) input_rectangles_o = F.conv2d(input, self.kernel_2_1, padding=0, groups=2) target_rectangles_o = F.conv2d(target, self.kernel_2_1, padding=0, groups=2) input_arget_rectangles_o = F.mse_loss(input_rectangles_o, target_rectangles_o, size_average=size_average) loss_rectangles = input_arget_rectangles_h + input_arget_rectangles_o return loss_local, loss_rectangles def loss_line_cross_l1(self, input, target, size_average=False): i_t = target - input loss_local = torch.mean(torch.abs(F.conv2d(F.pad(i_t, (1, 1, 1, 1), mode='replicate'), self.kernel, padding=0, groups=2) - i_t*5)) # loss_local = torch.mean(torch.abs(F.conv2d(i_t, self.kernel, padding=1, groups=2) - i_t*5)) # loss_local = torch.mean(torch.pow(F.conv2d(i_t, self.kernel, padding=1, groups=2) - i_t*5, 2)) input_rectangles_h = F.conv2d(input, self.kernel_1_2, padding=0, groups=2) target_rectangles_h = F.conv2d(target, self.kernel_1_2, padding=0, groups=2) input_arget_rectangles_h = F.l1_loss(input_rectangles_h, target_rectangles_h, size_average=size_average) input_rectangles_o = F.conv2d(input, self.kernel_2_1, padding=0, groups=2) target_rectangles_o = F.conv2d(target, self.kernel_2_1, padding=0, groups=2) input_arget_rectangles_o = F.l1_loss(input_rectangles_o, target_rectangles_o, size_average=size_average) loss_rectangles = input_arget_rectangles_h + input_arget_rectangles_o return loss_local, loss_rectangles def loss_fn4_v5(self, input, target, size_average=False): n, c, h, w = input.size() # n_ = n*c*h*w i_t = target - input '''one''' loss_l1 = F.smooth_l1_loss(input, target, size_average=size_average) '''two''' loss_local = torch.mean(torch.pow(F.conv2d(F.pad(i_t, (1, 1, 1, 1), mode='replicate'), self.kernel, padding=0, groups=2) - i_t*5, 2)) '''three --weak''' loss_edge_a = F.mse_loss(input[:, :, 0, :], target[:, :, 0, :], size_average=size_average) loss_edge_b = F.mse_loss(input[:, :, h-1, :], target[:, :, h-1, :], size_average=size_average) loss_edge_c = F.mse_loss(input[:, :, :, 0], target[:, :, :, 0], size_average=size_average) loss_edge_d = F.mse_loss(input[:, :, :, w-1], target[:, :, :, w-1], size_average=size_average) loss_edge = loss_edge_a+loss_edge_b+loss_edge_c+loss_edge_d '''four''' loss_rectangle = self.line_cross(input, target, size_average) return loss_l1, loss_local, loss_edge, loss_rectangle def loss_fn4_v5_r_4(self, input, target, size_average=False): i_t = target - input '''one''' loss_l1 = F.smooth_l1_loss(input, target, size_average=size_average) '''two''' loss_local = torch.mean(torch.pow(F.conv2d(F.pad(i_t, (4, 4, 4, 4), mode='replicate'), self.kernel_cross_17, padding=0, groups=2) - i_t*17, 2)) return loss_l1, loss_local, 0, 0 # return loss_l1, loss_local, loss_edge, loss_rectangle def loss_fn_l1_loss(self, input, target): return F.l1_loss(input, target, size_average=self.classify_size_average)