以前に紹介した3Dの骨格推定アルゴリズムPHALP(Predicting Human Appearance, Location and Pose for Tracking )がありました(記事URL:https://himahimaknowledge.blogspot.com/2023/08/python-environment-phalp.html)。
この前の記事では、自分のローカル環境でオフラインかつWIndows環境で無理やり実行する方法を書きましたが、要求されるGPUがRTX4080レベルとなかなかに現実的なものではありませんでした。
いろいろと調べてみると、公式のHPのGoogleColabを使うと骨格推定結果の.pklファイルを出力するところまではできるようです。
GoogleColab特有のディレクト管理などちょっと癖がある処理にはなるとは思いますが、自分で複雑な環境構築を作ったり、高価なGPUを使わなくても3Dかつメートル座標化されている座標を取得できるのは魅力的です。
今回の記事では、骨格推定アルゴリズムPHALPで出力される.pklファイルから骨格座標データを取り出して可視化するところまでのpythonコードを紹介したいと思います。
そもそも.pklファイルとは何か
PHALPで出力される.pklファイルから座標データを読み取って定義するためのコード。
)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import pandas as pd
import glob
import sys
from matplotlib.widgets import Slider, Button
import matplotlib.widgets as wg
from matplotlib import patches
plt.rcParams['font.family'] = 'MS Gothic'
import scipy
from scipy import signal
import time
import datetime
from numpy import linalg as LA
import math
import os, tkinter, tkinter.filedialog, tkinter.messagebox
filename = glob.glob('*.pkl')
import _pickle as pickle
import joblib
results =joblib.load(filename[0])
k_list =list(results.keys())
joint1 = results[k_list[0]]['3d_joints'][0]
fig = plt.figure(figsize =(5,5))
ax = fig.add_subplot(111,projection = '3d')
ax.set_xlim(-0.75,0.75)
ax.set_ylim(-0.75,0.75)
ax.set_zlim(-0.75,0.75)
r_c_shoul = (joint1[2,:]+joint1[33,:])/2
r_c_elb = (joint1[3,:]+joint1[32,:])/2
r_c_wri = (joint1[4,:]+joint1[31,:])/2
l_c_shoul = (joint1[5,:]+joint1[34,:])/2
l_c_elb = (joint1[6,:]+joint1[35,:])/2
l_c_wri = (joint1[7,:]+joint1[36,:])/2
c_head = (joint1[17,:]+joint1[18,:])/2
c_neck = (joint1[1,:]+joint1[37,:]+joint1[40,:])/3
spine = joint1[41,:]
pel = joint1[8,:]
pel2 = joint1[39,:]
b_pel = joint1[44,:]
r_ASIS = joint1[27,:]
l_ASIS = joint1[28,:]
r_c_hip = joint1[9,:]
r_c_knee =(joint1[10,:]+joint1[26,:])/2
r_c_ank = joint1[11,:]
r_c_foot = (joint1[22,:]+joint1[23,:])/2
r_c_heel = joint1[24,:]
l_c_hip = joint1[12,:]
l_c_knee =(joint1[13,:]+joint1[29,:])/2
l_c_ank = joint1[14,:]
l_c_foot = (joint1[19,:]+joint1[20,:])/2
l_c_heel = joint1[21,:]
size = 30
alp = 0.8
ax.scatter(c_head[0],c_head[2],-c_head[1],color = 'gray',s = 120,alpha = alp)
ax.scatter(c_neck[0],c_neck[2],-c_neck[1],color = 'gray',s = size,alpha = alp)
ax.scatter(spine[0],spine[2],-spine[1],color = 'gray',s = size,alpha = alp)
ax.scatter(pel[0],pel[2],-pel[1],color = 'gray',s = size,alpha = alp)
ax.scatter(r_ASIS[0],r_ASIS[2],-r_ASIS[1],color = 'gray',s = size,alpha = alp)
ax.scatter(l_ASIS[0],l_ASIS[2],-l_ASIS[1],color = 'gray',s = size,alpha = alp)
ax.scatter(b_pel[0],b_pel[2],-b_pel[1],color = 'gray',s = size,alpha = alp)
# ax.scatter(pel2[0],pel2[2],-pel2[1],color = 'gray',s = size,alpha = alp)
ax.scatter(r_c_shoul[0],r_c_shoul[2],-r_c_shoul[1],color = 'navy',s = size,alpha = alp)
ax.scatter(r_c_elb[0],r_c_elb[2],-r_c_elb[1],color = 'navy',s = size,alpha = alp)
ax.scatter(r_c_wri[0],r_c_wri[2],-r_c_wri[1],color = 'navy',s = size,alpha = alp)
ax.scatter(l_c_shoul[0],l_c_shoul[2],-l_c_shoul[1],color = 'crimson',s = size,alpha = alp)
ax.scatter(l_c_elb[0],l_c_elb[2],-l_c_elb[1],color = 'crimson',s = size,alpha = alp)
ax.scatter(l_c_wri[0],l_c_wri[2],-l_c_wri[1],color = 'crimson',s = size,alpha = alp)
ax.scatter(r_c_hip[0],r_c_hip[2],-r_c_hip[1],color = 'navy',s = size,alpha = alp)
ax.scatter(r_c_knee[0],r_c_knee[2],-r_c_knee[1],color = 'navy',s = size,alpha = alp)
ax.scatter(r_c_ank[0],r_c_ank[2],-r_c_ank[1],color = 'navy',s = size,alpha = alp)
ax.scatter(r_c_foot[0],r_c_foot[2],-r_c_foot[1],color = 'navy',s = size,alpha = alp)
ax.scatter(r_c_heel[0],r_c_heel[2],-r_c_heel[1],color = 'navy',s = size,alpha = alp)
ax.scatter(l_c_hip[0],l_c_hip[2],-l_c_hip[1],color = 'crimson',s = size,alpha = alp)
ax.scatter(l_c_knee[0],l_c_knee[2],-l_c_knee[1],color = 'crimson',s = size,alpha = alp)
ax.scatter(l_c_ank[0],l_c_ank[2],-l_c_ank[1],color = 'crimson',s = size,alpha = alp)
ax.scatter(l_c_foot[0],l_c_foot[2],-l_c_foot[1],color = 'crimson',s = size,alpha = alp)
ax.scatter(l_c_heel[0],l_c_heel[2],-l_c_heel[1],color = 'crimson',s = size,alpha = alp)
ax.plot([c_neck[0],r_c_shoul[0]],[c_neck[2],r_c_shoul[2]],[-c_neck[1],-r_c_shoul[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([c_neck[0],l_c_shoul[0]],[c_neck[2],l_c_shoul[2]],[-c_neck[1],-l_c_shoul[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([c_neck[0],spine[0]],[c_neck[2],spine[2]],[-c_neck[1],-spine[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([spine[0],pel[0]],[spine[2],pel[2]],[-spine[1],-pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([r_ASIS[0],pel[0]],[r_ASIS[2],pel[2]],[-r_ASIS[1],-pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([l_ASIS[0],pel[0]],[l_ASIS[2],pel[2]],[-l_ASIS[1],-pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([l_ASIS[0],r_ASIS[0]],[l_ASIS[2],r_ASIS[2]],[-l_ASIS[1],-r_ASIS[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([l_ASIS[0],b_pel[0]],[l_ASIS[2],b_pel[2]],[-l_ASIS[1],-b_pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([r_ASIS[0],b_pel[0]],[r_ASIS[2],b_pel[2]],[-r_ASIS[1],-b_pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([l_c_hip[0],pel[0]],[l_c_hip[2],pel[2]],[-l_c_hip[1],-pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([r_c_hip[0],pel[0]],[r_c_hip[2],pel[2]],[-r_c_hip[1],-pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([r_c_hip[0],r_ASIS[0]],[r_c_hip[2],r_ASIS[2]],[-r_c_hip[1],-r_ASIS[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([r_c_hip[0],b_pel[0]],[r_c_hip[2],b_pel[2]],[-r_c_hip[1],-b_pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([l_c_hip[0],l_ASIS[0]],[l_c_hip[2],l_ASIS[2]],[-l_c_hip[1],-l_ASIS[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([l_c_hip[0],b_pel[0]],[l_c_hip[2],b_pel[2]],[-l_c_hip[1],-b_pel[1]],color ='gray' ,linewidth = 2,alpha = alp)
ax.plot([r_c_hip[0],r_c_knee[0]],[r_c_hip[2],r_c_knee[2]],[-r_c_hip[1],-r_c_knee[1]],color ='navy' ,linewidth = 2,alpha = alp)
ax.plot([r_c_knee[0],r_c_ank[0]],[r_c_knee[2],r_c_ank[2]],[-r_c_knee[1],-r_c_ank[1]],color ='navy' ,linewidth = 2,alpha = alp)
ax.plot([r_c_ank[0],r_c_foot[0]],[r_c_ank[2],r_c_foot[2]],[-r_c_ank[1],-r_c_foot[1]],color ='navy' ,linewidth = 2,alpha = alp)
ax.plot([r_c_ank[0],r_c_heel[0]],[r_c_ank[2],r_c_heel[2]],[-r_c_ank[1],-r_c_heel[1]],color ='navy' ,linewidth = 2,alpha = alp)
ax.plot([r_c_foot[0],r_c_heel[0]],[r_c_foot[2],r_c_heel[2]],[-r_c_foot[1],-r_c_heel[1]],color ='navy' ,linewidth = 2,alpha = alp)
ax.plot([l_c_hip[0],l_c_knee[0]],[l_c_hip[2],l_c_knee[2]],[-l_c_hip[1],-l_c_knee[1]],color ='crimson' ,linewidth = 2,alpha = alp)
ax.plot([l_c_knee[0],l_c_ank[0]],[l_c_knee[2],l_c_ank[2]],[-l_c_knee[1],-l_c_ank[1]],color ='crimson' ,linewidth = 2,alpha = alp)
ax.plot([l_c_ank[0],l_c_foot[0]],[l_c_ank[2],l_c_foot[2]],[-l_c_ank[1],-l_c_foot[1]],color ='crimson' ,linewidth = 2,alpha = alp)
ax.plot([l_c_ank[0],l_c_heel[0]],[l_c_ank[2],l_c_heel[2]],[-l_c_ank[1],-l_c_heel[1]],color ='crimson' ,linewidth = 2,alpha = alp)
ax.plot([l_c_foot[0],l_c_heel[0]],[l_c_foot[2],l_c_heel[2]],[-l_c_foot[1],-l_c_heel[1]],color ='crimson' ,linewidth = 2,alpha = alp)
ax.plot([r_c_shoul[0],r_c_elb[0]],[r_c_shoul[2],r_c_elb[2]],[-r_c_shoul[1],-r_c_elb[1]],color ='navy' ,linewidth = 2,alpha = alp)
ax.plot([r_c_elb[0],r_c_wri[0]],[r_c_elb[2],r_c_wri[2]],[-r_c_elb[1],-r_c_wri[1]],color ='navy' ,linewidth = 2,alpha = alp)
ax.plot([l_c_shoul[0],l_c_elb[0]],[l_c_shoul[2],l_c_elb[2]],[-l_c_shoul[1],-l_c_elb[1]],color ='crimson' ,linewidth = 2,alpha = alp)
ax.plot([l_c_elb[0],l_c_wri[0]],[l_c_elb[2],l_c_wri[2]],[-l_c_elb[1],-l_c_wri[1]],color ='crimson' ,linewidth = 2,alpha = alp)
import _pickle as pickle import joblib results =joblib.load(filename[0]) k_list =list(results.keys()) joint1 = results[k_list[0]]['3d_joints'][0]
.jpg)