commit for checking the desired change

Ahmed(Utopia_Industries)
ahmedmujtaba-gif 2026-04-16 17:05:14 +05:00
parent 6c85ad6ff5
commit bf3f36d742
2 changed files with 36 additions and 28 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("yolo26m.pt") model = YOLO("person_detector_best.pt")
model.to(f"cuda:{INFERENCE_DEVICE}") model.to(f"cuda:{INFERENCE_DEVICE}")
# Group tracking # Group tracking

View File

@ -411,28 +411,39 @@ 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();
// KPIs // Aggregated KPIs
document.getElementById('valPeople').textContent = d.people_count; const totalPeople = d.total_people_count;
document.getElementById('valGroups').textContent = d.groups.length; let totalGroups = 0;
document.getElementById('valAlerts').textContent = d.alerts.length; let allGroups = [];
document.getElementById('valFps').textContent = d.fps;
document.getElementById('overlayPeople').textContent = d.people_count + ' People';
// Stream status badge 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('valFps').textContent = "GRID";
document.getElementById('overlayPeople').textContent = totalPeople + ' People Total';
// Stream status badge (Aggregated)
const badge = document.getElementById('statusBadge'); const badge = document.getElementById('statusBadge');
const stext = document.getElementById('statusText'); const stext = document.getElementById('statusText');
badge.className = 'status-badge ' + d.stream_status; const statuses = Object.values(d.cameras).map(c => c.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 (camerasLoaded) { if (statuses.includes('error')) {
const cameraSelect = document.getElementById('cameraSelect'); badge.className = 'status-badge error';
if (cameraSelect.value !== d.selected_camera_id) { stext.textContent = 'SYSTEM ERROR';
cameraSelect.value = d.selected_camera_id; } else if (statuses.includes('connecting') || statuses.includes('reconnecting')) {
} 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
@ -448,16 +459,16 @@ async function poll() {
} }
prevAlertActive = d.alert_active; prevAlertActive = d.alert_active;
// Groups list // Groups list (Aggregated)
const gl = document.getElementById('groupList'); const gl = document.getElementById('groupList');
if (d.groups.length === 0) { if (allGroups.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 = d.groups.map(g => { gl.innerHTML = allGroups.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</span> <span>${g.count} People - ${g.camName}</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>
@ -474,7 +485,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}</span> <span class="time">${a.time} - ${a.camera || 'Unknown'}</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>
@ -493,9 +504,6 @@ 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>