voxelization.h 6.32 KB
Newer Older
zhangwenwei's avatar
zhangwenwei committed
1
2
3
#pragma once
#include <torch/extension.h>

4
typedef enum { SUM = 0, MEAN = 1, MAX = 2 } reduce_t;
5

zhangwenwei's avatar
zhangwenwei committed
6
7
namespace voxelization {

8
9
int hard_voxelize_cpu(const at::Tensor &points, at::Tensor &voxels,
                      at::Tensor &coors, at::Tensor &num_points_per_voxel,
zhangwenwei's avatar
zhangwenwei committed
10
11
12
13
14
                      const std::vector<float> voxel_size,
                      const std::vector<float> coors_range,
                      const int max_points, const int max_voxels,
                      const int NDim = 3);

15
void dynamic_voxelize_cpu(const at::Tensor &points, at::Tensor &coors,
zhangwenwei's avatar
zhangwenwei committed
16
17
18
19
20
                          const std::vector<float> voxel_size,
                          const std::vector<float> coors_range,
                          const int NDim = 3);

std::vector<at::Tensor> dynamic_point_to_voxel_cpu(
21
    const at::Tensor &points, const at::Tensor &voxel_mapping,
zhangwenwei's avatar
zhangwenwei committed
22
23
24
    const std::vector<float> voxel_size, const std::vector<float> coors_range);

#ifdef WITH_CUDA
25
26
int hard_voxelize_gpu(const at::Tensor &points, at::Tensor &voxels,
                      at::Tensor &coors, at::Tensor &num_points_per_voxel,
zhangwenwei's avatar
zhangwenwei committed
27
28
29
30
31
                      const std::vector<float> voxel_size,
                      const std::vector<float> coors_range,
                      const int max_points, const int max_voxels,
                      const int NDim = 3);

32
33
34
35
36
37
38
int nondisterministic_hard_voxelize_gpu(const at::Tensor &points, at::Tensor &voxels,
                                        at::Tensor &coors, at::Tensor &num_points_per_voxel,
                                        const std::vector<float> voxel_size,
                                        const std::vector<float> coors_range,
                                        const int max_points, const int max_voxels,
                                        const int NDim = 3);

39
void dynamic_voxelize_gpu(const at::Tensor &points, at::Tensor &coors,
zhangwenwei's avatar
zhangwenwei committed
40
41
42
43
                          const std::vector<float> voxel_size,
                          const std::vector<float> coors_range,
                          const int NDim = 3);

44
45
46
std::vector<torch::Tensor> dynamic_point_to_voxel_forward_gpu(const torch::Tensor &feats,
                                                              const torch::Tensor &coors,
                                                              const reduce_t reduce_type);
zhangwenwei's avatar
zhangwenwei committed
47

48
49
50
51
52
53
54
void dynamic_point_to_voxel_backward_gpu(torch::Tensor &grad_feats,
                                         const torch::Tensor &grad_reduced_feats,
                                         const torch::Tensor &feats,
                                         const torch::Tensor &reduced_feats,
                                         const torch::Tensor &coors_idx,
                                         const torch::Tensor &reduce_count,
                                         const reduce_t reduce_type);
zhangwenwei's avatar
zhangwenwei committed
55
56
57
#endif

// Interface for Python
58
59
inline int hard_voxelize(const at::Tensor &points, at::Tensor &voxels,
                         at::Tensor &coors, at::Tensor &num_points_per_voxel,
zhangwenwei's avatar
zhangwenwei committed
60
61
62
                         const std::vector<float> voxel_size,
                         const std::vector<float> coors_range,
                         const int max_points, const int max_voxels,
63
                         const int NDim = 3, const bool deterministic = true) {
64
  if (points.device().is_cuda()) {
zhangwenwei's avatar
zhangwenwei committed
65
#ifdef WITH_CUDA
66
67
68
69
70
71
72
73
    if (deterministic) {
      return hard_voxelize_gpu(points, voxels, coors, num_points_per_voxel,
                               voxel_size, coors_range, max_points, max_voxels,
                               NDim);
    }
    return nondisterministic_hard_voxelize_gpu(points, voxels, coors, num_points_per_voxel,
                                               voxel_size, coors_range, max_points, max_voxels,
                                               NDim);
zhangwenwei's avatar
zhangwenwei committed
74
75
76
77
78
79
80
81
82
#else
    AT_ERROR("Not compiled with GPU support");
#endif
  }
  return hard_voxelize_cpu(points, voxels, coors, num_points_per_voxel,
                           voxel_size, coors_range, max_points, max_voxels,
                           NDim);
}

83
inline void dynamic_voxelize(const at::Tensor &points, at::Tensor &coors,
zhangwenwei's avatar
zhangwenwei committed
84
85
86
                             const std::vector<float> voxel_size,
                             const std::vector<float> coors_range,
                             const int NDim = 3) {
87
  if (points.device().is_cuda()) {
zhangwenwei's avatar
zhangwenwei committed
88
89
90
91
92
93
94
95
96
#ifdef WITH_CUDA
    return dynamic_voxelize_gpu(points, coors, voxel_size, coors_range, NDim);
#else
    AT_ERROR("Not compiled with GPU support");
#endif
  }
  return dynamic_voxelize_cpu(points, coors, voxel_size, coors_range, NDim);
}

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
inline reduce_t convert_reduce_type(const std::string &reduce_type) {
  if (reduce_type == "max")
    return reduce_t::MAX;
  else if (reduce_type == "sum")
    return reduce_t::SUM;
  else if (reduce_type == "mean")
    return reduce_t::MEAN;
  else TORCH_CHECK(false, "do not support reduce type " + reduce_type)
  return reduce_t::SUM;
}

inline std::vector<torch::Tensor> dynamic_point_to_voxel_forward(const torch::Tensor &feats,
                                                                 const torch::Tensor &coors,
                                                                 const std::string &reduce_type) {
  if (feats.device().is_cuda()) {
zhangwenwei's avatar
zhangwenwei committed
112
#ifdef WITH_CUDA
113
    return dynamic_point_to_voxel_forward_gpu(feats, coors, convert_reduce_type(reduce_type));
zhangwenwei's avatar
zhangwenwei committed
114
#else
115
    TORCH_CHECK(false, "Not compiled with GPU support");
zhangwenwei's avatar
zhangwenwei committed
116
117
#endif
  }
118
119
  TORCH_CHECK(false, "do not support cpu yet");
  return std::vector<torch::Tensor>();
zhangwenwei's avatar
zhangwenwei committed
120
121
}

122
123
124
125
126
127
128
129
inline void dynamic_point_to_voxel_backward(torch::Tensor &grad_feats,
                                            const torch::Tensor &grad_reduced_feats,
                                            const torch::Tensor &feats,
                                            const torch::Tensor &reduced_feats,
                                            const torch::Tensor &coors_idx,
                                            const torch::Tensor &reduce_count,
                                            const std::string &reduce_type) {
  if (grad_feats.device().is_cuda()) {
zhangwenwei's avatar
zhangwenwei committed
130
#ifdef WITH_CUDA
131
132
133
134
    dynamic_point_to_voxel_backward_gpu(
        grad_feats, grad_reduced_feats, feats, reduced_feats, coors_idx, reduce_count,
        convert_reduce_type(reduce_type));
    return;
zhangwenwei's avatar
zhangwenwei committed
135
#else
136
    TORCH_CHECK(false, "Not compiled with GPU support");
zhangwenwei's avatar
zhangwenwei committed
137
138
#endif
  }
139
  TORCH_CHECK(false, "do not support cpu yet");
zhangwenwei's avatar
zhangwenwei committed
140
141
142
}

}  // namespace voxelization