pytorch3d/tests/pulsar/test_depth.py
Christoph Lassner fb2763dc78 Fix flaky CircleCI test.
Summary: This fixes issues with `pulsar.test.TestDepth` that we are encountering on CircleCI. The ID equality test is removed, which seems to give different results on different hardware (which is okay, because the exact order of spheres can slightly vary if they're close due to numerical instabilities). The depth map validity test stays in place.

Reviewed By: bottler

Differential Revision: D24840776

fbshipit-source-id: 2f38ea4880abf202c84d2987fdd71a84c5ef3b05
2020-11-10 10:14:17 -08:00

95 lines
3.4 KiB
Python

# Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.
"""Test the sorting of the closest spheres."""
import logging
import os
import sys
import unittest
from os import path
import imageio
import numpy as np
import torch
# fmt: off
# Make the mixin available.
sys.path.insert(0, path.join(path.dirname(__file__), ".."))
from common_testing import TestCaseMixin # isort:skip # noqa: E402
# fmt: on
# Making sure you can run this, even if pulsar hasn't been installed yet.
sys.path.insert(0, path.join(path.dirname(__file__), "..", ".."))
devices = [torch.device("cuda"), torch.device("cpu")]
IN_REF_FP = path.join(path.dirname(__file__), "reference", "nr0000-in.pth")
OUT_REF_FP = path.join(path.dirname(__file__), "reference", "nr0000-out.pth")
class TestDepth(TestCaseMixin, unittest.TestCase):
"""Test different numbers of channels."""
def test_basic(self):
from pytorch3d.renderer.points.pulsar import Renderer
for device in devices:
gamma = 1e-5
max_depth = 15.0
min_depth = 5.0
renderer = Renderer(
256,
256,
10000,
orthogonal_projection=True,
right_handed_system=False,
n_channels=1,
).to(device)
data = torch.load(IN_REF_FP, map_location="cpu")
# For creating the reference files.
# Use in case of updates.
# data["pos"] = torch.rand_like(data["pos"])
# data["pos"][:, 0] = data["pos"][:, 0] * 2. - 1.
# data["pos"][:, 1] = data["pos"][:, 1] * 2. - 1.
# data["pos"][:, 2] = data["pos"][:, 2] + 9.5
result, result_info = renderer.forward(
data["pos"].to(device),
data["col"].to(device),
data["rad"].to(device),
data["cam_params"].to(device),
gamma,
min_depth=min_depth,
max_depth=max_depth,
return_forward_info=True,
bg_col=torch.zeros(1, device=device, dtype=torch.float32),
percent_allowed_difference=0.01,
)
depth_map = Renderer.depth_map_from_result_info_nograd(result_info)
depth_vis = (depth_map - depth_map[depth_map > 0].min()) * 200 / (
depth_map.max() - depth_map[depth_map > 0.0].min()
) + 50
if not os.environ.get("FB_TEST", False):
imageio.imwrite(
path.join(
path.dirname(__file__),
"test_out",
"test_depth_test_basic_depth.png",
),
depth_vis.cpu().numpy().astype(np.uint8),
)
# For creating the reference files.
# Use in case of updates.
# torch.save(
# data, path.join(path.dirname(__file__), "reference", "nr0000-in.pth")
# )
# torch.save(
# {"sphere_ids": sphere_ids, "depth_map": depth_map},
# path.join(path.dirname(__file__), "reference", "nr0000-out.pth"),
# )
# sys.exit(0)
reference = torch.load(OUT_REF_FP, map_location="cpu")
self.assertClose(reference["depth_map"].to(device), depth_map)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
unittest.main()