Neural-Scene-Flow-Fields
Neural-Scene-Flow-Fields copied to clipboard
Singularly in NDC2Euclidean
NDC2Euclidean appears to be attempting to prevent a divide-by-zero error by the addition of an epsilon value:
def NDC2Euclidean(xyz_ndc, H, W, f):
z_e = 2./ (xyz_ndc[..., 2:3] - 1. + 1e-6)
x_e = - xyz_ndc[..., 0:1] * z_e * W/ (2. * f)
y_e = - xyz_ndc[..., 1:2] * z_e * H/ (2. * f)
xyz_e = torch.cat([x_e, y_e, z_e], -1)
return xyz_e
However, since the coordinates have scene flow field vectors added to them, and the scene flow field output ranges (-1.0,1.0), it is possible to have xyz_ndc
significantly outside of the normal range. This means that a divide-by-zero can still happen in the above code if the z value hits (1.0+1e-6), which it does in our training.
We suggest clamping to valid NDC values to the range (-1.0, 0.99), with 0.99 chosen to prevent the Euclidean far plane from getting too large. This choice of clamping has significantly stabilized our training in early iterations:
z_e = 2./ (torch.clamp(xyz_ndc[..., 2:3], -1.0, 0.99) - 1.0)
https://github.com/zhengqili/Neural-Scene-Flow-Fields/blob/main/nsff_exp/run_nerf_helpers.py#L535