Skip to content

Add interface for depth in both forward rendering and backward propagation #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions cuda_rasterizer/forward.cu
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,13 @@ renderCUDA(
int W, int H,
const float2* __restrict__ points_xy_image,
const float* __restrict__ features,
const float* __restrict__ depths,
const float4* __restrict__ conic_opacity,
float* __restrict__ final_T,
uint32_t* __restrict__ n_contrib,
const float* __restrict__ bg_color,
float* __restrict__ out_color)
float* __restrict__ out_color,
float* __restrict__ out_depth)
{
// Identify current tile and associated min/max pixel range.
auto block = cg::this_thread_block();
Expand Down Expand Up @@ -301,6 +303,7 @@ renderCUDA(
uint32_t contributor = 0;
uint32_t last_contributor = 0;
float C[CHANNELS] = { 0 };
float D = { 0 };

// Iterate over batches until all done or range is complete
for (int i = 0; i < rounds; i++, toDo -= BLOCK_SIZE)
Expand Down Expand Up @@ -353,6 +356,7 @@ renderCUDA(
// Eq. (3) from 3D Gaussian splatting paper.
for (int ch = 0; ch < CHANNELS; ch++)
C[ch] += features[collected_id[j] * CHANNELS + ch] * alpha * T;
D += depths[collected_id[j]] * alpha * T;

T = test_T;

Expand All @@ -370,6 +374,7 @@ renderCUDA(
n_contrib[pix_id] = last_contributor;
for (int ch = 0; ch < CHANNELS; ch++)
out_color[ch * H * W + pix_id] = C[ch] + T * bg_color[ch];
out_depth[pix_id] = D;
}
}

Expand All @@ -380,23 +385,27 @@ void FORWARD::render(
int W, int H,
const float2* means2D,
const float* colors,
const float* depths,
const float4* conic_opacity,
float* final_T,
uint32_t* n_contrib,
const float* bg_color,
float* out_color)
float* out_color,
float* out_depth)
{
renderCUDA<NUM_CHANNELS> << <grid, block >> > (
ranges,
point_list,
W, H,
means2D,
colors,
depths,
conic_opacity,
final_T,
n_contrib,
bg_color,
out_color);
out_color,
out_depth);
}

void FORWARD::preprocess(int P, int D, int M,
Expand Down Expand Up @@ -452,4 +461,4 @@ void FORWARD::preprocess(int P, int D, int M,
tiles_touched,
prefiltered
);
}
}
4 changes: 3 additions & 1 deletion cuda_rasterizer/forward.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,13 @@ namespace FORWARD
int W, int H,
const float2* points_xy_image,
const float* features,
const float* depths,
const float4* conic_opacity,
float* final_T,
uint32_t* n_contrib,
const float* bg_color,
float* out_color);
float* out_color,
float* out_depth);
}


Expand Down
1 change: 1 addition & 0 deletions cuda_rasterizer/rasterizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ namespace CudaRasterizer
const float tan_fovx, float tan_fovy,
const bool prefiltered,
float* out_color,
float* out_depth,
int* radii = nullptr);

static void backward(
Expand Down
7 changes: 5 additions & 2 deletions cuda_rasterizer/rasterizer_impl.cu
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ int CudaRasterizer::Rasterizer::forward(
const float tan_fovx, float tan_fovy,
const bool prefiltered,
float* out_color,
float* out_depth,
int* radii)
{
const float focal_y = height / (2.0f * tan_fovy);
Expand Down Expand Up @@ -326,11 +327,13 @@ int CudaRasterizer::Rasterizer::forward(
width, height,
geomState.means2D,
feature_ptr,
geomState.depths,
geomState.conic_opacity,
imgState.accum_alpha,
imgState.n_contrib,
background,
out_color);
out_color,
out_depth);

return num_rendered;
}
Expand Down Expand Up @@ -430,4 +433,4 @@ void CudaRasterizer::Rasterizer::backward(
dL_dsh,
(glm::vec3*)dL_dscale,
(glm::vec4*)dL_drot);
}
}
6 changes: 3 additions & 3 deletions diff_gaussian_rasterization/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,16 +75,16 @@ def forward(
)

# Invoke C++/CUDA rasterizer
num_rendered, color, radii, geomBuffer, binningBuffer, imgBuffer = _C.rasterize_gaussians(*args)
num_rendered, color, depth, radii, geomBuffer, binningBuffer, imgBuffer = _C.rasterize_gaussians(*args)

# Keep relevant tensors for backward
ctx.raster_settings = raster_settings
ctx.num_rendered = num_rendered
ctx.save_for_backward(colors_precomp, means3D, scales, rotations, cov3Ds_precomp, radii, sh, geomBuffer, binningBuffer, imgBuffer)
return color, radii
return color, radii, depth

@staticmethod
def backward(ctx, grad_out_color, _):
def backward(ctx, grad_out_color, grad_radii, grad_depth):

# Restore necessary values from context
num_rendered = ctx.num_rendered
Expand Down
6 changes: 4 additions & 2 deletions rasterize_points.cu
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ std::function<char*(size_t N)> resizeFunctional(torch::Tensor& t) {
return lambda;
}

std::tuple<int, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor>
std::tuple<int, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor>
RasterizeGaussiansCUDA(
const torch::Tensor& background,
const torch::Tensor& means3D,
Expand Down Expand Up @@ -65,6 +65,7 @@ RasterizeGaussiansCUDA(
auto float_opts = means3D.options().dtype(torch::kFloat32);

torch::Tensor out_color = torch::full({NUM_CHANNELS, H, W}, 0.0, float_opts);
torch::Tensor out_depth = torch::full({1, H, W}, 0.0, float_opts);
torch::Tensor radii = torch::full({P}, 0, means3D.options().dtype(torch::kInt32));

torch::Device device(torch::kCUDA);
Expand Down Expand Up @@ -107,9 +108,10 @@ RasterizeGaussiansCUDA(
tan_fovy,
prefiltered,
out_color.contiguous().data<float>(),
out_depth.contiguous().data<float>(),
radii.contiguous().data<int>());
}
return std::make_tuple(rendered, out_color, radii, geomBuffer, binningBuffer, imgBuffer);
return std::make_tuple(rendered, out_color, out_depth, radii, geomBuffer, binningBuffer, imgBuffer);
}

std::tuple<torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor>
Expand Down
2 changes: 1 addition & 1 deletion rasterize_points.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#include <tuple>
#include <string>

std::tuple<int, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor>
std::tuple<int, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor, torch::Tensor>
RasterizeGaussiansCUDA(
const torch::Tensor& background,
const torch::Tensor& means3D,
Expand Down