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)