# Implementation Plan: Video Classification System ## Overview This document outlines the phased implementation plan for the Video Classification System. The plan breaks down the requirements into logical work packages (Sprints/Phases) that can be implemented, tested, and integrated sequentially. **Key Dependencies:** 1. **Infrastructure** must be available before any processing logic can run. 2. **Database Schema** must be finalized early to support metadata logging. 3. **Model Training Data** is a bottleneck; the initial model must be ready or a placeholder used for pipeline testing. --- ## Phase 1: Foundation & Infrastructure (Sprint 1-2) **Goal:** Establish the Docker environment, Database schema, and basic connectivity. No video processing yet, just the "skeleton." ### 1.1 Environment Setup - [ ] **Docker Compose Structure:** Create `docker-compose.yml` defining services for: - `mariadb`: Persistent volume for metadata. - `worker`: Build context for PyTorch/TensorRT environment. Include `nvidia-container-toolkit` config for GPU passthrough. - `ui`: Placeholder container (e.g., nginx serving a static "Under Construction" page) to verify network connectivity. - [ ] **Base Images:** - Create a custom Dockerfile for the worker based on `nvidia/cuda:11.8.0-runtime-ubuntu20.04`. - Install PyTorch (1.13+ with CUDA 11.8), OpenCV, FFmpeg-python, and TensorRT prerequisites. - [ ] **Volume Mounts:** - Map local NVMe path to `/scratch` in worker container (tmpfs preferred for speed). - Map NAS/SMB path to `/data/input` and `/data/output` in worker container. - Map `/models` and `/data/training` for persistence. ### 1.2 Database Schema Design - [ ] **MariaDB Schema:** Define tables in SQL migration script: - `videos`: `id`, `file_path`, `file_hash`, `resolution_w`, `resolution_h`, `codec`, `status` (NEW, PENDING, PROCESSING, COMPLETED, UNSCANNABLE, ERROR), `last_scan_time`, `last_processed_time`. - `processing_logs`: `id`, `video_id`, `model_version`, `frame_count`, `confidence_score`, `routing_decision`, `processed_at`. - `models`: `version`, `status` (ACTIVE, CANDIDATE, ARCHIVED), `path`, `calibration_temp`. - [ ] **Connection Layer:** Implement a Python module (`db_connector.py`) with connection pooling to MariaDB. ### 1.3 Configuration Management - [ ] **Config File:** Create `config.yaml` for thresholds (`T_high`, `T_low`), sampling intervals, and GPU settings. - [ ] **Logging Setup:** Configure structured logging (JSON format) to stdout for Docker capture. **Exit Criteria:** - `docker-compose up` starts DB and Worker containers successfully. - Worker can connect to DB and create tables. - GPU is visible inside the Worker container (`nvidia-smi`). --- ## Phase 2: Core Ingestion & Codec Handling (Sprint 3-4) **Goal:** Implement the directory scanner, video probing, and robust error handling for codecs/resolutions. ### 2.1 Directory Scanner - [ ] **Scanner Service:** Implement a background thread or separate script that walks `/data/input`. - [ ] **File Detection:** Identify new files (not in DB) and update status to `PENDING`. - [ ] **Deduplication:** Use `file_hash` (SHA-256 of first 1MB or full file if small) to prevent re-processing identical files. ### 2.2 Video Probing & Metadata Extraction - [ ] **FFmpeg Probe:** For each `PENDING` file, run `ffprobe` to extract: - Codec name. - Resolution (width/height). - Duration. - [ ] **Codec Validation:** Maintain a whitelist of supported codecs (H.264, H.265, VP8, VP9, etc.). - If codec is unsupported or `ffprobe` fails: Set status to `UNSCANNABLE`. - Log the specific error code/reason. - [ ] **Resolution Handling:** Store resolution in DB. Implement logic to downscale high-res frames (4K) if necessary to fit VRAM constraints during inference. ### 2.3 Batch Orchestration Skeleton - [ ] **Job Queue:** Implement a simple priority queue or DB-based locking mechanism to assign files to Worker processes. - [ ] **State Management:** Ensure atomic transitions from `PENDING` → `PROCESSING` to avoid duplicate processing. **Exit Criteria:** - New files in `/data/input` appear in DB with correct metadata within 60 seconds. - Unsupported codec files are marked `UNSCANNABLE` without crashing the scanner. - DB accurately reflects the current state of the 30TB corpus. --- ## Phase 3: Inference Pipeline & Model Integration (Sprint 5-6) **Goal:** Implement frame sampling, face detection, classification, and confidence aggregation. ### 3.1 Frame Sampling - [ ] **FFmpeg Extraction:** Implement logic to extract 1 frame per 30 seconds uniformly. - Handle variable FPS gracefully. - Save frames to `/scratch/tmp/` with naming convention `{video_id}_{timestamp}.jpg`. - [ ] **Memory Management:** Ensure frames are deleted from scratch space immediately after processing the video to prevent filling NVMe. ### 3.2 Face Detection - [ ] **Model Integration:** Load YOLOv8n (or chosen lightweight detector) via ONNX Runtime or TensorRT. - [ ] **Batching:** Implement dynamic batching for face detection to maximize GPU utilization. - [ ] **Crop Generation:** Extract face crops, resize to inference input size (e.g., 224x224). ### 3.3 Classification & Aggregation - [ ] **Model Integration:** Load MobileNetV3 (or chosen classifier) via TensorRT FP32. - [ ] **Inference:** Run classification on face crops. - [ ] **Aggregation Logic:** - Calculate frame-level confidence `p_i`. - Apply video-level aggregation (e.g., `max(p_i)` or weighted mean). - Apply temperature scaling for calibration. - [ ] **Routing Decision:** Compare final confidence `C` against `T_high` and `T_low`. Assign `MATCH`, `REVIEW`, or `SKIP`. ### 3.4 Result Persistence - [ ] **DB Update:** Update `videos` table with `processed_at`, `model_version`, and status `COMPLETED`. - [ ] **Log Entry:** Insert record into `processing_logs`. - [ ] **Export:** Write summary JSON/Parquet file to `/data/output` for analytics. **Exit Criteria:** - A sample video is processed end-to-end: Frames extracted → Faces detected → Classified → Confidence calculated → DB updated. - GPU memory usage stays under 18GB per GPU. - Throughput meets baseline (>30 videos/hour/GPU on test set). --- ## Phase 4: Active Learning & Review UI (Sprint 7-8) **Goal:** Enable human-in-the-loop correction and model retraining. ### 4.1 Review UI - [ ] **UI Setup:** Deploy Label Studio or custom Flask UI. - [ ] **Data Feed:** Query DB for videos with routing_decision = `REVIEW`. - [ ] **Frontend:** Display video player + top-k contributing frames. Allow annotator to toggle label (True/False) or correct classification. - [ ] **Export:** Generate CSV/JSON export of annotated data with ground truth. ### 4.2 Fine-Tuning Pipeline - [ ] **Data Loader:** Script to ingest exported annotations and prepare dataset for training. - [ ] **Training Job:** - Head-only fine-tuning on face crops. - Use AdamW, LR=1e-3, Early Stopping. - Save checkpoint to `/models/candidate/`. - [ ] **Validation:** - Run candidate model on held-out validation set. - Calculate F1 score and ECE (Expected Calibration Error). - If ΔF1 > 0.02 and ECE < 0.08, promote model to `ACTIVE`. ### 4.3 Model Swapping - [ ] **Registry Update:** Update DB `models` table to mark new version as `ACTIVE` and old as `ARCHIVED`. - [ ] **Hot Reload:** Restart Worker containers or signal process to reload new TensorRT engine. **Exit Criteria:** - Annotator can label a review video. - Labeled data triggers a fine-tuning job. - New model is validated and deployed automatically. --- ## Phase 5: Observability, Monitoring & Hardening (Sprint 9+) **Goal:** Ensure system reliability, debuggability, and long-term stability. ### 5.1 Metrics & Logging - [ ] **Prometheus Integration:** Expose metrics: - `videos_processed_total` (by routing decision). - `gpu_utilization`, `gpu_memory_used`. - `queue_depth` (PENDING/PROCESSING counts). - `confidence_distribution` histogram. - [ ] **Grafana Dashboard:** Create dashboards for: - Throughput (videos/hour). - Error rates (UNSCANNABLE/ERROR counts). - Confidence drift alerts. ### 5.2 Fault Tolerance & Resumption - [ ] **Crash Recovery:** Implement checkpointing. If Worker dies, mark `PROCESSING` jobs as `PENDING` again. - [ ] **Idempotency:** Ensure re-processing a file does not duplicate DB entries or outputs. - [ ] **Retry Logic:** Auto-retry transient errors (e.g., network blip during NAS access) up to 3 times. ### 5.3 Drift Detection - [ ] **Weekly Job:** Compare current confidence distribution to baseline. - [ ] **Alerting:** Send alert if `p(C > 0.5)` shifts >10% or Review Queue grows unbounded. **Exit Criteria:** - Dashboard shows real-time health of the system. - System recovers gracefully from forced Worker termination. - Alerts trigger correctly on simulated drift/errors. --- ## Risk Mitigation | Risk | Mitigation Strategy | |------|---------------------| | **GPU OOM** | Implement strict batch size caps; downscale 4K frames to 1080p/720p before inference. | | **Slow NAS I/O** | Cache frames in local NVMe `tmpfs`; minimize disk writes until final export. | | **Codec Variance** | Extensive unit testing of `ffprobe` logic against known "bad" files. Graceful degradation to `UNSCANNABLE`. | | **Model Regression** | Strict validation gate before model swap. Keep previous model in `ARCHIVED` state for quick rollback. | | **30TB Scan Time** | Incremental scanning using `file_hash` and `last_modified` timestamps. Avoid full rescan. | --- ## Deliverables Checklist - [ ] `docker-compose.yml` - [ ] Worker Dockerfile & Requirements.txt - [ ] MariaDB SQL Schema - [ ] Python Source Code (`src/`) - `scanner.py` - `processor.py` - `model_runner.py` - `db_handler.py` - `train.py` - [ ] Config Files (`config.yaml`) - [ ] Grafana Dashboard JSON - [ ] Documentation (`README.md`, `API_DOCS.md`)