|
import pandas as pd |
|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
import IPython |
|
import os |
|
|
|
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] |
|
|
|
|
|
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] |
|
|
|
|
|
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): |
|
|
|
|
|
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 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 |
|
|
|
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') |
|
|
|
|
|
|
|
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) |
|
|