KPConv-PyTorch/utils/mayavi_visu.py
Laurent FAINSIN d0cdb8e4ee 🎨 black + ruff
2023-05-15 17:18:10 +02:00

415 lines
11 KiB
Python

#
#
# 0=================================0
# | Kernel Point Convolutions |
# 0=================================0
#
#
# ----------------------------------------------------------------------------------------------------------------------
#
# Script for various visualization with mayavi
#
# ----------------------------------------------------------------------------------------------------------------------
#
# Hugues THOMAS - 11/06/2018
#
# ----------------------------------------------------------------------------------------------------------------------
#
# Imports and global variables
# \**********************************/
#
# Basic libs
import numpy as np
# PLY reader
# Configuration class
def show_ModelNet_models(all_points):
from mayavi import mlab
###########################
# Interactive visualization
###########################
# Create figure for features
fig1 = mlab.figure("Models", bgcolor=(1, 1, 1), size=(1000, 800))
fig1.scene.parallel_projection = False
# Indices
global file_i
file_i = 0
def update_scene():
# clear figure
mlab.clf(fig1)
# Plot new data feature
points = all_points[file_i]
# Rescale points for visu
points = (points * 1.5 + np.array([1.0, 1.0, 1.0])) * 50.0
# Show point clouds colorized with activations
mlab.points3d(
points[:, 0],
points[:, 1],
points[:, 2],
points[:, 2],
scale_factor=3.0,
scale_mode="none",
figure=fig1,
)
# New title
mlab.title(str(file_i), color=(0, 0, 0), size=0.3, height=0.01)
text = "<--- (press g for previous)" + 50 * " " + "(press h for next) --->"
mlab.text(0.01, 0.01, text, color=(0, 0, 0), width=0.98)
mlab.orientation_axes()
return
def keyboard_callback(vtk_obj, event):
global file_i
if vtk_obj.GetKeyCode() in ["g", "G"]:
file_i = (file_i - 1) % len(all_points)
update_scene()
elif vtk_obj.GetKeyCode() in ["h", "H"]:
file_i = (file_i + 1) % len(all_points)
update_scene()
return
# Draw a first plot
update_scene()
fig1.scene.interactor.add_observer("KeyPressEvent", keyboard_callback)
mlab.show()
def show_ModelNet_examples(clouds, cloud_normals=None, cloud_labels=None):
from mayavi import mlab
###########################
# Interactive visualization
###########################
# Create figure for features
fig1 = mlab.figure("Models", bgcolor=(1, 1, 1), size=(1000, 800))
fig1.scene.parallel_projection = False
if cloud_labels is None:
cloud_labels = [points[:, 2] for points in clouds]
# Indices
global file_i, show_normals
file_i = 0
show_normals = True
def update_scene():
# clear figure
mlab.clf(fig1)
# Plot new data feature
points = clouds[file_i]
labels = cloud_labels[file_i]
if cloud_normals is not None:
normals = cloud_normals[file_i]
else:
normals = None
# Rescale points for visu
points = (points * 1.5 + np.array([1.0, 1.0, 1.0])) * 50.0
# Show point clouds colorized with activations
mlab.points3d(
points[:, 0],
points[:, 1],
points[:, 2],
labels,
scale_factor=3.0,
scale_mode="none",
figure=fig1,
)
if normals is not None and show_normals:
mlab.quiver3d(
points[:, 0],
points[:, 1],
points[:, 2],
normals[:, 0],
normals[:, 1],
normals[:, 2],
scale_factor=10.0,
scale_mode="none",
figure=fig1,
)
# New title
mlab.title(str(file_i), color=(0, 0, 0), size=0.3, height=0.01)
text = "<--- (press g for previous)" + 50 * " " + "(press h for next) --->"
mlab.text(0.01, 0.01, text, color=(0, 0, 0), width=0.98)
mlab.orientation_axes()
return
def keyboard_callback(vtk_obj, event):
global file_i, show_normals
if vtk_obj.GetKeyCode() in ["g", "G"]:
file_i = (file_i - 1) % len(clouds)
update_scene()
elif vtk_obj.GetKeyCode() in ["h", "H"]:
file_i = (file_i + 1) % len(clouds)
update_scene()
elif vtk_obj.GetKeyCode() in ["n", "N"]:
show_normals = not show_normals
update_scene()
return
# Draw a first plot
update_scene()
fig1.scene.interactor.add_observer("KeyPressEvent", keyboard_callback)
mlab.show()
def show_neighbors(query, supports, neighbors):
from mayavi import mlab
###########################
# Interactive visualization
###########################
# Create figure for features
fig1 = mlab.figure("Models", bgcolor=(1, 1, 1), size=(1000, 800))
fig1.scene.parallel_projection = False
# Indices
global file_i
file_i = 0
def update_scene():
# clear figure
mlab.clf(fig1)
# Rescale points for visu
p1 = (query * 1.5 + np.array([1.0, 1.0, 1.0])) * 50.0
p2 = (supports * 1.5 + np.array([1.0, 1.0, 1.0])) * 50.0
l1 = p1[:, 2] * 0
l1[file_i] = 1
l2 = p2[:, 2] * 0 + 2
l2[neighbors[file_i]] = 3
# Show point clouds colorized with activations
mlab.points3d(
p1[:, 0],
p1[:, 1],
p1[:, 2],
l1,
scale_factor=2.0,
scale_mode="none",
vmin=0.0,
vmax=3.0,
figure=fig1,
)
mlab.points3d(
p2[:, 0],
p2[:, 1],
p2[:, 2],
l2,
scale_factor=3.0,
scale_mode="none",
vmin=0.0,
vmax=3.0,
figure=fig1,
)
# New title
mlab.title(str(file_i), color=(0, 0, 0), size=0.3, height=0.01)
text = "<--- (press g for previous)" + 50 * " " + "(press h for next) --->"
mlab.text(0.01, 0.01, text, color=(0, 0, 0), width=0.98)
mlab.orientation_axes()
return
def keyboard_callback(vtk_obj, event):
global file_i
if vtk_obj.GetKeyCode() in ["g", "G"]:
file_i = (file_i - 1) % len(query)
update_scene()
elif vtk_obj.GetKeyCode() in ["h", "H"]:
file_i = (file_i + 1) % len(query)
update_scene()
return
# Draw a first plot
update_scene()
fig1.scene.interactor.add_observer("KeyPressEvent", keyboard_callback)
mlab.show()
def show_input_batch(batch):
from mayavi import mlab
###########################
# Interactive visualization
###########################
# Create figure for features
fig1 = mlab.figure("Input", bgcolor=(1, 1, 1), size=(1000, 800))
fig1.scene.parallel_projection = False
# Unstack batch
all_points = batch.unstack_points()
all_neighbors = batch.unstack_neighbors()
all_pools = batch.unstack_pools()
# Indices
global b_i, l_i, neighb_i, show_pools
b_i = 0
l_i = 0
neighb_i = 0
show_pools = False
def update_scene():
# clear figure
mlab.clf(fig1)
# Rescale points for visu
p = (all_points[l_i][b_i] * 1.5 + np.array([1.0, 1.0, 1.0])) * 50.0
labels = p[:, 2] * 0
if show_pools:
p2 = (
all_points[l_i + 1][b_i][neighb_i : neighb_i + 1] * 1.5
+ np.array([1.0, 1.0, 1.0])
) * 50.0
p = np.vstack((p, p2))
labels = np.hstack((labels, np.ones((1,), dtype=np.int32) * 3))
pool_inds = all_pools[l_i][b_i][neighb_i]
pool_inds = pool_inds[pool_inds >= 0]
labels[pool_inds] = 2
else:
neighb_inds = all_neighbors[l_i][b_i][neighb_i]
neighb_inds = neighb_inds[neighb_inds >= 0]
labels[neighb_inds] = 2
labels[neighb_i] = 3
# Show point clouds colorized with activations
mlab.points3d(
p[:, 0],
p[:, 1],
p[:, 2],
labels,
scale_factor=2.0,
scale_mode="none",
vmin=0.0,
vmax=3.0,
figure=fig1,
)
"""
mlab.points3d(p[-2:, 0],
p[-2:, 1],
p[-2:, 2],
labels[-2:]*0 + 3,
scale_factor=0.16 * 1.5 * 50,
scale_mode='none',
mode='cube',
vmin=0.0,
vmax=3.0,
figure=fig1)
mlab.points3d(p[-1:, 0],
p[-1:, 1],
p[-1:, 2],
labels[-1:]*0 + 2,
scale_factor=0.16 * 2 * 2.5 * 1.5 * 50,
scale_mode='none',
mode='sphere',
vmin=0.0,
vmax=3.0,
figure=fig1)
"""
# New title
title_str = (
"<([) b_i={:d} (])> <(,) l_i={:d} (.)> <(N) n_i={:d} (M)>".format(
b_i, l_i, neighb_i
)
)
mlab.title(title_str, color=(0, 0, 0), size=0.3, height=0.90)
if show_pools:
text = "pools (switch with G)"
else:
text = "neighbors (switch with G)"
mlab.text(0.01, 0.01, text, color=(0, 0, 0), width=0.3)
mlab.orientation_axes()
return
def keyboard_callback(vtk_obj, event):
global b_i, l_i, neighb_i, show_pools
if vtk_obj.GetKeyCode() in ["[", "{"]:
b_i = (b_i - 1) % len(all_points[l_i])
neighb_i = 0
update_scene()
elif vtk_obj.GetKeyCode() in ["]", "}"]:
b_i = (b_i + 1) % len(all_points[l_i])
neighb_i = 0
update_scene()
elif vtk_obj.GetKeyCode() in [",", "<"]:
if show_pools:
l_i = (l_i - 1) % (len(all_points) - 1)
else:
l_i = (l_i - 1) % len(all_points)
neighb_i = 0
update_scene()
elif vtk_obj.GetKeyCode() in [".", ">"]:
if show_pools:
l_i = (l_i + 1) % (len(all_points) - 1)
else:
l_i = (l_i + 1) % len(all_points)
neighb_i = 0
update_scene()
elif vtk_obj.GetKeyCode() in ["n", "N"]:
neighb_i = (neighb_i - 1) % all_points[l_i][b_i].shape[0]
update_scene()
elif vtk_obj.GetKeyCode() in ["m", "M"]:
neighb_i = (neighb_i + 1) % all_points[l_i][b_i].shape[0]
update_scene()
elif vtk_obj.GetKeyCode() in ["g", "G"]:
if l_i < len(all_points) - 1:
show_pools = not show_pools
neighb_i = 0
update_scene()
return
# Draw a first plot
update_scene()
fig1.scene.interactor.add_observer("KeyPressEvent", keyboard_callback)
mlab.show()