1. 22 Jul, 2022 1 commit
    • Krzysztof Chalupka's avatar
      Add MeshRasterizerOpenGL · cb495504
      Krzysztof Chalupka authored
      Summary:
      Adding MeshRasterizerOpenGL, a faster alternative to MeshRasterizer. The new rasterizer follows the ideas from "Differentiable Surface Rendering via non-Differentiable Sampling".
      
      The new rasterizer 20x faster on a 2M face mesh (try pose optimization on Nefertiti from https://www.cs.cmu.edu/~kmcrane/Projects/ModelRepository/!). The larger the mesh, the larger the speedup.
      
      There are two main disadvantages:
      * The new rasterizer works with an OpenGL backend, so requires pycuda.gl and pyopengl installed (though we avoided writing any C++ code, everything is in Python!)
      * The new rasterizer is non-differentiable. However, you can still differentiate the rendering function if you use if with the new SplatterPhongShader which we recently added to PyTorch3D (see the original paper cited above).
      
      Reviewed By: patricklabatut, jcjohnson
      
      Differential Revision: D37698816
      
      fbshipit-source-id: 54d120639d3cb001f096237807e54aced0acda25
      cb495504
  2. 12 Jul, 2022 1 commit
    • Tristan Rice's avatar
      renderer: add support for rendering high dimensional textures for... · 8d10ba52
      Tristan Rice authored
      renderer: add support for rendering high dimensional textures for classification/segmentation use cases (#1248)
      
      Summary:
      For 3D segmentation problems it's really useful to be able to train the models from multiple viewpoints using Pytorch3D as the renderer. Currently due to hardcoded assumptions in a few spots the mesh renderer only supports rendering RGB (3 dimensional) data. You can encode the classification information as 3 channel data but if you have more than 3 classes you're out of luck.
      
      This relaxes the assumptions to make rendering semantic classes work with `HardFlatShader` and `AmbientLights` with no diffusion/specular. The other shaders/lights don't make any sense for classification since they mutate the texture values in some way.
      
      This only requires changes in `Materials` and `AmbientLights`. The bulk of the code is the unit test.
      
      Pull Request resolved: https://github.com/facebookresearch/pytorch3d/pull/1248
      
      Test Plan: Added unit test that renders a 5 dimensional texture and compare dimensions 2-5 to a stored picture.
      
      Reviewed By: bottler
      
      Differential Revision: D37764610
      
      Pulled By: d4l3k
      
      fbshipit-source-id: 031895724d9318a6f6bab5b31055bb3f438176a5
      8d10ba52
  3. 10 Feb, 2022 1 commit
  4. 08 Oct, 2021 1 commit
    • Nikhila Ravi's avatar
      IOU box3d epsilon fix · 6dfa3269
      Nikhila Ravi authored
      Summary: The epsilon value is important for determining whether vertices are inside/outside a plane.
      
      Reviewed By: gkioxari
      
      Differential Revision: D31485247
      
      fbshipit-source-id: 5517575de7c02f1afa277d00e0190a81f44f5761
      6dfa3269
  5. 30 Sep, 2021 1 commit
    • Nikhila Ravi's avatar
      (new) CUDA IoU for 3D boxes · ff8d4762
      Nikhila Ravi authored
      Summary: CUDA implementation of 3D bounding box overlap calculation.
      
      Reviewed By: gkioxari
      
      Differential Revision: D31157919
      
      fbshipit-source-id: 5dc89805d01fef2d6779f00a33226131e39c43ed
      ff8d4762
  6. 13 Sep, 2021 1 commit
    • Jeremy Reizenstein's avatar
      join_scene fix for TexturesUV · a0d76a70
      Jeremy Reizenstein authored
      Summary: Fix issue #826. This is a correction to the joining of TexturesUV into a single scene.
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D30767092
      
      fbshipit-source-id: 03ba6a1d2f22e569d1b3641cd13ddbb8dcb87ec7
      a0d76a70
  7. 01 Sep, 2021 1 commit
    • Nikhila Ravi's avatar
      (bug) Fix exception when creating a TextureAtlas · fc156b50
      Nikhila Ravi authored
      Summary: Fixes GitHub issue #751. The vectorized implementation of bilinear interpolation didn't properly handle the edge cases in the same way as the `grid_sample` method in PyTorch.
      
      Reviewed By: bottler
      
      Differential Revision: D30684208
      
      fbshipit-source-id: edf241ecbd72d46b94ad340a4e601e26c83db88e
      fc156b50
  8. 10 Jul, 2021 1 commit
  9. 21 Jun, 2021 1 commit
    • David Novotny's avatar
      Conversion from OpenCV cameras · 8006842f
      David Novotny authored
      Summary: Implements a conversion function between OpenCV and PyTorch3D cameras.
      
      Reviewed By: patricklabatut
      
      Differential Revision: D28992470
      
      fbshipit-source-id: dbcc9f213ec293c2f6938261c704aea09aad3c90
      8006842f
  10. 11 Jun, 2021 1 commit
    • Nikhila Ravi's avatar
      Culling to frustrum bug fix · a0f79318
      Nikhila Ravi authored
      Summary:
      When `z_clip_value = None` and faces are outside the view frustum the shape of one of the tensors in `clip.py` is incorrect.
      
      `faces_num_clipped_verts` should be (F,) but it was (F,3).  Added a new test to ensure this case is handled.
      
      Reviewed By: bottler
      
      Differential Revision: D29051282
      
      fbshipit-source-id: 5f4172ba4d4a75d928404dde9abf48aef18c68bd
      a0f79318
  11. 26 May, 2021 1 commit
    • Jeremy Reizenstein's avatar
      Experimental glTF reading · ed6983ea
      Jeremy Reizenstein authored
      Summary: Experimental data loader for taking the default scene from a GLB file and converting it to a single mesh in PyTorch3D.
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D25900167
      
      fbshipit-source-id: bff22ac00298b83a0bd071ae5c8923561e1d81d7
      ed6983ea
  12. 08 Feb, 2021 1 commit
    • Nikhila Ravi's avatar
      CUDA/C++ Rasterizer updates to handle clipped faces · 340662e9
      Nikhila Ravi authored
      Summary:
      - Updated the C++/CUDA mesh rasterization kernels to handle the clipped faces. In particular this required careful handling of the distance calculation for faces which are cut into a quadrilateral by the image plane and then split into two sub triangles i.e. both sub triangles can't be part of the top K faces.
      - Updated `rasterize_meshes.py` to use the utils functions to clip the meshes and convert the fragments back to in terms of the unclipped mesh
      - Added end to end tests
      
      Reviewed By: jcjohnson
      
      Differential Revision: D26169685
      
      fbshipit-source-id: d64cd0d656109b965f44a35c301b7c81f451cfa0
      340662e9
  13. 18 Dec, 2020 1 commit
    • Nikhila Ravi's avatar
      Classic Marching Cubes algorithm implementation · ebac66da
      Nikhila Ravi authored
      Summary:
      Defines a function to run marching cubes algorithm on a single or batch of 3D scalar fields. Returns a mesh's faces and vertices.
      
      UPDATES (12/18)
      - Input data is now specified as a (B, D, H, W) tensor as opposed to a (B, W, H, D) tensor. This will now be compatible with the Volumes datastructure.
      - Add an option to return output vertices in local coordinates instead of world coordinates.
      Also added a small fix to remove the dype for device in Transforms3D - if passing in a torch.device instead of str it causes a pyre error.
      
      Reviewed By: jcjohnson
      
      Differential Revision: D24599019
      
      fbshipit-source-id: 90554a200319fed8736a12371cc349e7108aacd0
      ebac66da
  14. 15 Dec, 2020 1 commit
    • Nikhila Ravi's avatar
      Non Square image rasterization for pointclouds · 3d769a66
      Nikhila Ravi authored
      Summary:
      Similar to non square image rasterization for meshes, apply the same updates to the pointcloud rasterizer.
      
      Main API Change:
      - PointRasterizationSettings now accepts a tuple/list of (H, W) for the image size.
      
      Reviewed By: jcjohnson
      
      Differential Revision: D25465206
      
      fbshipit-source-id: 7370d83c431af1b972158cecae19d82364623380
      3d769a66
  15. 09 Dec, 2020 1 commit
    • Nikhila Ravi's avatar
      Non square image rasterization for meshes · d07307a4
      Nikhila Ravi authored
      Summary:
      There are a couple of options for supporting non square images:
      1) NDC stays at [-1, 1] in both directions with the distance calculations all modified by (W/H). There are a lot of distance based calculations (e.g. triangle areas for barycentric coordinates etc) so this requires changes in many places.
      2) NDC is scaled by (W/H) so the smallest side has [-1, 1]. In this case none of the distance calculations need to be updated and only the pixel to NDC calculation needs to be modified.
      
      I decided to go with option 2 after trying option 1!
      
      API Changes:
      - Image size can now be specified optionally as a tuple
      
      TODO:
      - add a benchmark test for the non square case.
      
      Reviewed By: jcjohnson
      
      Differential Revision: D24404975
      
      fbshipit-source-id: 545efb67c822d748ec35999b35762bce58db2cf4
      d07307a4
  16. 18 Nov, 2020 1 commit
    • Georgia Gkioxari's avatar
      move icp_data.pth to tests/data · 5fb63b45
      Georgia Gkioxari authored
      Summary: Move icp_data.pth to tests/data
      
      Reviewed By: bottler
      
      Differential Revision: D25012575
      
      fbshipit-source-id: 9252d2eeca9141c82ad3bf9d3e3331a2eab5203b
      5fb63b45
  17. 03 Nov, 2020 1 commit
    • Christoph Lassner's avatar
      pulsar interface unification. · 960fd6d8
      Christoph Lassner authored
      Summary:
      This diff builds on top of the `pulsar integration` diff to provide a unified interface for the existing PyTorch3D point renderer and Pulsar. For more information about the pulsar backend, see the release notes and the paper (https://arxiv.org/abs/2004.07484). For information on how to use the backend, see the point cloud rendering notebook and the examples in the folder docs/examples.
      
      The unified interfaces are completely consistent. Switching the render backend is as easy as using `renderer = PulsarPointsRenderer(rasterizer=rasterizer).to(device)` instead of `renderer = PointsRenderer(rasterizer=rasterizer, compositor=compositor)` and adding the `gamma` parameter to the forward function. All PyTorch3D camera types are supported as far as possible; keyword arguments are properly forwarded to the camera. The `PerspectiveCamera` and `OrthographicCamera` require znear and zfar as additional parameters for the forward pass.
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D21421443
      
      fbshipit-source-id: 4aa0a83a419592d9a0bb5d62486a1cdea9d73ce6
      960fd6d8
  18. 29 Oct, 2020 1 commit
    • Jeremy Reizenstein's avatar
      remove texture_vis test · 0e5f4f76
      Jeremy Reizenstein authored
      Summary: This recently added test is sensitive to the version of PIL because of different algorithms to draw ellipses/circles. Remove it as there is no obvious safe way to test this. Replace with a test for the underlying centres_for_image().
      
      Reviewed By: theschnitz
      
      Differential Revision: D24622465
      
      fbshipit-source-id: e46d7384df491c71ac87ba8bbbce89507ac40080
      0e5f4f76
  19. 27 Oct, 2020 1 commit
    • Jeremy Reizenstein's avatar
      images for debugging TexturesUV · aa4cc0ad
      Jeremy Reizenstein authored
      Summary: New methods to directly plot a TexturesUV map with its used points, using PIL and matplotlib.
      
      Reviewed By: gkioxari
      
      Differential Revision: D23782968
      
      fbshipit-source-id: 692970857b5be13a35a3175dc82ac03963a73555
      aa4cc0ad
  20. 07 Oct, 2020 1 commit
    • Nikhila Ravi's avatar
      Fix texture atlas for objs which only have material properties · f5383a7e
      Nikhila Ravi authored
      Summary:
      Fix for GitHub issue #381.
      
      The example mesh provided in the issue only had material properties but no texture image. The current implementation of texture atlassing generated an atlas using both the material properties and the texture image but only worked if there was a texture image and associated vertex uv coordinates. I have now modified the texture atlas creation so that it doesn't require an image and can work with materials which only have material properties.
      
      Reviewed By: gkioxari
      
      Differential Revision: D24153068
      
      fbshipit-source-id: 63e9d325db09a84b336b83369d5342ce588a9932
      f5383a7e
  21. 09 Sep, 2020 1 commit
    • Steve Branson's avatar
      Fix softmax_rgb_blend() when mesh is outside zfar · f8ea5906
      Steve Branson authored
      Summary:
      This fixes two small issues with blending.py:softmax_rgb_blend():
        1) zfar and znear attributes are propagated from the camera settings instead of just using default settings of znear=1.0 and zfar=100.0
        2) A check is added to prevent arithmetic overflow in softmax_rgb_blend()
      
      This is a fix in response to https://github.com/facebookresearch/pytorch3d/issues/334
      where meshes rendererd using a SoftPhongShader with faces_per_pixel=1 appear black.  This only occurs when the scale of the mesh is large (vertex values > 100, where 100 is the default value of zfar).  This fix allows the caller to increase the value of cameras.zfar to match the scale of her/his mesh.
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D23517541
      
      fbshipit-source-id: ab8631ce9e5f2149f140b67b13eff857771b8807
      f8ea5906
  22. 25 Aug, 2020 2 commits
    • Jeremy Reizenstein's avatar
      amalgamate meshes with texture into a single scene · 909dc835
      Jeremy Reizenstein authored
      Summary:
      Add a join_scene method to all the textures to allow the join_mesh function to include textures. Rename the join_mesh function to join_meshes_as_scene.
      
      For TexturesAtlas, we now interpolate if the user attempts to have the resolution vary across the batch. This doesn't look great if the resolution is already very low.
      
      For TexturesUV, a rectangle packing function is required, this does something simple.
      
      Reviewed By: gkioxari
      
      Differential Revision: D23188773
      
      fbshipit-source-id: c013db061a04076e13e90ccc168a7913e933a9c5
      909dc835
    • Jeremy Reizenstein's avatar
      align_corners and padding for TexturesUV · e25ccab3
      Jeremy Reizenstein authored
      Summary:
      Allow, and make default, align_corners=True for texture maps. Allow changing the padding_mode and set the default to be "border" which produces more logical results. Some new documentation.
      
      The previous behavior corresponds to padding_mode="zeros" and align_corners=False.
      
      Reviewed By: gkioxari
      
      Differential Revision: D23268775
      
      fbshipit-source-id: 58d6229baa591baa69705bcf97471c80ba3651de
      e25ccab3
  23. 21 Aug, 2020 1 commit
    • Georgia Gkioxari's avatar
      camera refactoring · 57a22e73
      Georgia Gkioxari authored
      Summary:
      Refactor cameras
      * CamerasBase was enhanced with `transform_points_screen` that transforms projected points from NDC to screen space
      * OpenGLPerspective, OpenGLOrthographic -> FoVPerspective, FoVOrthographic
      * SfMPerspective, SfMOrthographic -> Perspective, Orthographic
      * PerspectiveCamera can optionally be constructred with screen space parameters
      * Note on Cameras and coordinate systems was added
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D23168525
      
      fbshipit-source-id: dd138e2b2cc7e0e0d9f34c45b8251c01266a2063
      57a22e73
  24. 07 Aug, 2020 2 commits
    • Luya Gao's avatar
      Return R2N2 voxel coordinates · 63ba74f1
      Luya Gao authored
      Summary: Return R2N2's voxel coordinates.
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D22462530
      
      fbshipit-source-id: a995cfa0957b2561eb3b0f4591cb1db42170bc68
      63ba74f1
    • Luya Gao's avatar
      Return R2N2 R,T,K · 326e4ccb
      Luya Gao authored
      Summary: Return rotation, translation and intrinsic matrices necessary to reproduce R2N2's own renderings.
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D22462520
      
      fbshipit-source-id: 46a3859743ebc43c7a24f75827d2be3adf3f486b
      326e4ccb
  25. 29 Jul, 2020 1 commit
    • Nikhila Ravi's avatar
      Texturing API updates · a3932960
      Nikhila Ravi authored
      Summary:
      A fairly big refactor of the texturing API with some breaking changes to how textures are defined.
      
      Main changes:
      - There are now 3 types of texture classes: `TexturesUV`, `TexturesAtlas` and `TexturesVertex`. Each class:
         - has a `sample_textures` function which accepts the `fragments` from rasterization and returns `texels`. This means that the shaders will not need to know the type of the mesh texture which will resolve several issues people were reporting on GitHub.
        -  has a `join_batch` method for joining multiple textures of the same type into a batch
      
      Reviewed By: gkioxari
      
      Differential Revision: D21067427
      
      fbshipit-source-id: 4b346500a60181e72fdd1b0dd89b5505c7a33926
      a3932960
  26. 16 Jul, 2020 1 commit
    • Nikhila Ravi's avatar
      barycentric clipping in cuda/c++ · cc70950f
      Nikhila Ravi authored
      Summary:
      Added support for barycentric clipping in the C++/CUDA rasterization kernels which can be switched on/off via a rasterization setting.
      
      Added tests and a benchmark to compare with the current implementation in PyTorch - for some cases of large image size/faces per pixel the cuda version is 10x faster.
      
      Reviewed By: gkioxari
      
      Differential Revision: D21705503
      
      fbshipit-source-id: e835c0f927f1e5088ca89020aef5ff27ac3a8769
      cc70950f
  27. 14 Jul, 2020 3 commits
    • Luya Gao's avatar
      Test rendering models for R2N2 · 5636eb61
      Luya Gao authored
      Summary: Adding a render function for R2N2.
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D22230228
      
      fbshipit-source-id: a9f588ddcba15bb5d8be1401f68d730e810b4251
      5636eb61
    • Luya Gao's avatar
      Render objects in a batch by the specified model_ids, categories or idxs for ShapeNetBase · 22f2963c
      Luya Gao authored
      Summary: Additional functionality for renderer in ShapeNetCore: users can select which objects to render by specifying their model_ids, or users could choose to render several random objects in some categories, or users could specify indices of the objects in the loaded dataset. (currently doesn't support changing lighting, still investigating why lighting is causing instability in renderings)
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D22179594
      
      fbshipit-source-id: 74c49094ffa3ea2eb71de9451f9e5da5053d356d
      22f2963c
    • Luya Gao's avatar
      Adding renderer for ShapeNetBase · 358e211c
      Luya Gao authored
      Summary: Adding a renderer to ShapeNetCore (Note that the lights are currently turned off for the test; will investigate why lighting causes instability in rendering)
      
      Reviewed By: nikhilaravi
      
      Differential Revision: D22102673
      
      fbshipit-source-id: a704756a1e93b61d5a879f0e5ee14ebcb0df49d7
      358e211c
  28. 09 Jun, 2020 1 commit
    • Luya Gao's avatar
      Adding join_mesh in pytorch3d.structures.meshes · e053d7c4
      Luya Gao authored
      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
      e053d7c4
  29. 20 Apr, 2020 1 commit
    • Nikhila Ravi's avatar
      coarse rasterization bug fix · 9ef1ee84
      Nikhila Ravi authored
      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
      9ef1ee84
  30. 17 Mar, 2020 1 commit
  31. 06 Mar, 2020 1 commit
    • Nikhila Ravi's avatar
      Fix coordinate system conventions in renderer · 15c72be4
      Nikhila Ravi authored
      Summary:
      ## Updates
      
      - Defined the world and camera coordinates according to this figure. The world coordinates are defined as having +Y up, +X left and +Z in.
      
      {F230888499}
      
      - Removed all flipping from blending functions.
      - Updated the rasterizer to return images with +Y up and +X left.
      - Updated all the mesh rasterizer tests
          - The expected values are now defined in terms of the default +Y up, +X left
          - Added tests where the triangles in the meshes are non symmetrical so that it is clear which direction +X and +Y are
      
      ## Questions:
      - Should we have **scene settings** instead of raster settings?
          - To be more correct we should be [z clipping in the rasterizer based on the far/near clipping planes](https://github.com/ShichenLiu/SoftRas/blob/master/soft_renderer/cuda/soft_rasterize_cuda_kernel.cu#L400) - these values are also required in the blending functions so should we make these scene level parameters and have a scene settings tuple which is available to the rasterizer and shader?
      
      Reviewed By: gkioxari
      
      Differential Revision: D20208604
      
      fbshipit-source-id: 55787301b1bffa0afa9618f0a0886cc681da51f3
      15c72be4
  32. 29 Feb, 2020 1 commit
    • Nikhila Ravi's avatar
      Barycentric clipping in the renderer and flat shading · ff19c642
      Nikhila Ravi authored
      Summary:
      Updates to the Renderer to enable barycentric clipping. This is important when there is blurring in the rasterization step.
      
      Also added support for flat shading.
      
      Reviewed By: jcjohnson
      
      Differential Revision: D19934259
      
      fbshipit-source-id: 036e48636cd80d28a04405d7a29fcc71a2982904
      ff19c642
  33. 20 Feb, 2020 1 commit
  34. 23 Jan, 2020 1 commit