Compare commits

...

1 Commits

Author SHA1 Message Date
ahmedmujtaba-gif bf3f36d742 commit for checking the desired change 2026-04-16 17:05:14 +05:00
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 "
"and verify NVIDIA drivers."
)
model = YOLO("yolo26m.pt")
model = YOLO("person_detector_best.pt")
model.to(f"cuda:{INFERENCE_DEVICE}")
# Group tracking

View File

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