Downloads · 30 days
209
12% of all-time downloads
Sa74ll/smolvla_so101_pickandplace
smolvla_so101_pickandplace is a robotics model from Sa74ll. Use it for the robotics task on the model card, and read the license before you ship it in a product. It is set up for lerobot. The card lists the license as mit.
87.66% success rate on SO-101 pick-and-place task through data-centric approach.
Downloads · 30 days
209
12% of all-time downloads
All-time downloads
1.8K
Public
Parameters
450M
907 MB on disk
Likes
3
Public
Click a slice to open those files.
.safetensors907 MB · 100%
How the weights are stored.
BF16447M · 99%
From the Hugging Face model README
87.66% success rate on SO-101 pick-and-place task through data-centric approach.
This is a fine-tuned version of SmolVLA trained on the SO-101 pick-and-place dataset.
Key Achievement: Improved from 60.92% to 87.66% success rate (+44%) by implementing position-aware stratified data splitting instead of hyperparameter tuning.
This model is designed for:
Out-of-scope: This model is fine-tuned specifically for SO-101 pick-and-place. Performance on other tasks or robots is not guaranteed.
| Joint | Success Rate |
|---|---|
| shoulder_pan | 98.13% |
| shoulder_lift | 82.91% |
| elbow_flex | 83.86% |
| wrist_flex | 80.38% |
| wrist_roll | 95.69% |
| gripper | 84.99% |
| Average | 87.66% |
| Metric | Sequential Split | Stratified Split | Improvement |
|---|---|---|---|
| Success Rate | 60.92% | 87.66% | +44% |
| Train/Val Gap | 5.0x | 1.7x | -66% |
| shoulder_pan | 45.81% | 98.13% | +114% |
| wrist_roll | 60.86% | 95.69% | +57% |
Key Innovation: Stratified splitting by cube position instead of sequential episode splitting.
# Stratified split ensures all 5 positions in train AND val
for position in range(5):
position_episodes = episodes[position*10:(position+1)*10]
train: 8 episodes per position (80%)
val: 2 episodes per position (20%)
Training hyperparameters:
Data augmentation:
pip install lerobot
from lerobot.common.policies.smolvla.modeling_smolvla import SmolVLAPolicy
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
import torch
# Load model
policy = SmolVLAPolicy.from_pretrained("your-username/smolvla-so101-stratified")
policy.eval()
policy.to("cuda")
# Load dataset for testing
dataset = LeRobotDataset("lerobot/svla_so101_pickplace")
# Get observation
obs = dataset[0]
# Prepare input
batch = {
'observation.images.camera1': obs['observation.images.up'].unsqueeze(0),
'observation.images.camera2': obs['observation.images.side'].unsqueeze(0),
'observation.state': obs['observation.state'].unsqueeze(0),
}
# Predict actions
with torch.no_grad():
actions = policy.predict_action_chunk(batch) # (1, 50, 6)
next_action = actions[0, 0, :] # First action in sequence
This model demonstrates that proper data handling can have larger impact than hyperparameter optimization.
What didn't work:
What worked:
The initial 5x train/val gap wasn't overfitting - it was unfair evaluation on underrepresented data (validation set was only position 4, which had few training examples).