rewardgen 0.1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rewardgen-0.1.0.0/PKG-INFO +419 -0
- rewardgen-0.1.0.0/README.md +386 -0
- rewardgen-0.1.0.0/pyproject.toml +77 -0
- rewardgen-0.1.0.0/rewardgen/__init__.py +14 -0
- rewardgen-0.1.0.0/rewardgen/api_models.py +256 -0
- rewardgen-0.1.0.0/rewardgen/core.py +1066 -0
- rewardgen-0.1.0.0/rewardgen/robometer/__init__.py +2 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/__init__.py +1 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/__init__.py +1 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/agibot/__init__.py +21 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/agibot/agibot_helper.py +170 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/agibot/download_task_jsons.py +42 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/data_scripts/libero/rerender_libero.py +322 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_helpers/generate_soar_labels_vlm.py +619 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_helpers/oxe_helper.py +815 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/agibotworld_loader.py +619 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/autoeval_loader.py +85 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/egocot_loader.py +188 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/egodex_loader.py +146 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/epic_loader.py +268 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/failsafe_loader.py +202 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/fino_net_loader.py +422 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/galaxea_loader.py +302 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/h2r_loader.py +380 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/hand_paired_loader.py +168 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/humanoid_everyday_loader.py +346 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/libero_loader.py +158 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/mit_franka_prank_loader.py +216 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/molmoact_loader.py +244 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/motif_loader.py +131 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/mw_collected_loader.py +161 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/mw_task_annotations.py +205 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/new_mit_franka_loader.py +262 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/oxe_loader.py +457 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/ph2d_loader.py +104 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/racer_loader.py +189 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/roboarena_loader.py +123 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/robofac_loader.py +452 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/robofail_loader.py +191 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/roboreward_loader.py +170 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/soar_loader.py +235 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/usc_franka_policy_ranking_loader.py +148 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/usc_koch_human_robot_paired_loader.py +466 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/usc_koch_p_ranking_loader.py +274 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/usc_xarm_policy_ranking_loader.py +164 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/utd_so101_clean_policy_ranking_loader.py +276 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/dataset_loaders/utd_so101_loader.py +158 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/generate_hf_dataset.py +1083 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/helpers.py +404 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/validate_dataset.py +196 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/video_helpers.py +238 -0
- rewardgen-0.1.0.0/rewardgen/robometer/dataset_upload/visualize_dataset.py +273 -0
- rewardgen-0.1.0.0/rewardgen/robometer/rg_robometer.py +244 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/configs/eval_configs.py +274 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/configs/experiment_configs.py +562 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/__init__.py +6 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/base.py +86 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/rbm_heads.py +694 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/rewind.py +164 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/collators/utils.py +197 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/dataset_category.py +558 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/dataset_types.py +68 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/__init__.py +13 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/base.py +774 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/custom_eval.py +67 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/helpers.py +703 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/name_mapping.py +96 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/name_mapping_final.py +96 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/rbm_data.py +253 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/repeated_dataset.py +24 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/datasets/strategy_first_dataset.py +657 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/__init__.py +19 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/base.py +782 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/base_pref.py +73 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/confusion_matrix.py +300 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/progress_policy_ranking.py +235 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/quality_preference.py +219 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/reward_alignment.py +174 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/eval/roboarena_quality_preference.py +121 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/pref.py +370 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/samplers/progress.py +176 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/data/scripts/preprocess_datasets.py +1095 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/evals/eval_server.py +802 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/evals/eval_utils.py +455 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/evals/eval_viz_utils.py +208 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/__init__.py +8 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/heads.py +101 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/rbm.py +993 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/rewind_transformer.py +396 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/models/utils.py +77 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/__init__.py +0 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/config_utils.py +41 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/distributed.py +273 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/embedding_utils.py +100 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/logger.py +441 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/metrics.py +210 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/save.py +973 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/setup_utils.py +1203 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/tensor_utils.py +27 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/timer.py +40 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/upload_to_hub.py +241 -0
- rewardgen-0.1.0.0/rewardgen/robometer/robometer/utils/video_utils.py +603 -0
- rewardgen-0.1.0.0/rewardgen/robometer/scripts/count_trajectories.py +370 -0
- rewardgen-0.1.0.0/rewardgen/robometer/scripts/example_inference.py +482 -0
- rewardgen-0.1.0.0/rewardgen/robometer/scripts/example_inference_local.py +201 -0
- rewardgen-0.1.0.0/rewardgen/robometer/scripts/example_libero_robometer_wrapper.py +736 -0
- rewardgen-0.1.0.0/rewardgen/robometer/scripts/robotics_demo_video_scraper.py +1039 -0
- rewardgen-0.1.0.0/rewardgen/robometer/train.py +358 -0
- rewardgen-0.1.0.0/rewardgen/roboreward.py +282 -0
- rewardgen-0.1.0.0/rewardgen/sole.py +762 -0
- rewardgen-0.1.0.0/rewardgen/topreward.py +483 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothBCOTrainer.py +2216 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothCPOTrainer.py +1996 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothDPOTrainer.py +2934 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothGKDTrainer.py +1347 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothGRPOTrainer.py +4282 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothKTOTrainer.py +2413 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothNashMDTrainer.py +1400 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothORPOTrainer.py +1920 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothOnlineDPOTrainer.py +2503 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothPPOTrainer.py +1694 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothPRMTrainer.py +1169 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothRLOOTrainer.py +2864 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothRewardTrainer.py +1387 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothSFTTrainer.py +1725 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/UnslothXPOTrainer.py +1445 -0
- rewardgen-0.1.0.0/rewardgen/unsloth_compiled_cache/moe_utils.py +1320 -0
- rewardgen-0.1.0.0/rewardgen/utils/__init__.py +2 -0
- rewardgen-0.1.0.0/rewardgen/utils/model_utils.py +47 -0
- rewardgen-0.1.0.0/rewardgen.egg-info/PKG-INFO +419 -0
- rewardgen-0.1.0.0/rewardgen.egg-info/SOURCES.txt +133 -0
- rewardgen-0.1.0.0/rewardgen.egg-info/dependency_links.txt +1 -0
- rewardgen-0.1.0.0/rewardgen.egg-info/requires.txt +25 -0
- rewardgen-0.1.0.0/rewardgen.egg-info/top_level.txt +1 -0
- rewardgen-0.1.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rewardgen
|
|
3
|
+
Version: 0.1.0.0
|
|
4
|
+
Summary: RewardGen package
|
|
5
|
+
Author: Philip
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: torch==2.9.0
|
|
9
|
+
Requires-Dist: torchvision==0.24.0
|
|
10
|
+
Requires-Dist: torchaudio==2.9.0
|
|
11
|
+
Requires-Dist: transformers==4.57.3
|
|
12
|
+
Requires-Dist: vllm==0.12.0
|
|
13
|
+
Requires-Dist: unsloth>=2025.10
|
|
14
|
+
Requires-Dist: wandb>=0.19.1
|
|
15
|
+
Requires-Dist: pillow
|
|
16
|
+
Requires-Dist: accelerate>=1.2.1
|
|
17
|
+
Requires-Dist: qwen_vl_utils
|
|
18
|
+
Requires-Dist: datasets>=3.2.0
|
|
19
|
+
Requires-Dist: trl
|
|
20
|
+
Requires-Dist: imageio
|
|
21
|
+
Requires-Dist: matplotlib
|
|
22
|
+
Requires-Dist: av<16.0.0,>=15.0.0
|
|
23
|
+
Requires-Dist: openai
|
|
24
|
+
Requires-Dist: google-genai
|
|
25
|
+
Requires-Dist: omegaconf>=2.3.0
|
|
26
|
+
Requires-Dist: hydra-core
|
|
27
|
+
Requires-Dist: tensorboard
|
|
28
|
+
Requires-Dist: peft
|
|
29
|
+
Requires-Dist: codetiming>=1.4.0
|
|
30
|
+
Requires-Dist: sentence-transformers>=2.0.0
|
|
31
|
+
Requires-Dist: decord>=0.6.0
|
|
32
|
+
Requires-Dist: lerobot>=0.4.4
|
|
33
|
+
|
|
34
|
+
<div align="center">
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# RewardGen
|
|
38
|
+
|
|
39
|
+
**RewardGen** is a python package that makes it easy to apply any ***reward model*** to your robot videos.
|
|
40
|
+
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
## Example videos
|
|
44
|
+
|
|
45
|
+
<!-- https://github.com/user-attachments/assets/cd481f28-0cb3-4874-bd50-1ec3ad8326ec -->
|
|
46
|
+
https://github.com/user-attachments/assets/3c444096-d3dd-47c7-b09d-90b0756d0f72
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## Supported Models
|
|
50
|
+
- Robometer (https://robometer.github.io)
|
|
51
|
+
- SOLE-R1 (https://philipmit.github.io/sole-r1/)
|
|
52
|
+
- TOPReward (https://topreward.github.io/webpage/)
|
|
53
|
+
- RoboReward (https://arxiv.org/abs/2601.00675)
|
|
54
|
+
- OpenAI models (e.g., `"GPT-5"`)
|
|
55
|
+
- Google models (e.g., `"Gemini-3-Pro-Preview"`)
|
|
56
|
+
|
|
57
|
+
## ToDos
|
|
58
|
+
- [ ] Enable fine-tuning of reward models on custom datasets
|
|
59
|
+
|
|
60
|
+
## File Structure
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
rewardgen/
|
|
64
|
+
├── rewardgen/ # Main package
|
|
65
|
+
│ ├── robometer/ # Robometer code
|
|
66
|
+
│ ├── sole.py # SOLE-R1 code
|
|
67
|
+
│ ├── roboreward.py # RoboReward code
|
|
68
|
+
│ ├── topreward.py # TOPReward code
|
|
69
|
+
│ └── api_models.py # OpenAI and Gemini APIs
|
|
70
|
+
├── test_videos/ # Example videos to test
|
|
71
|
+
├── model_outputs/ # Example videos showing model outputs
|
|
72
|
+
├── docs/
|
|
73
|
+
│ ├── lerobot_dataset_reward_annotation.mdx # Examples showing integration with lerobot datasets
|
|
74
|
+
└── pyproject.toml # Dependencies (uv)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
## Install
|
|
79
|
+
### Option 1: quick pip install
|
|
80
|
+
```bash
|
|
81
|
+
pip install -U rewardgen
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Option 2: use [uv](https://github.com/astral-sh/uv) for dependency management
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# 1) Clone the repository
|
|
88
|
+
git clone https://github.com/Philip-MIT/rewardgen
|
|
89
|
+
|
|
90
|
+
# 2) Install `uv`
|
|
91
|
+
pip install uv
|
|
92
|
+
|
|
93
|
+
# 3) Sync environment
|
|
94
|
+
uv sync
|
|
95
|
+
|
|
96
|
+
# 4) Activate environment
|
|
97
|
+
source .venv/bin/activate
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Optional: Pre-download model checkpoints
|
|
104
|
+
```bash
|
|
105
|
+
|
|
106
|
+
# SOLE-R1 (8B)
|
|
107
|
+
python -c "from rewardgen.utils.model_utils import get_model_dir; get_model_dir('sole-r1')"
|
|
108
|
+
|
|
109
|
+
# Robometer (4B)
|
|
110
|
+
python -c "from rewardgen.utils.model_utils import get_model_dir; get_model_dir('robometer')"
|
|
111
|
+
|
|
112
|
+
# TOPReward (based on Qwen3-VL-8B)
|
|
113
|
+
python -c "from rewardgen.utils.model_utils import get_model_dir; get_model_dir('topreward')"
|
|
114
|
+
|
|
115
|
+
# RoboReward (8B)
|
|
116
|
+
python -c "from rewardgen.utils.model_utils import get_model_dir; get_model_dir('roboreward')"
|
|
117
|
+
|
|
118
|
+
> **Note:** Robometer is ~8GB. SOLE-R1, RoboReward, and TOPReward are ~17GB each.
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
## Optional: Download all test videos and example model outputs
|
|
122
|
+
```bash
|
|
123
|
+
# 1) Install gcloud: https://cloud.google.com/sdk/docs/install
|
|
124
|
+
|
|
125
|
+
# 2) Go to target directory
|
|
126
|
+
# cd /path/to/rewardgen
|
|
127
|
+
|
|
128
|
+
# Optional: disable credentials so you don't have to authenticate
|
|
129
|
+
gcloud config set auth/disable_credentials True
|
|
130
|
+
|
|
131
|
+
# Download test videos
|
|
132
|
+
gcloud storage cp --recursive gs://roboreason-view-videos-philip/test_videos ./
|
|
133
|
+
|
|
134
|
+
# Download model outputs for all test videos
|
|
135
|
+
gcloud storage cp --recursive gs://roboreason-view-videos-philip/model_outputs ./
|
|
136
|
+
|
|
137
|
+
# Optional: re-enable credentials afterward if you disabled them above.
|
|
138
|
+
gcloud config set auth/disable_credentials False
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
## Quick start: Example reward generation and plotting
|
|
144
|
+
```python
|
|
145
|
+
# pip install -U rewardgen
|
|
146
|
+
from rewardgen import generate, video_plot
|
|
147
|
+
|
|
148
|
+
video_paths = ['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
|
|
149
|
+
task_description="Pick up the cube from the table."
|
|
150
|
+
|
|
151
|
+
# Robometer
|
|
152
|
+
rewards, success_probs = generate(model="Robometer", task_description=task_description, video_paths=video_paths, view_type='external', verbose=False)
|
|
153
|
+
output_robometer = {"model": "Robometer", "rewards": rewards[0]}
|
|
154
|
+
|
|
155
|
+
# SOLE-R1
|
|
156
|
+
rewards, reasoning_traces = generate(model="SOLE-R1", task_description=task_description, video_paths=video_paths, view_type='external and wrist', verbose=False)
|
|
157
|
+
output_sole = {"model": "SOLE-R1", "rewards": rewards[0], "reasoning_traces": reasoning_traces[0]}
|
|
158
|
+
|
|
159
|
+
# Optional: Ground-truth rewards (available for test videos from sim environments)
|
|
160
|
+
import json
|
|
161
|
+
with open(video_paths[0].replace(".mp4", "/data.json"), 'r') as f:
|
|
162
|
+
data = json.load(f)
|
|
163
|
+
|
|
164
|
+
output_groundtruth = {"model": "Ground truth", "rewards": data['ground-truth rewards']}
|
|
165
|
+
|
|
166
|
+
# Plot
|
|
167
|
+
video_plot(outputs=[output_groundtruth, output_sole, output_robometer], plot_save_path='model_outputs/combined/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4', video_path = video_paths[0], task_description=task_description)
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
## Examples for generating across all models
|
|
173
|
+
|
|
174
|
+
### Robometer
|
|
175
|
+
```python
|
|
176
|
+
|
|
177
|
+
from rewardgen import generate
|
|
178
|
+
|
|
179
|
+
video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
|
|
180
|
+
task_description="Pick up the cube from the table."
|
|
181
|
+
|
|
182
|
+
rewards, success_probs = generate(
|
|
183
|
+
model="Robometer",
|
|
184
|
+
task_description=task_description,
|
|
185
|
+
video_paths=video_paths,
|
|
186
|
+
view_type='external',
|
|
187
|
+
verbose=False
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### SOLE-R1
|
|
193
|
+
```python
|
|
194
|
+
|
|
195
|
+
from rewardgen import generate
|
|
196
|
+
|
|
197
|
+
video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
|
|
198
|
+
task_description="Pick up the cube from the table."
|
|
199
|
+
|
|
200
|
+
rewards, reasoning_traces = generate(
|
|
201
|
+
model="SOLE-R1",
|
|
202
|
+
task_description=task_description,
|
|
203
|
+
video_paths=video_paths,
|
|
204
|
+
view_type='external and wrist',
|
|
205
|
+
verbose=False
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
output_sole = {"model": "SOLE-R1", "rewards": rewards[0], "reasoning_traces": reasoning_traces[0]}
|
|
209
|
+
|
|
210
|
+
# Plotting with show_reasoning_traces=True
|
|
211
|
+
video_plot(
|
|
212
|
+
outputs=[output_sole],
|
|
213
|
+
plot_save_path='model_outputs/combined/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4',
|
|
214
|
+
video_path=video_paths[0],
|
|
215
|
+
show_reasoning_traces=True,
|
|
216
|
+
task_description=task_description,
|
|
217
|
+
verbose=False
|
|
218
|
+
)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
### TOPReward
|
|
223
|
+
```python
|
|
224
|
+
|
|
225
|
+
from rewardgen import generate
|
|
226
|
+
|
|
227
|
+
video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
|
|
228
|
+
task_description="Pick up the cube from the table."
|
|
229
|
+
|
|
230
|
+
rewards = generate(
|
|
231
|
+
model="TOPReward",
|
|
232
|
+
task_description=task_description,
|
|
233
|
+
video_paths=video_paths,
|
|
234
|
+
view_type='external',
|
|
235
|
+
verbose=False
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### RoboReward
|
|
241
|
+
```python
|
|
242
|
+
|
|
243
|
+
from rewardgen import generate
|
|
244
|
+
|
|
245
|
+
video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
|
|
246
|
+
task_description="Pick up the cube from the table."
|
|
247
|
+
|
|
248
|
+
rewards = generate(
|
|
249
|
+
model="RoboReward",
|
|
250
|
+
task_description=task_description,
|
|
251
|
+
video_paths=video_paths,
|
|
252
|
+
view_type='external',
|
|
253
|
+
verbose=False
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### GPT-5 (and other OpenAI models)
|
|
259
|
+
```python
|
|
260
|
+
|
|
261
|
+
from rewardgen import generate
|
|
262
|
+
|
|
263
|
+
video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
|
|
264
|
+
task_description="Pick up the cube from the table."
|
|
265
|
+
|
|
266
|
+
# requires OpenAI API key: https://developers.openai.com/api/docs/quickstart
|
|
267
|
+
API_KEY = "..."
|
|
268
|
+
|
|
269
|
+
rewards, reasoning_traces = generate(
|
|
270
|
+
model="GPT-5",
|
|
271
|
+
task_description=task_description,
|
|
272
|
+
video_paths=video_paths,
|
|
273
|
+
view_type='external',
|
|
274
|
+
key=API_KEY,
|
|
275
|
+
verbose=False
|
|
276
|
+
)
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Gemini-3-Pro (and other Google models)
|
|
280
|
+
```python
|
|
281
|
+
|
|
282
|
+
from rewardgen import generate
|
|
283
|
+
|
|
284
|
+
video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
|
|
285
|
+
task_description="Pick up the cube from the table."
|
|
286
|
+
|
|
287
|
+
# requires Gemini API key: https://ai.google.dev/gemini-api/docs/api-key
|
|
288
|
+
API_KEY = "..."
|
|
289
|
+
|
|
290
|
+
rewards, reasoning_traces = generate(
|
|
291
|
+
model="Gemini-3-Pro-Preview",
|
|
292
|
+
task_description=task_description,
|
|
293
|
+
video_paths=video_paths,
|
|
294
|
+
view_type='external',
|
|
295
|
+
key=API_KEY,
|
|
296
|
+
verbose=False
|
|
297
|
+
)
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Video plotting
|
|
301
|
+
```python
|
|
302
|
+
|
|
303
|
+
from rewardgen import generate, video_plot
|
|
304
|
+
|
|
305
|
+
video_paths=['test_videos/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4']
|
|
306
|
+
task_description="Pick up the cube from the table."
|
|
307
|
+
|
|
308
|
+
# Robometer
|
|
309
|
+
rewards, success_probs = generate(model="Robometer", task_description=task_description, video_paths=video_paths, view_type='external')
|
|
310
|
+
output_robometer = {"model": "Robometer", "rewards": rewards[0]}
|
|
311
|
+
|
|
312
|
+
# SOLE-R1
|
|
313
|
+
rewards, reasoning_traces = generate(model="SOLE-R1", task_description=task_description, video_paths=video_paths, view_type='external and wrist')
|
|
314
|
+
output_sole = {"model": "SOLE-R1", "rewards": rewards[0], "reasoning_traces": reasoning_traces[0]}
|
|
315
|
+
|
|
316
|
+
# Optional: Ground-truth rewards (available for test videos from sim environments)
|
|
317
|
+
import json
|
|
318
|
+
with open(video_paths[0].replace(".mp4", "/data.json"), 'r') as f:
|
|
319
|
+
data = json.load(f)
|
|
320
|
+
|
|
321
|
+
output_groundtruth = {"model": "Ground truth", "rewards": data['ground-truth rewards']}
|
|
322
|
+
|
|
323
|
+
video_plot(
|
|
324
|
+
outputs=[output_sole, output_robometer],
|
|
325
|
+
plot_save_path='model_outputs/combined/robosuite/lift/unsuccessful/robosuite_lift_episode_11_unsuccessful_max_reward_37.mp4',
|
|
326
|
+
video_path=video_paths[0],
|
|
327
|
+
task_description=task_description,
|
|
328
|
+
verbose=False
|
|
329
|
+
)
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## Reward generation and plotting across many videos
|
|
333
|
+
```python
|
|
334
|
+
|
|
335
|
+
from rewardgen import generate
|
|
336
|
+
import glob
|
|
337
|
+
import json
|
|
338
|
+
|
|
339
|
+
video_paths = glob.glob('test_videos/robosuite/lift/unsuccessful/*')
|
|
340
|
+
task_description="Pick up the cube from the table."
|
|
341
|
+
|
|
342
|
+
## REWARD GENERATION
|
|
343
|
+
# Robometer for all videos
|
|
344
|
+
rewards_robometer, success_probs_robometer = generate(model="Robometer", task_description=task_description, video_paths=video_paths, view_type='external')
|
|
345
|
+
# SOLE-R1 for all videos
|
|
346
|
+
rewards_sole, reasoning_traces_sole = generate(model="SOLE-R1", task_description=task_description, video_paths=video_paths, view_type='external and wrist')
|
|
347
|
+
|
|
348
|
+
## PLOTTING
|
|
349
|
+
plot_save_dir = 'model_outputs/combined'
|
|
350
|
+
for video_idx in range(len(video_paths)):
|
|
351
|
+
output_robometer = {"model": "Robometer", "rewards": rewards_robometer[video_idx]}
|
|
352
|
+
output_sole = {"model": "SOLE-R1", "rewards": rewards_sole[video_idx]}
|
|
353
|
+
# Optional: Ground-truth rewards (available for test videos from sim environments)
|
|
354
|
+
with open(video_paths[video_idx].replace(".mp4", "/data.json"), 'r') as f:
|
|
355
|
+
data = json.load(f)
|
|
356
|
+
|
|
357
|
+
output_groundtruth = {"model": "Ground truth", "rewards": data['ground-truth rewards']}
|
|
358
|
+
video_plot(
|
|
359
|
+
outputs = [output_groundtruth, output_sole, output_robometer],
|
|
360
|
+
plot_save_path = plot_save_dir + video_paths[video_idx].split('test_videos/')[-1] ,
|
|
361
|
+
video_path = video_paths[video_idx],
|
|
362
|
+
task_description=task_description,
|
|
363
|
+
verbose = False
|
|
364
|
+
)
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
## generate
|
|
373
|
+
|
|
374
|
+
| Argument | Type | Required | Description |
|
|
375
|
+
| --------------------- | ----------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
376
|
+
| `model` | `str` | ✅ | Name of the model to use. Options include: `"Robometer"`, `"SOLE-R1"`, `"TOPReward"`, `"RoboReward"`, OpenAI models (e.g.`"GPT-5"`), Google models (e.g., `"Gemini-3-Pro-Preview"`) |
|
|
377
|
+
| `task_description` | `str` | ✅ | Natural language description of the task the robot is performing. |
|
|
378
|
+
| `video_paths` | `List[str]` | ✅ | List of paths to input video files. |
|
|
379
|
+
| `view_type_per_video` | `List[str]` | ✅ | List specifying the camera view(s) used for reward reasoning for each video (e.g., `"external"`, `"wrist"`, or `"external and wrist"`). |
|
|
380
|
+
| `key` | `str` | ❌ | API key required for external models (e.g., OpenAI or Gemini). Not needed for local models. |
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
| Model Type | Return Values |
|
|
384
|
+
| ---------------------- | --------------------------- |
|
|
385
|
+
| SOLE-R1 / GPT / Gemini | `rewards, reasoning_traces` |
|
|
386
|
+
| Robometer | `rewards, success_probs` |
|
|
387
|
+
| TOPReward / RoboReward | `rewards` |
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
## video_plot
|
|
391
|
+
|
|
392
|
+
| Argument | Type | Required | Description |
|
|
393
|
+
| ----------------------- | ------------ | -------- | ----------------------------------------------------------------------------------------- |
|
|
394
|
+
| `outputs` | `List[dict]` | ❌* | List of model outputs (e.g., from `generate`) to visualize together. |
|
|
395
|
+
| `plot_save_path` | `str` | ❌ | Path where the output video with overlays will be saved. |
|
|
396
|
+
| `video_path` | `str` | ❌ | Path to the original video file being visualized. |
|
|
397
|
+
| `view_type` | `str` | ❌ | View type used for visualization (e.g., `"external"`, `"wrist"`, `"external and wrist"`). |
|
|
398
|
+
| `show_reasoning_traces` | `bool` | ❌ | Whether to overlay reasoning traces on the video. Default: `False`. |
|
|
399
|
+
| `show_all_frames` | `bool` | ❌ | Whether to render all frames instead of sampled frames. Default: `False`. |
|
|
400
|
+
| `model` | `str` | ❌** | Model name (used when calling `video_plot` directly instead of passing `outputs`). |
|
|
401
|
+
| `task_description` | `str` | ❌** | Task description (used in direct-call mode). |
|
|
402
|
+
| `video_paths` | `List[str]` | ❌** | Input videos (used in direct-call mode). |
|
|
403
|
+
| `view_type_per_video` | `List[str]` | ❌** | View types per video (used in direct-call mode). |
|
|
404
|
+
| `key` | `str` | ❌** | API key (if required for model). |
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
## Acknowledgements
|
|
412
|
+
RewardGen builds upon the following repos:
|
|
413
|
+
- RewardScope (https://github.com/philfung/reward-scope)
|
|
414
|
+
- Robometer (https://github.com/robometer/robometer)
|
|
415
|
+
- TOPReward (https://github.com/TOPReward/TOPReward)
|
|
416
|
+
|
|
417
|
+
Also thank you to [Jack Vial](https://github.com/jackvial) for the SO-101 videos.
|
|
418
|
+
|
|
419
|
+
|