code: def test_simple_sphere(self):
      device = torch.device("cuda:0")
  
      # Load reference image
      ref_filename = "test_simple_pointcloud_sphere.png"
      image_ref_filename = DATA_DIR / ref_filename
  
      # Rescale image_ref to the 0 - 1 range and convert to a binary mask.
      image_ref = convert_image_to_binary_mask(image_ref_filename).to(
          torch.int32
      )
  
      sphere_mesh = ico_sphere(1, device)
      verts_padded = sphere_mesh.verts_padded()
      verts_padded[..., 1] += 0.2
      verts_padded[..., 0] += 0.2
      pointclouds = Pointclouds(points=verts_padded)
      R, T = look_at_view_transform(2.7, 0.0, 0.0)
      cameras = FoVPerspectiveCameras(device=device, R=R, T=T)
      raster_settings = PointsRasterizationSettings(
          image_size=256, radius=5e-2, points_per_pixel=1
      )
  
      #################################
      #  1. Test init without cameras.
      ##################################
  
      # Initialize without passing in the cameras
      rasterizer = PointsRasterizer()
  
      # Check that omitting the cameras in both initialization
      # and the forward pass throws an error:
      with self.assertRaisesRegex(
          ValueError, "Cameras must be specified"
      ):
          rasterizer(pointclouds)
  
      ##########################################
      # 2. Test rasterizing a single pointcloud
      ##########################################
  
      fragments = rasterizer(
          pointclouds, cameras=cameras, raster_settings=raster_settings
      )
  
      # Convert idx to a binary mask
      image = fragments.idx[0, ..., 0].squeeze().cpu()
      image[image >= 0] = 1.0
      image[image < 0] = 0.0
  
      if DEBUG:
          Image.fromarray((image.numpy() * 255).astype(np.uint8)).save(
              DATA_DIR / "DEBUG_test_rasterized_sphere_points.png"
          )
  
      self.assertTrue(torch.allclose(image, image_ref[..., 0]))
  
      ########################################
      #  3. Test with a batch of pointclouds
      ########################################
  
      batch_size = 10
      pointclouds = pointclouds.extend(batch_size)
      fragments = rasterizer(
          pointclouds, cameras=cameras, raster_settings=raster_settings
      )
      for i in range(batch_size):
          image = fragments.idx[i, ..., 0].squeeze().cpu()
          image[image >= 0] = 1.0
          image[image < 0] = 0.0
          self.assertTrue(torch.allclose(image, image_ref[..., 0]))
  
imports: import unittest
  import numpy
  import torch
  from PIL import Image
  from pytorch3d.renderer import FoVOrthographicCameras, FoVPerspectiveCameras, look_at_view_transform, MeshRasterizer, OrthographicCameras, PerspectiveCameras, PointsRasterizationSettings, PointsRasterizer, RasterizationSettings
  from pytorch3d.renderer.fisheyecameras import FishEyeCameras
  from pytorch3d.renderer.opengl.rasterizer_opengl import _check_cameras, _check_raster_settings, _convert_meshes_to_gl_ndc, _parse_and_verify_image_size, MeshRasterizerOpenGL
  from pytorch3d.structures import Pointclouds
  from pytorch3d.structures.meshes import Meshes
  from pytorch3d.utils.ico_sphere import ico_sphere
  from .common_testing import get_tests_dir, TestCaseMixin
label_desc: Use image node_id 1 for calling the TestPointRasterizer obj's underlying member method code with example usage: obj.test_simple_sphere() without return types