mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-08-02 20:02:49 +08:00
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
This commit is contained in:
parent
0345f860d4
commit
13429640d3
@ -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 @@
|
|||||||
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 @@
|
|||||||
|
|
||||||
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(
|
|||||||
# 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):
|
|||||||
|
|
||||||
# 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):
|
|||||||
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):
|
|||||||
"""
|
"""
|
||||||
# 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):
|
|||||||
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):
|
|||||||
"""
|
"""
|
||||||
# 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]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user