Compare commits
No commits in common. "Ahmed(Utopia_Industries)" and "main" have entirely different histories.
Ahmed(Utop
...
main
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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' :
|
||||||
if (statuses.includes('error')) {
|
d.stream_status === 'error' ? 'Error' : 'Connecting';
|
||||||
badge.className = 'status-badge error';
|
if (d.active_camera_name) {
|
||||||
stext.textContent = 'SYSTEM ERROR';
|
stext.textContent = `${stext.textContent} - ${d.active_camera_name}`;
|
||||||
} else if (statuses.includes('connecting') || statuses.includes('reconnecting')) {
|
}
|
||||||
badge.className = 'status-badge connecting';
|
|
||||||
stext.textContent = 'CONNECTING...';
|
if (camerasLoaded) {
|
||||||
} else {
|
const cameraSelect = document.getElementById('cameraSelect');
|
||||||
badge.className = 'status-badge live';
|
if (cameraSelect.value !== d.selected_camera_id) {
|
||||||
stext.textContent = 'ALL SYSTEMS LIVE';
|
cameraSelect.value = d.selected_camera_id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue