From e13e63a811438c250c1760cbcbcbe6c034a8570d Mon Sep 17 00:00:00 2001 From: Shubham Goel Date: Wed, 10 Feb 2021 21:21:54 -0800 Subject: [PATCH] bugfix in cotcurv laplacian loss. closes #551 (#553) Summary: Pull Request resolved: https://github.com/facebookresearch/pytorch3d/pull/553 Reviewed By: theschnitz Differential Revision: D26257591 Pulled By: gkioxari fbshipit-source-id: 899a3f733a77361e8572b0900a34b55764ff08f2 --- pytorch3d/loss/mesh_laplacian_smoothing.py | 3 ++- tests/test_mesh_laplacian_smoothing.py | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pytorch3d/loss/mesh_laplacian_smoothing.py b/pytorch3d/loss/mesh_laplacian_smoothing.py index bdffcd1f..575a7c3e 100644 --- a/pytorch3d/loss/mesh_laplacian_smoothing.py +++ b/pytorch3d/loss/mesh_laplacian_smoothing.py @@ -108,6 +108,7 @@ def mesh_laplacian_smoothing(meshes, method: str = "uniform"): idx = norm_w > 0 norm_w[idx] = 1.0 / norm_w[idx] else: + L_sum = torch.sparse.sum(L, dim=1).to_dense().view(-1, 1) norm_w = 0.25 * inv_areas else: raise ValueError("Method should be one of {uniform, cot, cotcurv}") @@ -117,7 +118,7 @@ def mesh_laplacian_smoothing(meshes, method: str = "uniform"): elif method == "cot": loss = L.mm(verts_packed) * norm_w - verts_packed elif method == "cotcurv": - loss = (L.mm(verts_packed) - verts_packed) * norm_w + loss = (L.mm(verts_packed) - L_sum * verts_packed) * norm_w loss = loss.norm(dim=1) loss = loss * weights diff --git a/tests/test_mesh_laplacian_smoothing.py b/tests/test_mesh_laplacian_smoothing.py index 1e9139c6..14bc2639 100644 --- a/tests/test_mesh_laplacian_smoothing.py +++ b/tests/test_mesh_laplacian_smoothing.py @@ -89,11 +89,12 @@ class TestLaplacianSmoothing(unittest.TestCase): inv_areas[idx] = 1.0 / inv_areas[idx] norm_w = L.sum(dim=1, keepdims=True) + L_sum = norm_w.clone() idx = norm_w > 0 norm_w[idx] = 1.0 / norm_w[idx] if method == "cotcurv": - loss = (L.mm(verts_packed) - verts_packed) * inv_areas * 0.25 + loss = (L.mm(verts_packed) - L_sum * verts_packed) * inv_areas * 0.25 loss = loss.norm(dim=1) else: loss = L.mm(verts_packed) * norm_w - verts_packed @@ -147,7 +148,7 @@ class TestLaplacianSmoothing(unittest.TestCase): def test_laplacian_smoothing_cot(self): """ - Test Laplacian Smoothing with uniform weights. + Test Laplacian Smoothing with cot weights. """ meshes = TestLaplacianSmoothing.init_meshes(10, 100, 300) @@ -161,7 +162,7 @@ class TestLaplacianSmoothing(unittest.TestCase): def test_laplacian_smoothing_cotcurv(self): """ - Test Laplacian Smoothing with uniform weights. + Test Laplacian Smoothing with cotcurv weights. """ meshes = TestLaplacianSmoothing.init_meshes(10, 100, 300)