Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition

Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition. Recording the process in the project.
The paper pdf is here; The code repository is here


Check List


17->18关节点

st-gcn输入18个关节点,而HRNet输出17个关节点(少了neck),用左肩和右肩平均代替

关节点标注见OneNote:/PRIS/notes/Keypoint 关节点标注

TBD…


realtime_demo渲染慢

python显示视频慢,直接保存到本地png,打开png会自动刷新,与视频无异
但还是最好找到高性能的视频包

TBD…


鬼影问题

Problem
offline_demo中骨架总是比真人慢几拍,有的视频会这样但有的却不会,而且realtime_demo不会出现这个问题

Solution
在视频渲染函数1的输入参数中 骨架和视频是分开的,说明生成的骨架就已经有了偏移。
生成骨架是由 demo 中的 naive_pose_tracker类负责的,而原作者也说了这个class是简单写的,可能会有问题。

""" A simple tracker for recording person poses and generating skeleton sequences.
For actual occasion, I recommend you to implement a robuster tracker.
Pull-requests are welcomed.
"""

pose tracker

溯因后发现根本原因在于 get_skeleton_sequence函数中假设 trace 的 latest_frame 能达到 data_frame
而对于offline_demo来说latest_frame不一定总是达到data_frame(offline的data_frame等于视频长度)
但对于realtime_demo来说视频渲染函数输入是单帧的骨架

修改get_skeleton_sequence中end的计算即可

- end = self.data_frame - (self.latest_frame - latest_frame)
+ end = latest_frame

提取关节点

Problem
在导入Python json包,调用json.dump/dumps函数时,python对象转json时报错 TypeError: Object of type 'float32' is not JSON serializable 也就是无法序列化某些对象格式

Solution 1
自定义序列化方法

class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        if isinstance(obj, time):
            return obj.__str__()
        else:
            return super(NpEncoder, self).default(obj)

然后在调用json.dump/dumps时,指定使用自定义序列化方法

json.dumps(data, cls=MyEncoder) 

Solution 2
将其转化为可以序列化的对象格式,比如int(),str()

BTW
四舍五入取整

int(x+0.5)

训练数据

Problem
训练精度不变,label不变

Solution
原来是数据处理的时候忘记了归一化,要把坐标归一化到视频画面的宽高范围内

  1. utils.visualization.stgcn_visualize