Wildfire-Detection_Openenv / server /wildfire_environment.py
OpelSpeedster's picture
Upload folder using huggingface_hub
70ec152 verified
Raw
History Blame Contribute Delete
3.16 kB
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
"""
Wildfire Detection Environment Implementation.
This environment uses the FirenetCNN model for wildfire detection.
"""
import os
import base64
import numpy as np
from uuid import uuid4
from io import BytesIO
from openenv.core.env_server.interfaces import Environment
from openenv.core.env_server.types import State
try:
from ..models import WildfireAction, WildfireObservation
except ImportError:
from models import WildfireAction, WildfireObservation
try:
from environments.wildfire_detection.wildfire_env import WildfireDetectionEnv
except ModuleNotFoundError:
from multipen.environments.wildfire_detection.wildfire_env import (
WildfireDetectionEnv,
)
class WildfireEnvironment(Environment):
"""OpenEnv environment for wildfire detection using FirenetCNN."""
SUPPORTS_CONCURRENT_SESSIONS: bool = True
def __init__(self):
self._state = State(episode_id=str(uuid4()), step_count=0)
self._env = None
self._init_env()
def _init_env(self):
model_path = os.path.join(
os.path.dirname(__file__),
"..",
"..",
"Forest-Fire-Detection-Using-FirenetCNN-and-XAI-Techniques",
"FirenetCNN1.h5",
)
self._env = WildfireDetectionEnv(model_path=model_path)
def reset(self) -> WildfireObservation:
self._state = State(episode_id=str(uuid4()), step_count=0)
obs = self._env.reset()
return self._make_observation(obs, 0.0, False)
def step(self, action: WildfireAction) -> WildfireObservation:
self._state.step_count += 1
action_idx = ["Alert", "Scan", "Ignore", "Deploy"].index(action.action)
obs, reward, done, info = self._env.step(action_idx)
return self._make_observation(obs, reward, done, info)
def _make_observation(
self, obs: dict, reward: float, done: bool
) -> WildfireObservation:
img = obs.get("image")
img_b64 = ""
if img is not None:
from PIL import Image
import numpy as np
pil_img = Image.fromarray(img)
buffer = BytesIO()
pil_img.save(buffer, format="JPEG")
img_b64 = base64.b64encode(buffer.getvalue()).decode()
return WildfireObservation(
image=img_b64,
prediction={
"fire": float(obs.get("prediction", [0, 0, 0])[0]),
"smoke": float(obs.get("prediction", [0, 0, 0])[1]),
"no_fire": float(obs.get("prediction", [0, 0, 0])[2]),
},
gradcam_summary=f"Grad-CAM: {obs.get('gradcam_summary', [0])[0]}",
frame_id=int(obs.get("frame_id", [0])[0]),
step=int(obs.get("step", [0])[0]),
ground_truth="no_fire",
reward=reward,
done=done,
metadata={},
)
@property
def state(self) -> State:
return self._state