@@ -69,6 +69,21 @@ def _load_scalars_data(logdir: str):
6969 return data
7070
7171
72+ def _load_pointcloud_data (logdir : str ):
73+ """Loads pointcloud summaries from events in a logdir."""
74+ paths = tf .io .gfile .glob (os .path .join (logdir , "events.out.tfevents.*" ))
75+ data = collections .defaultdict (dict )
76+ for path in paths :
77+ for event in tf .compat .v1 .train .summary_iterator (path ):
78+ for value in event .summary .value :
79+ if value .metadata .plugin_data .plugin_name == "mesh" :
80+ if "config" not in value .tag :
81+ data [event .step ][value .tag ] = tf .make_ndarray (value .tensor )
82+ else :
83+ data [event .step ][value .tag ] = value .metadata .plugin_data .content
84+ return data
85+
86+
7287def _load_hparams (logdir : str ):
7388 """Loads hparams summaries from events in a logdir."""
7489 paths = tf .io .gfile .glob (os .path .join (logdir , "events.out.tfevents.*" ))
@@ -142,6 +157,24 @@ def test_write_histograms(self):
142157 ]
143158 self .assertAllClose (data ["b" ], ([0 , 2 ], expected_histograms_b ))
144159
160+ def test_write_pointcloud (self ):
161+ point_clouds = np .random .normal (0 , 1 , (1 , 1024 , 3 )).astype (np .float32 )
162+ point_colors = np .random .uniform (0 , 1 , (1 , 1024 , 3 )).astype (np .float32 )
163+ config = {
164+ "material" : "PointCloudMaterial" ,
165+ "size" : 0.09 ,
166+ }
167+ self .writer .write_pointcloud (
168+ step = 0 ,
169+ point_clouds = {"pcd" : point_clouds },
170+ point_colors = {"pcd" : point_colors },
171+ configs = {"config" : config },
172+ )
173+ self .writer .flush ()
174+ data = _load_pointcloud_data (self .logdir )
175+ self .assertAllClose (data [0 ]["pcd_VERTEX" ], point_clouds )
176+ self .assertAllClose (data [0 ]["pcd_COLOR" ], point_colors )
177+
145178 def test_hparams (self ):
146179 self .writer .write_hparams (dict (batch_size = 512 , num_epochs = 90 ))
147180 hparams = _load_hparams (self .logdir )
0 commit comments