voxel_gen.py 5.57 KB
Newer Older
yan.yan's avatar
yan.yan committed
1
# Copyright 2021 Yan Yan
2
#
yan.yan's avatar
yan.yan committed
3
4
5
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
6
#
yan.yan's avatar
yan.yan committed
7
#     http://www.apache.org/licenses/LICENSE-2.0
8
#
yan.yan's avatar
yan.yan committed
9
10
11
12
13
14
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

15
import numpy as np
yan.yan's avatar
yan.yan committed
16

17
from cumm import tensorview as tv
yan.yan's avatar
yan.yan committed
18
from spconv.utils import Point2VoxelCPU3d
yan.yan's avatar
v2.1  
yan.yan committed
19
from spconv.pytorch.utils import PointToVoxel
20
21
import torch

yan.yan's avatar
yan.yan committed
22
23

def main():
24
    np.random.seed(50051)
yan.yan's avatar
yan.yan committed
25
    # voxel gen source code: spconv/csrc/sparse/pointops.py
26
27
28
29
30
    gen = Point2VoxelCPU3d(vsize_xyz=[0.1, 0.1, 0.1],
                           coors_range_xyz=[-80, -80, -2, 80, 80, 6],
                           num_point_features=3,
                           max_num_voxels=5000,
                           max_num_points_per_voxel=5)
yan.yan's avatar
yan.yan committed
31
32
33
34
35
36

    pc = np.random.uniform(-10, 10, size=[1000, 3])
    pc_tv = tv.from_numpy(pc)
    # generate voxels, note that voxels_tv reference to a persistent buffer in generator,
    # so we can't run it in multi-thread.
    voxels_tv, indices_tv, num_p_in_vx_tv = gen.point_to_voxel(pc_tv)
yan.yan's avatar
yan.yan committed
37
38
39
    voxels_np = voxels_tv.numpy_view()
    indices_np = indices_tv.numpy_view()
    num_p_in_vx_np = num_p_in_vx_tv.numpy_view()
40
    print(f"------Raw Voxels {voxels_np.shape[0]}-------")
yan.yan's avatar
yan.yan committed
41
    print(voxels_np[0])
yan.yan's avatar
yan.yan committed
42
    # run voxel gen and FILL MEAN VALUE to voxel remain
43
44
    voxels_tv, indices_tv, num_p_in_vx_tv = gen.point_to_voxel_empty_mean(
        pc_tv)
yan.yan's avatar
yan.yan committed
45
46
47
48
49
    voxels_np = voxels_tv.numpy_view()
    indices_np = indices_tv.numpy_view()
    num_p_in_vx_np = num_p_in_vx_tv.numpy_view()
    print("------Voxels with mean filled-------")
    print(voxels_np[0])
yan.yan's avatar
yan.yan committed
50

51

yan.yan's avatar
v2.1  
yan.yan committed
52
def main_point_with_features():
53
    np.random.seed(50051)
yan.yan's avatar
v2.1  
yan.yan committed
54
55
    # voxel gen source code: spconv/csrc/sparse/pointops.py
    gen = Point2VoxelCPU3d(
56
57
58
59
60
        vsize_xyz=[0.1, 0.1, 0.1],
        coors_range_xyz=[-80, -80, -2, 80, 80, 6],
        num_point_features=
        4,  # here num_point_features must equal to pc.shape[1]
        max_num_voxels=5000,
yan.yan's avatar
v2.1  
yan.yan committed
61
62
63
64
65
66
67
68
69
70
71
72
        max_num_points_per_voxel=5)

    pc = np.random.uniform(-10, 10, size=[1000, 3])
    other_pc_feature = np.random.uniform(-1, 1, size=[1000, 1])
    pc_with_feature = np.concatenate([pc, other_pc_feature], axis=1)
    pc_tv = tv.from_numpy(pc_with_feature)
    # generate voxels, note that voxels_tv reference to a persistent buffer in generator,
    # so we can't run it in multi-thread.
    voxels_tv, indices_tv, num_p_in_vx_tv = gen.point_to_voxel(pc_tv)
    voxels_np = voxels_tv.numpy_view()
    indices_np = indices_tv.numpy_view()
    num_p_in_vx_np = num_p_in_vx_tv.numpy_view()
73
    print(f"------Raw Voxels {voxels_np.shape[0]}-------")
