Wildfire-Detection_Openenv / inference_rl.py
OpelSpeedster's picture
Upload folder using huggingface_hub
5192692 verified
Raw
History Blame Contribute Delete
3.48 kB
"""
Wildfire Detection RL Inference Script
=======================================
Uses trained Q-learning model for decision making.
"""
import os
import sys
import pickle
import numpy as np
from collections import defaultdict
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from environments.wildfire_detection.wildfire_env import WildfireDetectionEnv
class TrainedQLearningAgent:
"""Trained Q-learning agent for inference."""
def __init__(self, model_path=None):
self.model_path = model_path or os.path.join(
os.path.dirname(__file__), "q_model.pkl"
)
self.q_table = None
self.actions = ["Alert", "Scan", "Ignore", "Deploy"]
self._load_model()
def _load_model(self):
if os.path.exists(self.model_path):
with open(self.model_path, "rb") as f:
self.q_table = defaultdict(lambda: [0.0, 0.0, 0.0, 0.0], pickle.load(f))
print(f"Loaded trained model from: {self.model_path}")
print(f"Q-table: {dict(self.q_table)}")
else:
print("WARNING: No trained model found!")
self.q_table = defaultdict(lambda: [0.0, 0.0, 0.0, 0.0])
def get_state_key(self, obs):
"""Convert observation to discrete state key."""
prediction = obs.get("prediction", np.zeros(3))
if hasattr(prediction, "tolist"):
p = prediction.tolist()
elif hasattr(prediction, "__iter__"):
p = list(prediction)
else:
p = [0, 0, 0]
# Match training: fire_high, smoke_high
fire_high = 0 if p[0] < 0.5 else 1
smoke_high = 0 if p[1] < 0.5 else 1
return (fire_high, smoke_high)
def choose_action(self, state):
"""Choose best action based on Q-values."""
q_values = self.q_table.get(state, [0.0, 0.0, 0.0, 0.0])
if hasattr(q_values, "tolist"):
q_values = q_values.tolist()
return q_values.index(max(q_values))
def get_action_name(self, action_idx):
return self.actions[action_idx]
def run_inference():
"""Run inference with trained RL agent."""
print(
"[START] task=wildfire_detection env=wildfire_detection model=trained_q_learning"
)
env = WildfireDetectionEnv()
agent = TrainedQLearningAgent()
rewards_list = []
steps_executed = 0
obs = env.reset()
for step in range(1, 21):
steps_executed = step
state = agent.get_state_key(obs)
action_idx = agent.choose_action(state)
action_str = agent.get_action_name(action_idx)
obs, reward, done, info = env.step(action_idx)
rewards_list.append(reward)
error_msg = "null"
print(
f"[STEP] step={step} action={action_str} reward={reward:.2f} done={str(done).lower()} error={error_msg}"
)
if done:
break
env.close()
total_reward = sum(rewards_list)
rewards_str = ",".join(f"{r:.2f}" for r in rewards_list)
success = total_reward > 0
print(
f"[END] success={str(success).lower()} steps={steps_executed} rewards={rewards_str}"
)
return {
"success": success,
"steps": steps_executed,
"rewards": rewards_list,
"total_reward": total_reward,
}
if __name__ == "__main__":
result = run_inference()
print(
f"\nResult: success={result['success']}, total_reward={result['total_reward']:.2f}"
)