def test_cpu(self): """ Test that the output of rendering non square images gives the same result as square images. i.e. the dists, zbuf, idx are all the same for the square region which is present in both images. In this test we compare between the naive C++ implementation and the naive python implementation as the Coarse/Fine method is not fully implemented in C++ """ # Test both when (W > H) and (H > W). # Using smaller image sizes here as the Python rasterizer is really slow. image_sizes = [(32, 64), (64, 32), (60, 110)] devices = ["cpu"] blurs = [5e-2] batch_sizes = [1] test_cases = product(image_sizes, blurs, devices, batch_sizes) for image_size, blur, device, batch_size in test_cases: # Initialize the verts grad tensor and the meshes objects verts_nonsq_naive, pointcloud_nonsq_naive = self._clone_pointcloud( torus_points, device, batch_size) verts_nonsq_python, pointcloud_nonsq_python = self._clone_pointcloud( torus_points, device, batch_size) # Compare Naive CPU with Python as Coarse/Fine rasteriztation # is not implemented for CPU fragments_naive = self._rasterize(pointcloud_nonsq_naive, image_size, bin_size=0, blur=blur) idxs, zbuf, pix_dists = rasterize_points_python( pointcloud_nonsq_python, image_size, blur, points_per_pixel=1, ) fragments_python = PointFragments( idx=idxs, zbuf=zbuf, dists=pix_dists, ) # Save debug images if DEBUG is set to true at the top of the file. _save_debug_image(fragments_naive.idx, image_size, 0, blur) _save_debug_image(fragments_python.idx, image_size, "python", blur) # List of non square outputs to compare with the square output nonsq_fragment_gradtensor_list = [ (fragments_naive, verts_nonsq_naive, "naive"), (fragments_python, verts_nonsq_python, "python"), ] self._compare_square_with_nonsq( image_size, blur, device, torus_points, nonsq_fragment_gradtensor_list, batch_size, )
def _bm_python_with_init(N, P, img_size=32, radius=0.1, pts_per_pxl=3): torch.manual_seed(231) points = torch.randn(N, P, 3) pointclouds = Pointclouds(points=points) args = (pointclouds, img_size, radius, pts_per_pxl) return lambda: rasterize_points_python(*args)