import os import numpy as np try: import matplotlib.cm as mplcm from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D except ImportError: pass import openpifpaf CAR_KEYPOINTS_24 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24'] CAR_SKELETON_24 = [ [1, 2],[2, 3],[3, 4],[4, 5],[5, 6],[6, 7],[7, 8],[8, 9],[9, 10],[10, 11], [11, 12],[12, 13],[13, 14],[14, 15],[15, 16],[16, 17],[17, 18],[18, 19],[19, 20], [20, 21],[21, 22],[22, 23],[23, 24],[24, 1],[24, 3],[1, 5] ] CAR_CATEGORIES_24 = ['karusel'] CAR_SCORE_WEIGHTS_24 = [5,5,5,0.5,2,2,5,1,1,1,1,4,3,2,3,3,3,1,5,5,2,4,0.5,2] CAR_SIGMAS_24 = [0.05] * len(CAR_KEYPOINTS_24) CAR_POSE_24 = np.array([[ 129., -137., 0.], [ -41., 33., 0.], [ -65., 46., 0.], [ 22., -134., 0.], [ 70., -253., 0.], [ 69., -329., 0.], [ -37., -224., 0.], [ -88., -199., 0.], [-143., -171., 0.], [-173., -119., 0.], [-219., -30., 0.], [-307., -26., 0.], [-207., 123., 0.], [-138., 258., 0.], [ -43., 240., 0.], [ 10., 242., 0.], [ 62., 229., 0.], [ 146., 174., 0.], [ 213., 138., 0.], [ 230., 59., 0.], [ 302., -11., 0.], [ 288., -93., 0.], [ 172., -65., 0.], [ 103., -14., 0.]]) HFLIP_24 = { '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9', '10': '10', '11': '11', '12': '12', '13': '13', '14': '14', '15': '15', '16': '16', '17': '17', '18': '18', '19': '19', '20': '20', '21': '21', '22': '22', '23': '23', '24': '24' } training_weights_local_centrality = [ 0.890968488270775, 0.716506138617812, 1.05674590410869, 0.764774195768455, 0.637682585483328, 0.686680807728366, 0.955422595797394, 0.936714585642375, 1.34823795445326, 1.38308992581967, 1.32689945125819, 1.38838655605483, 1.18980184904613, 1.02584355494795, 0.90969156732068, 1.24732068576104, 1.11338768064342, 0.933815217550391, 0.852297518872114, 1.04167641424727, 1.01668968075247, 1.34625964088011, 0.911796331039028, 0.866206536337413, 1.55957820407853, 0.730844382675724, 0.651138644197359, 0.758018559633786, 1.31842501396691, 1.32186116654782, 0.744347016851606, 0.636390683664723, 0.715244950821949, 1.63122349407032, 0.849835699185461, 0.910488007220499, 1.44244151650561, 1.14150437331681, 1.19808610191343, 0.960186788642886, 1.05023623286937, 1.19761709710598, 1.3872216313401, 1.01256700741214, 1.1167909667759, 1.27893496336199, 1.54475684725655, 1.40343733870633, 1.45552060866114, 1.47264222155031, 0.970060423999993, 0.944450314768933, 0.623987071240172, 0.5745237907704, 0.66890646050993, 0.978411632994504, 0.587396395188292, 0.76307999741129, 0.609793563449648, 0.67983566494545, 0.685883538168462, 0.753587600664775, 0.770335133588157, 0.764713638033368, 0.792364155965385, 0.796435233566833 ] def get_constants(num_kps): if num_kps == 24: CAR_POSE_24[:, 2] = 2.0 return [CAR_KEYPOINTS_24, CAR_SKELETON_24, HFLIP_24, CAR_SIGMAS_24, CAR_POSE_24, CAR_CATEGORIES_24, CAR_SCORE_WEIGHTS_24] if num_kps == 66: CAR_POSE_66[:, 2] = 2.0 return [CAR_KEYPOINTS_66, CAR_SKELETON_66, HFLIP_66, CAR_SIGMAS_66, CAR_POSE_66, CAR_CATEGORIES_66, CAR_SCORE_WEIGHTS_66] # using no if-elif-else construction due to pylint no-else-return error raise Exception("Only poses with 24 or 66 keypoints are available.") def draw_ann(ann, *, keypoint_painter, filename=None, margin=0.5, aspect=None, **kwargs): from openpifpaf import show # pylint: disable=import-outside-toplevel bbox = ann.bbox() xlim = bbox[0] - margin, bbox[0] + bbox[2] + margin ylim = bbox[1] - margin, bbox[1] + bbox[3] + margin if aspect == 'equal': fig_w = 5.0 else: fig_w = 5.0 / (ylim[1] - ylim[0]) * (xlim[1] - xlim[0]) with show.canvas(filename, figsize=(fig_w, 5), nomargin=True, **kwargs) as ax: ax.set_axis_off() ax.set_xlim(*xlim) ax.set_ylim(*ylim) if aspect is not None: ax.set_aspect(aspect) keypoint_painter.annotation(ax, ann) def draw_skeletons(pose, sigmas, skel, kps, scr_weights): from openpifpaf.annotation import Annotation # pylint: disable=import-outside-toplevel from openpifpaf import show # pylint: disable=import-outside-toplevel scale = np.sqrt( (np.max(pose[:, 0]) - np.min(pose[:, 0])) * (np.max(pose[:, 1]) - np.min(pose[:, 1])) ) show.KeypointPainter.show_joint_scales = True keypoint_painter = show.KeypointPainter() ann = Annotation(keypoints=kps, skeleton=skel, score_weights=scr_weights) ann.set(pose, np.array(sigmas) * scale) os.makedirs('docs', exist_ok=True) draw_ann(ann, filename='docs/skeleton_car.png', keypoint_painter=keypoint_painter) def plot3d_red(ax_2D, p3d, skeleton): skeleton = [(bone[0] - 1, bone[1] - 1) for bone in skeleton] rot_p90_x = np.array([[1, 0, 0], [0, 0, 1], [0, 1, 0]]) p3d = p3d @ rot_p90_x fig = ax_2D.get_figure() ax = Axes3D(fig, auto_add_to_figure=False) fig.add_axes(ax) ax.set_axis_off() ax_2D.set_axis_off() ax.view_init(azim=-90, elev=20) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') max_range = np.array([p3d[:, 0].max() - p3d[:, 0].min(), p3d[:, 1].max() - p3d[:, 1].min(), p3d[:, 2].max() - p3d[:, 2].min()]).max() / 2.0 mid_x = (p3d[:, 0].max() + p3d[:, 0].min()) * 0.5 mid_y = (p3d[:, 1].max() + p3d[:, 1].min()) * 0.5 mid_z = (p3d[:, 2].max() + p3d[:, 2].min()) * 0.5 ax.set_xlim(mid_x - max_range, mid_x + max_range) ax.set_ylim(mid_y - max_range, mid_y + max_range) ax.set_zlim(mid_z - max_range, mid_z + max_range) # pylint: disable=no-member for ci, bone in enumerate(skeleton): c = mplcm.get_cmap('tab20')((ci % 20 + 0.05) / 20) # Same coloring as Pifpaf preds ax.plot(p3d[bone, 0], p3d[bone, 1], p3d[bone, 2], color=c) def animate(i): ax.view_init(elev=10., azim=i) return fig return FuncAnimation(fig, animate, frames=360, interval=100) def print_associations(): print("\nAssociations of the car skeleton with 24 keypoints") for j1, j2 in CAR_SKELETON_24: print(CAR_KEYPOINTS_24[j1 - 1], '-', CAR_KEYPOINTS_24[j2 - 1]) print("\nAssociations of the car skeleton with 66 keypoints") for j1, j2 in CAR_SKELETON_66: print(CAR_KEYPOINTS_66[j1 - 1], '-', CAR_KEYPOINTS_66[j2 - 1]) def main(): # print_associations() # ============================================================================= # draw_skeletons(CAR_POSE_24, sigmas = CAR_SIGMAS_24, skel = CAR_SKELETON_24, # kps = CAR_KEYPOINTS_24, scr_weights = CAR_SCORE_WEIGHTS_24) # draw_skeletons(CAR_POSE_66, sigmas = CAR_SIGMAS_66, skel = CAR_SKELETON_66, # kps = CAR_KEYPOINTS_66, scr_weights = CAR_SCORE_WEIGHTS_66) # ============================================================================= # with openpifpaf.show.Canvas.blank(nomargin=True) as ax_2D: # anim_66 = plot3d_red(ax_2D, CAR_POSE_66, CAR_SKELETON_66) # anim_66.save('./CAR_66_Pose.gif', fps=30) with openpifpaf.show.Canvas.blank(nomargin=True) as ax_2D: anim_24 = plot3d_red(ax_2D, CAR_POSE_24, CAR_SKELETON_24) anim_24.save('./CAR_24_Pose.gif', fps=30) if __name__ == '__main__': main()