a formula for bin size for images over 64x64 (#90)

Summary:
Signed-off-by: Michele Sanna <sanna@arrival.com>

fixes the bin_size calculation with a formula for any image_size > 64. Matches the values chosen so far.

simple test:

```
import numpy as np
import matplotlib.pyplot as plt

image_size = np.arange(64, 2048)
bin_size = np.where(image_size <= 64, 8, (2 ** np.maximum(np.ceil(np.log2(image_size)) - 4, 4)).astype(int))

print(image_size)
print(bin_size)

for ims, bins in zip(image_size, bin_size):
    if ims <= 64:
        assert bins == 8
    elif ims <= 256:
        assert bins == 16
    elif ims <= 512:
        assert bins == 32
    elif ims <= 1024:
        assert bins == 64
    elif ims <= 2048:
        assert bins == 128

    assert (ims + bins - 1) // bins < 22

plt.plot(image_size, bin_size)
plt.grid()
plt.show()
```

![img](https://user-images.githubusercontent.com/54891577/75464693-795bcf00-597f-11ea-9061-26440211691c.png)
Pull Request resolved: https://github.com/facebookresearch/pytorch3d/pull/90

Reviewed By: jcjohnson

Differential Revision: D21160372

Pulled By: nikhilaravi

fbshipit-source-id: 660cf5832f4ca5be243c435a6bed969596fc0188
This commit is contained in:
Michele Sanna
2020-04-24 14:53:59 -07:00
committed by Facebook GitHub Bot
parent c3d636dc8c
commit f8acecb6b3
6 changed files with 52 additions and 7 deletions

View File

@@ -7,6 +7,11 @@ from pytorch3d import _C
from pytorch3d.renderer.mesh.rasterize_meshes import pix_to_ndc
# Maxinum number of faces per bins for
# coarse-to-fine rasterization
kMaxPointsPerBin = 22
# TODO(jcjohns): Support non-square images
def rasterize_points(
pointclouds,
@@ -82,6 +87,15 @@ def rasterize_points(
elif image_size <= 1024:
bin_size = 64
if bin_size != 0:
# There is a limit on the number of points per bin in the cuda kernel.
points_per_bin = 1 + (image_size - 1) // bin_size
if points_per_bin >= kMaxPointsPerBin:
raise ValueError(
"bin_size too small, number of points per bin must be less than %d; got %d"
% (kMaxPointsPerBin, points_per_bin)
)
if max_points_per_bin is None:
max_points_per_bin = int(max(10000, points_packed.shape[0] / 5))