Compare commits

..

No commits in common. "Ahmed(Utopia_Industries)" and "main" have entirely different histories.

2 changed files with 27 additions and 35 deletions

View File

@ -67,7 +67,7 @@ if not torch.cuda.is_available():
"CUDA GPU is required but not available. Install a CUDA-enabled PyTorch build " "CUDA GPU is required but not available. Install a CUDA-enabled PyTorch build "
"and verify NVIDIA drivers." "and verify NVIDIA drivers."
) )
model = YOLO("person_detector_best.pt") model = YOLO("yolo26m.pt")
model.to(f"cuda:{INFERENCE_DEVICE}") model.to(f"cuda:{INFERENCE_DEVICE}")
# Group tracking # Group tracking

View File

@ -411,39 +411,28 @@ async function poll() {
const res = await fetch('/api/status'); const res = await fetch('/api/status');
const d = await res.json(); const d = await res.json();
// Aggregated KPIs // KPIs
const totalPeople = d.total_people_count; document.getElementById('valPeople').textContent = d.people_count;
let totalGroups = 0; document.getElementById('valGroups').textContent = d.groups.length;
let allGroups = [];
Object.keys(d.cameras).forEach(cid => {
const camData = d.cameras[cid];
totalGroups += camData.groups.length;
camData.groups.forEach(g => {
allGroups.push({...g, camName: camData.name});
});
});
document.getElementById('valPeople').textContent = totalPeople;
document.getElementById('valGroups').textContent = totalGroups;
document.getElementById('valAlerts').textContent = d.alerts.length; document.getElementById('valAlerts').textContent = d.alerts.length;
document.getElementById('valFps').textContent = "GRID"; document.getElementById('valFps').textContent = d.fps;
document.getElementById('overlayPeople').textContent = totalPeople + ' People Total'; document.getElementById('overlayPeople').textContent = d.people_count + ' People';
// Stream status badge (Aggregated) // Stream status badge
const badge = document.getElementById('statusBadge'); const badge = document.getElementById('statusBadge');
const stext = document.getElementById('statusText'); const stext = document.getElementById('statusText');
const statuses = Object.values(d.cameras).map(c => c.status); badge.className = 'status-badge ' + d.stream_status;
stext.textContent = d.stream_status === 'live' ? 'Live' :
d.stream_status === 'error' ? 'Error' : 'Connecting';
if (d.active_camera_name) {
stext.textContent = `${stext.textContent} - ${d.active_camera_name}`;
}
if (statuses.includes('error')) { if (camerasLoaded) {
badge.className = 'status-badge error'; const cameraSelect = document.getElementById('cameraSelect');
stext.textContent = 'SYSTEM ERROR'; if (cameraSelect.value !== d.selected_camera_id) {
} else if (statuses.includes('connecting') || statuses.includes('reconnecting')) { cameraSelect.value = d.selected_camera_id;
badge.className = 'status-badge connecting'; }
stext.textContent = 'CONNECTING...';
} else {
badge.className = 'status-badge live';
stext.textContent = 'ALL SYSTEMS LIVE';
} }
// Alert KPI glow // Alert KPI glow
@ -459,16 +448,16 @@ async function poll() {
} }
prevAlertActive = d.alert_active; prevAlertActive = d.alert_active;
// Groups list (Aggregated) // Groups list
const gl = document.getElementById('groupList'); const gl = document.getElementById('groupList');
if (allGroups.length === 0) { if (d.groups.length === 0) {
gl.innerHTML = '<div class="no-groups">No groups detected</div>'; gl.innerHTML = '<div class="no-groups">No groups detected</div>';
} else { } else {
gl.innerHTML = allGroups.map(g => { gl.innerHTML = d.groups.map(g => {
const cls = g.duration >= 20 ? 'danger' : g.duration >= 10 ? 'warning' : ''; const cls = g.duration >= 20 ? 'danger' : g.duration >= 10 ? 'warning' : '';
return `<div class="group-item"> return `<div class="group-item">
<div class="group-meta"> <div class="group-meta">
<span>${g.count} People - ${g.camName}</span> <span>${g.count} People</span>
<span>Group #${g.id}</span> <span>Group #${g.id}</span>
</div> </div>
<span class="group-timer ${cls}">${g.duration}s</span> <span class="group-timer ${cls}">${g.duration}s</span>
@ -485,7 +474,7 @@ async function poll() {
<div class="alert-entry" onclick="openLightbox('/${a.image}')"> <div class="alert-entry" onclick="openLightbox('/${a.image}')">
<img class="alert-thumb" src="/${a.image}" alt="Alert"> <img class="alert-thumb" src="/${a.image}" alt="Alert">
<div class="alert-info"> <div class="alert-info">
<span class="time">${a.time} - ${a.camera || 'Unknown'}</span> <span class="time">${a.time}</span>
<span class="desc">${a.people} people gathered</span> <span class="desc">${a.people} people gathered</span>
<span class="duration">Duration: ${a.duration}s</span> <span class="duration">Duration: ${a.duration}s</span>
</div> </div>
@ -504,6 +493,9 @@ function openLightbox(src) {
} }
setInterval(poll, 1000); setInterval(poll, 1000);
document.getElementById('cameraSelect').addEventListener('change', (e) => {
selectCamera(e.target.value);
});
loadCameras().then(poll); loadCameras().then(poll);
poll(); poll();
</script> </script>