test_ray_point_refiner.py 3.36 KB
Newer Older
Jeremy Reizenstein's avatar
Jeremy Reizenstein committed
1
2
3
4
5
6
7
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.

import unittest
8
from itertools import product
Jeremy Reizenstein's avatar
Jeremy Reizenstein committed
9
10

import torch
11
12
13
14
15

from pytorch3d.implicitron.models.renderer.ray_point_refiner import (
    apply_blurpool_on_weights,
    RayPointRefiner,
)
Darijan Gudelj's avatar
Darijan Gudelj committed
16
from pytorch3d.implicitron.models.renderer.ray_sampler import ImplicitronRayBundle
Jeremy Reizenstein's avatar
Jeremy Reizenstein committed
17
from tests.common_testing import TestCaseMixin
Jeremy Reizenstein's avatar
Jeremy Reizenstein committed
18
19
20
21
22
23
24


class TestRayPointRefiner(TestCaseMixin, unittest.TestCase):
    def test_simple(self):
        length = 15
        n_pts_per_ray = 10

25
        for add_input_samples, use_blurpool in product([False, True], [False, True]):
Jeremy Reizenstein's avatar
Jeremy Reizenstein committed
26
27
28
29
            ray_point_refiner = RayPointRefiner(
                n_pts_per_ray=n_pts_per_ray,
                random_sampling=False,
                add_input_samples=add_input_samples,
30
                blurpool_weights=use_blurpool,
Jeremy Reizenstein's avatar
Jeremy Reizenstein committed
31
32
            )
            lengths = torch.arange(length, dtype=torch.float32).expand(3, 25, length)
Darijan Gudelj's avatar
Darijan Gudelj committed
33
34
35
36
37
38
39
40
            bundle = ImplicitronRayBundle(
                lengths=lengths,
                origins=None,
                directions=None,
                xys=None,
                camera_ids=None,
                camera_counts=None,
            )
Jeremy Reizenstein's avatar
Jeremy Reizenstein committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
            weights = torch.ones(3, 25, length)
            refined = ray_point_refiner(bundle, weights)

            self.assertIsNone(refined.directions)
            self.assertIsNone(refined.origins)
            self.assertIsNone(refined.xys)
            expected = torch.linspace(0.5, length - 1.5, n_pts_per_ray)
            expected = expected.expand(3, 25, n_pts_per_ray)
            if add_input_samples:
                full_expected = torch.cat((lengths, expected), dim=-1).sort()[0]
            else:
                full_expected = expected
            self.assertClose(refined.lengths, full_expected)

            ray_point_refiner_random = RayPointRefiner(
                n_pts_per_ray=n_pts_per_ray,
                random_sampling=True,
                add_input_samples=add_input_samples,
59
                blurpool_weights=use_blurpool,
Jeremy Reizenstein's avatar
Jeremy Reizenstein committed
60
61
62
63
64
65
66
67
68
69
70
71
            )
            refined_random = ray_point_refiner_random(bundle, weights)
            lengths_random = refined_random.lengths
            self.assertEqual(lengths_random.shape, full_expected.shape)
            if not add_input_samples:
                self.assertGreater(lengths_random.min().item(), 0.5)
                self.assertLess(lengths_random.max().item(), length - 1.5)

            # Check sorted
            self.assertTrue(
                (lengths_random[..., 1:] - lengths_random[..., :-1] > 0).all()
            )
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

    def test_apply_blurpool_on_weights(self):
        weights = torch.tensor(
            [
                [0.5, 0.6, 0.7],
                [0.5, 0.3, 0.9],
            ]
        )
        expected_weights = 0.5 * torch.tensor(
            [
                [0.5 + 0.6, 0.6 + 0.7, 0.7 + 0.7],
                [0.5 + 0.5, 0.5 + 0.9, 0.9 + 0.9],
            ]
        )
        out_weights = apply_blurpool_on_weights(weights)
        self.assertTrue(torch.allclose(out_weights, expected_weights))

    def test_shapes_apply_blurpool_on_weights(self):
        weights = torch.randn((5, 4, 3, 2, 1))
        out_weights = apply_blurpool_on_weights(weights)
        self.assertEqual((5, 4, 3, 2, 1), out_weights.shape)