Spaces:
Runtime error
Runtime error
File size: 7,168 Bytes
470ac18 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
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)
|