File size: 4,847 Bytes
a6dd040
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import numpy as np
import unittest
import time

import torch
import MinkowskiEngineTest._C

from utils import load_file, batched_coordinates


class KernelRegionTestCase(unittest.TestCase):
    def test(self):
        coordinates = torch.IntTensor(
            [[0, 1, -1], [0, 1, 0], [0, 1, 1], [0, 2, -1], [0, 2, 0], [0, 2, 1]]
        )
        kernel_size = torch.IntTensor([3, 3])

        (in_maps, out_maps), N, t = MinkowskiEngineTest._C.kernel_map_test(
            coordinates, coordinates, kernel_size
        )

    def test2(self):
        coordinates = torch.IntTensor([[0, 1, -1], [0, 2, 1]])
        kernel_size = torch.IntTensor([3, 3])

        regions = MinkowskiEngineTest._C.region_iterator_test(coordinates, kernel_size)

        self.assertEqual(
            len(regions), len(coordinates) * torch.prod(kernel_size).item()
        )

        self.assertEqual(regions[0], [0, 0, -2])
        self.assertEqual(regions[1], [0, 1, -2])
        self.assertEqual(regions[2], [0, 2, -2])

        self.assertEqual(regions[3], [0, 0, -1])
        self.assertEqual(regions[4], [0, 1, -1])
        self.assertEqual(regions[5], [0, 2, -1])

        self.assertEqual(regions[6], [0, 0, 0])
        self.assertEqual(regions[7], [0, 1, 0])
        self.assertEqual(regions[8], [0, 2, 0])

    def test_even(self):
        coordinates = torch.IntTensor([[0, 1, -1], [0, 2, 1]])
        kernel_size = torch.IntTensor([3, 2])

        regions = MinkowskiEngineTest._C.region_iterator_test(coordinates, kernel_size)

        self.assertEqual(
            len(regions), len(coordinates) * torch.prod(kernel_size).item()
        )

        self.assertEqual(regions[0], [0, 0, -1])
        self.assertEqual(regions[1], [0, 1, -1])
        self.assertEqual(regions[2], [0, 2, -1])

        self.assertEqual(regions[3], [0, 0, 0])
        self.assertEqual(regions[4], [0, 1, 0])
        self.assertEqual(regions[5], [0, 2, 0])

    def test_even3(self):
        coordinates = torch.IntTensor([[0, 1, -1, 3], [0, 2, 1, -2]])
        kernel_size = torch.IntTensor([3, 2, 2])

        regions = MinkowskiEngineTest._C.region_iterator_test(coordinates, kernel_size)

        self.assertEqual(
            len(regions), len(coordinates) * torch.prod(kernel_size).item()
        )

        self.assertEqual(regions[0], [0, 0, -1, 3])
        self.assertEqual(regions[1], [0, 1, -1, 3])
        self.assertEqual(regions[2], [0, 2, -1, 3])

        self.assertEqual(regions[3], [0, 0, 0, 3])
        self.assertEqual(regions[4], [0, 1, 0, 3])
        self.assertEqual(regions[5], [0, 2, 0, 3])

        self.assertEqual(regions[6], [0, 0, -1, 4])
        self.assertEqual(regions[7], [0, 1, -1, 4])
        self.assertEqual(regions[8], [0, 2, -1, 4])

        self.assertEqual(regions[9], [0, 0, 0, 4])
        self.assertEqual(regions[10], [0, 1, 0, 4])
        self.assertEqual(regions[11], [0, 2, 0, 4])

    def test_kernel_map1(self):
        in_coordinates = torch.IntTensor([[0, 1, -1], [0, 2, 1]])
        out_coordinates = torch.IntTensor([[0, 1, -1], [0, 2, 1], [1, 2, 1]])
        kernel_size = torch.IntTensor([1, 1])

        (in_maps, out_maps), num, t = MinkowskiEngineTest._C.kernel_map_test(
            in_coordinates, out_coordinates, kernel_size
        )

        self.assertEqual(in_maps[0], [0, 1])
        self.assertEqual(out_maps[0], [0, 1])

    def test_kernel_map(self):
        in_coordinates = torch.IntTensor([[0, 1, -1], [0, 2, 1]])
        out_coordinates = torch.IntTensor([[0, 1, 0], [0, 1, 2], [1, 2, 1]])
        kernel_size = torch.IntTensor([3, 3])

        kernel_map, num, t = MinkowskiEngineTest._C.kernel_map_test(
            in_coordinates, out_coordinates, kernel_size
        )

        in_maps = kernel_map[0]
        out_maps = kernel_map[1]
        self.assertEqual(len(in_maps), torch.prod(kernel_size).item())

        self.assertEqual(in_maps[1], [0])
        self.assertEqual(out_maps[1], [0])
        self.assertEqual(in_maps[2], [1])
        self.assertEqual(out_maps[2], [1])

    def test_pcd(self):
        coords, colors, pcd = load_file("1.ply")
        kernel_size = torch.IntTensor([3, 3, 3])
        for batch_size in [1, 5, 10, 20, 40]:
            for voxel_size in [0.05, 0.035, 0.02]:
                min_time = 100000
                dcoords = torch.from_numpy(np.floor(coords / voxel_size)).int()
                bcoords = batched_coordinates([dcoords for i in range(batch_size)])
                for i in range(10):
                    kernel_map, num, t = MinkowskiEngineTest._C.kernel_map_test(
                        bcoords, bcoords, kernel_size
                    )
                    min_time = min(t, min_time)

                    num_kernels = np.sum([len(a) for a in kernel_map[0]])
                print(f"{batch_size}\t{voxel_size}\t{num}\t{num_kernels}\t{min_time}")