83 Commits

Author SHA1 Message Date
Luya Gao
e053d7c456 Adding join_mesh in pytorch3d.structures.meshes
Summary: Adding a function in pytorch3d.structures.meshes to join multiple meshes into a Meshes object representing a single mesh. The function currently ignores all textures.

Reviewed By: nikhilaravi

Differential Revision: D21876908

fbshipit-source-id: 448602857e9d3d3f774d18bb4e93076f78329823
2020-06-09 08:33:23 -07:00
Jeremy Reizenstein
5444c53cee Avoid plain division involving integers
Summary: To avoid pytorch warnings and future behaviour changes, stop using torch.div and / with tensors of integers.

Reviewed By: gkioxari, mruberry

Differential Revision: D21857955

fbshipit-source-id: fb9f3000f3d953352cdc721d2a5f73d3a4bbf4b7
2020-06-03 11:32:05 -07:00
Luya Gao
65620e716c Adding support for changing background color
Summary: Adds support to hard_rgb_blend and hard blending shaders in shader.py (HardPhongShader, HardGouraudShader, and HardFlatShader) for changing the background color on which objects are rendered

Reviewed By: nikhilaravi

Differential Revision: D21746062

fbshipit-source-id: 08001200f4339d6a69c52405c6b8f4cac9f3f56e
2020-06-01 08:00:57 -07:00
Nikhila Ravi
e3819a49df update rasterizer transform method
Summary:
Update the transform method in the mesh rasterizer class to use the new `update_padded` method on the `Meshes` class to directly update the mesh vertices.

Also added a benchmark.

Reviewed By: gkioxari

Differential Revision: D21700352

fbshipit-source-id: c330e4040c681729eb2cc7bdfd92fb4a51a1a7d6
2020-05-23 10:28:21 -07:00
Georgia Gkioxari
1fb97f9c84 update padded in meshes
Summary:
Three changes to Meshes

1. `num_verts_per_mesh` and `num_faces_per_mesh` are assigned at construction time and are returned without the need for `compute_packed`
2. `update_padded` updates `verts_padded` and shallow copies faces list and faces_padded and existing attributes from construction.
3. `padded_to_packed_idx` does not need `compute_packed`

Reviewed By: nikhilaravi

Differential Revision: D21653674

fbshipit-source-id: dc6815a2e2a925fe4a834fe357919da2b2c14527
2020-05-22 22:38:29 -07:00
Jeremy Reizenstein
f2d1d2db69 Alternative type names in PLY #205
Summary: Add ability to decode ply files which use types like int32.

Reviewed By: nikhilaravi

Differential Revision: D21639208

fbshipit-source-id: 0ede7d4aa353a6e940446680a18e7ac0c48fafee
2020-05-20 01:13:23 -07:00
Justin Johnson
d8987c6f48 Add benchmark for diffuse and specular lighting
Summary: I was trying to speed up the lighting computations, but my ideas didn't work. Even if that didn't work, we can at least commit the benchmarking script I wrote for diffuse and specular shading.

Reviewed By: nikhilaravi

Differential Revision: D21580171

fbshipit-source-id: 8b60c0284e91ecbe258b6aae839bd5c2bbe788aa
2020-05-16 15:55:10 -07:00
Roman Shapovalov
a8377f1f06 Numerical stability of ePnP.
Summary: lg-zhang found the problem with the quadratic part of ePnP implementation: n262385 . It was caused by a coefficient returned from the linear equation solver being equal to exactly 0.0, which caused `sign()` to return 0, something I had not anticipated. I also made sure we avoid division by zero by clamping all relevant denominators.

Reviewed By: nikhilaravi, lg-zhang

Differential Revision: D21531200

fbshipit-source-id: 9eb2fa9d4f4f8f5f411d4cf1cffcc44b365b7e51
2020-05-15 01:36:21 -07:00
David Novotny
34a0df0630 SO3 log map fix for singularity at PI
Summary:
Fixes the case where the rotation angle is exactly 0/PI.
Added a test for `so3_log_map(identity_matrix)`.

Reviewed By: nikhilaravi

Differential Revision: D21477078

fbshipit-source-id: adff804da97f6f0d4f50aa1f6904a34832cb8bfe
2020-05-10 13:15:37 -07:00
Nikhila Ravi
17ca6ecd81 allow cameras to be None in rasterizer initialization
Summary: Fix to enable a mesh/point rasterizer to be initialized without having to specify the camera.

Reviewed By: jcjohnson, gkioxari

Differential Revision: D21362359

fbshipit-source-id: 4f84ea18ad9f179c7b7c2289ebf9422a2f5e26de
2020-05-05 22:32:57 -07:00
Georgia Gkioxari
a61c9376d5 add align modes for cubify
Summary: Add alignment modes for cubify operation.

Reviewed By: nikhilaravi

Differential Revision: D21393199

fbshipit-source-id: 7022044e591229a6ed5efc361fd3215e65f43f86
2020-05-05 11:09:45 -07:00
Jeremy Reizenstein
8fc28baa27 Looser gradient check in test_rasterize_meshes
Summary: This has been failing intermittently

Reviewed By: nikhilaravi

Differential Revision: D21403157

fbshipit-source-id: 51b74d6c813b52effe72d14b565e250fcabbb463
2020-05-05 09:26:47 -07:00
Nikhila Ravi
0eca74fa5f lint fixes
Summary:
Ran the linter.
TODO: need to update the linter as per D21353065.

