mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-08-02 03:42:50 +08:00
idr harmonic_fns and doc
Summary: Document the inputs of idr functions and distinguish n_harmonic_functions to be 0 (simple embedding) versus -1 (no embedding). Reviewed By: davnov134 Differential Revision: D37209012 fbshipit-source-id: 6e5c3eae54c4e5e8c3f76cad1caf162c6c222d52
This commit is contained in:
parent
28c1afaa9d
commit
81d63c6382
@ -201,7 +201,7 @@ generic_model_args:
|
||||
bias: 1.0
|
||||
skip_in: []
|
||||
weight_norm: true
|
||||
n_harmonic_functions_xyz: 0
|
||||
n_harmonic_functions_xyz: -1
|
||||
pooled_feature_dim: 0
|
||||
encoding_dim: 0
|
||||
implicit_function_NeRFormerImplicitFunction_args:
|
||||
|
@ -15,6 +15,41 @@ from .base import ImplicitFunctionBase
|
||||
|
||||
@registry.register
|
||||
class IdrFeatureField(ImplicitFunctionBase, torch.nn.Module):
|
||||
"""
|
||||
Implicit function as used in http://github.com/lioryariv/idr.
|
||||
|
||||
Members:
|
||||
d_in: dimension of the input point.
|
||||
n_harmonic_functions_xyz: If -1, do not embed the point.
|
||||
If >=0, use a harmonic embedding with this number of
|
||||
harmonic functions. (The harmonic embedding includes the input
|
||||
itself, so a value of 0 means the point is used but without
|
||||
any harmonic functions.)
|
||||
d_out and feature_vector_size: Sum of these is the output
|
||||
dimension. This implicit function thus returns a concatenation
|
||||
of `d_out` signed distance function values and `feature_vector_size`
|
||||
features (such as colors). When used in `GenericModel`,
|
||||
`feature_vector_size` corresponds is automatically set to
|
||||
`render_features_dimensions`.
|
||||
dims: list of hidden layer sizes.
|
||||
geometric_init: whether to use custom weight initialization
|
||||
in linear layers. If False, pytorch default (uniform sampling)
|
||||
is used.
|
||||
bias: if geometric_init=True, initial value for bias subtracted
|
||||
in the last layer.
|
||||
skip_in: List of indices of layers that receive as input the initial
|
||||
value concatenated with the output of the previous layers.
|
||||
weight_norm: whether to apply weight normalization to each layer.
|
||||
pooled_feature_dim: If view pooling is in use (provided as
|
||||
fun_viewpool to forward()) this must be its number of features.
|
||||
Otherwise this must be set to 0. (If used from GenericModel,
|
||||
this config value will be overridden automatically.)
|
||||
encoding_dim: If global coding is in use (provided as global_code
|
||||
to forward()) this must be its number of featuress.
|
||||
Otherwise this must be set to 0. (If used from GenericModel,
|
||||
this config value will be overridden automatically.)
|
||||
"""
|
||||
|
||||
feature_vector_size: int = 3
|
||||
d_in: int = 3
|
||||
d_out: int = 1
|
||||
@ -23,7 +58,7 @@ class IdrFeatureField(ImplicitFunctionBase, torch.nn.Module):
|
||||
bias: float = 1.0
|
||||
skip_in: Sequence[int] = ()
|
||||
weight_norm: bool = True
|
||||
n_harmonic_functions_xyz: int = 0
|
||||
n_harmonic_functions_xyz: int = -1
|
||||
pooled_feature_dim: int = 0
|
||||
encoding_dim: int = 0
|
||||
|
||||
@ -33,7 +68,7 @@ class IdrFeatureField(ImplicitFunctionBase, torch.nn.Module):
|
||||
dims = [self.d_in] + list(self.dims) + [self.d_out + self.feature_vector_size]
|
||||
|
||||
self.embed_fn = None
|
||||
if self.n_harmonic_functions_xyz > 0:
|
||||
if self.n_harmonic_functions_xyz >= 0:
|
||||
self.embed_fn = HarmonicEmbedding(
|
||||
self.n_harmonic_functions_xyz, append_input=True
|
||||
)
|
||||
@ -63,13 +98,13 @@ class IdrFeatureField(ImplicitFunctionBase, torch.nn.Module):
|
||||
std=0.0001,
|
||||
)
|
||||
torch.nn.init.constant_(lin.bias, -self.bias)
|
||||
elif self.n_harmonic_functions_xyz > 0 and layer_idx == 0:
|
||||
elif self.n_harmonic_functions_xyz >= 0 and layer_idx == 0:
|
||||
torch.nn.init.constant_(lin.bias, 0.0)
|
||||
torch.nn.init.constant_(lin.weight[:, 3:], 0.0)
|
||||
torch.nn.init.normal_(
|
||||
lin.weight[:, :3], 0.0, 2**0.5 / out_dim**0.5
|
||||
)
|
||||
elif self.n_harmonic_functions_xyz > 0 and layer_idx in self.skip_in:
|
||||
elif self.n_harmonic_functions_xyz >= 0 and layer_idx in self.skip_in:
|
||||
torch.nn.init.constant_(lin.bias, 0.0)
|
||||
torch.nn.init.normal_(lin.weight, 0.0, 2**0.5 / out_dim**0.5)
|
||||
torch.nn.init.constant_(lin.weight[:, -(dims[0] - 3) :], 0.0)
|
||||
@ -110,27 +145,26 @@ class IdrFeatureField(ImplicitFunctionBase, torch.nn.Module):
|
||||
# Tensor]`.
|
||||
).view(0, self.out_dim)
|
||||
|
||||
embedding = None
|
||||
embeddings = []
|
||||
if self.embed_fn is not None:
|
||||
# pyre-fixme[29]: `Union[torch.Tensor, torch.nn.Module]` is not a function.
|
||||
embedding = self.embed_fn(rays_points_world)
|
||||
embeddings.append(self.embed_fn(rays_points_world))
|
||||
|
||||
if fun_viewpool is not None:
|
||||
assert rays_points_world.ndim == 2
|
||||
pooled_feature = fun_viewpool(rays_points_world[None])
|
||||
# TODO: pooled features are 4D!
|
||||
embedding = torch.cat((embedding, pooled_feature), dim=-1)
|
||||
embeddings.append(pooled_feature)
|
||||
|
||||
if global_code is not None:
|
||||
assert embedding.ndim == 2
|
||||
assert global_code.shape[0] == 1 # TODO: generalize to batches!
|
||||
# This will require changing raytracer code
|
||||
# embedding = embedding[None].expand(global_code.shape[0], *embedding.shape)
|
||||
embedding = torch.cat(
|
||||
(embedding, global_code[0, None, :].expand(*embedding.shape[:-1], -1)),
|
||||
dim=-1,
|
||||
embeddings.append(
|
||||
global_code[0, None, :].expand(rays_points_world.shape[0], -1)
|
||||
)
|
||||
|
||||
embedding = torch.cat(embeddings, dim=-1)
|
||||
x = embedding
|
||||
# pyre-fixme[29]: `Union[BoundMethod[typing.Callable(torch._C._TensorBase.__s...
|
||||
for layer_idx in range(self.num_layers - 1):
|
||||
|
@ -16,6 +16,30 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class RayNormalColoringNetwork(torch.nn.Module):
|
||||
"""
|
||||
Members:
|
||||
d_in and feature_vector_size: Sum of these is the input
|
||||
dimension. These must add up to the sum of
|
||||
- 3 [for the points]
|
||||
- 3 unless mode=no_normal [for the normals]
|
||||
- 3 unless mode=no_view_dir [for view directions]
|
||||
- the feature size, [number of channels in feature_vectors]
|
||||
|
||||
d_out: dimension of output.
|
||||
mode: One of "idr", "no_view_dir" or "no_normal" to allow omitting
|
||||
part of the network input.
|
||||
dims: list of hidden layer sizes.
|
||||
weight_norm: whether to apply weight normalization to each layer.
|
||||
n_harmonic_functions_dir:
|
||||
If >0, use a harmonic embedding with this number of
|
||||
harmonic functions for the view direction. Otherwise view directions
|
||||
are fed without embedding, unless mode is `no_view_dir`.
|
||||
pooled_feature_dim: If a pooling function is in use (provided as
|
||||
pooling_fn to forward()) this must be its number of features.
|
||||
Otherwise this must be set to 0. (If used from GenericModel,
|
||||
this will be set automatically.)
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
feature_vector_size: int = 3,
|
||||
|
Loading…
x
Reference in New Issue
Block a user