feat: merged detection output + parallel model execution

- Multiple models run simultaneously on each frame via ThreadPoolExecutor
- Detections merged with IoU deduplication (same class, high overlap → keep highest conf)
- Single merged_annotated.mp4 output (not per-model videos)
- Single model still uses existing run_pipeline for backward compat
- Active jobs banner on upload page (polls every 5s)
- GPU warning when selecting 3+ models
- 62/62 tests pass
This commit is contained in:
jetson committed 2026-09-22 11:10:41 +07:00
1 parent 163280078f
commit fc20a521ee
5 files changed
+381 -40

No files matched your search

+19
View File
@@ -257,6 +257,19 @@
}
.empty-state p { margin-bottom: var(--space-2); }
/* Active jobs banner */
.active-jobs-banner {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-3) var(--space-4);
background: #f0f9ff;
border: 1px solid #0EA5E9;
border-radius: var(--radius-md);
margin-bottom: var(--space-6);
font-size: var(--text-sm);
}
/* Video delete button */
.video-delete-btn {
flex-shrink: 0;
@@ -291,6 +304,12 @@
<p>Upload a video and select detection models to run analysis.</p>
</div>
<div class="active-jobs-banner" id="active-jobs-banner" style="display:none">
<span class="badge badge-info">&#9654;</span>
<span id="active-jobs-text"></span>
<a href="/jobs" class="btn btn-ghost btn-sm">View All</a>
</div>
<form action="/upload" method="post" enctype="multipart/form-data" id="upload-form">
<input type="hidden" name="video_path" id="video-path-input" value="">