zoukankan      html  css  js  c++  java
  • PKU-MMD骨架数据可视化程序,动态图,python

    PKU-MMD数据集简介

    官网链接:https://www.icst.pku.edu.cn/struct/Projects/PKUMMD.html

    除官网提供的一些信息外,下面我再补充两点信息。

    补充信息1

    各条视频的长度,如下表,第一条视频有4674帧,第二条视频有4049帧。每一个view有359条视频,总共有1825266帧,平均每个视频有约5070帧。下表中的最后一个数字0是为了画表格而随手加上去的。

    补充信息2

    第一个视频的第一帧中,第一个人的骨架节点坐标,第一列表示x坐标,第二列表示y坐标,第三列表示z坐标:

    骨架数据可视化

    PKU-MMD数据集中数据数据顺序与各节点的对应关系如下图所示。官网上没给出这个对应关系,我通过视频和数据散点图之间来回核对,摸清了这个对应关系。

    图中的骨架各节点的连接方式是通过看原论文(PKU-MMD: A Large Scale Benchmark for Continuous Multi-Modal Human Action Understanding)而画出来的,但我最近看到另外一篇论文(A Deep Learning Approach for Human Action Recognition using Skeletal Information)的画法:

    这两种画法唯一的区别在手部,后者似乎更合理。但为了和原论文吻合,下面的可视化程序采用的是前者。

    动态可视化程序如下:

    import os
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    file_name = '0017-M.txt'
    points = np.loadtxt(os.path.join('/Users/wangpeng/Desktop/PKU_MMD/Skeleton', file_name), dtype=np.float)
    row = points.shape[0]
    point = (points[:, :75]).reshape(row, 25, 3)
    xmax = np.max(point[:, :, 0])
    xmin = np.min(point[:, :, 0])
    ymax = np.max(point[:, :, 1])
    ymin = np.min(point[:, :, 1])
    zmax = np.max(point[:, :, 2])
    zmin = np.min(point[:, :, 2])
    
    # 读取标签
    num_classes = 52   # number of classes
    gt_array = np.loadtxt(os.path.join('/Users/wangpeng/Desktop/PKU_MMD/Label', file_name), dtype=np.int, delimiter=',')
    label = np.ones([row, ], dtype=np.int) * (num_classes - 1)   # 0~50th is the original ground truth. The 51st class is the background.
    for i in range(gt_array.shape[0]):
        label[gt_array[i, 1]-1: gt_array[i, 2]-1] = gt_array[i, 0] - 1   # 末尾的-1是为了让标签从0开始
    
    # 相邻各节点列表,用来画节点之间的连接线
    arm = [21, 7, 6, 5, 4, 20, 8, 9, 10, 11, 23]
    rightHand = [22, 7]
    leftHand = [24, 11]
    bodyLeg = [3, 2, 20, 1, 0, 12, 13, 14, 15]
    leftLeg = [0, 16, 17, 18, 19]
    
    # 2D展示------------------------------------------------------------------------
    n = 0   # 从第n帧开始展示
    m = 1   # 到第m帧结束,n<m<row
    plt.figure()
    plt.ion()
    for i in range(n, m):
        plt.cla()
        plt.scatter(point[i, :, 0], point[i, :, 1], c='red', s=40.0)
        plt.plot(point[i, arm, 0], point[i, arm, 1], c='green', lw=2.0)
        plt.plot(point[i, rightHand, 0], point[i, rightHand, 1], c='green', lw=2.0)
        plt.plot(point[i, leftHand, 0], point[i, leftHand, 1], c='green', lw=2.0)
        plt.plot(point[i, bodyLeg, 0], point[i, bodyLeg, 1], c='green', lw=2.0)
        plt.plot(point[i, leftLeg, 0], point[i, leftLeg, 1], c='green', lw=2.0)
        plt.text(xmax-0.8, ymax-0.2, 'frame: {}/{}'.format(i, row))
        plt.text(xmax-0.8, ymax-0.4, 'label: ' + str(label[i]))
        plt.xlim(xmin, xmax)
        plt.ylim(ymin, ymax)
        plt.pause(0.01)
    
    plt.ioff()
    plt.show()
    
    
    # 3D展示------------------------------------------------------------------------
    #n = 1100   # 从第n帧开始展示
    #m = 1200   # 到第m帧结束,n<m<row
    #fig = plt.figure()   # 先生成一块画布,然后在画布上添加3D坐标轴
    #plt.ion()
    #for i in range(n, m):
    #    fig.clf()
    #    ax = Axes3D(fig)
    #    ax.scatter(point[i, :, 0], point[i, :, 1], point[i, :, 2], c='red', s=40.0)
    #    ax.plot(point[i, arm, 0], point[i, arm, 1], point[i, arm, 2], c='green', lw=2.0)
    #    ax.plot(point[i, rightHand, 0], point[i, rightHand, 1], point[i, rightHand, 2], c='green', lw=2.0)
    #    ax.plot(point[i, leftHand, 0], point[i, leftHand, 1], point[i, leftHand, 2], c='green', lw=2.0)
    #    ax.plot(point[i, bodyLeg, 0], point[i, bodyLeg, 1], point[i, bodyLeg, 2], c='green', lw=2.0)
    #    ax.plot(point[i, leftLeg, 0], point[i, leftLeg, 1], point[i, leftLeg, 2], c='green', lw=2.0)
    #    ax.text(xmax-0.8, ymax-0.2, zmax-0.2, 'frame {}/{}'.format(i, row))
    #    ax.text(xmax-0.8, ymax-0.4, zmax-0.4, 'label: ' + str(label[i]))
    #    ax.set_xlabel("X")
    #    ax.set_ylabel("Y")
    #    ax.set_zlabel("Z")
    #    ax.set_xlim(xmin, xmax)
    #    ax.set_ylim(ymin, ymax)
    #    ax.set_zlim(zmin, zmax)
    #    plt.pause(0.01)
    #
    #plt.ioff()
    #plt.show()

    下面只展示第一帧:

  • 相关阅读:
    带你封装自己的『权限管理』框架
    一夜搞懂 | JVM 线程安全与锁优化
    一夜搞懂 | Java 内存模型与线程
    一夜搞懂 | JVM 字节码执行引擎
    一夜搞懂 | JVM 类加载机制
    一夜搞懂 | JVM GC&内存分配
    一文洞悉JVM内存管理机制
    Redis 的基本数据类型 和 基础应用场景
    MyISAM 和 InnoDB 索引结构及其实现原理
    一次性搞懂 PHP 中面向对象的所有知识点。
  • 原文地址:https://www.cnblogs.com/picassooo/p/13793810.html
Copyright © 2011-2022 走看看