Reviewed By: bottler

Differential Revision: D21362270

fbshipit-source-id: ad0e781de0a29f565ad25c43bc94a19b1828c020
2020-05-04 09:56:44 -07:00
Jeremy Reizenstein
0c595dcf5b Joining mismatched texture maps on CUDA #175
Summary:
Use nn.functional.interpolate instead of a TorchVision transform to resize texture maps to a common value. This works on all devices. This fixes issue #175.

Also fix the condition so it only happens when needed.

Reviewed By: nikhilaravi

Differential Revision: D21324510

fbshipit-source-id: c50eb06514984995bd81f2c44079be6e0b4098e4
2020-05-01 05:20:10 -07:00
Georgia Gkioxari
e64e0d17ef fix self assign for normals est
Summary: Fix self assignment of normals when estimating normals

Reviewed By: nikhilaravi

Differential Revision: D21315980

fbshipit-source-id: 2aa5864c3f066e39e07343f192cc6423ce1ae771
2020-04-30 14:27:08 -07:00
Jeremy Reizenstein
232e4a7e3d Driver update for ci, easier diagnosing
Summary: Bump the nvidia driver used in the conda tests. Add an environment variable (unused) to allow building without ninja. Print relative error on assertClose failure.

Reviewed By: nikhilaravi

Differential Revision: D21227373

fbshipit-source-id: 5dd8eb097151da27d3632daa755a1e7b9ac97845
2020-04-25 16:03:42 -07:00
Nikhila Ravi
cf84dacf2e fix get cuda device test error
Summary:
Cuda test failing on circle with the error `random_ expects 'from' to be less than 'to', but got from=0 >= to=0`

This is because the `high` value in `torch.randint` is 1 more than the highest value in the distribution from which a value is drawn. So if there is only 1 cuda device available then the low and high are 0.

Reviewed By: gkioxari

Differential Revision: D21236669

