Commit 13429640 authored by Nikhila Ravi's avatar Nikhila Ravi Committed by Facebook GitHub Bot
Browse files

Bug fix for case where aspect ratio is a float

Summary:
- Fix the calculation of the non square NDC range when the H and W are not integer multiples.
- Add test for this case

Reviewed By: gkioxari

Differential Revision: D26613213

fbshipit-source-id: df6763cac602e9f1d516b41b432c4d2cfbaa356d
parent 0345f860
...@@ -10,7 +10,9 @@ ...@@ -10,7 +10,9 @@
__device__ inline float NonSquareNdcRange(int S1, int S2) { __device__ inline float NonSquareNdcRange(int S1, int S2) {
float range = 2.0f; float range = 2.0f;
if (S1 > S2) { if (S1 > S2) {
range = ((S1 / S2) * range); // First multiply S1 by float range so that division results
// in a float value.
range = (S1 * range) / S2;
} }
return range; return range;
} }
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
inline float NonSquareNdcRange(int S1, int S2) { inline float NonSquareNdcRange(int S1, int S2) {
float range = 2.0f; float range = 2.0f;
if (S1 > S2) { if (S1 > S2) {
range = ((S1 / S2) * range); range = (S1 * range) / S2;
} }
return range; return range;
} }
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
from typing import List, Optional, Tuple, Union from typing import List, Optional, Tuple, Union
import numpy as np
import torch import torch
# pyre-fixme[21]: Could not find name `_C` in `pytorch3d`. # pyre-fixme[21]: Could not find name `_C` in `pytorch3d`.
...@@ -120,15 +121,7 @@ def rasterize_points( ...@@ -120,15 +121,7 @@ def rasterize_points(
# Binned CPU rasterization not fully implemented # Binned CPU rasterization not fully implemented
bin_size = 0 bin_size = 0
else: else:
# TODO: These heuristics are not well-thought out! bin_size = int(2 ** max(np.ceil(np.log2(max_image_size)) - 4, 4))
if max_image_size <= 64:
bin_size = 8
elif max_image_size <= 256:
bin_size = 16
elif max_image_size <= 512:
bin_size = 32
elif max_image_size <= 1024:
bin_size = 64
if bin_size != 0: if bin_size != 0:
# There is a limit on the number of points per bin in the cuda kernel. # There is a limit on the number of points per bin in the cuda kernel.
......
...@@ -314,7 +314,7 @@ class TestRasterizeRectangleImagesMeshes(TestCaseMixin, unittest.TestCase): ...@@ -314,7 +314,7 @@ class TestRasterizeRectangleImagesMeshes(TestCaseMixin, unittest.TestCase):
# Finally check the gradients of the input vertices for # Finally check the gradients of the input vertices for
# the square and non square case # the square and non square case
self.assertClose(verts_square.grad, grad_tensor.grad, rtol=2e-4) self.assertClose(verts_square.grad, grad_tensor.grad, rtol=3e-4)
def test_gpu(self): def test_gpu(self):
""" """
...@@ -323,8 +323,9 @@ class TestRasterizeRectangleImagesMeshes(TestCaseMixin, unittest.TestCase): ...@@ -323,8 +323,9 @@ class TestRasterizeRectangleImagesMeshes(TestCaseMixin, unittest.TestCase):
dists, zbuf, bary are all the same for the square dists, zbuf, bary are all the same for the square
region which is present in both images. region which is present in both images.
""" """
# Test both cases: (W > H), (H > W) # Test both cases: (W > H), (H > W) as well as the case where
image_sizes = [(64, 128), (128, 64), (128, 256), (256, 128)] # H and W are not integer multiples of each other (i.e. float aspect ratio)
image_sizes = [(64, 128), (128, 64), (128, 256), (256, 128), (600, 1110)]
devices = ["cuda:0"] devices = ["cuda:0"]
blurs = [0.0, 0.001] blurs = [0.0, 0.001]
...@@ -391,7 +392,7 @@ class TestRasterizeRectangleImagesMeshes(TestCaseMixin, unittest.TestCase): ...@@ -391,7 +392,7 @@ class TestRasterizeRectangleImagesMeshes(TestCaseMixin, unittest.TestCase):
""" """
# Test both when (W > H) and (H > W). # Test both when (W > H) and (H > W).
# Using smaller image sizes here as the Python rasterizer is really slow. # Using smaller image sizes here as the Python rasterizer is really slow.
image_sizes = [(32, 64), (64, 32)] image_sizes = [(32, 64), (64, 32), (60, 110)]
devices = ["cpu"] devices = ["cpu"]
blurs = [0.0, 0.001] blurs = [0.0, 0.001]
batch_sizes = [1] batch_sizes = [1]
...@@ -646,8 +647,9 @@ class TestRasterizeRectangleImagesPointclouds(TestCaseMixin, unittest.TestCase): ...@@ -646,8 +647,9 @@ class TestRasterizeRectangleImagesPointclouds(TestCaseMixin, unittest.TestCase):
dists, zbuf, idx are all the same for the square dists, zbuf, idx are all the same for the square
region which is present in both images. region which is present in both images.
""" """
# Test both cases: (W > H), (H > W) # Test both cases: (W > H), (H > W) as well as the case where
image_sizes = [(64, 128), (128, 64), (128, 256), (256, 128)] # H and W are not integer multiples of each other (i.e. float aspect ratio)
image_sizes = [(64, 128), (128, 64), (128, 256), (256, 128), (600, 1110)]
devices = ["cuda:0"] devices = ["cuda:0"]
blurs = [5e-2] blurs = [5e-2]
...@@ -713,7 +715,7 @@ class TestRasterizeRectangleImagesPointclouds(TestCaseMixin, unittest.TestCase): ...@@ -713,7 +715,7 @@ class TestRasterizeRectangleImagesPointclouds(TestCaseMixin, unittest.TestCase):
""" """
# Test both when (W > H) and (H > W). # Test both when (W > H) and (H > W).
# Using smaller image sizes here as the Python rasterizer is really slow. # Using smaller image sizes here as the Python rasterizer is really slow.
image_sizes = [(32, 64), (64, 32)] image_sizes = [(32, 64), (64, 32), (60, 110)]
devices = ["cpu"] devices = ["cpu"]
blurs = [5e-2] blurs = [5e-2]
batch_sizes = [1] batch_sizes = [1]
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment