# EvilEye
Intelligence video surveillance system with object detection, tracking, and multi-camera support.
## Features
- **Multi-camera support** - Process multiple video sources simultaneously
- **Object detection** - YOLO-based object detection with customizable models
- **Object tracking** - Advanced tracking algorithms with re-identification
- **Pipeline architecture** - Modular and extensible processing pipeline
- **GUI and CLI** - Both graphical and command-line interfaces
- **Database integration** - PostgreSQL support for event storage
- **Real-time processing** - Optimized for real-time video analysis
## Quick Start
### Installation
#### From PyPI (Users)
```bash
# Install from PyPI with all dependencies
pip install evileye
```
#### From Source (Developers)
```bash
# Clone the repository
git clone https://github.com/aicommunity/EvilEye.git
cd EvilEye
# Install in development mode
pip install -e "."
# Fix entry points
python fix_entry_points.py
Next you can use the 'evileye' command to work, or if the command does not work:
python3 -m evileye.cli_wrapper
```
### Basic Usage
EvilEye provides multiple entry points for different use cases:
```bash
# Deploy sample configurations (recommended for beginners)
evileye deploy-samples
# Deploy EvilEye system to current directory
evileye deploy
# List available configurations
evileye list-configs
# Run with configuration ('configs/' prefix may be omitted)
evileye run configs/my_config.json
# Create new configuration
evileye-create my_config --sources 2 --source-type video_file
# Launch main application with GUI
evileye-launch
# Open configuration editor
evileye-configure configs/my_config.json
# Direct process launcher
evileye-process --config configs/my_config.json
```
**Quick Start Options:**
- **GUI Users**: Use `evileye-launch` for the main application interface
- **CLI Users**: Use `evileye` commands for command-line operations
- **Configuration**: Use `evileye-configure` for visual configuration editing
- **Automation**: Use `evileye-process` for headless operation
#### After Running `evileye deploy`
The `deploy` command creates the following structure in your current directory:
```
your_project/
├── credentials.json # Database and camera credentials
└── configs/ # Configuration files directory
└── (empty - ready for your configs)
```
#### After Running `evileye deploy-samples`
The `deploy-samples` command creates the following structure in your current directory:
```
your_project/
├── credentials.json # Database and camera credentials
├── videos/ # Sample video files
│ ├── planes_sample.mp4 # Single video with planes
│ ├── sample_split.mp4 # Video with two camera views
│ ├── 6p-c0.avi # Multi-camera tracking (camera 0)
│ └── 6p-c1.avi # Multi-camera tracking (camera 1)
└── configs/ # Configuration files directory
├── single_video.json # Single video processing
├── single_video_split.json # Video with 2-way split
├── multi_videos.json # Multiple videos with tracking
├── single_ip_camera.json # IP camera processing
├── single_video_rtdetr.json # Single video with RT-DETR detector
├── multi_videos_rtdetr.json # Multiple videos with RT-DETR detector
├── single_video_rfdetr.json # Single video with RF-DETR detector
└── README_SAMPLES.md # Sample configurations guide
```
#### Credentials Configuration
The `credentials.json` file contains database and camera access credentials:
```json
{
"sources": {
"rtsp://camera1.example.com": {
"username": "camera_user",
"password": "camera_password"
},
"rtsp://camera2.example.com": {
"username": "admin",
"password": "admin123"
}
},
"database": {
"user_name": "postgres",
"password": "your_db_password",
"database_name": "evil_eye_db",
"host_name": "localhost",
"port": 5432,
"default_database_name": "postgres",
"default_password": "your_default_password",
"default_user_name": "postgres",
"default_host_name": "localhost",
"default_port": 5432
}
}
```
⚠️ **Security Warning**: The `credentials.json` file contains plain text passwords. Store this file securely and never commit it to version control. Consider using environment variables or a secure credential manager for production deployments.
## Configuration
EvilEye uses JSON configuration files for the **PipelineSurveillance** class. The configuration is divided into sections that define different components of the surveillance pipeline.
⚠️ **Important**: The configuration structure described above is specific to the **PipelineSurveillance** class. Other pipeline classes may have different configuration requirements and structure.
### Configuration Structure
```json
{
"pipeline": {
"pipeline_class": "PipelineSurveillance",
"sources": [...], // Video sources configuration
"detectors": [...], // Object detection configuration
"trackers": [...], // Object tracking configuration
"mc_trackers": [...] // Multi-camera tracking configuration
},
"controller": {
"fps": 30,
"show_main_gui": true
}
}
```
### Sources Configuration
The `sources` section defines video input sources. Each source can be configured with different types and splitting options.
#### Source Types
**1. IP Camera (`IpCamera`)**
```json
{
"source": "IpCamera",
"camera": "rtsp://url",
"apiPreference": "CAP_FFMPEG",
"source_ids": [0],
"source_names": ["Main Camera"]
}
```
**2. Video File (`VideoFile`)**
```json
{
"source": "VideoFile",
"camera": "/path/to/video.mp4",
"apiPreference": "CAP_FFMPEG",
"loop_play": true,
"source_ids": [0],
"source_names": ["Video Source"]
}
```
**3. Device Camera (`Device`)**
```json
{
"source": "Device",
"camera": 0,
"apiPreference": "CAP_FFMPEG",
"source_ids": [0],
"source_names": ["USB Camera"]
}
```
#### Source Splitting Options
**Without Splitting (Single Output)**
```json
{
"source": "IpCamera",
"camera": "rtsp://url1",
"split": false,
"num_split": 0,
"src_coords": [0],
"source_ids": [0],
"source_names": ["Camera1"]
}
```
**With Splitting (Multiple Outputs)**
```json
{
"source": "IpCamera",
"camera": "rtsp://url2",
"split": true,
"num_split": 2,
"src_coords": [
[0, 0, 2304, 1300], // Top region: x, y, width, height
[0, 1300, 2304, 1292] // Bottom region: x, y, width, height
],
"source_ids": [1, 2],
"source_names": ["Camera2_Top", "Camera2_Bottom"]
}
```
#### Source Parameters
| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `source` | string | Source type: `IpCamera`, `VideoFile`, `Device` | - |
| `camera` | string/int | Camera URL, file path, or device index | - |
| `apiPreference` | string | OpenCV API preference | `CAP_FFMPEG` |
| `split` | boolean | Enable source splitting | `false` |
| `num_split` | int | Number of split regions | `0` |
| `src_coords` | array | Coordinates for split regions | `[0]` |
| `source_ids` | array | Unique IDs for each output | - |
| `source_names` | array | Names for each output | - |
| `loop_play` | boolean | Loop video files | `true` |
| `desired_fps` | int | Target FPS for the source | `null` |
### Detectors Configuration
The `detectors` section configures object detection for each source.
#### YOLO Detector Configuration
```json
{
"source_ids": [0],
"model": "models/yolov8n.pt",
"show": false,
"inference_size": 640,
"device": null,
"conf": 0.4,
"save": false,
"stride_type": "frames",
"vid_stride": 1,
"classes": [0, 1, 24, 25, 63, 66, 67],
"roi": [
[[1790, 0, 500, 400], [1700, 0, 1000, 1045]]
]
}
```
#### Detector Parameters
| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `source_ids` | array | Source IDs to process | - |
| `model` | string | YOLO model path | `models/yolov8n.pt` |
| `show` | boolean | Show detection results | `false` |
| `inference_size` | int | Model input size | `640` |
| `device` | string | Device for inference (`cpu`, `cuda:0`) | `null` |
| `conf` | float | Confidence threshold | `0.25` |
| `save` | boolean | Save detection results | `false` |
| `stride_type` | string | Stride type: `frames` | `frames` |
| `vid_stride` | int | Video stride | `1` |
| `classes` | array | Object classes to detect | `[0, 1, 24, 25, 63, 66, 67]` |
| `roi` | array | Regions of interest | `[[]]` |
#### RT-DETR Detector Configuration
RT-DETR (Real-Time Detection Transformer) provides high-accuracy object detection with transformer architecture:
```json
{
"type": "ObjectDetectorRtdetr",
"source_ids": [0],
"model": "rtdetr-l.pt",
"inference_size": 640,
"conf": 0.25,
"device": "cpu",
"classes": [0, 1, 24, 25, 63, 66, 67],
"roi": [[]],
"vid_stride": 1,
"num_detection_threads": 1
}
```
#### RF-DETR Detector Configuration
RF-DETR (Roboflow Detection Transformer) provides optimized transformer-based detection:
```json
{
"type": "ObjectDetectorRfdetr",
"source_ids": [0],
"model": "rfdetr-nano",
"inference_size": 640,
"conf": 0.25,
"device": "cpu",
"classes": [0, 1, 24, 25, 63, 66, 67],
"roi": [[]],
"vid_stride": 1,
"num_detection_threads": 1
}
```
#### Detector Types
| Detector Type | Model | Architecture | Speed | Accuracy |
|---------------|-------|--------------|-------|----------|
| YOLO | `yolov8n.pt` | CNN | Fast | Good |
| RT-DETR | `rtdetr-l.pt` | Transformer | Medium | High |
| RF-DETR | `rfdetr-nano` | Transformer | Fast | Good |
### Trackers Configuration
The `trackers` section configures object tracking for each source.
#### Botsort Tracker Configuration
```json
{
"source_ids": [0],
"fps": 30,
"tracker_type": "botsort",
"botsort_cfg": {
"appearance_thresh": 0.25,
"gmc_method": "sparseOptFlow",
"match_thresh": 0.8,
"new_track_thresh": 0.6,
"proximity_thresh": 0.5,
"track_buffer": 30,
"track_high_thresh": 0.5,
"track_low_thresh": 0.1,
"with_reid": false
}
}
```
#### Tracker Parameters
| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `source_ids` | array | Source IDs to track | - |
| `fps` | int | Tracking FPS | `5` |
| `tracker_type` | string | Tracker type | `botsort` |
| `botsort_cfg` | object | Botsort configuration | See above |
### Multi-Camera Trackers Configuration
The `mc_trackers` section configures cross-camera object tracking.
#### Multi-Camera Tracking Configuration
```json
{
"source_ids": [0, 1, 2],
"enable": true
}
```
#### Multi-Camera Tracker Parameters
| Parameter | Type | Description | Default |
|-----------|------|-------------|---------|
| `source_ids` | array | Source IDs for cross-camera tracking | - |
| `enable` | boolean | Enable multi-camera tracking | `false` |
### Complete Configuration Examples
#### IP Camera Configuration (poly-cameras.json)
```json
{
"pipeline": {
"sources": [
{
"source": "IpCamera",
"camera": "rtsp://url1",
"apiPreference": "CAP_FFMPEG",
"split": false,
"num_split": 0,
"src_coords": [0],
"source_ids": [0],
"source_names": ["Cam1"]
},
{
"source": "IpCamera",
"camera": "rtsp://url2",
"apiPreference": "CAP_FFMPEG",
"split": true,
"num_split": 2,
"src_coords": [
[0, 0, 2304, 1300],
[0, 1300, 2304, 1292]
],
"source_ids": [1, 2],
"source_names": ["Cam2", "Cam3"]
}
],
"detectors": [
{
"source_ids": [0],
"model": "models/yolov8n.pt",
"show": false,
"inference_size": 640,
"device": null,
"conf": 0.4,
"save": false,
"stride_type": "frames",
"vid_stride": 1,
"classes": [0, 1, 24, 25, 63, 66, 67]
}
],
"trackers": [
{
"source_ids": [0],
"fps": 30,
"tracker_type": "botsort"
}
],
"mc_trackers": [
{
"source_ids": [0, 1, 2],
"enable": true
}
]
},
"controller": {
"fps": 30,
"show_main_gui": true
}
}
```
#### Video File Configuration (poly-videos.json)
```json
{
"pipeline": {
"sources": [
{
"source": "VideoFile",
"camera": "/path/to/video1.mp4",
"apiPreference": "CAP_FFMPEG",
"split": false,
"num_split": 0,
"src_coords": [0],
"source_ids": [0],
"source_names": ["Video1"]
},
{
"source": "VideoFile",
"camera": "/path/to/video2.mp4",
"apiPreference": "CAP_FFMPEG",
"split": true,
"num_split": 2,
"src_coords": [
[0, 0, 2304, 1300],
[0, 1300, 2304, 1292]
],
"source_ids": [1, 2],
"source_names": ["Video2_1", "Video2_2"]
}
],
"detectors": [
{
"source_ids": [0],
"model": "models/yolov8n.pt",
"show": false,
"inference_size": 640,
"device": null,
"conf": 0.4,
"save": false,
"stride_type": "frames",
"vid_stride": 1,
"classes": [0, 1, 24, 25, 63, 66, 67]
}
],
"trackers": [
{
"source_ids": [0],
"fps": 30,
"tracker_type": "botsort"
}
],
"mc_trackers": [
{
"source_ids": [0, 1, 2],
"enable": true
}
]
},
"controller": {
"fps": 30,
"show_main_gui": true
}
}
```
## CLI Commands
EvilEye provides a comprehensive command-line interface for all operations through multiple entry points:
### Available Entry Points
EvilEye provides several command-line entry points for different operations:
| Command | Description | Usage |
|---------|-------------|-------|
| `evileye` | Main CLI interface with all commands | `evileye [COMMAND] [OPTIONS]` |
| `evileye-process` | Direct process launcher with GUI | `evileye-process [OPTIONS]` |
| `evileye-configure` | Configuration editor GUI | `evileye-configure [CONFIG_FILE]` |
| `evileye-launch` | Main application launcher GUI | `evileye-launch [CONFIG_FILE]` |
| `evileye-create` | Configuration file creator | `evileye-create [NAME] [OPTIONS]` |
### Main CLI Commands (`evileye`)
The main `evileye` command provides access to all system functionality:
```bash
# Deploy configuration files to current directory
evileye deploy
# Deploy sample configurations with working examples
evileye deploy-samples
# Create new configuration
evileye-create my_config --sources 2 --source-type video_file
# Run with configuration
evileye run configs/my_config.json
# Validate configuration file
evileye validate configs/my_config.json
# List available configurations
evileye list-configs
# Show system information
evileye info
```
### Process Launcher (`evileye-process`)
Direct launcher for the surveillance process with GUI support:
```bash
# Launch with configuration file
evileye-process --config configs/my_config.json
# Launch with GUI disabled (headless mode)
evileye-process --config configs/my_config.json --no-gui
# Launch with auto-close when video ends
evileye-process --config configs/my_config.json --autoclose
# Use preset for multiple video sources
evileye-process --sources_preset multi_camera
```
**Options:**
- `--config CONFIG_FILE` - Configuration file path
- `--gui` / `--no-gui` - Enable/disable GUI (default: enabled)
- `--autoclose` - Auto-close when video ends
- `--sources_preset PRESET` - Use preset for multiple sources
### Configuration Editor (`evileye-configure`)
Graphical configuration editor for creating and modifying configuration files:
```bash
# Open configuration editor
evileye-configure
# Open specific configuration file
evileye-configure configs/my_config.json
# Open configuration from any path
evileye-configure /path/to/config.json
```
**Features:**
- Visual configuration editor
- Real-time validation
- Template-based configuration creation
- Source, detector, and tracker configuration
- Multi-camera setup support
### Application Launcher (`evileye-launch`)
Main application launcher with integrated configuration management:
```bash
# Launch main application
evileye-launch
# Launch with specific configuration
evileye-launch configs/my_config.json
```
**Features:**
- Configuration file browser
- Process control (start/stop surveillance)
- Real-time status monitoring
- Log display and management
- Tabbed interface for different functions
### Configuration Creator (`evileye-create`)
Command-line tool for creating new configuration files:
```bash
# Create basic configuration
evileye-create my_config
# Create configuration with specific number of sources
evileye-create my_config --sources 3
# Create configuration with specific source type
evileye-create my_config --sources 2 --source-type ip_camera
# Create configuration with specific pipeline
evileye-create my_config --pipeline PipelineSurveillance
# List available pipeline classes
evileye-create --list-pipelines
# Create configuration in specific directory
evileye-create /path/to/custom_config
```
**Options:**
- `--sources N` - Number of video sources (default: 0)
- `--source-type TYPE` - Source type: `video_file`, `ip_camera`, `device`
- `--pipeline PIPELINE` - Pipeline class to use
- `--list-pipelines` - List available pipeline classes
The Configuration GUI provides:
- Configuration file browser and editor
- Process control (launch/stop surveillance system via process.py)
- Real-time status monitoring
- Log display and management
- Tabbed interface for configuration, logs, and controls
### Deployment Command Details
The `evileye deploy` command:
1. **Copies** `credentials_proto.json` to `credentials.json` (if `credentials.json` doesn't exist)
2. **Creates** `configs/` folder (if it doesn't exist)
3. **Prepares** your project directory for EvilEye configuration
**Created Files:**
- `credentials.json` - Database and camera access credentials
- `configs/` - Directory for your configuration files
**Next Steps After Deploy:**
1. Edit `credentials.json` with your actual credentials
2. Create configurations using `evileye-create`
3. Run the system with `evileye run`
### Configuration Management
```bash
# List available pipeline classes
evileye-create --list-pipelines
# Create configuration with specific pipeline
evileye-create my_config --sources 2 --pipeline PipelineSurveillance
# Available source types:
# - video_file: Video files (.mp4, .avi, etc.)
# - ip_camera: IP cameras (RTSP streams)
# - device: USB/web cameras
# Validate configuration file
evileye validate configs/my_config.json
# List available configurations
evileye list-configs
```
### Complete Workflow Example
```bash
# 1. Deploy files to new project directory
mkdir my_surveillance_project
cd my_surveillance_project
evileye deploy
# 2. Edit credentials.json with your actual credentials
# - Add camera usernames/passwords
# - Configure database connection
# 3. Create configuration for 2 IP cameras
evileye-create surveillance_config --sources 2 --source-type ip_camera
# 4. Edit configs/surveillance_config.json with your camera URLs
# - Replace "rtsp://url" with actual camera URLs
# - Configure detection and tracking parameters
# 5. Validate configuration
evileye validate configs/surveillance_config.json
# 6. Run the system (multiple options available)
evileye run configs/surveillance_config.json
# Alternative: Use direct process launcher
evileye-process --config configs/surveillance_config.json
# Alternative: Use GUI launcher for easier management
evileye-launch
# Alternative: Use configuration editor for fine-tuning
evileye-configure configs/surveillance_config.json
```
### Entry Point Usage Scenarios
**For Beginners:**
```bash
# Use the main launcher with GUI
evileye-launch
```
**For Advanced Users:**
```bash
# Use direct process launcher with specific options
evileye-process --config configs/my_config.json --no-gui --autoclose
```
**For Configuration Management:**
```bash
# Create new configurations
evileye-create my_config --sources 3 --source-type ip_camera
# Edit existing configurations
evileye-configure configs/my_config.json
# Validate configurations
evileye validate configs/my_config.json
```
**For Automation/Scripts:**
```bash
# Use main CLI for scripting
evileye run configs/automated_config.json
# Use process launcher for headless operation
evileye-process --config configs/headless_config.json --no-gui
```
## Development
### Project Structure
```
evileye/
├── core/ # Core pipeline components
│ ├── pipeline.py # Base pipeline class
│ ├── processor_base.py # Base processor class
│ └── ...
├── pipelines/ # Pipeline implementations
│ └── pipeline_surveillance.py
├── object_detector/ # Object detection modules
├── object_tracker/ # Object tracking modules
├── object_multi_camera_tracker/ # Multi-camera tracking
├── events_detectors/ # Event detection
├── database_controller/ # Database integration
├── visualization_modules/ # Main application GUI components
├── configs/ # Configuration files
├── tests/ # Test suite
├── evileye/ # Package entry points
│ ├── cli.py # Command-line interface
│ ├── launch.py # Configuration GUI launcher
│ └── __init__.py # Package initialization
├── pyproject.toml # Project configuration
├── Makefile # Development commands
└── README.md # This file
```
## Architecture
EvilEye uses a modular pipeline architecture:
1. **Sources** - Video capture from cameras, files, or streams
2. **Preprocessors** - Frame preprocessing and enhancement
3. **Detectors** - Object detection using YOLO models
4. **Trackers** - Object tracking and trajectory analysis
5. **Multi-camera Trackers** - Cross-camera object re-identification
Each component is implemented as a processor that can be configured and combined to create custom surveillance pipelines.
### Pipeline Classes
EvilEye supports multiple pipeline implementations:
- **PipelineSurveillance** - Full-featured pipeline with all components (sources, detectors, trackers, mc_trackers)
- **Custom Pipelines** - User-defined pipeline implementations
Pipeline classes are automatically discovered from:
- Built-in `evileye.pipelines` package
- Local `pipelines/` folder in working directory
#### Available Pipeline Classes
```bash
# List available pipeline classes
evileye-create --list-pipelines
```
#### Creating Custom Pipelines
Create custom pipelines by extending the base `Pipeline` class and placing them in a local `pipelines/` folder:
```python
from evileye.core.pipeline_processors import Pipeline
class MyCustomPipeline(Pipeline):
def __init__(self):
super().__init__()
# Custom initialization
def generate_default_structure(self, num_sources: int):
# Custom configuration generation
pass
```
Each pipeline class can define its own configuration structure and processing logic.
## Contributing
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
### Code Style
- Follow PEP 8 guidelines
- Use type hints
- Write docstrings for all functions and classes
- Run `make quality` before submitting PRs
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Support
- **Documentation**: [https://evileye.readthedocs.io/](https://evileye.readthedocs.io/)
- **Issues**: [https://github.com/evileye/evileye/issues](https://github.com/evileye/evileye/issues)
- **Discussions**: [https://github.com/evileye/evileye/discussions](https://github.com/evileye/evileye/discussions)
## Acknowledgments
- [Ultralytics](https://github.com/ultralytics/ultralytics) for YOLO models
- [OpenCV](https://opencv.org/) for computer vision
- [PyQt6](https://www.riverbankcomputing.com/software/pyqt/) for GUI
Raw data
{
"_id": null,
"home_page": null,
"name": "evileye",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": "AI Community <palexab@gmail.com>",
"keywords": "surveillance, computer-vision, object-detection, object-tracking, video-processing",
"author": null,
"author_email": "AI Community <palexab@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/37/7b/85db1f402227c3029a758a9d03ed87a9a27e8e13a4ebee649d7dd9702676/evileye-0.0.6.tar.gz",
"platform": null,
"description": "# EvilEye\n\nIntelligence video surveillance system with object detection, tracking, and multi-camera support.\n\n## Features\n\n- **Multi-camera support** - Process multiple video sources simultaneously\n- **Object detection** - YOLO-based object detection with customizable models\n- **Object tracking** - Advanced tracking algorithms with re-identification\n- **Pipeline architecture** - Modular and extensible processing pipeline\n- **GUI and CLI** - Both graphical and command-line interfaces\n- **Database integration** - PostgreSQL support for event storage\n- **Real-time processing** - Optimized for real-time video analysis\n\n## Quick Start\n\n### Installation\n\n#### From PyPI (Users)\n\n```bash\n# Install from PyPI with all dependencies\npip install evileye\n\n```\n\n#### From Source (Developers)\n\n```bash\n# Clone the repository\ngit clone https://github.com/aicommunity/EvilEye.git\ncd EvilEye\n\n# Install in development mode\npip install -e \".\"\n\n# Fix entry points\npython fix_entry_points.py\n\nNext you can use the 'evileye' command to work, or if the command does not work:\npython3 -m evileye.cli_wrapper\n```\n\n### Basic Usage\n\nEvilEye provides multiple entry points for different use cases:\n\n```bash\n# Deploy sample configurations (recommended for beginners)\nevileye deploy-samples\n\n# Deploy EvilEye system to current directory\nevileye deploy\n\n# List available configurations\nevileye list-configs\n\n# Run with configuration ('configs/' prefix may be omitted)\nevileye run configs/my_config.json\n\n# Create new configuration\nevileye-create my_config --sources 2 --source-type video_file\n\n# Launch main application with GUI\nevileye-launch\n\n# Open configuration editor\nevileye-configure configs/my_config.json\n\n# Direct process launcher\nevileye-process --config configs/my_config.json\n```\n\n**Quick Start Options:**\n- **GUI Users**: Use `evileye-launch` for the main application interface\n- **CLI Users**: Use `evileye` commands for command-line operations\n- **Configuration**: Use `evileye-configure` for visual configuration editing\n- **Automation**: Use `evileye-process` for headless operation\n\n#### After Running `evileye deploy`\n\nThe `deploy` command creates the following structure in your current directory:\n\n```\nyour_project/\n\u251c\u2500\u2500 credentials.json # Database and camera credentials\n\u2514\u2500\u2500 configs/ # Configuration files directory\n \u2514\u2500\u2500 (empty - ready for your configs)\n```\n\n#### After Running `evileye deploy-samples`\n\nThe `deploy-samples` command creates the following structure in your current directory:\n\n```\nyour_project/\n\u251c\u2500\u2500 credentials.json # Database and camera credentials\n\u251c\u2500\u2500 videos/ # Sample video files\n\u2502 \u251c\u2500\u2500 planes_sample.mp4 # Single video with planes\n\u2502 \u251c\u2500\u2500 sample_split.mp4 # Video with two camera views\n\u2502 \u251c\u2500\u2500 6p-c0.avi # Multi-camera tracking (camera 0)\n\u2502 \u2514\u2500\u2500 6p-c1.avi # Multi-camera tracking (camera 1)\n\u2514\u2500\u2500 configs/ # Configuration files directory\n \u251c\u2500\u2500 single_video.json # Single video processing\n \u251c\u2500\u2500 single_video_split.json # Video with 2-way split\n \u251c\u2500\u2500 multi_videos.json # Multiple videos with tracking\n \u251c\u2500\u2500 single_ip_camera.json # IP camera processing\n \u251c\u2500\u2500 single_video_rtdetr.json # Single video with RT-DETR detector\n \u251c\u2500\u2500 multi_videos_rtdetr.json # Multiple videos with RT-DETR detector\n \u251c\u2500\u2500 single_video_rfdetr.json # Single video with RF-DETR detector\n \u2514\u2500\u2500 README_SAMPLES.md # Sample configurations guide\n```\n\n#### Credentials Configuration\n\nThe `credentials.json` file contains database and camera access credentials:\n\n```json\n{\n \"sources\": {\n \"rtsp://camera1.example.com\": {\n \"username\": \"camera_user\",\n \"password\": \"camera_password\"\n },\n \"rtsp://camera2.example.com\": {\n \"username\": \"admin\",\n \"password\": \"admin123\"\n }\n },\n \"database\": {\n \"user_name\": \"postgres\",\n \"password\": \"your_db_password\",\n \"database_name\": \"evil_eye_db\",\n \"host_name\": \"localhost\",\n \"port\": 5432,\n \"default_database_name\": \"postgres\",\n \"default_password\": \"your_default_password\",\n \"default_user_name\": \"postgres\",\n \"default_host_name\": \"localhost\",\n \"default_port\": 5432\n }\n}\n```\n\n\u26a0\ufe0f **Security Warning**: The `credentials.json` file contains plain text passwords. Store this file securely and never commit it to version control. Consider using environment variables or a secure credential manager for production deployments.\n\n\n\n## Configuration\n\nEvilEye uses JSON configuration files for the **PipelineSurveillance** class. The configuration is divided into sections that define different components of the surveillance pipeline.\n\n\u26a0\ufe0f **Important**: The configuration structure described above is specific to the **PipelineSurveillance** class. Other pipeline classes may have different configuration requirements and structure.\n\n### Configuration Structure\n\n```json\n{\n \"pipeline\": {\n \"pipeline_class\": \"PipelineSurveillance\",\n \"sources\": [...], // Video sources configuration\n \"detectors\": [...], // Object detection configuration\n \"trackers\": [...], // Object tracking configuration\n \"mc_trackers\": [...] // Multi-camera tracking configuration\n },\n \"controller\": {\n \"fps\": 30,\n \"show_main_gui\": true\n }\n}\n```\n\n### Sources Configuration\n\nThe `sources` section defines video input sources. Each source can be configured with different types and splitting options.\n\n#### Source Types\n\n**1. IP Camera (`IpCamera`)**\n```json\n{\n \"source\": \"IpCamera\",\n \"camera\": \"rtsp://url\",\n \"apiPreference\": \"CAP_FFMPEG\",\n \"source_ids\": [0],\n \"source_names\": [\"Main Camera\"]\n}\n```\n\n**2. Video File (`VideoFile`)**\n```json\n{\n \"source\": \"VideoFile\",\n \"camera\": \"/path/to/video.mp4\",\n \"apiPreference\": \"CAP_FFMPEG\",\n \"loop_play\": true,\n \"source_ids\": [0],\n \"source_names\": [\"Video Source\"]\n}\n```\n\n**3. Device Camera (`Device`)**\n```json\n{\n \"source\": \"Device\",\n \"camera\": 0,\n \"apiPreference\": \"CAP_FFMPEG\",\n \"source_ids\": [0],\n \"source_names\": [\"USB Camera\"]\n}\n```\n\n#### Source Splitting Options\n\n**Without Splitting (Single Output)**\n```json\n{\n \"source\": \"IpCamera\",\n \"camera\": \"rtsp://url1\",\n \"split\": false,\n \"num_split\": 0,\n \"src_coords\": [0],\n \"source_ids\": [0],\n \"source_names\": [\"Camera1\"]\n}\n```\n\n**With Splitting (Multiple Outputs)**\n```json\n{\n \"source\": \"IpCamera\",\n \"camera\": \"rtsp://url2\",\n \"split\": true,\n \"num_split\": 2,\n \"src_coords\": [\n [0, 0, 2304, 1300], // Top region: x, y, width, height\n [0, 1300, 2304, 1292] // Bottom region: x, y, width, height\n ],\n \"source_ids\": [1, 2],\n \"source_names\": [\"Camera2_Top\", \"Camera2_Bottom\"]\n}\n```\n\n#### Source Parameters\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `source` | string | Source type: `IpCamera`, `VideoFile`, `Device` | - |\n| `camera` | string/int | Camera URL, file path, or device index | - |\n| `apiPreference` | string | OpenCV API preference | `CAP_FFMPEG` |\n| `split` | boolean | Enable source splitting | `false` |\n| `num_split` | int | Number of split regions | `0` |\n| `src_coords` | array | Coordinates for split regions | `[0]` |\n| `source_ids` | array | Unique IDs for each output | - |\n| `source_names` | array | Names for each output | - |\n| `loop_play` | boolean | Loop video files | `true` |\n| `desired_fps` | int | Target FPS for the source | `null` |\n\n### Detectors Configuration\n\nThe `detectors` section configures object detection for each source.\n\n#### YOLO Detector Configuration\n\n```json\n{\n \"source_ids\": [0],\n \"model\": \"models/yolov8n.pt\",\n \"show\": false,\n \"inference_size\": 640,\n \"device\": null,\n \"conf\": 0.4,\n \"save\": false,\n \"stride_type\": \"frames\",\n \"vid_stride\": 1,\n \"classes\": [0, 1, 24, 25, 63, 66, 67],\n \"roi\": [\n [[1790, 0, 500, 400], [1700, 0, 1000, 1045]]\n ]\n}\n```\n\n#### Detector Parameters\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `source_ids` | array | Source IDs to process | - |\n| `model` | string | YOLO model path | `models/yolov8n.pt` |\n| `show` | boolean | Show detection results | `false` |\n| `inference_size` | int | Model input size | `640` |\n| `device` | string | Device for inference (`cpu`, `cuda:0`) | `null` |\n| `conf` | float | Confidence threshold | `0.25` |\n| `save` | boolean | Save detection results | `false` |\n| `stride_type` | string | Stride type: `frames` | `frames` |\n| `vid_stride` | int | Video stride | `1` |\n| `classes` | array | Object classes to detect | `[0, 1, 24, 25, 63, 66, 67]` |\n| `roi` | array | Regions of interest | `[[]]` |\n\n#### RT-DETR Detector Configuration\n\nRT-DETR (Real-Time Detection Transformer) provides high-accuracy object detection with transformer architecture:\n\n```json\n{\n \"type\": \"ObjectDetectorRtdetr\",\n \"source_ids\": [0],\n \"model\": \"rtdetr-l.pt\",\n \"inference_size\": 640,\n \"conf\": 0.25,\n \"device\": \"cpu\",\n \"classes\": [0, 1, 24, 25, 63, 66, 67],\n \"roi\": [[]],\n \"vid_stride\": 1,\n \"num_detection_threads\": 1\n}\n```\n\n#### RF-DETR Detector Configuration\n\nRF-DETR (Roboflow Detection Transformer) provides optimized transformer-based detection:\n\n```json\n{\n \"type\": \"ObjectDetectorRfdetr\",\n \"source_ids\": [0],\n \"model\": \"rfdetr-nano\",\n \"inference_size\": 640,\n \"conf\": 0.25,\n \"device\": \"cpu\",\n \"classes\": [0, 1, 24, 25, 63, 66, 67],\n \"roi\": [[]],\n \"vid_stride\": 1,\n \"num_detection_threads\": 1\n}\n```\n\n#### Detector Types\n\n| Detector Type | Model | Architecture | Speed | Accuracy |\n|---------------|-------|--------------|-------|----------|\n| YOLO | `yolov8n.pt` | CNN | Fast | Good |\n| RT-DETR | `rtdetr-l.pt` | Transformer | Medium | High |\n| RF-DETR | `rfdetr-nano` | Transformer | Fast | Good |\n\n### Trackers Configuration\n\nThe `trackers` section configures object tracking for each source.\n\n#### Botsort Tracker Configuration\n\n```json\n{\n \"source_ids\": [0],\n \"fps\": 30,\n \"tracker_type\": \"botsort\",\n \"botsort_cfg\": {\n \"appearance_thresh\": 0.25,\n \"gmc_method\": \"sparseOptFlow\",\n \"match_thresh\": 0.8,\n \"new_track_thresh\": 0.6,\n \"proximity_thresh\": 0.5,\n \"track_buffer\": 30,\n \"track_high_thresh\": 0.5,\n \"track_low_thresh\": 0.1,\n \"with_reid\": false\n }\n}\n```\n\n#### Tracker Parameters\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `source_ids` | array | Source IDs to track | - |\n| `fps` | int | Tracking FPS | `5` |\n| `tracker_type` | string | Tracker type | `botsort` |\n| `botsort_cfg` | object | Botsort configuration | See above |\n\n### Multi-Camera Trackers Configuration\n\nThe `mc_trackers` section configures cross-camera object tracking.\n\n#### Multi-Camera Tracking Configuration\n\n```json\n{\n \"source_ids\": [0, 1, 2],\n \"enable\": true\n}\n```\n\n#### Multi-Camera Tracker Parameters\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `source_ids` | array | Source IDs for cross-camera tracking | - |\n| `enable` | boolean | Enable multi-camera tracking | `false` |\n\n### Complete Configuration Examples\n\n#### IP Camera Configuration (poly-cameras.json)\n\n```json\n{\n \"pipeline\": {\n \"sources\": [\n {\n \"source\": \"IpCamera\",\n \"camera\": \"rtsp://url1\",\n \"apiPreference\": \"CAP_FFMPEG\",\n \"split\": false,\n \"num_split\": 0,\n \"src_coords\": [0],\n \"source_ids\": [0],\n \"source_names\": [\"Cam1\"]\n },\n {\n \"source\": \"IpCamera\",\n \"camera\": \"rtsp://url2\",\n \"apiPreference\": \"CAP_FFMPEG\",\n \"split\": true,\n \"num_split\": 2,\n \"src_coords\": [\n [0, 0, 2304, 1300],\n [0, 1300, 2304, 1292]\n ],\n \"source_ids\": [1, 2],\n \"source_names\": [\"Cam2\", \"Cam3\"]\n }\n ],\n \"detectors\": [\n {\n \"source_ids\": [0],\n \"model\": \"models/yolov8n.pt\",\n \"show\": false,\n \"inference_size\": 640,\n \"device\": null,\n \"conf\": 0.4,\n \"save\": false,\n \"stride_type\": \"frames\",\n \"vid_stride\": 1,\n \"classes\": [0, 1, 24, 25, 63, 66, 67]\n }\n ],\n \"trackers\": [\n {\n \"source_ids\": [0],\n \"fps\": 30,\n \"tracker_type\": \"botsort\"\n }\n ],\n \"mc_trackers\": [\n {\n \"source_ids\": [0, 1, 2],\n \"enable\": true\n }\n ]\n },\n \"controller\": {\n \"fps\": 30,\n \"show_main_gui\": true\n }\n}\n```\n\n#### Video File Configuration (poly-videos.json)\n\n```json\n{\n \"pipeline\": {\n \"sources\": [\n {\n \"source\": \"VideoFile\",\n \"camera\": \"/path/to/video1.mp4\",\n \"apiPreference\": \"CAP_FFMPEG\",\n \"split\": false,\n \"num_split\": 0,\n \"src_coords\": [0],\n \"source_ids\": [0],\n \"source_names\": [\"Video1\"]\n },\n {\n \"source\": \"VideoFile\",\n \"camera\": \"/path/to/video2.mp4\",\n \"apiPreference\": \"CAP_FFMPEG\",\n \"split\": true,\n \"num_split\": 2,\n \"src_coords\": [\n [0, 0, 2304, 1300],\n [0, 1300, 2304, 1292]\n ],\n \"source_ids\": [1, 2],\n \"source_names\": [\"Video2_1\", \"Video2_2\"]\n }\n ],\n \"detectors\": [\n {\n \"source_ids\": [0],\n \"model\": \"models/yolov8n.pt\",\n \"show\": false,\n \"inference_size\": 640,\n \"device\": null,\n \"conf\": 0.4,\n \"save\": false,\n \"stride_type\": \"frames\",\n \"vid_stride\": 1,\n \"classes\": [0, 1, 24, 25, 63, 66, 67]\n }\n ],\n \"trackers\": [\n {\n \"source_ids\": [0],\n \"fps\": 30,\n \"tracker_type\": \"botsort\"\n }\n ],\n \"mc_trackers\": [\n {\n \"source_ids\": [0, 1, 2],\n \"enable\": true\n }\n ]\n },\n \"controller\": {\n \"fps\": 30,\n \"show_main_gui\": true\n }\n}\n```\n\n## CLI Commands\n\nEvilEye provides a comprehensive command-line interface for all operations through multiple entry points:\n\n### Available Entry Points\n\nEvilEye provides several command-line entry points for different operations:\n\n| Command | Description | Usage |\n|---------|-------------|-------|\n| `evileye` | Main CLI interface with all commands | `evileye [COMMAND] [OPTIONS]` |\n| `evileye-process` | Direct process launcher with GUI | `evileye-process [OPTIONS]` |\n| `evileye-configure` | Configuration editor GUI | `evileye-configure [CONFIG_FILE]` |\n| `evileye-launch` | Main application launcher GUI | `evileye-launch [CONFIG_FILE]` |\n| `evileye-create` | Configuration file creator | `evileye-create [NAME] [OPTIONS]` |\n\n### Main CLI Commands (`evileye`)\n\nThe main `evileye` command provides access to all system functionality:\n\n```bash\n# Deploy configuration files to current directory\nevileye deploy\n\n# Deploy sample configurations with working examples\nevileye deploy-samples\n\n# Create new configuration\nevileye-create my_config --sources 2 --source-type video_file\n\n# Run with configuration\nevileye run configs/my_config.json\n\n# Validate configuration file\nevileye validate configs/my_config.json\n\n# List available configurations\nevileye list-configs\n\n# Show system information\nevileye info\n```\n\n### Process Launcher (`evileye-process`)\n\nDirect launcher for the surveillance process with GUI support:\n\n```bash\n# Launch with configuration file\nevileye-process --config configs/my_config.json\n\n# Launch with GUI disabled (headless mode)\nevileye-process --config configs/my_config.json --no-gui\n\n# Launch with auto-close when video ends\nevileye-process --config configs/my_config.json --autoclose\n\n# Use preset for multiple video sources\nevileye-process --sources_preset multi_camera\n```\n\n**Options:**\n- `--config CONFIG_FILE` - Configuration file path\n- `--gui` / `--no-gui` - Enable/disable GUI (default: enabled)\n- `--autoclose` - Auto-close when video ends\n- `--sources_preset PRESET` - Use preset for multiple sources\n\n### Configuration Editor (`evileye-configure`)\n\nGraphical configuration editor for creating and modifying configuration files:\n\n```bash\n# Open configuration editor\nevileye-configure\n\n# Open specific configuration file\nevileye-configure configs/my_config.json\n\n# Open configuration from any path\nevileye-configure /path/to/config.json\n```\n\n**Features:**\n- Visual configuration editor\n- Real-time validation\n- Template-based configuration creation\n- Source, detector, and tracker configuration\n- Multi-camera setup support\n\n### Application Launcher (`evileye-launch`)\n\nMain application launcher with integrated configuration management:\n\n```bash\n# Launch main application\nevileye-launch\n\n# Launch with specific configuration\nevileye-launch configs/my_config.json\n```\n\n**Features:**\n- Configuration file browser\n- Process control (start/stop surveillance)\n- Real-time status monitoring\n- Log display and management\n- Tabbed interface for different functions\n\n### Configuration Creator (`evileye-create`)\n\nCommand-line tool for creating new configuration files:\n\n```bash\n# Create basic configuration\nevileye-create my_config\n\n# Create configuration with specific number of sources\nevileye-create my_config --sources 3\n\n# Create configuration with specific source type\nevileye-create my_config --sources 2 --source-type ip_camera\n\n# Create configuration with specific pipeline\nevileye-create my_config --pipeline PipelineSurveillance\n\n# List available pipeline classes\nevileye-create --list-pipelines\n\n# Create configuration in specific directory\nevileye-create /path/to/custom_config\n```\n\n**Options:**\n- `--sources N` - Number of video sources (default: 0)\n- `--source-type TYPE` - Source type: `video_file`, `ip_camera`, `device`\n- `--pipeline PIPELINE` - Pipeline class to use\n- `--list-pipelines` - List available pipeline classes\n\nThe Configuration GUI provides:\n- Configuration file browser and editor\n- Process control (launch/stop surveillance system via process.py)\n- Real-time status monitoring\n- Log display and management\n- Tabbed interface for configuration, logs, and controls\n\n### Deployment Command Details\n\nThe `evileye deploy` command:\n\n1. **Copies** `credentials_proto.json` to `credentials.json` (if `credentials.json` doesn't exist)\n2. **Creates** `configs/` folder (if it doesn't exist)\n3. **Prepares** your project directory for EvilEye configuration\n\n**Created Files:**\n- `credentials.json` - Database and camera access credentials\n- `configs/` - Directory for your configuration files\n\n**Next Steps After Deploy:**\n1. Edit `credentials.json` with your actual credentials\n2. Create configurations using `evileye-create`\n3. Run the system with `evileye run`\n\n### Configuration Management\n\n```bash\n# List available pipeline classes\nevileye-create --list-pipelines\n\n# Create configuration with specific pipeline\nevileye-create my_config --sources 2 --pipeline PipelineSurveillance\n\n# Available source types:\n# - video_file: Video files (.mp4, .avi, etc.)\n# - ip_camera: IP cameras (RTSP streams)\n# - device: USB/web cameras\n\n# Validate configuration file\nevileye validate configs/my_config.json\n\n# List available configurations\nevileye list-configs\n```\n\n### Complete Workflow Example\n\n```bash\n# 1. Deploy files to new project directory\nmkdir my_surveillance_project\ncd my_surveillance_project\nevileye deploy\n\n# 2. Edit credentials.json with your actual credentials\n# - Add camera usernames/passwords\n# - Configure database connection\n\n# 3. Create configuration for 2 IP cameras\nevileye-create surveillance_config --sources 2 --source-type ip_camera\n\n# 4. Edit configs/surveillance_config.json with your camera URLs\n# - Replace \"rtsp://url\" with actual camera URLs\n# - Configure detection and tracking parameters\n\n# 5. Validate configuration\nevileye validate configs/surveillance_config.json\n\n# 6. Run the system (multiple options available)\nevileye run configs/surveillance_config.json\n\n# Alternative: Use direct process launcher\nevileye-process --config configs/surveillance_config.json\n\n# Alternative: Use GUI launcher for easier management\nevileye-launch\n\n# Alternative: Use configuration editor for fine-tuning\nevileye-configure configs/surveillance_config.json\n```\n\n### Entry Point Usage Scenarios\n\n**For Beginners:**\n```bash\n# Use the main launcher with GUI\nevileye-launch\n```\n\n**For Advanced Users:**\n```bash\n# Use direct process launcher with specific options\nevileye-process --config configs/my_config.json --no-gui --autoclose\n```\n\n**For Configuration Management:**\n```bash\n# Create new configurations\nevileye-create my_config --sources 3 --source-type ip_camera\n\n# Edit existing configurations\nevileye-configure configs/my_config.json\n\n# Validate configurations\nevileye validate configs/my_config.json\n```\n\n**For Automation/Scripts:**\n```bash\n# Use main CLI for scripting\nevileye run configs/automated_config.json\n\n# Use process launcher for headless operation\nevileye-process --config configs/headless_config.json --no-gui\n```\n\n## Development\n\n### Project Structure\n\n```\nevileye/\n\u251c\u2500\u2500 core/ # Core pipeline components\n\u2502 \u251c\u2500\u2500 pipeline.py # Base pipeline class\n\u2502 \u251c\u2500\u2500 processor_base.py # Base processor class\n\u2502 \u2514\u2500\u2500 ...\n\u251c\u2500\u2500 pipelines/ # Pipeline implementations\n\u2502 \u2514\u2500\u2500 pipeline_surveillance.py\n\u251c\u2500\u2500 object_detector/ # Object detection modules\n\u251c\u2500\u2500 object_tracker/ # Object tracking modules\n\u251c\u2500\u2500 object_multi_camera_tracker/ # Multi-camera tracking\n\u251c\u2500\u2500 events_detectors/ # Event detection\n\u251c\u2500\u2500 database_controller/ # Database integration\n\u251c\u2500\u2500 visualization_modules/ # Main application GUI components\n\u251c\u2500\u2500 configs/ # Configuration files\n\u251c\u2500\u2500 tests/ # Test suite\n\u251c\u2500\u2500 evileye/ # Package entry points\n\u2502 \u251c\u2500\u2500 cli.py # Command-line interface\n\u2502 \u251c\u2500\u2500 launch.py # Configuration GUI launcher\n\u2502 \u2514\u2500\u2500 __init__.py # Package initialization\n\u251c\u2500\u2500 pyproject.toml # Project configuration\n\u251c\u2500\u2500 Makefile # Development commands\n\u2514\u2500\u2500 README.md # This file\n```\n\n## Architecture\n\nEvilEye uses a modular pipeline architecture:\n\n1. **Sources** - Video capture from cameras, files, or streams\n2. **Preprocessors** - Frame preprocessing and enhancement\n3. **Detectors** - Object detection using YOLO models\n4. **Trackers** - Object tracking and trajectory analysis\n5. **Multi-camera Trackers** - Cross-camera object re-identification\n\nEach component is implemented as a processor that can be configured and combined to create custom surveillance pipelines.\n\n### Pipeline Classes\n\nEvilEye supports multiple pipeline implementations:\n\n- **PipelineSurveillance** - Full-featured pipeline with all components (sources, detectors, trackers, mc_trackers)\n- **Custom Pipelines** - User-defined pipeline implementations\n\nPipeline classes are automatically discovered from:\n- Built-in `evileye.pipelines` package\n- Local `pipelines/` folder in working directory\n\n#### Available Pipeline Classes\n\n```bash\n# List available pipeline classes\nevileye-create --list-pipelines\n```\n\n#### Creating Custom Pipelines\n\nCreate custom pipelines by extending the base `Pipeline` class and placing them in a local `pipelines/` folder:\n\n```python\nfrom evileye.core.pipeline_processors import Pipeline\n\n\nclass MyCustomPipeline(Pipeline):\n def __init__(self):\n super().__init__()\n # Custom initialization\n\n def generate_default_structure(self, num_sources: int):\n # Custom configuration generation\n pass\n```\n\nEach pipeline class can define its own configuration structure and processing logic.\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n### Code Style\n\n- Follow PEP 8 guidelines\n- Use type hints\n- Write docstrings for all functions and classes\n- Run `make quality` before submitting PRs\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Support\n\n- **Documentation**: [https://evileye.readthedocs.io/](https://evileye.readthedocs.io/)\n- **Issues**: [https://github.com/evileye/evileye/issues](https://github.com/evileye/evileye/issues)\n- **Discussions**: [https://github.com/evileye/evileye/discussions](https://github.com/evileye/evileye/discussions)\n\n## Acknowledgments\n\n- [Ultralytics](https://github.com/ultralytics/ultralytics) for YOLO models\n- [OpenCV](https://opencv.org/) for computer vision\n- [PyQt6](https://www.riverbankcomputing.com/software/pyqt/) for GUI\n",
"bugtrack_url": null,
"license": null,
"summary": "Intelligence video surveillance system",
"version": "0.0.6",
"project_urls": {
"Bug Tracker": "https://github.com/evileye/evileye/issues",
"Documentation": "https://evileye.readthedocs.io/",
"Homepage": "https://github.com/evileye/evileye",
"Repository": "https://github.com/evileye/evileye.git",
"Source Code": "https://github.com/evileye/evileye"
},
"split_keywords": [
"surveillance",
" computer-vision",
" object-detection",
" object-tracking",
" video-processing"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "b534b3a5e288d57ab6bb8c337fe676fed3b2a466dba2fb3bfce9476d48edef3f",
"md5": "18a9f9cf7fef5cfee7af8d415553ee17",
"sha256": "ffbe42938d1ac5b08bd51b3fca9bb5bc965da02e56224fff97b677db461c348a"
},
"downloads": -1,
"filename": "evileye-0.0.6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "18a9f9cf7fef5cfee7af8d415553ee17",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 6281319,
"upload_time": "2025-10-08T06:44:26",
"upload_time_iso_8601": "2025-10-08T06:44:26.001899Z",
"url": "https://files.pythonhosted.org/packages/b5/34/b3a5e288d57ab6bb8c337fe676fed3b2a466dba2fb3bfce9476d48edef3f/evileye-0.0.6-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "377b85db1f402227c3029a758a9d03ed87a9a27e8e13a4ebee649d7dd9702676",
"md5": "49a94f8e2c20f4c9ce193ba709f61801",
"sha256": "a0482e8526e00bd848c55c8a96a42b8b5f5b9100d66386ddeaee88795803c3ac"
},
"downloads": -1,
"filename": "evileye-0.0.6.tar.gz",
"has_sig": false,
"md5_digest": "49a94f8e2c20f4c9ce193ba709f61801",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 6250649,
"upload_time": "2025-10-08T06:44:29",
"upload_time_iso_8601": "2025-10-08T06:44:29.852781Z",
"url": "https://files.pythonhosted.org/packages/37/7b/85db1f402227c3029a758a9d03ed87a9a27e8e13a4ebee649d7dd9702676/evileye-0.0.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-08 06:44:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "evileye",
"github_project": "evileye",
"github_not_found": true,
"lcname": "evileye"
}