python-detector-worker/CLAUDE.md
2025-09-12 21:44:09 +07:00

595 lines
No EOL
24 KiB
Markdown

# Python Detector Worker - CLAUDE.md
## Project Overview
This is a FastAPI-based computer vision detection worker that processes video streams from RTSP/HTTP sources and runs advanced YOLO-based machine learning pipelines for multi-class object detection and parallel classification. The system features comprehensive database integration, Redis support, and hierarchical pipeline execution designed to work within a larger CMS (Content Management System) architecture.
**IMPORTANT**: This project has been completely refactored from a monolithic 4,000+ line codebase into a modular, maintainable architecture with dependency injection, comprehensive testing, and clear separation of concerns.
### Key Features
- **Multi-Class Detection**: Simultaneous detection of multiple object classes (e.g., Car + Frontal)
- **Parallel Processing**: Concurrent execution of classification branches using ThreadPoolExecutor
- **Database Integration**: Automatic PostgreSQL schema management and record updates
- **Redis Actions**: Image storage with region cropping and pub/sub messaging
- **Pipeline Synchronization**: Branch coordination with `waitForBranches` functionality
- **Dynamic Field Mapping**: Template-based field resolution for database operations
- **Modular Architecture**: Clean separation of concerns with dependency injection
- **Thread-Safe Operations**: Singleton managers for global state management
- **Comprehensive Testing**: Unit, integration, and performance test suites
## Architecture & Technology Stack
- **Framework**: FastAPI with WebSocket support and modern async patterns
- **ML/CV**: PyTorch, Ultralytics YOLO, OpenCV with BoT-SORT tracking
- **Containerization**: Docker (Python 3.13-bookworm base)
- **Data Storage**: Redis integration for action handling + PostgreSQL for persistent storage
- **Database**: Automatic schema management with gas_station_1 database
- **Parallel Processing**: ThreadPoolExecutor for concurrent classification
- **Communication**: WebSocket-based real-time protocol
- **Design Patterns**: Dependency Injection, Singleton, Repository patterns
- **Testing**: Pytest with asyncio, mocking, and benchmarking support
## New Modular Architecture
### Core Directory Structure
```
detector_worker/
├── core/ # Core infrastructure components
│ ├── config.py # Multi-source configuration management
│ ├── constants.py # Application constants
│ ├── exceptions.py # Custom exception hierarchy
│ ├── singleton_managers.py # Thread-safe singleton managers
│ └── dependency_injection.py # IoC container implementation
├── detection/ # Computer vision and ML components
│ ├── yolo_detector.py # YOLO model inference
│ ├── tracking_manager.py # BoT-SORT multi-object tracking
│ └── stability_validator.py # Detection stability validation
├── pipeline/ # ML pipeline execution
│ ├── pipeline_executor.py # Main pipeline orchestration
│ ├── action_executor.py # Redis/DB action execution
│ └── field_mapper.py # Template-based field mapping
├── streams/ # Video stream management
│ ├── stream_manager.py # Stream lifecycle management
│ ├── frame_reader.py # RTSP/HTTP frame reading
│ └── camera_monitor.py # Connection state monitoring
├── communication/ # WebSocket and messaging
│ ├── websocket_handler.py # WebSocket connection management
│ ├── message_processor.py # Message routing and processing
│ └── response_formatter.py # Response formatting
├── storage/ # Data persistence
│ ├── database_manager.py # PostgreSQL operations
│ ├── redis_client.py # Redis operations
│ └── session_cache.py # Session and cache management
├── models/ # Model and pipeline management
│ ├── model_manager.py # YOLO model loading/caching
│ └── pipeline_loader.py # MPTA pipeline loading
└── utils/ # Utility functions
├── logging_utils.py # Structured logging setup
├── image_utils.py # Image processing utilities
└── system_utils.py # System monitoring utilities
```
### Main Application (`app.py`)
- **FastAPI application** with modern lifespan management (replacing deprecated @app.on_event)
- **Dependency injection container** initialization and service registration
- **WebSocket endpoint** delegation to communication layer
- **HTTP REST endpoint** for image retrieval (`/camera/{camera_id}/image`)
- **Clean separation** between framework code and business logic
- **Resource monitoring** integrated with singleton managers
### Core Infrastructure (`core/`)
#### Configuration Management (`core/config.py`)
- **Multi-source configuration** with environment variables, JSON files, and defaults
- **Type-safe configuration** with proper validation and error handling
- **Development/production** environment support
- **Configuration providers** pattern for extensible config sources
#### Singleton Managers (`core/singleton_managers.py`)
- **Thread-safe singleton implementation** using metaclass pattern
- **Six specialized managers**:
- `SubscriptionManager`: WebSocket subscription lifecycle
- `StreamManager`: RTSP/HTTP stream management with reference counting
- `ModelManager`: YOLO model loading and caching
- `PipelineManager`: MPTA pipeline loading and management
- `SessionManager`: Session tracking and management
- `SessionCacheManager`: Redis-backed session caching
- **Replaces global dictionaries** for thread-safe state management
#### Dependency Injection (`core/dependency_injection.py`)
- **Full IoC container** with automatic constructor injection
- **Three service lifetimes**: Singleton, Transient, Scoped
- **Interface-based registration** supporting both concrete types and factories
- **Circular dependency detection** and resolution
- **Scope management** for request-scoped services
### Detection System (`detection/`)
#### YOLO Detector (`detection/yolo_detector.py`)
- **YOLODetector class** for inference management
- **Multi-class detection** support (Car + Frontal simultaneously)
- **GPU/CPU optimization** with automatic device selection
- **Confidence filtering** and NMS post-processing
- **Integration with tracking system**
#### Tracking Manager (`detection/tracking_manager.py`)
- **BoT-SORT implementation** for multi-object tracking
- **Track lifecycle management** with unique ID assignment
- **Stability validation** integration for reliable detections
- **Performance optimization** with configurable parameters
#### Stability Validator (`detection/stability_validator.py`)
- **Detection stability analysis** over time windows
- **Confidence trend analysis** for reliable object detection
- **Configurable thresholds** for stability determination
- **Integration with tracking and pipeline systems**
### Pipeline System (`pipeline/`)
#### Pipeline Executor (`pipeline/pipeline_executor.py`)
- **PipelineExecutor class** for orchestrating MPTA pipeline execution
- **Hierarchical execution** with detection → classification branching
- **Parallel processing** using ThreadPoolExecutor for classification branches
- **Branch synchronization** with `waitForBranches` coordination
- **Error handling** and retry mechanisms
#### Action Executor (`pipeline/action_executor.py`)
- **ActionExecutor class** for Redis and database actions
- **Redis image storage** with region cropping and expiration
- **PostgreSQL operations** with automatic schema management
- **Pub/sub messaging** for real-time notifications
- **Template-based configuration** for dynamic action parameters
#### Field Mapper (`pipeline/field_mapper.py`)
- **FieldMapper class** for template-based field resolution
- **Dynamic field mapping** from classification results to database fields
- **Template syntax**: `{model_id.field_name}` → actual values
- **Type-safe field resolution** with error handling
### Stream Management (`streams/`)
#### Stream Manager (`streams/stream_manager.py`)
- **StreamManager class** for RTSP/HTTP stream lifecycle management
- **Reference counting** for shared stream optimization
- **Automatic reconnection** with exponential backoff
- **Thread-safe operations** with proper locking mechanisms
#### Frame Reader (`streams/frame_reader.py`)
- **FrameReader class** for RTSP stream processing
- **SnapshotReader class** for HTTP snapshot capture
- **Queue-based buffering** with latest frame optimization
- **Error handling** and connection recovery
#### Camera Monitor (`streams/camera_monitor.py`)
- **CameraMonitor class** for connection state tracking
- **Health monitoring** and status reporting
- **Integration with stream management** for failure detection
### Communication Layer (`communication/`)
#### WebSocket Handler (`communication/websocket_handler.py`)
- **WebSocketHandler class** for connection lifecycle management
- **Message routing** to appropriate processors
- **Error handling** and graceful disconnection
- **Integration with subscription management**
#### Message Processor (`communication/message_processor.py`)
- **MessageProcessor class** for message routing and handling
- **Type-safe message processing** with validation
- **Integration with detection pipeline** and state management
- **Real-time response formatting**
#### Response Formatter (`communication/response_formatter.py`)
- **ResponseFormatter class** for consistent message formatting
- **Detection result formatting** with timestamp and metadata
- **State report generation** with system metrics
- **JSON serialization** with type safety
### Storage Layer (`storage/`)
#### Database Manager (`storage/database_manager.py`)
- **DatabaseManager class** with Repository pattern implementation
- **Automatic schema management** for gas_station_1.car_frontal_info
- **Connection pooling** and transaction management
- **Combined update operations** with field mapping
- **Error handling** and retry mechanisms
#### Redis Client (`storage/redis_client.py`)
- **RedisClient class** for Redis operations
- **Image storage** with automatic expiration
- **Pub/sub messaging** for real-time notifications
- **Connection management** with retry logic
- **Type-safe operations** with proper error handling
#### Session Cache (`storage/session_cache.py`)
- **SessionCacheManager class** for session and cache management
- **Redis-backed caching** with configurable expiration
- **Session tracking** with UUID generation
- **Thread-safe operations** with singleton pattern
### Model Management (`models/`)
#### Model Manager (`models/model_manager.py`)
- **ModelManager class** for YOLO model lifecycle management
- **Model caching** with memory optimization
- **GPU/CPU device management** with automatic selection
- **Thread-safe model loading** and inference preparation
#### Pipeline Loader (`models/pipeline_loader.py`)
- **PipelineLoader class** for MPTA archive handling
- **ZIP archive extraction** and validation
- **Configuration parsing** with schema validation
- **Model file management** and loading coordination
## System Workflow
### Application Startup (app.py)
1. **Configuration Loading** - Multi-source configuration initialization
2. **Dependency Container Setup** - Service registration and IoC container configuration
3. **Singleton Manager Initialization** - Thread-safe global state managers
4. **FastAPI Application Creation** - Modern lifespan management setup
5. **Service Registration** - All components registered with dependency injection
6. **Server Launch** - Uvicorn server startup with WebSocket support
### WebSocket Connection Flow
1. **Client Connection** (`communication/websocket_handler.py:35`)
2. **Message Reception** (`communication/message_processor.py:42`)
3. **Subscription Processing** (`communication/message_processor.py:78`)
4. **Stream Initialization** (`streams/stream_manager.py:156`)
5. **Model Loading** (`models/model_manager.py:89`)
6. **Pipeline Setup** (`pipeline/pipeline_executor.py:67`)
### Detection Pipeline Flow
1. **Frame Capture** (`streams/frame_reader.py:123`)
2. **YOLO Detection** (`detection/yolo_detector.py:145`)
3. **Multi-Object Tracking** (`detection/tracking_manager.py:178`)
4. **Stability Validation** (`detection/stability_validator.py:92`)
5. **Pipeline Execution** (`pipeline/pipeline_executor.py:234`)
6. **Action Execution** (`pipeline/action_executor.py:189`)
7. **Field Mapping** (`pipeline/field_mapper.py:67`)
8. **Database Update** (`storage/database_manager.py:234`)
9. **Response Formatting** (`communication/response_formatter.py:89`)
## WebSocket Protocol
### Message Types
- **subscribe**: Start camera stream with model pipeline
- **unsubscribe**: Stop camera stream processing
- **requestState**: Request current worker status
- **setSessionId**: Associate display with session identifier
- **patchSession**: Update session data
- **stateReport**: Periodic heartbeat with system metrics
- **imageDetection**: Detection results with timestamp and model info
### Subscription Format
```json
{
"type": "subscribe",
"payload": {
"subscriptionIdentifier": "display-001;cam-001",
"rtspUrl": "rtsp://...", // OR snapshotUrl
"snapshotUrl": "http://...",
"snapshotInterval": 5000,
"modelUrl": "http://...model.mpta",
"modelId": 101,
"modelName": "Vehicle Detection",
"cropX1": 100, "cropY1": 200,
"cropX2": 300, "cropY2": 400
}
}
```
## Model Pipeline (MPTA) Format
### Enhanced Structure
- **ZIP archive** containing models and configuration
- **pipeline.json** - Main configuration file with Redis + PostgreSQL settings
- **Model files** - YOLO .pt files for detection/classification
- **Multi-model support** - Detection + multiple classification models
### Advanced Pipeline Flow
1. **Multi-class detection stage** - YOLO detection of Car + Frontal simultaneously
2. **Validation stage** - Check for expected classes (flexible matching)
3. **Database initialization** - Create initial record with session_id
4. **Redis actions** - Save cropped frontal images with expiration
5. **Parallel classification** - Concurrent brand and body type classification
6. **Branch synchronization** - Wait for all classification branches to complete
7. **Database update** - Combined update with all classification results
### Enhanced Branch Configuration
```json
{
"modelId": "car_frontal_detection_v1",
"modelFile": "car_frontal_detection_v1.pt",
"multiClass": true,
"expectedClasses": ["Car", "Frontal"],
"triggerClasses": ["Car", "Frontal"],
"minConfidence": 0.8,
"actions": [
{
"type": "redis_save_image",
"region": "Frontal",
"key": "inference:{display_id}:{timestamp}:{session_id}:{filename}",
"expire_seconds": 600
}
],
"branches": [
{
"modelId": "car_brand_cls_v1",
"modelFile": "car_brand_cls_v1.pt",
"parallel": true,
"crop": true,
"cropClass": "Frontal",
"triggerClasses": ["Frontal"],
"minConfidence": 0.85
}
],
"parallelActions": [
{
"type": "postgresql_update_combined",
"table": "car_frontal_info",
"key_field": "session_id",
"waitForBranches": ["car_brand_cls_v1", "car_bodytype_cls_v1"],
"fields": {
"car_brand": "{car_brand_cls_v1.brand}",
"car_body_type": "{car_bodytype_cls_v1.body_type}"
}
}
]
}
```
## Testing Infrastructure
### Test Structure
```
tests/
├── unit/ # Unit tests for individual components
│ ├── core/ # Core infrastructure tests
│ ├── detection/ # Computer vision component tests
│ ├── pipeline/ # Pipeline execution tests
│ ├── streams/ # Stream management tests
│ ├── communication/ # WebSocket and messaging tests
│ ├── storage/ # Database and Redis tests
│ └── models/ # Model management tests
├── integration/ # End-to-end workflow tests
├── performance/ # Performance benchmarks and load tests
└── fixtures/ # Test data and mock objects
```
### Test Commands
```bash
# Run all tests
make test
# Run specific test categories
make test-unit
make test-integration
make test-performance
# Run with coverage reporting
make test-coverage
# Run code quality checks
make lint
make format
```
## Development & Deployment
### Cross-Platform Development Setup
The project supports cross-platform development with automatic Python command detection:
- **macOS/Linux**: Automatically uses `python3` and `pip3`
- **Windows**: Falls back to `python` and `pip`
- **No manual configuration needed**
### Step-by-Step Setup Guide
#### 1. Clone and Setup
```bash
git clone <repository-url>
cd python-detector-worker
# Check environment information
make env-info
```
#### 2. Install Dependencies
```bash
# Install production dependencies
make install
# Install development dependencies (recommended)
make install-dev
# Verify installation
make check-deps
```
#### 3. Run the Application
```bash
# Development mode (staging port 8001 with auto-reload)
make run-staging
# Production mode (port 8000 with auto-reload)
make run
# Production mode (port 8000 without auto-reload)
make run-prod
# Debug mode (staging port 8001 with verbose logging)
make run-debug
```
#### 4. Verify Setup
```bash
# Check application health
curl http://localhost:8001/health # For staging
curl http://localhost:8000/health # For production
# Run quick tests
make test-fast
# Check code quality
make lint
```
### Local Development Commands
#### Application Execution
```bash
make run # Production mode (port 8000) with reload
make run-staging # Staging mode (port 8001) with reload
make run-prod # Production mode (port 8000) without reload
make run-debug # Debug mode (staging port 8001) with verbose logging
```
#### Code Quality & Testing
```bash
# Code formatting and quality
make format # Format code with black & isort
make lint # Run linting (flake8, mypy)
make quality # Run all quality checks
# Testing
make test # Run all tests with coverage
make test-unit # Run unit tests only
make test-integration # Run integration tests
make test-performance # Run performance benchmarks
make test-fast # Run fast tests only
make test-coverage # Generate detailed coverage report
# Development utilities
make clean # Clean build artifacts
make env-info # Show environment details
make version # Show application version
```
### Docker Deployment
#### Basic Docker Operations
```bash
# Build container
make docker-build
# Run container (production port 8000)
make docker-run
# Run container (staging port 8001)
make docker-run-staging
# Development container with volume mounts
make docker-dev
```
#### Docker Environment Variables
```bash
# Run with custom port
docker run -p 8001:8001 -e DETECTOR_WORKER_PORT=8001 detector-worker
# Run with configuration
docker run -v $(PWD)/config.json:/app/config.json detector-worker
```
### Configuration Management
- **Environment Variables**: Override default configuration
- **config.json**: Development and production settings
- **DETECTOR_WORKER_ENV**: Environment selection (dev/test/prod)
## Code Conventions & Patterns
### Design Patterns Used
- **Dependency Injection**: IoC container with automatic constructor injection
- **Singleton Pattern**: Thread-safe implementation using metaclass
- **Repository Pattern**: Database operations with interface abstraction
- **Factory Pattern**: Model and pipeline loading with configurable factories
- **Observer Pattern**: WebSocket communication and event handling
### Code Quality Standards
- **Type Hints**: Comprehensive type annotations throughout codebase
- **Error Handling**: Structured exception hierarchy with proper propagation
- **Logging**: Structured logging with context-aware messages
- **Testing**: Unit, integration, and performance tests with high coverage
- **Documentation**: Comprehensive docstrings and inline documentation
### Performance Optimizations
- **GPU Acceleration**: CUDA support with automatic fallback to CPU
- **Memory Management**: Model caching with automatic cleanup
- **Thread Safety**: Proper locking mechanisms for concurrent operations
- **Resource Monitoring**: CPU, memory, and GPU usage tracking
- **Connection Pooling**: Database and Redis connection optimization
## Security Considerations
- **Input Validation**: All WebSocket messages and configuration validated
- **Resource Limits**: Configurable limits for streams, models, and connections
- **Error Handling**: Graceful failure handling without information leakage
- **Authentication**: Redis and PostgreSQL connection security
- **Model Security**: MPTA file validation and secure model loading
## Database Integration
### Schema Management
The system automatically creates and manages PostgreSQL tables:
```sql
CREATE TABLE IF NOT EXISTS gas_station_1.car_frontal_info (
display_id VARCHAR(255),
captured_timestamp VARCHAR(255),
session_id VARCHAR(255) PRIMARY KEY,
license_character VARCHAR(255) DEFAULT NULL,
license_type VARCHAR(255) DEFAULT 'No model available',
car_brand VARCHAR(255) DEFAULT NULL,
car_model VARCHAR(255) DEFAULT NULL,
car_body_type VARCHAR(255) DEFAULT NULL,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
```
### Workflow
1. **Detection**: When both "Car" and "Frontal" are detected, create initial database record with UUID session_id
2. **Redis Storage**: Save cropped frontal image to Redis with session_id in key
3. **Parallel Processing**: Run brand and body type classification concurrently
4. **Synchronization**: Wait for all branches to complete using `waitForBranches`
5. **Database Update**: Update record with combined classification results using field mapping
### Field Mapping
Templates like `{car_brand_cls_v1.brand}` are resolved to actual classification results:
- `car_brand_cls_v1.brand` → "Honda"
- `car_bodytype_cls_v1.body_type` → "Sedan"
## Migration from Legacy Code
### Key Changes
- **Monolithic to Modular**: 4,000+ lines split into 30+ focused modules
- **Global State Elimination**: Replaced with thread-safe singleton managers
- **Dependency Injection**: Automatic constructor injection with IoC container
- **Modern FastAPI**: Deprecated patterns replaced with current best practices
- **Comprehensive Testing**: Full test suite with unit, integration, and performance tests
### Breaking Changes
- **Import Paths**: All imports now use `detector_worker.` prefix
- **Configuration**: New multi-source configuration system
- **Dependencies**: New dependency injection requirements
- **Testing**: New test infrastructure and commands
## Dependencies
- **fastapi[standard]**: Web framework with WebSocket support
- **uvicorn**: ASGI server
- **torch, torchvision**: PyTorch for ML inference
- **ultralytics**: YOLO implementation
- **opencv-python**: Computer vision operations
- **websockets**: WebSocket client/server
- **redis**: Redis client for action execution
- **psycopg2-binary**: PostgreSQL database adapter
- **scipy**: Scientific computing for advanced algorithms
- **filterpy**: Kalman filtering and state estimation
- **pytest**: Testing framework with asyncio support
- **black, isort**: Code formatting tools
- **mypy**: Static type checking
- **flake8**: Code quality analysis
## References
- **ARCHITECTURE.md**: Comprehensive technical documentation with flow diagrams
- **test_protocol.py**: WebSocket communication validation
- **pipeline_webcam.py**: Local testing with visual output
- **Makefile**: Development workflow commands
- **tox.ini**: Multi-environment testing configuration