in downstream/semseg/lib/datasets/scannet.py [0:0]
def test_pointcloud(self, pred_dir):
print('Running full pointcloud evaluation.')
eval_path = os.path.join(pred_dir, 'fulleval')
os.makedirs(eval_path, exist_ok=True)
# Join room by their area and room id.
# Test independently for each room.
sys.setrecursionlimit(100000) # Increase recursion limit for k-d tree.
hist = np.zeros((self.NUM_LABELS, self.NUM_LABELS))
for i, data_path in enumerate(self.data_paths):
room_id = self.get_output_id(i)
pred = np.load(os.path.join(pred_dir, 'pred_%04d_%02d.npy' % (i, 0)))
# save voxelized pointcloud predictions
save_point_cloud(
np.hstack((pred[:, :3], np.array([SCANNET_COLOR_MAP[i] for i in pred[:, -1]]))),
f'{eval_path}/{room_id}_voxel.ply',
verbose=False)
fullply_f = self.data_root / data_path
query_pointcloud = read_plyfile(fullply_f)
query_xyz = query_pointcloud[:, :3]
query_label = query_pointcloud[:, -1]
# Run test for each room.
pred_tree = spatial.KDTree(pred[:, :3], leafsize=500)
_, result = pred_tree.query(query_xyz)
ptc_pred = pred[result, 3].astype(int)
# Save prediciton in txt format for submission.
np.savetxt(f'{eval_path}/{room_id}.txt', ptc_pred, fmt='%i')
# Save prediciton in colored pointcloud for visualization.
save_point_cloud(
np.hstack((query_xyz, np.array([SCANNET_COLOR_MAP[i] for i in ptc_pred]))),
f'{eval_path}/{room_id}.ply',
verbose=False)
# Evaluate IoU.
if self.IGNORE_LABELS is not None:
ptc_pred = np.array([self.label_map[x] for x in ptc_pred], dtype=np.int)
query_label = np.array([self.label_map[x] for x in query_label], dtype=np.int)
hist += fast_hist(ptc_pred, query_label, self.NUM_LABELS)
ious = per_class_iu(hist) * 100
print('mIoU: ' + str(np.nanmean(ious)) + '\n'
'Class names: ' + ', '.join(CLASS_LABELS) + '\n'
'IoU: ' + ', '.join(np.round(ious, 2).astype(str)))