Diff-TTSG / pymo /viz_tools.py
Shivam Mehta
Adding code
3c10b34
# import IPython
import os
import matplotlib.animation as animation
import matplotlib.colors as colors
import matplotlib.patheffects as pe
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
def save_fig(fig_id, tight_layout=True):
if tight_layout:
plt.tight_layout()
plt.savefig(fig_id + ".png", format="png", dpi=300)
def draw_stickfigure(mocap_track, frame, data=None, joints=None, draw_names=False, ax=None, figsize=(8, 8)):
if ax is None:
fig = plt.figure(figsize=figsize)
ax = fig.add_subplot(111)
if joints is None:
joints_to_draw = mocap_track.skeleton.keys()
else:
joints_to_draw = joints
if data is None:
df = mocap_track.values
else:
df = data
for joint in joints_to_draw:
ax.scatter(
x=df["%s_Xposition" % joint][frame], y=df["%s_Yposition" % joint][frame], alpha=0.6, c="b", marker="o"
)
parent_x = df["%s_Xposition" % joint][frame]
parent_y = df["%s_Yposition" % joint][frame]
children_to_draw = [c for c in mocap_track.skeleton[joint]["children"] if c in joints_to_draw]
for c in children_to_draw:
child_x = df["%s_Xposition" % c][frame]
child_y = df["%s_Yposition" % c][frame]
ax.plot([parent_x, child_x], [parent_y, child_y], "k-", lw=2)
if draw_names:
ax.annotate(joint, (df["%s_Xposition" % joint][frame] + 0.1, df["%s_Yposition" % joint][frame] + 0.1))
return ax
def draw_stickfigure3d(mocap_track, frame, data=None, joints=None, draw_names=False, ax=None, figsize=(8, 8)):
from mpl_toolkits.mplot3d import Axes3D
if ax is None:
fig = plt.figure(figsize=figsize)
ax = fig.add_subplot(111, projection="3d")
if joints is None:
joints_to_draw = mocap_track.skeleton.keys()
else:
joints_to_draw = joints
if data is None:
df = mocap_track.values
else:
df = data
for joint in joints_to_draw:
parent_x = df["%s_Xposition" % joint][frame]
parent_y = df["%s_Zposition" % joint][frame]
parent_z = df["%s_Yposition" % joint][frame]
# ^ In mocaps, Y is the up-right axis
ax.scatter(xs=parent_x, ys=parent_y, zs=parent_z, alpha=0.6, c="b", marker="o")
children_to_draw = [c for c in mocap_track.skeleton[joint]["children"] if c in joints_to_draw]
for c in children_to_draw:
child_x = df["%s_Xposition" % c][frame]
child_y = df["%s_Zposition" % c][frame]
child_z = df["%s_Yposition" % c][frame]
# ^ In mocaps, Y is the up-right axis
ax.plot([parent_x, child_x], [parent_y, child_y], [parent_z, child_z], "k-", lw=2, c="black")
if draw_names:
ax.text(x=parent_x + 0.1, y=parent_y + 0.1, z=parent_z + 0.1, s=joint, color="rgba(0,0,0,0.9")
return ax
def sketch_move(mocap_track, data=None, ax=None, figsize=(16, 8)):
if ax is None:
fig = plt.figure(figsize=figsize)
ax = fig.add_subplot(111)
if data is None:
data = mocap_track.values
for frame in range(0, data.shape[0], 4):
# draw_stickfigure(mocap_track, f, data=data, ax=ax)
for joint in mocap_track.skeleton.keys():
children_to_draw = [c for c in mocap_track.skeleton[joint]["children"]]
parent_x = data["%s_Xposition" % joint][frame]
parent_y = data["%s_Yposition" % joint][frame]
frame_alpha = frame / data.shape[0]
for c in children_to_draw:
child_x = data["%s_Xposition" % c][frame]
child_y = data["%s_Yposition" % c][frame]
ax.plot([parent_x, child_x], [parent_y, child_y], "-", lw=1, color="gray", alpha=frame_alpha)
def render_mp4(mocap_track, filename, data=None, ax=None, axis_scale=50, elev=45, azim=45):
if ax is None:
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection="3d")
ax.set_xlim3d(-axis_scale, axis_scale)
ax.set_zlim3d(0, axis_scale)
ax.set_ylim3d(-axis_scale, axis_scale)
ax.grid(True)
ax.set_axis_off()
ax.view_init(elev=elev, azim=azim)
xs = np.linspace(-200, 200, 50)
ys = np.linspace(-200, 200, 50)
X, Y = np.meshgrid(xs, ys)
Z = np.zeros(X.shape)
wframe = ax.plot_wireframe(X, Y, Z, rstride=2, cstride=2, color="grey", lw=0.2)
# fig = plt.figure(figsize=figsize)
# ax = fig.add_subplot(111)
if data is None:
data = mocap_track.values
fps = int(np.round(1 / mocap_track.framerate))
lines = []
lines.append(
[
plt.plot(
[0, 0],
[0, 0],
[0, 0],
color="red",
lw=2,
path_effects=[pe.Stroke(linewidth=3, foreground="black"), pe.Normal()],
)[0]
for _ in range(len(mocap_track.skeleton.keys()))
]
)
def animate(frame):
changed = []
j = 0
for joint in mocap_track.skeleton.keys():
children_to_draw = [c for c in mocap_track.skeleton[joint]["children"]]
parent_x = data["%s_Xposition" % joint][frame]
parent_y = data["%s_Yposition" % joint][frame]
parent_z = data["%s_Zposition" % joint][frame]
# frame_alpha = frame/data.shape[0]
for c in children_to_draw:
child_x = data["%s_Xposition" % c][frame]
child_y = data["%s_Yposition" % c][frame]
child_z = data["%s_Zposition" % c][frame]
lines[0][j].set_data(np.array([[child_x, parent_x], [-child_z, -parent_z]]))
lines[0][j].set_3d_properties(np.array([child_y, parent_y]))
changed += lines
j += 1
return changed
plt.tight_layout()
ani = animation.FuncAnimation(fig, animate, np.arange(data.shape[0]), interval=1000 / fps)
if filename != None:
ani.save(filename, fps=fps, bitrate=13934)
ani.event_source.stop()
del ani
plt.close()
try:
plt.show()
plt.save()
except AttributeError as e:
pass
def viz_cnn_filter(feature_to_viz, mocap_track, data, gap=25):
fig = plt.figure(figsize=(16, 4))
ax = plt.subplot2grid((1, 8), (0, 0))
ax.imshow(feature_to_viz.T, aspect="auto", interpolation="nearest")
ax = plt.subplot2grid((1, 8), (0, 1), colspan=7)
for frame in range(feature_to_viz.shape[0]):
frame_alpha = 0.2 # frame/data.shape[0] * 2 + 0.2
for joint_i, joint in enumerate(mocap_track.skeleton.keys()):
children_to_draw = [c for c in mocap_track.skeleton[joint]["children"]]
parent_x = data["%s_Xposition" % joint][frame] + frame * gap
parent_y = data["%s_Yposition" % joint][frame]
ax.scatter(
x=parent_x,
y=parent_y,
alpha=0.6,
cmap="RdBu",
c=feature_to_viz[frame][joint_i] * 10000,
marker="o",
s=abs(feature_to_viz[frame][joint_i] * 10000),
)
plt.axis("off")
for c in children_to_draw:
child_x = data["%s_Xposition" % c][frame] + frame * gap
child_y = data["%s_Yposition" % c][frame]
ax.plot([parent_x, child_x], [parent_y, child_y], "-", lw=1, color="gray", alpha=frame_alpha)
def print_skel(X):
stack = [X.root_name]
tab = 0
while stack:
joint = stack.pop()
tab = len(stack)
print("%s- %s (%s)" % ("| " * tab, joint, X.skeleton[joint]["parent"]))
for c in X.skeleton[joint]["children"]:
stack.append(c)
# def nb_play_mocap_fromurl(mocap, mf, frame_time=1/30, scale=1, base_url='http://titan:8385'):
# if mf == 'bvh':
# bw = BVHWriter()
# with open('test.bvh', 'w') as ofile:
# bw.write(mocap, ofile)
# filepath = '../notebooks/test.bvh'
# elif mf == 'pos':
# c = list(mocap.values.columns)
# for cc in c:
# if 'rotation' in cc:
# c.remove(cc)
# mocap.values.to_csv('test.csv', index=False, columns=c)
# filepath = '../notebooks/test.csv'
# else:
# return
# url = '%s/mocapplayer/player.html?data_url=%s&scale=%f&cz=200&order=xzyi&frame_time=%f'%(base_url, filepath, scale, frame_time)
# iframe = '<iframe src=' + url + ' width="100%" height=500></iframe>'
# link = '<a href=%s target="_blank">New Window</a>'%url
# return IPython.display.HTML(iframe+link)
# def nb_play_mocap(mocap, mf, meta=None, frame_time=1/30, scale=1, camera_z=500, base_url=None):
# data_template = 'var dataBuffer = `$$DATA$$`;'
# data_template += 'var metadata = $$META$$;'
# data_template += 'start(dataBuffer, metadata, $$CZ$$, $$SCALE$$, $$FRAMETIME$$);'
# dir_path = os.path.dirname(os.path.realpath(__file__))
# if base_url is None:
# base_url = os.path.join(dir_path, 'mocapplayer/playBuffer.html')
# # print(dir_path)
# if mf == 'bvh':
# pass
# elif mf == 'pos':
# cols = list(mocap.values.columns)
# for c in cols:
# if 'rotation' in c:
# cols.remove(c)
# data_csv = mocap.values.to_csv(index=False, columns=cols)
# if meta is not None:
# lines = [','.join(item) for item in meta.astype('str')]
# meta_csv = '[' + ','.join('[%s]'%l for l in lines) +']'
# else:
# meta_csv = '[]'
# data_assigned = data_template.replace('$$DATA$$', data_csv)
# data_assigned = data_assigned.replace('$$META$$', meta_csv)
# data_assigned = data_assigned.replace('$$CZ$$', str(camera_z))
# data_assigned = data_assigned.replace('$$SCALE$$', str(scale))
# data_assigned = data_assigned.replace('$$FRAMETIME$$', str(frame_time))
# else:
# return
# with open(os.path.join(dir_path, 'mocapplayer/data.js'), 'w') as oFile:
# oFile.write(data_assigned)
# url = '%s?&cz=200&order=xzyi&frame_time=%f&scale=%f'%(base_url, frame_time, scale)
# iframe = '<iframe frameborder="0" src=' + url + ' width="100%" height=500></iframe>'
# link = '<a href=%s target="_blank">New Window</a>'%url
# return IPython.display.HTML(iframe+link)