yan.yan's avatar
v2.1  
yan.yan committed
74
75
    print(voxels_np[0])
    # run voxel gen and FILL MEAN VALUE to voxel remain
76
77
    voxels_tv, indices_tv, num_p_in_vx_tv = gen.point_to_voxel_empty_mean(
        pc_tv)
yan.yan's avatar
v2.1  
yan.yan committed
78
79
80
81
82
83
    voxels_np = voxels_tv.numpy_view()
    indices_np = indices_tv.numpy_view()
    num_p_in_vx_np = num_p_in_vx_tv.numpy_view()
    print("------Voxels with mean filled-------")
    print(voxels_np[0])

84

yan.yan's avatar
v2.1  
yan.yan committed
85
def main_pytorch_voxel_gen():
86
    np.random.seed(50051)
yan.yan's avatar
v2.1  
yan.yan committed
87
    # voxel gen source code: spconv/csrc/sparse/pointops.py
88
89
90
91
92
    gen = PointToVoxel(vsize_xyz=[0.1, 0.1, 0.1],
                       coors_range_xyz=[-80, -80, -2, 80, 80, 6],
                       num_point_features=3,
                       max_num_voxels=5000,
                       max_num_points_per_voxel=5)
yan.yan's avatar
v2.1  
yan.yan committed
93
94
95
96
97
98
99

    pc = np.random.uniform(-10, 10, size=[1000, 3])
    pc_th = torch.from_numpy(pc)
    voxels_th, indices_th, num_p_in_vx_th = gen(pc_th)
    voxels_np = voxels_th.numpy()
    indices_np = indices_th.numpy()
    num_p_in_vx_np = num_p_in_vx_th.numpy()
100
    print(f"------Raw Voxels {voxels_np.shape[0]}-------")
yan.yan's avatar
v2.1  
yan.yan committed
101
102
103
104
105
106
107
108
109
    print(voxels_np[0])
    # run voxel gen and FILL MEAN VALUE to voxel remain
    voxels_tv, indices_tv, num_p_in_vx_tv = gen(pc_th, empty_mean=True)
    voxels_np = voxels_tv.numpy()
    indices_np = indices_tv.numpy()
    num_p_in_vx_np = num_p_in_vx_tv.numpy()
    print("------Voxels with mean filled-------")
    print(voxels_np[0])

110

yan.yan's avatar
v2.1  
yan.yan committed
111
def main_pytorch_voxel_gen_cuda():
112
    np.random.seed(50051)
yan.yan's avatar
v2.1  
yan.yan committed
113
114
    # voxel gen source code: spconv/csrc/sparse/pointops.py
    device = torch.device("cuda:0")
115
116
117
118
119
120
    gen = PointToVoxel(vsize_xyz=[0.1, 0.1, 0.1],
                       coors_range_xyz=[-80, -80, -2, 80, 80, 6],
                       num_point_features=3,
                       max_num_voxels=5000,
                       max_num_points_per_voxel=5,
                       device=device)
yan.yan's avatar
v2.1  
yan.yan committed
121
122
123
124
125
126
127

    pc = np.random.uniform(-10, 10, size=[1000, 3]).astype(np.float32)
    pc_th = torch.from_numpy(pc).to(device)
    voxels_th, indices_th, num_p_in_vx_th = gen(pc_th)
    voxels_np = voxels_th.cpu().numpy()
    indices_np = indices_th.cpu().numpy()
    num_p_in_vx_np = num_p_in_vx_th.cpu().numpy()
128
    print(f"------Raw Voxels {voxels_np.shape[0]}-------")
yan.yan's avatar
v2.1  
yan.yan committed
129
130
131
132
133
134
135
136
137
138
    print(voxels_np[0])
    # run voxel gen and FILL MEAN VALUE to voxel remain
    voxels_tv, indices_tv, num_p_in_vx_tv = gen(pc_th, empty_mean=True)
    voxels_np = voxels_tv.cpu().numpy()
    indices_np = indices_tv.cpu().numpy()
    num_p_in_vx_np = num_p_in_vx_tv.cpu().numpy()
    print("------Voxels with mean filled-------")
    print(voxels_np[0])


yan.yan's avatar
yan.yan committed
139
140
if __name__ == "__main__":
    main()
yan.yan's avatar
v2.1  
yan.yan committed
141
142
143
    main_point_with_features()
    main_pytorch_voxel_gen()
    if torch.cuda.is_available():
144
        main_pytorch_voxel_gen_cuda()