Update app.py
Browse files
app.py
CHANGED
|
@@ -4,7 +4,7 @@ import os
|
|
| 4 |
import numpy as np
|
| 5 |
from datetime import datetime
|
| 6 |
import matplotlib.pyplot as plt
|
| 7 |
-
import time
|
| 8 |
from services.detection_service import detect_faults_solar, detect_faults_windmill
|
| 9 |
from services.anomaly_service import track_anomalies, predict_anomaly
|
| 10 |
from models.solar_model import load_solar_model
|
|
@@ -68,7 +68,7 @@ st.markdown(
|
|
| 68 |
# Initialize session state
|
| 69 |
if 'paused' not in st.session_state:
|
| 70 |
st.session_state.paused = False
|
| 71 |
-
st.session_state.frame_rate =
|
| 72 |
st.session_state.frame_count = 0
|
| 73 |
st.session_state.logs = []
|
| 74 |
st.session_state.anomaly_counts = []
|
|
@@ -264,7 +264,7 @@ def main():
|
|
| 264 |
with col6:
|
| 265 |
resume_btn = st.button("▶️ Resume")
|
| 266 |
with col7:
|
| 267 |
-
frame_rate = st.slider("Frame Interval (seconds)", 0.
|
| 268 |
|
| 269 |
# Handle button clicks and slider
|
| 270 |
if pause_btn:
|
|
@@ -279,10 +279,46 @@ def main():
|
|
| 279 |
video_path = os.path.join(VIDEO_FOLDER, video_file)
|
| 280 |
while True:
|
| 281 |
if st.session_state.paused:
|
| 282 |
-
|
| 283 |
-
if
|
| 284 |
-
|
| 285 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 286 |
else:
|
| 287 |
frame, metrics, logs, chart, snapshots = monitor_feed(video_path, detection_type, model)
|
| 288 |
if frame is None:
|
|
@@ -291,7 +327,6 @@ def main():
|
|
| 291 |
|
| 292 |
# Update UI
|
| 293 |
video_placeholder.image(frame, channels="RGB", width=640)
|
| 294 |
-
# Fix for f-string backslash issue
|
| 295 |
metrics_formatted = metrics.replace("\n", "<br>")
|
| 296 |
metrics_placeholder.markdown(
|
| 297 |
f'<div class="metrics-text">{metrics_formatted}</div>',
|
|
|
|
| 4 |
import numpy as np
|
| 5 |
from datetime import datetime
|
| 6 |
import matplotlib.pyplot as plt
|
| 7 |
+
import time
|
| 8 |
from services.detection_service import detect_faults_solar, detect_faults_windmill
|
| 9 |
from services.anomaly_service import track_anomalies, predict_anomaly
|
| 10 |
from models.solar_model import load_solar_model
|
|
|
|
| 68 |
# Initialize session state
|
| 69 |
if 'paused' not in st.session_state:
|
| 70 |
st.session_state.paused = False
|
| 71 |
+
st.session_state.frame_rate = 0.2 # Adjusted default to reduce flicker
|
| 72 |
st.session_state.frame_count = 0
|
| 73 |
st.session_state.logs = []
|
| 74 |
st.session_state.anomaly_counts = []
|
|
|
|
| 264 |
with col6:
|
| 265 |
resume_btn = st.button("▶️ Resume")
|
| 266 |
with col7:
|
| 267 |
+
frame_rate = st.slider("Frame Interval (seconds)", 0.1, 1.0, st.session_state.frame_rate) # Adjusted range
|
| 268 |
|
| 269 |
# Handle button clicks and slider
|
| 270 |
if pause_btn:
|
|
|
|
| 279 |
video_path = os.path.join(VIDEO_FOLDER, video_file)
|
| 280 |
while True:
|
| 281 |
if st.session_state.paused:
|
| 282 |
+
# Skip processing if paused and last frame exists
|
| 283 |
+
if st.session_state.last_frame is not None:
|
| 284 |
+
frame, metrics, logs, chart, snapshots = monitor_feed(video_path, detection_type, model)
|
| 285 |
+
if frame is None:
|
| 286 |
+
st.success("Video processing completed.")
|
| 287 |
+
break
|
| 288 |
+
# Update UI only if necessary
|
| 289 |
+
video_placeholder.image(frame, channels="RGB", width=640)
|
| 290 |
+
metrics_formatted = metrics.replace("\n", "<br>")
|
| 291 |
+
metrics_placeholder.markdown(
|
| 292 |
+
f'<div class="metrics-text">{metrics_formatted}</div>',
|
| 293 |
+
unsafe_allow_html=True
|
| 294 |
+
)
|
| 295 |
+
logs_formatted = logs.replace("\n", "</div><div class='log-entry'>")
|
| 296 |
+
logs_placeholder.markdown(
|
| 297 |
+
f'<div class="log-entry">{logs_formatted}</div>',
|
| 298 |
+
unsafe_allow_html=True
|
| 299 |
+
)
|
| 300 |
+
trends_placeholder.image(chart)
|
| 301 |
+
with gallery_placeholder.container():
|
| 302 |
+
cols = st.columns(5)
|
| 303 |
+
for i, col in enumerate(cols):
|
| 304 |
+
with col:
|
| 305 |
+
if i < len(snapshots):
|
| 306 |
+
st.image(snapshots[i], width=100)
|
| 307 |
+
st.markdown(f'<div class="log-entry">{st.session_state.snapshots[i]["log"]}</div>', unsafe_allow_html=True)
|
| 308 |
+
else:
|
| 309 |
+
st.empty()
|
| 310 |
+
prediction = predict_anomaly(st.session_state.anomaly_counts)
|
| 311 |
+
if prediction:
|
| 312 |
+
prediction_placeholder.warning("**Prediction:** Potential issue detected - anomaly spike detected!")
|
| 313 |
+
else:
|
| 314 |
+
prediction_placeholder.empty()
|
| 315 |
+
time.sleep(st.session_state.frame_rate)
|
| 316 |
+
continue # Avoid rerun when paused
|
| 317 |
+
else:
|
| 318 |
+
frame, metrics, logs, chart, snapshots = monitor_feed(video_path, detection_type, model)
|
| 319 |
+
if frame is None:
|
| 320 |
+
st.success("Video processing completed.")
|
| 321 |
+
break
|
| 322 |
else:
|
| 323 |
frame, metrics, logs, chart, snapshots = monitor_feed(video_path, detection_type, model)
|
| 324 |
if frame is None:
|
|
|
|
| 327 |
|
| 328 |
# Update UI
|
| 329 |
video_placeholder.image(frame, channels="RGB", width=640)
|
|
|
|
| 330 |
metrics_formatted = metrics.replace("\n", "<br>")
|
| 331 |
metrics_placeholder.markdown(
|
| 332 |
f'<div class="metrics-text">{metrics_formatted}</div>',
|