Reinforcement Learning
stable-baselines3
PyTorch
English
Korean
deep-reinforcement-learning
ppo
continuous-control
mujoco
pusher
pusher-v5
robotics
robot
robot-arm
robotic-manipulation
7-dof
gymnasium
Eval Results (legacy)
Instructions to use hwihwalab/pusher-v5-ppo with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- stable-baselines3
How to use hwihwalab/pusher-v5-ppo with stable-baselines3:
from huggingface_sb3 import load_from_hub checkpoint = load_from_hub( repo_id="hwihwalab/pusher-v5-ppo", filename="{MODEL FILENAME}.zip", ) - Notebooks
- Google Colab
- Kaggle
| """ | |
| evaluate.py | |
| ํ์ต ์๋ฃ๋ Pusher-v5 PPO ๋ชจ๋ธ์ ๋ก๋ํ์ฌ ์ฑ๋ฅ์ ์ ๋ฐ ํ๊ฐํ๊ณ ๊ณ ํ์ง ๋น๋์ค/GIF๋ฅผ ์์ฑํฉ๋๋ค. | |
| """ | |
| import os | |
| import argparse | |
| import numpy as np | |
| import gymnasium as gym | |
| from stable_baselines3 import PPO | |
| import visualizer | |
| def evaluate_model( | |
| model_path: str, | |
| episodes: int = 5, | |
| output_dir: str = "./eval_results", | |
| seed: int = 100, | |
| fps: int = 30, | |
| ): | |
| """ | |
| ์ ์ฅ๋ PPO ๋ชจ๋ธ์ ๋ก๋ํ์ฌ ํ ์คํธ ์ํผ์๋๋ฅผ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํฉ๋๋ค. | |
| """ | |
| os.makedirs(output_dir, exist_ok=True) | |
| print("=" * 65) | |
| print(f" [Evaluation] ๋ชจ๋ธ ๋ก๋ ์ค: {model_path}") | |
| print(f" - ํ๊ฐ ์ํผ์๋ ์: {episodes}") | |
| print(f" - ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ : {output_dir}") | |
| print("=" * 65) | |
| # ํ๊ฒฝ ๋ฐ ๋ชจ๋ธ ๋ก๋ | |
| env = gym.make("Pusher-v5", render_mode="rgb_array") | |
| model = PPO.load(model_path, env=env) | |
| all_rewards = [] | |
| all_dists_goal = [] | |
| all_dists_arm = [] | |
| for ep in range(episodes): | |
| obs, info = env.reset(seed=seed + ep) | |
| done = False | |
| ep_reward = 0.0 | |
| ep_step = 0 | |
| frames = [] | |
| final_dist_goal = 0.0 | |
| final_dist_arm = 0.0 | |
| while not done: | |
| action, _ = model.predict(obs, deterministic=True) | |
| next_obs, reward, terminated, truncated, step_info = env.step(action) | |
| ep_reward += float(reward) | |
| ep_step += 1 | |
| done = terminated or truncated | |
| reward_dist = step_info.get("reward_dist", 0.0) | |
| reward_near = step_info.get("reward_near", 0.0) | |
| final_dist_goal = abs(reward_dist) / 1.25 if reward_dist <= 0 else reward_dist | |
| final_dist_arm = abs(reward_near) if reward_near <= 0 else reward_near | |
| raw_frame = env.render() | |
| if raw_frame is not None: | |
| hud_frame = visualizer.draw_hud_on_frame( | |
| frame=raw_frame, | |
| timestep=-1, | |
| episode=ep + 1, | |
| step=ep_step, | |
| step_reward=float(reward), | |
| total_reward=ep_reward, | |
| reward_dist=reward_dist, | |
| reward_near=reward_near, | |
| actions=action, | |
| tag=f"Eval Ep {ep+1}", | |
| ) | |
| frames.append(hud_frame) | |
| obs = next_obs | |
| all_rewards.append(ep_reward) | |
| all_dists_goal.append(final_dist_goal) | |
| all_dists_arm.append(final_dist_arm) | |
| # ์ํผ์๋๋ณ ๋น๋์ค/GIF ์ ์ฅ | |
| out_base = os.path.join(output_dir, f"eval_episode_{ep+1}") | |
| gif_path, mp4_path = visualizer.save_video_and_gif(frames, out_base, fps=fps) | |
| print(f"Episode {ep+1:02d} | Return: {ep_reward:+.2f} | Final Goal Dist: {final_dist_goal:.3f}m | Arm Dist: {final_dist_arm:.3f}m") | |
| print(f" -> ๋น๋์ค: {mp4_path} | GIF: {gif_path}") | |
| env.close() | |
| print("\n" + "=" * 65) | |
| print(" [Evaluation Summary]") | |
| print(f" - ํ๊ท ๋ณด์ (Mean Return) : {np.mean(all_rewards):+.2f} ยฑ {np.std(all_rewards):.2f}") | |
| print(f" - ํ๊ท ๋ชฉํ ๊ฑฐ๋ฆฌ (Mean Goal Dist) : {np.mean(all_dists_goal):.3f}m") | |
| print(f" - ํ๊ท ํ-๋ฌผ์ฒด ๊ฑฐ๋ฆฌ (Mean Arm Dist): {np.mean(all_dists_arm):.3f}m") | |
| print("=" * 65) | |
| def main(): | |
| parser = argparse.ArgumentParser(description="Pusher-v5 PPO ๋ชจ๋ธ ๋ ๋ฆฝ ํ๊ฐ ๋ฐ ๋น๋์ค ์์ฑ") | |
| parser.add_argument("--model_path", type=str, default="./results/ppo_pusher.zip", help="ํ๊ฐํ ๋ชจ๋ธ ํ์ผ ๊ฒฝ๋ก (.zip)") | |
| parser.add_argument("--episodes", type=int, default=3, help="ํ๊ฐํ ์ํผ์๋ ์ (๊ธฐ๋ณธ: 3)") | |
| parser.add_argument("--output_dir", type=str, default="./eval_results", help="ํ๊ฐ ๊ฒฐ๊ณผ๋ฌผ ์ ์ฅ ๋๋ ํ ๋ฆฌ") | |
| parser.add_argument("--seed", type=int, default=100, help="ํ๊ฐ ๋๋ค ์๋") | |
| parser.add_argument("--fps", type=int, default=30, help="๋น๋์ค ์ฌ์ FPS") | |
| args = parser.parse_args() | |
| evaluate_model( | |
| model_path=args.model_path, | |
| episodes=args.episodes, | |
| output_dir=args.output_dir, | |
| seed=args.seed, | |
| fps=args.fps, | |
| ) | |
| if __name__ == "__main__": | |
| main() | |