Views
No views yet
subfolder argument.subfolder | Dataset | Protocol | Modality | Classes | Params | Top-1 |
|---|---|---|---|---|---|---|
ntu60-xsub-joint | NTU RGB+D 60 | X-Sub | joint | 60 | 3.62M | 92.6% J+B: 93.0% |
ntu60-xsub-bone | NTU RGB+D 60 | X-Sub | bone | 60 | 3.62M | 92.1% J+B: 93.0% |
ntu60-xview-joint | NTU RGB+D 60 | X-View | joint | 60 | 3.62M | 97.0% J+B: 97.4% |
ntu60-xview-bone | NTU RGB+D 60 | X-View | bone | 60 | 3.62M | 96.5% J+B: 97.4% |
ntu120-xsub-joint | NTU RGB+D 120 | X-Sub | joint | 120 | 3.63M | 87.7% J+B: 89.4% |
ntu120-xsub-bone | NTU RGB+D 120 | X-Sub | bone | 120 | 3.63M | 88.2% J+B: 89.4% |
ntu120-xset-joint | NTU RGB+D 120 | X-Set | joint | 120 | 3.63M | 89.3% J+B: 91.0% |
ntu120-xset-bone | NTU RGB+D 120 | X-Set | bone | 120 | 3.63M | 89.8% J+B: 91.0% |
ntu60-inter-xsub-joint | NTU-Inter | X-Sub | joint | 11 | 3.61M | 97.1% |
ntu60-inter-xview-joint | NTU-Inter | X-View | joint | 11 | 3.61M | 99.3% |
ntu120-inter-xsub-joint | NTU-Inter 120 | X-Sub | joint | 26 | 3.61M | 92.3% |
ntu120-inter-xset-joint | NTU-Inter 120 | X-Set | joint | 26 | 3.61M | 93.2% |
nwucla-joint | NW-UCLA | official split | joint | 10 | 1.93M | 98.3% |
nwucla-bone | NW-UCLA | official split | bone | 10 | 1.93M | 98.3% |
J+B is the E2 ensemble — average the
softmax outputs of the joint and bone checkpoints of the same row pair. The paper reports a
single NW-UCLA figure with no per-modality or per-ensemble breakdown, so it is listed once
rather than attributed to either stream.1pip install torch timm huggingface_hub safetensors
2pip install git+https://github.com/KAIST-VICLab/SkateFormer.git1import torch
2from skateformer import SkateFormer
3
4model = SkateFormer.from_pretrained(
5 "JeonghyeokDo/SkateFormer", subfolder="ntu60-xsub-joint"
6).eval()
7
8# [B, C, T, V, M] — already joint-partitioned, see below
9x = torch.randn(1, 3, 64, 24, 2)
10with torch.no_grad():
11 logits = model(x) # -> [1, 60]
12
13print(model.id2label[logits.argmax(-1).item()])skateformer.preprocessing reproduces the evaluation-time path of the original
feeders:1import numpy as np
2from skateformer.preprocessing import prepare_input
3
4raw = np.random.randn(3, 300, 25, 2) # [C, T, V, M] raw NTU skeleton (25 joints, 2 people)
5x, index_t = prepare_input(raw, valid_frame_num=120, layout="ntu", modality="j")
6
7with torch.no_grad():
8 logits = model(x, index_t)layout="nw_ucla" (20 joints, 1 person) for the NW-UCLA checkpoints, and
modality="b" for the bone ones — the modality must match the checkpoint you loaded.index_t carries the normalised timestamps of the sampled frames (in [-1, 1]) and drives
the model's temporal index embedding. If omitted, the model assumes a clip that uniformly
spans the whole sequence.1joint = SkateFormer.from_pretrained("JeonghyeokDo/SkateFormer", subfolder="ntu60-xsub-joint").eval()
2bone = SkateFormer.from_pretrained("JeonghyeokDo/SkateFormer", subfolder="ntu60-xsub-bone").eval()
3
4xj, t = prepare_input(raw, valid_frame_num=120, layout="ntu", modality="j")
5xb, _ = prepare_input(raw, valid_frame_num=120, layout="ntu", modality="b")
6with torch.no_grad():
7 probs = (joint(xj, t).softmax(-1) + bone(xb, t).softmax(-1)) / 2model.id2label maps class ids to names for the loaded checkpoint. The label sets are
NTU RGB+D 60 (60), NTU RGB+D 120 (120), NTU-Inter (11: A50-A60), NTU-Inter 120
(26: A50-A60 + A106-A120) and NW-UCLA (10):1@inproceedings{do2024skateformer,
2 title = {SkateFormer: Skeletal-Temporal Transformer for Human Action Recognition},
3 author = {Do, Jeonghyeok and Kim, Munchurl},
4 booktitle = {European Conference on Computer Vision (ECCV)},
5 year = {2024}
6}