yellowstone
This commit is contained in:
parent
c300289aec
commit
eed4d3cf00
@ -1,8 +1,8 @@
|
|||||||
# Wildlife Monitoring Dashboard — Nationaal Park De Hoge Veluwe
|
# Wildlife Monitoring Dashboard — Yellowstone National Park
|
||||||
|
|
||||||
A real-time wildlife camera-trap monitoring dashboard powered by an EfficientNet V2-S classifier and multiple Explainable AI (XAI) methods. Built for the 0HM340 Human-AI Interaction assignment.
|
A real-time wildlife camera-trap monitoring dashboard powered by an EfficientNet V2-S classifier and multiple Explainable AI (XAI) methods. Built for the 0HM340 Human-AI Interaction assignment.
|
||||||
|
|
||||||
The dashboard simulates a live feed of camera-trap detections across five locations in [Nationaal Park De Hoge Veluwe](https://hogeveluwe.nl/), classifying images into seven species (bear, deer, fox, hare, moose, person, wolf) and providing interactive explanations of each prediction.
|
The dashboard simulates a live feed of camera-trap detections across five locations in [Yellowstone National Park](https://www.nps.gov/yell/), classifying images into seven species (bear, deer, fox, hare, moose, person, wolf) and providing interactive explanations of each prediction.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ The server starts at **http://localhost:5000**.
|
|||||||
assignment-HAI/
|
assignment-HAI/
|
||||||
├── dashboard.py # Flask application (main entry point)
|
├── dashboard.py # Flask application (main entry point)
|
||||||
├── train.py # Standalone training script
|
├── train.py # Standalone training script
|
||||||
├── map.webp # Park map background image
|
├── yellowstone-camping-map.jpg # Park map background image
|
||||||
├── pyproject.toml # Project metadata and dependencies
|
├── pyproject.toml # Project metadata and dependencies
|
||||||
├── uv.lock # Locked dependency versions
|
├── uv.lock # Locked dependency versions
|
||||||
├── .python-version # Python version pin (3.13)
|
├── .python-version # Python version pin (3.13)
|
||||||
|
|||||||
@ -5,7 +5,7 @@ This guide explains how to use the Wildlife Monitoring Dashboard as an end user
|
|||||||
|
|
||||||
## Home Page — Live Map
|
## Home Page — Live Map
|
||||||
|
|
||||||
The home page shows a fullscreen map of Nationaal Park De Hoge Veluwe with five camera locations marked as blue dots. Each dot represents a physical camera trap deployed in the park.
|
The home page shows a fullscreen map of Yellowstone National Park with five camera locations marked as blue dots. Each dot represents a physical camera trap deployed in the park.
|
||||||
|
|
||||||
### Live Camera Feed
|
### Live Camera Feed
|
||||||
|
|
||||||
|
|||||||
34
dashboard.py
34
dashboard.py
@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Wildlife Monitoring Dashboard — Nationaal Park De Hoge Veluwe
|
Wildlife Monitoring Dashboard — Yellowstone National Park
|
||||||
|
|
||||||
Flask app with two pages:
|
Flask app with two pages:
|
||||||
/ – fullscreen map with camera markers + togglable sidebar
|
/ – fullscreen map with camera markers + togglable sidebar
|
||||||
@ -48,16 +48,16 @@ XAI_DIR.mkdir(exist_ok=True)
|
|||||||
|
|
||||||
# Camera positions as percentages of the map image (adjust to match map.webp)
|
# Camera positions as percentages of the map image (adjust to match map.webp)
|
||||||
CAMERAS = {
|
CAMERAS = {
|
||||||
"CAM-01": {"name": "Hubertus Trail", "px": 50, "py": 15,
|
"CAM-01": {"name": "Lamar Valley", "px": 65, "py": 17,
|
||||||
"desc": "Northern forest near Jachthuis Sint Hubertus"},
|
"desc": "Northeast corridor, prime wolf and bison territory"},
|
||||||
"CAM-02": {"name": "Otterlo Gate", "px": 25, "py": 38,
|
"CAM-02": {"name": "Hayden Valley", "px": 48, "py": 38,
|
||||||
"desc": "Western entrance, deciduous woodland"},
|
"desc": "Central meadows between canyon and lake"},
|
||||||
"CAM-03": {"name": "Kröller-Müller", "px": 42, "py": 48,
|
"CAM-03": {"name": "Mammoth Hot Springs", "px": 28, "py": 12,
|
||||||
"desc": "Central area near the museum"},
|
"desc": "Northern range, year-round elk habitat"},
|
||||||
"CAM-04": {"name": "Hoenderloo Path", "px": 72, "py": 32,
|
"CAM-04": {"name": "Old Faithful", "px": 24, "py": 54,
|
||||||
"desc": "Eastern forest corridor"},
|
"desc": "Upper Geyser Basin, forested southwest"},
|
||||||
"CAM-05": {"name": "Deelense Veld", "px": 55, "py": 68,
|
"CAM-05": {"name": "Yellowstone Lake", "px": 55, "py": 48,
|
||||||
"desc": "Southern heathland near Schaarsbergen"},
|
"desc": "Eastern shoreline, moose and waterfowl corridor"},
|
||||||
}
|
}
|
||||||
|
|
||||||
SPECIES_ICON = {
|
SPECIES_ICON = {
|
||||||
@ -384,9 +384,9 @@ def api_detections():
|
|||||||
return jsonify(detections)
|
return jsonify(detections)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/map.webp")
|
@app.route("/map.jpg")
|
||||||
def serve_map():
|
def serve_map():
|
||||||
return send_from_directory(".", "map.webp")
|
return send_from_directory(".", "yellowstone-camping-map.jpg")
|
||||||
|
|
||||||
|
|
||||||
@app.route("/xai/<det_id>/<filename>")
|
@app.route("/xai/<det_id>/<filename>")
|
||||||
@ -401,7 +401,7 @@ HOME_HTML = r"""<!DOCTYPE html>
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
<title>De Hoge Veluwe — Wildlife Monitor</title>
|
<title>Yellowstone — Wildlife Monitor</title>
|
||||||
<style>
|
<style>
|
||||||
*{margin:0;padding:0;box-sizing:border-box}
|
*{margin:0;padding:0;box-sizing:border-box}
|
||||||
body{font-family:system-ui,-apple-system,sans-serif;overflow:hidden;height:100vh;background:#0f172a}
|
body{font-family:system-ui,-apple-system,sans-serif;overflow:hidden;height:100vh;background:#0f172a}
|
||||||
@ -550,12 +550,12 @@ body{font-family:system-ui,-apple-system,sans-serif;overflow:hidden;height:100vh
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div id="title"><h1>Nationaal Park De Hoge Veluwe</h1><p>Wildlife Camera Monitoring</p></div>
|
<div id="title"><h1>Yellowstone National Park</h1><p>Wildlife Camera Monitoring</p></div>
|
||||||
|
|
||||||
<!-- map -->
|
<!-- map -->
|
||||||
<div id="map-outer">
|
<div id="map-outer">
|
||||||
<div id="map-wrap">
|
<div id="map-wrap">
|
||||||
<img id="map-img" src="/map.webp" alt="Park map" draggable="false">
|
<img id="map-img" src="/map.jpg" alt="Park map" draggable="false">
|
||||||
{% for cid, c in cameras.items() %}
|
{% for cid, c in cameras.items() %}
|
||||||
<a href="/cam/{{ cid }}" class="cam-marker" id="mk-{{ cid }}" style="left:{{ c.px }}%;top:{{ c.py }}%"></a>
|
<a href="/cam/{{ cid }}" class="cam-marker" id="mk-{{ cid }}" style="left:{{ c.px }}%;top:{{ c.py }}%"></a>
|
||||||
<div class="cam-label" style="left:{{ c.px }}%;top:calc({{ c.py }}% - 18px)">{{ cid }} · {{ c.name }}</div>
|
<div class="cam-label" style="left:{{ c.px }}%;top:calc({{ c.py }}% - 18px)">{{ cid }} · {{ c.name }}</div>
|
||||||
@ -757,7 +757,7 @@ DETAIL_HTML = r"""<!DOCTYPE html>
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
<title>Detection {{ det.id }} — De Hoge Veluwe</title>
|
<title>Detection {{ det.id }} — Yellowstone</title>
|
||||||
<style>
|
<style>
|
||||||
*{margin:0;padding:0;box-sizing:border-box}
|
*{margin:0;padding:0;box-sizing:border-box}
|
||||||
body{font-family:system-ui,-apple-system,sans-serif;background:#0f172a;color:#e2e8f0;line-height:1.5}
|
body{font-family:system-ui,-apple-system,sans-serif;background:#0f172a;color:#e2e8f0;line-height:1.5}
|
||||||
|
|||||||
BIN
yellowstone-camping-map.jpg
Normal file
BIN
yellowstone-camping-map.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.7 MiB |
Loading…
x
Reference in New Issue
Block a user