fbshipit-source-id: 46c312d431c474f1f2c50747b1d5e7afbd7df3a9
2020-04-24 16:12:49 -07:00
Michele Sanna
f8acecb6b3 a formula for bin size for images over 64x64 (#90)
Summary:
Signed-off-by: Michele Sanna <sanna@arrival.com>

fixes the bin_size calculation with a formula for any image_size > 64. Matches the values chosen so far.

simple test:

```
import numpy as np
import matplotlib.pyplot as plt

image_size = np.arange(64, 2048)
bin_size = np.where(image_size <= 64, 8, (2 ** np.maximum(np.ceil(np.log2(image_size)) - 4, 4)).astype(int))

print(image_size)
print(bin_size)

for ims, bins in zip(image_size, bin_size):
    if ims <= 64:
        assert bins == 8
    elif ims <= 256:
        assert bins == 16
    elif ims <= 512:
        assert bins == 32
    elif ims <= 1024:
        assert bins == 64
    elif ims <= 2048:
        assert bins == 128

    assert (ims + bins - 1) // bins < 22

plt.plot(image_size, bin_size)
plt.grid()
plt.show()
```

![img](https://user-images.githubusercontent.com/54891577/75464693-795bcf00-597f-11ea-9061-26440211691c.png)
Pull Request resolved: https://github.com/facebookresearch/pytorch3d/pull/90

Reviewed By: jcjohnson

Differential Revision: D21160372

Pulled By: nikhilaravi

fbshipit-source-id: 660cf5832f4ca5be243c435a6bed969596fc0188
2020-04-24 14:56:41 -07:00
Nikhila Ravi
c3d636dc8c Cuda updates
Summary:
Updates to:
- enable cuda kernel launches on any GPU (not just the default)
- cuda and contiguous checks for all kernels
- checks to ensure all tensors are on the same device
- error reporting in the cuda kernels
- cuda tests now run on a random device not just the default

Reviewed By: jcjohnson, gkioxari

Differential Revision: D21215280

fbshipit-source-id: 1bedc9fe6c35e9e920bdc4d78ed12865b1005519
2020-04-24 09:11:04 -07:00
Nikhila Ravi
c9267ab7af Update load obj and compare with SoftRas
Summary:
Updated the load obj function to support creating of a per face texture map using the information in an .mtl file. Uses the approach from in SoftRasterizer.

Currently I have ported in the SoftRasterizer code but this is only to help with comparison and will  be deleted before landing. The ShapeNet Test data will also be deleted.

Here is the [Design doc](https://docs.google.com/document/d/1AUcLP4QwVSqlfLAUfbjM9ic5vYn9P54Ha8QbcVXW2eI/edit?usp=sharing).

## Added
- texture atlas creation functions in PyTorch based on the SoftRas cuda implementation
- tests to compare SoftRas vs PyTorch3D implementation to verify it matches (using real shapenet data with meshes consisting of multiple textures)
- benchmarks tests

## Remaining todo:
- add more tests for obj io to test the new functions and the two texturing options
- replace the shapenet data with the output from SoftRas saved as a file.

# MAIN FILES TO REVIEW

- `obj_io.py`
- `test_obj_io.py` [still some tests to be added but have comparisons with SoftRas for now]

The reference SoftRas implementations are in `softras_load_obj.py` and `load_textures.cu`.

Reviewed By: gkioxari

Differential Revision: D20754859

fbshipit-source-id: 42ace9dfb73f26e29d800c763f56d5b66c60c5e2
2020-04-23 19:38:35 -07:00
Justin Johnson
9f31a4fd46 Expose knn_check_version in python
Summary:
We have multiple KNN CUDA implementations. From python, users can currently request a particular implementation via the `version` flag, but they have no way of knowing which implementations can be used for a given problem.

This diff exposes a function `pytorch3d._C.knn_check_version(version, D, K)` that returns whether a particular version can be used.

Reviewed By: nikhilaravi

Differential Revision: D21162573

fbshipit-source-id: 6061960bdcecba454fd920b00036f4e9ff3fdbc0
2020-04-22 14:30:52 -07:00
Jeremy Reizenstein
9e4bd2e5e0 chamfer test consistency
Summary:
Modify test_chamfer for more robustness. Avoid empty pointclouds, including where point_reduction is mean, for which we currently return nan (*), and so that we aren't looking at an empty gradient. Make sure we aren't using padding as points in the homogenous cases in the tests, which will lead to a tie between closest points and therefore a potential instability in the gradient - see https://github.com/pytorch/pytorch/issues/35699.

(*) This doesn't attempt to fix the nan.

Reviewed By: nikhilaravi, gkioxari

Differential Revision: D21157322

fbshipit-source-id: a609e84e25a24379c8928ff645d587552526e4af
2020-04-22 09:28:51 -07:00
Nikhila Ravi
4bf30593ff back face culling in rasterization
Summary:
Added backface culling as an option to the `raster_settings`. This is needed for the full forward rendering of shapenet meshes with texture (some meshes contain
multiple overlapping segments which have different textures).

For a triangle (v0, v1, v2) define the vectors A = (v1 - v0) and B = (v2 − v0) and use this to calculate the area of the triangle as:
```
area = 0.5 * A  x B
area = 0.5 * ((x1 − x0)(y2 − y0) − (x2 − x0)(y1 − y0))
```
The area will be positive if (v0, v1, v2) are oriented counterclockwise (a front face), and negative if (v0, v1, v2) are oriented clockwise (a back face).

We can reuse the `edge_function` as it already calculates the triangle area.

Reviewed By: jcjohnson

Differential Revision: D20960115

fbshipit-source-id: 2d8a4b9ccfb653df18e79aed8d05c7ec0f057ab1
2020-04-22 08:22:46 -07:00
Nikhila Ravi
9ef1ee8455 coarse rasterization bug fix
Summary:
Fix a bug which resulted in a rendering artifacts if the image size was not a multiple of 16.
Fix: Revert coarse rasterization to original implementation and only update fine rasterization to reverse the ordering of Y and X axis. This is much simpler than the previous approach!

Additional changes:
- updated mesh rendering end-end tests to check outputs from both naive and coarse to fine rasterization.
- added pointcloud rendering end-end tests

Reviewed By: gkioxari

Differential Revision: D21102725

fbshipit-source-id: 2e7e1b013dd6dd12b3a00b79eb8167deddb2e89a
2020-04-20 14:54:16 -07:00
Jeremy Reizenstein
1e4749602d skip code tests in conda build
Summary:
None of the current test_build tests make sense during `conda build`.

Also remove the unnecessary dependency on the `six` library.

Reviewed By: nikhilaravi

Differential Revision: D20893852

fbshipit-source-id: 685f0446eaa0bd9151eeee89fc630a1ddc0252ff
2020-04-20 12:19:45 -07:00
Jeremy Reizenstein
6207c359b1 spelling and flake
Summary: mostly recent lintish things

Reviewed By: nikhilaravi

Differential Revision: D21089003

fbshipit-source-id: 028733c1d875268f1879e4481da475b7100ba0b6
2020-04-17 10:50:22 -07:00
Jeremy Reizenstein
f25af96959 vert_align for Pointclouds object
Reviewed By: gkioxari

Differential Revision: D21088730

fbshipit-source-id: f8c125ac8c8009d45712ae63237ca64acf1faf45
2020-04-17 10:39:43 -07:00
Roman Shapovalov
04d8bf6a43 Efficient PnP.
Summary:
Efficient PnP algorithm to fit 2D to 3D correspondences under perspective assumption.

Benchmarked both variants of nullspace and pick one; SVD takes 7 times longer in the 100K points case.

Reviewed By: davnov134, gkioxari

Differential Revision: D20095754

fbshipit-source-id: 2b4519729630e6373820880272f674829eaed073
2020-04-17 07:44:16 -07:00
David Novotny
7788a38050 Camera inheritance + unprojections
Summary: Made a CameraBase class. Added `unproject_points` method for each camera class.

Reviewed By: nikhilaravi

Differential Revision: D20373602

fbshipit-source-id: 7e3da5ae420091b5fcab400a9884ef29ad7a7343
2020-04-17 04:38:14 -07:00
David Novotny
365945b1fd Pointcloud normals estimation.
Summary: Estimates normals of a point cloud.

Reviewed By: gkioxari

Differential Revision: D20860182

fbshipit-source-id: 652ec2743fa645e02c01ffa37c2971bf27b89cef
2020-04-16 18:36:19 -07:00
David Novotny
8abbe22ffb ICP - point-to-point version
Summary:
The iterative closest point algorithm - point-to-point version.

Output of `bm_iterative_closest_point`:
Argument key: `batch_size dim n_points_X n_points_Y use_pointclouds`

```
Benchmark                                         Avg Time(μs)      Peak Time(μs) Iterations
--------------------------------------------------------------------------------
IterativeClosestPoint_1_3_100_100_False              107569          111323              5
IterativeClosestPoint_1_3_100_1000_False             118972          122306              5
IterativeClosestPoint_1_3_1000_100_False             108576          110978              5
IterativeClosestPoint_1_3_1000_1000_False            331836          333515              2
IterativeClosestPoint_1_20_100_100_False             134387          137842              4
IterativeClosestPoint_1_20_100_1000_False            149218          153405              4
IterativeClosestPoint_1_20_1000_100_False            414248          416595              2
IterativeClosestPoint_1_20_1000_1000_False           374318          374662              2
IterativeClosestPoint_10_3_100_100_False             539852          539852              1
IterativeClosestPoint_10_3_100_1000_False            752784          752784              1
IterativeClosestPoint_10_3_1000_100_False           1070700         1070700              1
IterativeClosestPoint_10_3_1000_1000_False          1164020         1164020              1
IterativeClosestPoint_10_20_100_100_False            374548          377337              2
IterativeClosestPoint_10_20_100_1000_False           472764          476685              2
IterativeClosestPoint_10_20_1000_100_False          1457175         1457175              1
IterativeClosestPoint_10_20_1000_1000_False         2195820         2195820              1
IterativeClosestPoint_1_3_100_100_True               110084          115824              5
IterativeClosestPoint_1_3_100_1000_True              142728          147696              4
IterativeClosestPoint_1_3_1000_100_True              212966          213966              3
IterativeClosestPoint_1_3_1000_1000_True             369130          375114              2
IterativeClosestPoint_10_3_100_100_True              354615          355179              2
IterativeClosestPoint_10_3_100_1000_True             451815          452704              2
IterativeClosestPoint_10_3_1000_100_True             511833          511833              1
IterativeClosestPoint_10_3_1000_1000_True            798453          798453              1
--------------------------------------------------------------------------------
```

Reviewed By: shapovalov, gkioxari

Differential Revision: D19909952

fbshipit-source-id: f77fadc88fb7c53999909d594114b182ee2a3def
2020-04-16 14:02:16 -07:00
Nikhila Ravi
b530b0af32 lint fixes
Summary: Resolved trailing whitespace warnings.

Reviewed By: gkioxari

Differential Revision: D21023982

fbshipit-source-id: 14ea2ca372c13cfa987acc260264ca99ce44c461
2020-04-15 21:58:59 -07:00
Nikhila Ravi
3794f6753f remove nearest_neighbors
Summary: knn is more general and faster than the nearest_neighbor code, so remove the latter.

Reviewed By: gkioxari

Differential Revision: D20816424

fbshipit-source-id: 75d6c44d17180752d0c9859814bbdf7892558158
2020-04-15 20:51:41 -07:00
Nikhila Ravi
790eb8c402 Chamfer for Pointclouds object
Summary:
Allow Pointclouds objects and heterogenous data to be provided for Chamfer loss. Remove "none" as an option for point_reduction because it doesn't make sense and in the current implementation is effectively the same as "sum".

Possible improvement: create specialised operations for sum and cosine_similarity of padded tensors, to avoid having to create masks. sum would be useful elsewhere.

Reviewed By: gkioxari

Differential Revision: D20816301

fbshipit-source-id: 0f32073210225d157c029d80de450eecdb64f4d2
2020-04-15 14:10:45 -07:00
Siddhant Ranade
677b0bd5ae SfMPerspectiveCameras projection matrix bug fix (#148)
Summary:
Fixed a bug in creating the projection matrix for the SfMPerspectiveCameras class. Also fixed the corresponding test in test_cameras.py.

The p0x, p0y are 2D coordinates for the principal point in the NDCS, and therefore should be added AFTER the perspective z divide. I.e. we expect

<a href="https://www.codecogs.com/eqnedit.php?latex=\begin{bmatrix}&space;x\&space;y\&space;z&space;\end{bmatrix}_{\text{NDCS}}&space;=&space;\begin{bmatrix}&space;f_xX/Z&space;&plus;&space;p_x\&space;f_yY/Z&space;&plus;&space;p_y\&space;1&space;/&space;Z\&space;\end{bmatrix}&space;=&space;\text{normalize}\left(&space;\begin{bmatrix}&space;f_xX&space;&plus;&space;p_xZ\&space;f_yY&space;&plus;&space;p_yZ\&space;1\&space;Z&space;\end{bmatrix}&space;\right)" target="_blank"><img src="https://latex.codecogs.com/gif.latex?\begin{bmatrix}&space;x\&space;y\&space;z&space;\end{bmatrix}_{\text{NDCS}}&space;=&space;\begin{bmatrix}&space;f_xX/Z&space;&plus;&space;p_x\&space;f_yY/Z&space;&plus;&space;p_y\&space;1&space;/&space;Z\&space;\end{bmatrix}&space;=&space;\text{normalize}\left(&space;\begin{bmatrix}&space;f_xX&space;&plus;&space;p_xZ\&space;f_yY&space;&plus;&space;p_yZ\&space;1\&space;Z&space;\end{bmatrix}&space;\right)" title="\begin{bmatrix} x\ y\ z \end{bmatrix}_{\text{NDCS}} = \begin{bmatrix} f_xX/Z + p_x\ f_yY/Z + p_y\ 1 / Z\ \end{bmatrix} = \text{normalize}\left( \begin{bmatrix} f_xX + p_xZ\ f_yY + p_yZ\ 1\ Z \end{bmatrix} \right)" /></a>

The current behavior is

<a href="https://www.codecogs.com/eqnedit.php?latex=\begin{bmatrix}&space;x\&space;y\&space;z&space;\end{bmatrix}_{\text{NDCS}}&space;=&space;\begin{bmatrix}&space;f_xX/Z&space;&plus;&space;p_x/Z\&space;f_yY/Z&space;&plus;&space;p_y/Z\&space;1&space;/&space;Z\&space;\end{bmatrix}&space;=&space;\text{normalize}\left(&space;\begin{bmatrix}&space;f_xX&space;&plus;&space;p_x\&space;f_yY&space;&plus;&space;p_y\&space;1\&space;Z&space;\end{bmatrix}&space;\right)" target="_blank"><img src="https://latex.codecogs.com/gif.latex?\begin{bmatrix}&space;x\&space;y\&space;z&space;\end{bmatrix}_{\text{NDCS}}&space;=&space;\begin{bmatrix}&space;f_xX/Z&space;&plus;&space;p_x/Z\&space;f_yY/Z&space;&plus;&space;p_y/Z\&space;1&space;/&space;Z\&space;\end{bmatrix}&space;=&space;\text{normalize}\left(&space;\begin{bmatrix}&space;f_xX&space;&plus;&space;p_x\&space;f_yY&space;&plus;&space;p_y\&space;1\&space;Z&space;\end{bmatrix}&space;\right)" title="\begin{bmatrix} x\ y\ z \end{bmatrix}_{\text{NDCS}} = \begin{bmatrix} f_xX/Z + p_x/Z\ f_yY/Z + p_y/Z\ 1 / Z\ \end{bmatrix} = \text{normalize}\left( \begin{bmatrix} f_xX + p_x\ f_yY + p_y\ 1\ Z \end{bmatrix} \right)" /></a>

which is incorrect.
Pull Request resolved: https://github.com/facebookresearch/pytorch3d/pull/148

Reviewed By: gkioxari

Differential Revision: D21039003

Pulled By: davnov134

fbshipit-source-id: 3e19ac22adbcc39b731ae14052a72fd4ddda2af5
2020-04-15 10:20:43 -07:00
Georgia Gkioxari
b2b0c5a442 knn autograd
Summary:
Adds knn backward to return `grad_pts1` and `grad_pts2`. Adds `knn_gather` to return the nearest neighbors in pts2.

The BM tests include backward pass and are ran on an M40.
```
Benchmark                               Avg Time(μs)      Peak Time(μs) Iterations
--------------------------------------------------------------------------------
KNN_SQUARE_32_256_128_3_24_cpu              39558           43485             13
KNN_SQUARE_32_256_128_3_24_cuda:0            1080            1404            463
KNN_SQUARE_32_256_512_3_24_cpu              81950           85781              7
KNN_SQUARE_32_256_512_3_24_cuda:0            1519            1641            330
--------------------------------------------------------------------------------

Benchmark                               Avg Time(μs)      Peak Time(μs) Iterations
--------------------------------------------------------------------------------
KNN_RAGGED_32_256_128_3_24_cpu              13798           14650             37
KNN_RAGGED_32_256_128_3_24_cuda:0            1576            1713            318
KNN_RAGGED_32_256_512_3_24_cpu              31255           32210             16
KNN_RAGGED_32_256_512_3_24_cuda:0            2024            2162            248
--------------------------------------------------------------------------------
```

Reviewed By: jcjohnson

Differential Revision: D20945556

fbshipit-source-id: a16f616029c6b5f8c2afceb5f2bc12c5c20d2f3c
2020-04-14 17:22:56 -07:00
Georgia Gkioxari
487d4d6607 point mesh distances
Summary:
Implementation of point to mesh distances. The current diff contains two types:
(a) Point to Edge
(b) Point to Face

```

Benchmark                                       Avg Time(μs)      Peak Time(μs) Iterations
--------------------------------------------------------------------------------
POINT_MESH_EDGE_4_100_300_5000_cuda:0                2745            3138            183
POINT_MESH_EDGE_4_100_300_10000_cuda:0               4408            4499            114
POINT_MESH_EDGE_4_100_3000_5000_cuda:0               4978            5070            101
POINT_MESH_EDGE_4_100_3000_10000_cuda:0              9076            9187             56
POINT_MESH_EDGE_4_1000_300_5000_cuda:0               1411            1487            355
POINT_MESH_EDGE_4_1000_300_10000_cuda:0              4829            5030            104
POINT_MESH_EDGE_4_1000_3000_5000_cuda:0              7539            7620             67
POINT_MESH_EDGE_4_1000_3000_10000_cuda:0            12088           12272             42
POINT_MESH_EDGE_8_100_300_5000_cuda:0                3106            3222            161
POINT_MESH_EDGE_8_100_300_10000_cuda:0               8561            8648             59
POINT_MESH_EDGE_8_100_3000_5000_cuda:0               6932            7021             73
POINT_MESH_EDGE_8_100_3000_10000_cuda:0             24032           24176             21
POINT_MESH_EDGE_8_1000_300_5000_cuda:0               5272            5399             95
POINT_MESH_EDGE_8_1000_300_10000_cuda:0             11348           11430             45
POINT_MESH_EDGE_8_1000_3000_5000_cuda:0             17478           17683             29
POINT_MESH_EDGE_8_1000_3000_10000_cuda:0            25961           26236             20
POINT_MESH_EDGE_16_100_300_5000_cuda:0               8244            8323             61
POINT_MESH_EDGE_16_100_300_10000_cuda:0             18018           18071             28
POINT_MESH_EDGE_16_100_3000_5000_cuda:0             19428           19544             26
POINT_MESH_EDGE_16_100_3000_10000_cuda:0            44967           45135             12
POINT_MESH_EDGE_16_1000_300_5000_cuda:0              7825            7937             64
POINT_MESH_EDGE_16_1000_300_10000_cuda:0            18504           18571             28
POINT_MESH_EDGE_16_1000_3000_5000_cuda:0            65805           66132              8
POINT_MESH_EDGE_16_1000_3000_10000_cuda:0           90885           91089              6
--------------------------------------------------------------------------------

Benchmark                                       Avg Time(μs)      Peak Time(μs) Iterations
--------------------------------------------------------------------------------
POINT_MESH_FACE_4_100_300_5000_cuda:0                1561            1685            321
POINT_MESH_FACE_4_100_300_10000_cuda:0               2818            2954            178
POINT_MESH_FACE_4_100_3000_5000_cuda:0              15893           16018             32
POINT_MESH_FACE_4_100_3000_10000_cuda:0             16350           16439             31
POINT_MESH_FACE_4_1000_300_5000_cuda:0               3179            3278            158
POINT_MESH_FACE_4_1000_300_10000_cuda:0              2353            2436            213
POINT_MESH_FACE_4_1000_3000_5000_cuda:0             16262           16336             31
POINT_MESH_FACE_4_1000_3000_10000_cuda:0             9334            9448             54
POINT_MESH_FACE_8_100_300_5000_cuda:0                4377            4493            115
POINT_MESH_FACE_8_100_300_10000_cuda:0               9728            9822             52
POINT_MESH_FACE_8_100_3000_5000_cuda:0              26428           26544             19
POINT_MESH_FACE_8_100_3000_10000_cuda:0             42238           43031             12
POINT_MESH_FACE_8_1000_300_5000_cuda:0               3891            3982            129
POINT_MESH_FACE_8_1000_300_10000_cuda:0              5363            5429             94
POINT_MESH_FACE_8_1000_3000_5000_cuda:0             20998           21084             24
POINT_MESH_FACE_8_1000_3000_10000_cuda:0            39711           39897             13
POINT_MESH_FACE_16_100_300_5000_cuda:0               5955            6001             84
POINT_MESH_FACE_16_100_300_10000_cuda:0             12082           12144             42
POINT_MESH_FACE_16_100_3000_5000_cuda:0             44996           45176             12
POINT_MESH_FACE_16_100_3000_10000_cuda:0            73042           73197              7
POINT_MESH_FACE_16_1000_300_5000_cuda:0              8292            8374             61
POINT_MESH_FACE_16_1000_300_10000_cuda:0            19442           19506             26
POINT_MESH_FACE_16_1000_3000_5000_cuda:0            36059           36194             14
POINT_MESH_FACE_16_1000_3000_10000_cuda:0           64644           64822              8
--------------------------------------------------------------------------------
```

Reviewed By: jcjohnson

Differential Revision: D20590462

fbshipit-source-id: 42a39837b514a546ac9471bfaff60eefe7fae829
2020-04-11 00:21:24 -07:00
Jeremy Reizenstein
01b5f7b228 heterogenous KNN
Summary: Interface and working implementation of ragged KNN. Benchmarks (which aren't ragged) haven't slowed. New benchmark shows that ragged is faster than non-ragged of the same shape.

Reviewed By: jcjohnson

Differential Revision: D20696507

fbshipit-source-id: 21b80f71343a3475c8d3ee0ce2680f92f0fae4de
2020-04-07 01:47:37 -07:00
Jeremy Reizenstein
29b9c44c0a Allow conda's generated files.
Summary: The conda build process generates some files of its own, which we don't want to catch in our test for copyright notices.

Reviewed By: nikhilaravi, patricklabatut

Differential Revision: D20868566

fbshipit-source-id: 76a786a3eb9a674d59e630cc06f346e8b82258a4
2020-04-06 10:03:57 -07:00
Jeremy Reizenstein
b87058c62a fix recent lint
Summary: lint clean again

Reviewed By: patricklabatut

Differential Revision: D20868775

fbshipit-source-id: ade4301c1012c5c6943186432465215701d635a9
2020-04-06 06:41:00 -07:00
David Novotny
90dc7a0856 Initialization of Transform3D with a custom matrix.
Summary:
Allows to initialize a Transform3D object with a batch of user-defined transformation matrices:
```
t = Transform3D(matrix=torch.randn(2, 4, 4))
```

Reviewed By: nikhilaravi

Differential Revision: D20693475

fbshipit-source-id: dccc49b2ca4c19a034844c63463953ba8f52c1bc
2020-04-05 14:44:27 -07:00
Roman Shapovalov
e37085d999 Weighted Umeyama.
Summary:
1. Introduced weights to Umeyama implementation. This will be needed for weighted ePnP but is useful on its own.
2. Refactored to use the same code for the Pointclouds mask and passed weights.
3. Added test cases with random weights.
4. Fixed a bug in tests that calls the function with 0 points (fails randomly in Pytorch 1.3, will be fixed in the next release: https://github.com/pytorch/pytorch/issues/31421 ).

Reviewed By: gkioxari

Differential Revision: D20070293

fbshipit-source-id: e9f549507ef6dcaa0688a0f17342e6d7a9a4336c
2020-04-03 02:59:11 -07:00
David Novotny
e5b1d6d3a3 Umeyama
Summary:
Umeyama estimates a rigid motion between two sets of corresponding points.

Benchmark output for `bm_points_alignment`

```
Arguments key: [<allow_reflection>_<batch_size>_<dim>_<estimate_scale>_<n_points>_<use_pointclouds>]
Benchmark                                                        Avg Time(μs)      Peak Time(μs) Iterations
--------------------------------------------------------------------------------
CorrespodingPointsAlignment_True_1_3_True_100_False                   7382            9833             68
CorrespodingPointsAlignment_True_1_3_True_10000_False                 8183           10500             62
CorrespodingPointsAlignment_True_1_3_False_100_False                  7301            9263             69
CorrespodingPointsAlignment_True_1_3_False_10000_False                7945            9746             64
CorrespodingPointsAlignment_True_1_20_True_100_False                 13706           41623             37
CorrespodingPointsAlignment_True_1_20_True_10000_False               11044           33766             46
CorrespodingPointsAlignment_True_1_20_False_100_False                 9908           28791             51
CorrespodingPointsAlignment_True_1_20_False_10000_False               9523           18680             53
CorrespodingPointsAlignment_True_10_3_True_100_False                 29585           32026             17
CorrespodingPointsAlignment_True_10_3_True_10000_False               29626           36324             18
CorrespodingPointsAlignment_True_10_3_False_100_False                26013           29253             20
CorrespodingPointsAlignment_True_10_3_False_10000_False              25000           33820             20
CorrespodingPointsAlignment_True_10_20_True_100_False                40955           41592             13
CorrespodingPointsAlignment_True_10_20_True_10000_False              42087           42393             12
CorrespodingPointsAlignment_True_10_20_False_100_False               39863           40381             13
CorrespodingPointsAlignment_True_10_20_False_10000_False             40813           41699             13
CorrespodingPointsAlignment_True_100_3_True_100_False               183146          194745              3
CorrespodingPointsAlignment_True_100_3_True_10000_False             213789          231466              3
CorrespodingPointsAlignment_True_100_3_False_100_False              177805          180796              3
CorrespodingPointsAlignment_True_100_3_False_10000_False            184963          185695              3
CorrespodingPointsAlignment_True_100_20_True_100_False              347181          347325              2
CorrespodingPointsAlignment_True_100_20_True_10000_False            363259          363613              2
CorrespodingPointsAlignment_True_100_20_False_100_False             351769          352496              2
CorrespodingPointsAlignment_True_100_20_False_10000_False           375629          379818              2
CorrespodingPointsAlignment_False_1_3_True_100_False                 11155           13770             45
CorrespodingPointsAlignment_False_1_3_True_10000_False               10743           13938             47
CorrespodingPointsAlignment_False_1_3_False_100_False                 9578           11511             53
CorrespodingPointsAlignment_False_1_3_False_10000_False               9549           11984             53
CorrespodingPointsAlignment_False_1_20_True_100_False                13809           14183             37
CorrespodingPointsAlignment_False_1_20_True_10000_False              14084           15082             36
CorrespodingPointsAlignment_False_1_20_False_100_False               12765           14177             40
CorrespodingPointsAlignment_False_1_20_False_10000_False             12811           13096             40
CorrespodingPointsAlignment_False_10_3_True_100_False                28823           39384             18
CorrespodingPointsAlignment_False_10_3_True_10000_False              27135           27525             19
CorrespodingPointsAlignment_False_10_3_False_100_False               26236           28980             20
CorrespodingPointsAlignment_False_10_3_False_10000_False             42324           45123             12
CorrespodingPointsAlignment_False_10_20_True_100_False              723902          723902              1
CorrespodingPointsAlignment_False_10_20_True_10000_False            220007          252886              3
CorrespodingPointsAlignment_False_10_20_False_100_False              55593           71636              9
CorrespodingPointsAlignment_False_10_20_False_10000_False            44419           71861             12
CorrespodingPointsAlignment_False_100_3_True_100_False              184768          185199              3
CorrespodingPointsAlignment_False_100_3_True_10000_False            198657          213868              3
CorrespodingPointsAlignment_False_100_3_False_100_False             224598          309645              3
CorrespodingPointsAlignment_False_100_3_False_10000_False           197863          202002              3
CorrespodingPointsAlignment_False_100_20_True_100_False             293484          309459              2
CorrespodingPointsAlignment_False_100_20_True_10000_False           327253          366644              2
CorrespodingPointsAlignment_False_100_20_False_100_False            420793          422194              2
CorrespodingPointsAlignment_False_100_20_False_10000_False          462634          485542              2
CorrespodingPointsAlignment_True_1_3_True_100_True                    7664            9909             66
CorrespodingPointsAlignment_True_1_3_True_10000_True                  7190            8366             70
CorrespodingPointsAlignment_True_1_3_False_100_True                   6549            8316             77
CorrespodingPointsAlignment_True_1_3_False_10000_True                 6534            7710             77
CorrespodingPointsAlignment_True_10_3_True_100_True                  29052           32940             18
CorrespodingPointsAlignment_True_10_3_True_10000_True                30526           33453             17
CorrespodingPointsAlignment_True_10_3_False_100_True                 28708           32993             18
CorrespodingPointsAlignment_True_10_3_False_10000_True               30630           35973             17
CorrespodingPointsAlignment_True_100_3_True_100_True                264909          320820              3
CorrespodingPointsAlignment_True_100_3_True_10000_True              310902          322604              2
CorrespodingPointsAlignment_True_100_3_False_100_True               246832          250634              3
CorrespodingPointsAlignment_True_100_3_False_10000_True             276006          289061              2
CorrespodingPointsAlignment_False_1_3_True_100_True                  11421           13757             44
CorrespodingPointsAlignment_False_1_3_True_10000_True                11199           12532             45
CorrespodingPointsAlignment_False_1_3_False_100_True                 11474           15841             44
CorrespodingPointsAlignment_False_1_3_False_10000_True               10384           13188             49
CorrespodingPointsAlignment_False_10_3_True_100_True                 36599           47340             14
CorrespodingPointsAlignment_False_10_3_True_10000_True               40702           50754             13
CorrespodingPointsAlignment_False_10_3_False_100_True                41277           52149             13
CorrespodingPointsAlignment_False_10_3_False_10000_True              34286           37091             15
CorrespodingPointsAlignment_False_100_3_True_100_True               254991          258578              2
CorrespodingPointsAlignment_False_100_3_True_10000_True             257999          261285              2
CorrespodingPointsAlignment_False_100_3_False_100_True              247511          248693              3
CorrespodingPointsAlignment_False_100_3_False_10000_True            251807          263865              3
```

Reviewed By: gkioxari

Differential Revision: D19808389

fbshipit-source-id: 83305a58627d2fc5dcaf3c3015132d8148f28c29
2020-04-02 14:46:51 -07:00
Patrick Labatut
83feed56a0 Fix saving / loading empty PLY meshes
Summary:
Similar to D20392526, PLY files without vertices or faces should be allowed:
- a PLY with only vertices can represent a point cloud
- a PLY without any vertex or face is just empty
- a PLY with faces referencing inexistent vertices has invalid data

Reviewed By: gkioxari

Differential Revision: D20400330

fbshipit-source-id: 35a5f072603fd221f382c7faad5f37c3e0b49bb1
2020-04-01 04:51:20 -07:00
Jeremy Reizenstein
b64fe51360 join_meshes_as_batch
Summary: rename join_meshes to join_meshes_as_batch.

Reviewed By: nikhilaravi

Differential Revision: D20671293

fbshipit-source-id: e84d6a67d6c1ec28fb5e52d4607db8e92561a4cd
2020-03-30 11:27:41 -07:00
Jeremy Reizenstein
27eb791e2f fix recent lint
Summary: Flowing of compositing comments

Reviewed By: nikhilaravi

Differential Revision: D20556707

fbshipit-source-id: 4abdc85e4f65abd41c4a890b6895bc5e95b4576b
2020-03-30 06:17:27 -07:00
Patrick Labatut
d57daa6f85 Address black + isort fbsource linter warnings
Summary: Address black + isort fbsource linter warnings from D20558374 (previous diff)

Reviewed By: nikhilaravi

Differential Revision: D20558373

fbshipit-source-id: d3607de4a01fb24c0d5269634563a7914bddf1c8
2020-03-29 14:51:02 -07:00
Jeremy Reizenstein
37c5c8e0b6 Linter, deprecated type()
Summary: Run linter after recent changes. Fix long comment in knn.h which clang-format has reflowed badly. Add crude test that code doesn't call deprecated `.type()` or `.data()`.

Reviewed By: nikhilaravi

Differential Revision: D20692935

fbshipit-source-id: 28ce0308adae79a870cb41a810b7cf8744f41ab8
2020-03-29 14:02:58 -07:00
Patrick Labatut
3061c5b663 Fix saving / loading empty OBJ files
Summary:
OBJ files without vertices or faces should be allowed:
- an OBJ with only vertices can represent a point cloud
- an OBJ without any vertex or face is just empty
- an OBJ with faces referencing inexistent vertices has invalid data

Reviewed By: gkioxari

Differential Revision: D20392526

fbshipit-source-id: e72c846ff1e5787fb11d527af3fefa261f9eb0ee
2020-03-28 08:14:00 -07:00
Justin Johnson
870290df34 Implement K-Nearest Neighbors
Summary:
Implements K-Nearest Neighbors with C++ and CUDA versions.

KNN in CUDA is highly nontrivial. I've implemented a few different versions of the kernel, and we heuristically dispatch to different kernels based on the problem size. Some of the kernels rely on template specialization on either D or K, so we use template metaprogramming to compile specialized versions for ranges of D and K.

These kernels are up to 3x faster than our existing 1-nearest-neighbor kernels, so we should also consider swapping out `nn_points_idx` to use these kernels in the backend.

I've been working mostly on the CUDA kernels, and haven't converged on the correct Python API.

I still want to benchmark against FAISS to see how far away we are from their performance.

Reviewed By: bottler

Differential Revision: D19729286

fbshipit-source-id: 608ffbb7030c21fe4008f330522f4890f0c3c21a
2020-03-26 13:40:26 -07:00