Files
VideoDetect/README.md
T
2026-08-03 11:30:49 -04:00

169 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# VideoDetect - Video Classification System
A production-grade video classification system for processing large-scale video corpora (~30TB) to classify videos based on demographic presence using deep learning models.
## Architecture
```
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Scanner │────▶│ Processor │────▶│ Results │
│ (STORY-02) │ │ (STORY-03/04)│ │ (STORY-05) │
└─────────────┘ └──────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ MariaDB │◀───▶│ GPU (P40) │◀───▶│ Export │
│ (Metadata) │ │ (Inference) │ │ (Parquet) │
└─────────────┘ └──────────────┘ └─────────────┘
┌─────────────┐ ┌──────────────┐
│ Review UI │◀───▶│ Active Learn │
│ (STORY-06) │ │ (STORY-07) │
└─────────────┘ └──────────────┘
┌─────────────┐
│ Monitoring │
│ (STORY-08) │
└─────────────┘
```
## Quick Start
### Prerequisites
- Docker & Docker Compose v2+
- NVIDIA Container Toolkit
- 2× Tesla P40 GPUs (or compatible)
- NAS/SMB mount at `/mnt/nas` (configurable via env vars)
### Environment Variables
```bash
# Database
export DB_ROOT_PASSWORD=your_root_password
export DB_PASSWORD=your_db_password
# Paths (optional, defaults shown)
export NAS_INPUT_PATH=/mnt/nas/input
export NAS_OUTPUT_PATH=/mnt/nas/output
export MODELS_PATH=/mnt/nas/models
export TRAINING_PATH=/mnt/nas/training
# Grafana admin password
export GRAFANA_PASSWORD=your_grafana_password
```
### Start the Stack
```bash
docker-compose up -d
```
### Verify Services
```bash
# Check all containers are running
docker-compose ps
# Check GPU visibility in worker
docker exec videodetect-worker nvidia-smi
# Check database connectivity
docker exec videodetect-mariadb mysql -u videodetect -p videodetect -e "SHOW TABLES;"
# Access UI
open http://localhost:5000
# Access Grafana
open http://localhost:3000 (admin / your_grafana_password)
# Access Prometheus
open http://localhost:9090
```
## Project Structure
```
VideoDetect/
├── docker-compose.yml # Multi-service orchestration
├── config.yaml # All configuration
├── db/
│ └── schema.sql # MariaDB schema
├── worker/
│ ├── Dockerfile # Worker container image
│ └── requirements.txt # Python dependencies
├── ui/
│ ├── Dockerfile # UI container image
│ └── review/ # Review UI templates
├── src/
│ ├── main.py # Worker entry point
│ ├── db_connector.py # Database connection layer
│ ├── config_loader.py # Configuration management
│ ├── logging_config.py # Logging setup
│ ├── scanner.py # Directory scanner (STORY-02)
│ ├── prober.py # Video probing (STORY-02)
│ ├── frame_sampler.py # Frame extraction (STORY-03)
│ ├── face_detector.py # Face detection (STORY-04)
│ ├── classifier.py # Classification (STORY-05)
│ ├── aggregator.py # Confidence aggregation (STORY-05)
│ ├── router.py # Threshold routing (STORY-05)
│ ├── result_updater.py # Result persistence (STORY-06)
│ ├── data_export.py # Parquet/JSONL export (STORY-06)
│ ├── review_api.py # Review API (STORY-07)
│ ├── active_learning/ # Active learning pipeline (STORY-08)
│ │ ├── label_ingestor.py
│ │ ├── trainer.py
│ │ ├── validator.py
│ │ └── registry.py
│ ├── metrics.py # Prometheus metrics (STORY-09)
│ ├── crash_recovery.py # Crash recovery (STORY-09)
│ └── drift_detector.py # Drift detection (STORY-09)
├── monitoring/
│ ├── prometheus/
│ │ └── prometheus.yml # Prometheus config
│ └── grafana/
│ ├── dashboards/ # Grafana dashboard JSONs
│ └── provisioning/ # Grafana data source config
├── STORY-01.md through STORY-09.md # Implementation stories
├── Plan.md # Implementation plan
└── Requirements.md # Requirements document
```
## Implementation Stories
| Story | Description | Sprint | Points |
|-------|-------------|--------|--------|
| STORY-01 | Foundation & Infrastructure | 1-2 | 13 |
| STORY-02 | Core Ingestion & Codec Handling | 3-4 | 21 |
| STORY-03 | Frame Sampling | 5 | 13 |
| STORY-04 | Face Detection | 5-6 | 21 |
| STORY-05 | Classification & Confidence | 5-6 | 21 |
| STORY-06 | Results Persistence & Export | 5-6 | 13 |
| STORY-07 | Review Interface | 7 | 21 |
| STORY-08 | Active Learning Pipeline | 7-8 | 34 |
| STORY-09 | Observability & Hardening | 9+ | 34 |
## Hardware Requirements
- **GPUs:** 2× Tesla P40 24GB (compute capability 5.2)
- **CUDA:** ≤ 11.8
- **PyTorch:** ≤ 2.1.0
- **Inference:** FP32 only (no Tensor Cores)
- **Storage:** NVMe/SSD for scratch, NAS/SMB for input/output
- **RAM:** ≥ 32GB system RAM
## Key Design Decisions
1. **TensorRT FP32 only** — Tesla P40 has no Tensor Cores; FP16 would not provide benefit
2. **YOLOv8n + MobileNetV3** — Lightweight models optimized for throughput over accuracy
3. **Max aggregation** — Most conservative confidence strategy; use highest frame confidence
4. **Temperature scaling** — Calibrates confidence scores without retraining
5. **Head-only fine-tuning** — Faster retraining with frozen backbone
6. **Parquet export** — Efficient columnar format for analytics
7. **No auth/SSL** — Per TC-06, internal LAN only
## License
Proprietary — VideoDetect Project