SLiM / README.md
JeonghyeokDo's picture
Add SLiM NTU-60 encoders and linear probes
6b3e488 verified
|
Raw
History Blame Contribute Delete
2.86 kB
---
license: apache-2.0
library_name: slim
tags:
- skeleton-action-recognition
- self-supervised-learning
- action-recognition
- pytorch
---
# SLiM
Encoders from **Less is More: Compact-Token Masked Feature Learning for Skeleton Representation
Learning**.
- Paper: https://arxiv.org/abs/2603.10648
- Project page: https://kaist-viclab.github.io/SLiM_site/
- Code: https://github.com/KAIST-VICLab/SLiM
SLiM patchifies a 64-frame skeleton clip with `P_T = 8`, `P_J = 1` into a compact `8 x 25` token
grid and trains a ViT encoder (8 blocks, dim 256, 8 heads) against an EMA teacher with masked
feature prediction and global-local contrastive learning. No coordinate decoder is used, and
downstream inference costs 3.59 GFLOPs.
## Available checkpoints
One encoder per evaluation protocol, each in its own subfolder. Linear evaluation uses a frozen
encoder, a linear classifier and a single joint stream.
| subfolder | protocol | epoch | Top-1 (%) |
| --- | --- | ---: | ---: |
| `ntu60_xsub` | NTU RGB+D 60 X-Sub | 120 | 87.9 |
| `ntu60_xview` | NTU RGB+D 60 X-View | 150 | 93.2 |
**NTU RGB+D 120 weights are coming** and will be added here as `ntu120_xsub` and `ntu120_xset`.
## Usage
```bash
git clone https://github.com/KAIST-VICLab/SLiM && cd SLiM
pip install -r requirements.txt huggingface_hub safetensors
```
xFormers and a CUDA GPU are required β€” the temporal-RoPE attention has no CPU path.
```python
import torch
from slim.hub import SLiMEncoder
model = SLiMEncoder.from_pretrained("JeonghyeokDo/SLiM", subfolder="ntu60_xsub").eval().cuda()
# clips: (B, 3, 64, 25, M) β€” coordinates, frames, joints, people
clips = torch.zeros(2, 3, 64, 25, 1).cuda()
with torch.no_grad():
feats = model.get_intermediate_layers(clips, 4, return_class_token=True)
patch_tokens, cls_token = feats[-1] # (B, 200, 256), (B, 256)
```
Evaluate each encoder on its own protocol only. Inputs follow the repository's preprocessing:
clips are resampled to 64 frames, one person per token sequence, coordinates shifted so that
joint 1 of the first frame is the origin.
## Files
```
ntu60_xsub/
β”œβ”€β”€ config.json, model.safetensors encoder β€” load with subfolder="ntu60_xsub"
└── linear/ the trained linear-probe grid behind the number above
ntu60_xview/
β”œβ”€β”€ config.json, model.safetensors encoder β€” load with subfolder="ntu60_xview"
└── linear/
```
See the repository README for the evaluation commands.
## Citation
```bibtex
@article{do2026slim,
title = {Less is More: Compact-Token Masked Feature Learning for Skeleton Representation Learning},
author = {Do, Jeonghyeok and Chen, Yun and Youk, Geunhyuk and Kim, Munchurl},
journal = {arXiv preprint arXiv:2603.10648},
year = {2026}
}
```
Built on [DINOv2](https://github.com/facebookresearch/dinov2) (Apache 2.0).