Motion detection and object identification (person, dog, cat) using YOLOv8 with GPU support and Telegram/Email alerts.
This system combines classic motion detection (OpenCV BackgroundSubtractor) with YOLOv8 inference to provide:
- Real-time motion detection
- Object identification (person, dog, cat)
- Automatic alerts via Telegram and/or Email
- Telegram bot for remote control
- Schedules to activate alerts only at specific times
- Automatic GPU acceleration (CUDA) when available
┌─────────────────────────────────────────────────────────────┐
│ VIDEO SOURCE │
│ (Webcam / File / RTSP/HTTP Stream) │
└────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ MOTION DETECTION (OpenCV) │
│ • BackgroundSubtractorMOG2 │
│ • Morphological filtering │
│ • Contour analysis │
└────────────────────────┬────────────────────────────────────┘
│
▼
┌──────────────────┐
│ Motion? │
└────┬─────────┬───┘
│ NO │ YES
│ ▼
│ ┌─────────────────────────────────┐
│ │ YOLOv8 DETECTION (ONNX) │
│ │ • Inference every N frames │
│ │ • Auto GPU (CUDA) │
│ │ • Class filtering │
│ │ • NMS │
│ └────────┬────────────────────────┘
│ │
│ ▼
│ ┌──────────────────┐
│ │ Person detected? │
│ └────┬─────────┬───┘
│ │ NO │ YES
│ │ ▼
│ │ ┌──────────────────────┐
│ │ │ CHECK SCHEDULE │
│ │ │ CHECK COOLDOWN │
│ │ └────┬─────────────────┘
│ │ │
│ │ ▼
│ │ ┌──────────────────────┐
│ │ │ SEND ALERTS │
│ │ │ • Telegram (photo) │
│ │ │ • Email (attachment) │
│ │ └──────────────────────┘
│ │
└─────────┴────────────────────────────────┐
│
▼
┌─────────────────────────────┐
│ LIVE DISPLAY │
│ • Bounding boxes │
│ • Info panel │
│ • Alarm state │
└─────────────────────────────┘
- Capture frames from webcam/file/stream.
- Run motion detection to avoid unnecessary YOLO inference.
- Run YOLOv8 inference every N frames.
- If a person is detected and alarm is active → send alerts.
- Telegram bot allows remote control (on/off/auto, schedule, snapshot).
- Motion detection + YOLOv8 object detection
- Automatic GPU acceleration (CUDA)
- Telegram alerts (photo + caption)
- Email alerts (photo attachment)
- Schedules with day/time filtering
- Remote control via Telegram bot
- Real-time display and performance info
- Python 3.8+
- Windows / Linux / macOS
- Optional NVIDIA GPU for CUDA acceleration
Linux/macOS
chmod +x install.sh
./install.shWindows
install.bat- Create a bot with
@BotFather. - Put the token in
.env. - Send
/startto the bot. - Run:
python chat_id.py| Command | Description |
|---|---|
/activar |
Force alarm ON |
/desactivar |
Force alarm OFF |
/auto |
Use schedule |
/estado |
Show status |
/horario |
Show schedule |
/sethorario HH:MM HH:MM |
Set schedule |
/setdias 1,2,3,4,5 |
Set active days |
/foto |
Snapshot |
/help |
Help |
HORARIO_INICIO="08:00"
HORARIO_FIN="22:00"
DIAS_ACTIVOS="1,2,3,4,5,6,7"GMAIL_CUENTA="your_email@gmail.com"
GMAIL_PASSWORD="app_password"GNU GPLv3 (see LICENSE)
- Ultralytics YOLOv8
- ONNX Runtime
- OpenCV
Sistema de detección de movimiento e identificación de objetos (personas, perros, gatos) usando YOLOv8 con soporte para GPU y alertas por Telegram/Email.
Este sistema combina detección de movimiento tradicional (OpenCV BackgroundSubtractor) con inteligencia artificial (YOLOv8) para crear un sistema de vigilancia inteligente que puede:
- Detectar movimiento en tiempo real usando algoritmos de sustracción de fondo
- Identificar objetos específicos (personas, perros, gatos) usando YOLOv8 con ONNX Runtime
- Enviar alertas automáticas por Telegram y/o Email cuando detecta personas
- Control remoto mediante bot de Telegram para activar/desactivar alarma
- Horarios programables para activar el sistema solo en ciertos momentos
- Optimizado para rendimiento con soporte GPU automático (NVIDIA CUDA)
┌─────────────────────────────────────────────────────────────┐
│ FUENTE DE VIDEO │
│ (Webcam / Archivo / Stream RTSP/HTTP) │
└────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ DETECCIÓN DE MOVIMIENTO (OpenCV) │
│ • BackgroundSubtractorMOG2 │
│ • Filtrado morfológico │
│ • Análisis de contornos │
└────────────────────────┬────────────────────────────────────┘
│
▼
┌──────────────────┐
│ ¿Movimiento? │
└────┬─────────┬───┘
│ NO │ SÍ
│ ▼
│ ┌─────────────────────────────────┐
│ │ DETECCIÓN YOLOv8 (ONNX) │
│ │ • Inferencia cada N frames │
│ │ • GPU automática (CUDA) │
│ │ • Filtrado de clases │
│ │ • NMS (Non-Maximum Suppression) │
│ └────────┬────────────────────────┘
│ │
│ ▼
│ ┌──────────────────┐
│ │ ¿Persona? │
│ └────┬─────────┬───┘
│ │ NO │ SÍ
│ │ ▼
│ │ ┌──────────────────────┐
│ │ │ VERIFICAR HORARIO │
│ │ │ VERIFICAR COOLDOWN │
│ │ └────┬─────────────────┘
│ │ │
│ │ ▼
│ │ ┌──────────────────────┐
│ │ │ ENVIAR ALERTAS │
│ │ │ • Telegram (foto) │
│ │ │ • Email (adjunta) │
│ │ └──────────────────────┘
│ │
└─────────┴────────────────────────────────┐
│
▼
┌─────────────────────────────┐
│ VISUALIZACIÓN EN PANTALLA │
│ • Bounding boxes │
│ • Panel de información │
│ • Estado de alarma │
└─────────────────────────────┘
# El sistema lee frames de diferentes fuentes:
URL = 0 # Webcam
URL = "video.mp4" # Archivo local
URL = "https://..." # Stream HTTP/RTSP- Usa
BackgroundSubtractorMOG2para crear una máscara de píxeles en movimiento - Aplica operaciones morfológicas (apertura, dilatación) para reducir ruido
- Calcula contornos y filtra por área mínima
- Propósito: Evitar ejecutar YOLOv8 en frames estáticos (ahorro de CPU/GPU)
# Solo si hay movimiento significativo → ejecutar YOLOv8
if movimiento_detectado and frame_count % YOLO_INTERVAL == 0:
detectar_yolov8(frame)-
Preprocesamiento:
- Redimensiona frame a 640x640 (letterbox con padding)
- Normaliza valores a 0-1
- Convierte formato HWC → CHW (Height, Width, Channels)
-
Inferencia ONNX:
- Ejecuta modelo YOLOv8n.onnx usando ONNX Runtime
- Utiliza GPU automáticamente si está disponible (CUDA)
- Salida: tensor [1, 84, 8400] con 8400 detecciones posibles
-
Postprocesamiento:
- Filtra detecciones por confianza (threshold ajustable)
- Aplica NMS (Non-Maximum Suppression) para eliminar duplicados
- Solo conserva clases configuradas (person, dog, cat)
# Detecciones filtradas
CLASES_DETECTAR = {
"person": {"nombre": "PERSONA", "color": (0, 255, 0)},
"dog": {"nombre": "PERRO", "color": (0, 165, 255)},
"cat": {"nombre": "GATO", "color": (255, 0, 255)}
}-
Verificación de condiciones:
- ¿Se detectó una PERSONA?
- ¿La alarma está activa? (horario + día + estado forzado)
- ¿Ha pasado el tiempo de cooldown? (evita spam)
-
Envío multihilo:
- Captura el frame actual
- Lanza thread separado para no bloquear el video
- Envía por Telegram (foto con caption)
- Envía por Email (foto adjunta en MIME)
# Cooldown de 60 segundos entre alertas
if (ahora - ultima_alerta).total_seconds() >= COOLDOWN_ALERTAS:
enviar_alertas(frame, objetos_detectados)- Thread daemon escuchando comandos 24/7
- Usa long polling (
getUpdatescon timeout=30s) - Comandos procesados:
/activar→ Fuerza alarma ON/desactivar→ Fuerza alarma OFF/auto→ Usa horario programado/foto→ Captura instantánea/sethorario HH:MM HH:MM→ Cambia horario/setdias 1,2,3,4,5→ Cambia días activos
# El bot modifica variables globales
ALARMA_FORZADA = True # Siempre activa
ALARMA_FORZADA = False # Siempre inactiva
ALARMA_FORZADA = None # Usar horario-
Procesamiento condicional:
- YOLOv8 solo se ejecuta cuando hay movimiento
- Intervalo ajustable (
YOLO_INTERVAL): GPU=1 frame, CPU=5 frames
-
GPU automática:
- Detecta NVIDIA CUDA automáticamente
- Fallback a CPU si no hay GPU
- ONNX Runtime optimizado para inferencia
-
Streaming optimizado:
- Buffer de 1 frame para streams en vivo
- Descarta frames antiguos (
grab()x2) - Reduce latencia en streams RTSP/HTTP
-
Multithreading:
- Alertas enviadas en threads separados
- Bot Telegram en thread daemon
- No bloquea el procesamiento de video
# Ejemplo: Alertas solo de lunes a viernes, 8:00 a 22:00
HORARIO_INICIO = "08:00"
HORARIO_FIN = "22:00"
DIAS_ACTIVOS = "1,2,3,4,5" # 1=Lun, 7=Dom
# Horario nocturno (ej: 22:00 a 06:00)
HORARIO_INICIO = "22:00"
HORARIO_FIN = "06:00"Lógica de horario:
- Verifica día de la semana (
isoweekday()) - Maneja horarios nocturnos (cruzan medianoche)
- Modo forzado anula horario programado
- Detección de movimiento en tiempo real
- YOLOv8 para identificar personas, perros y gatos
- Soporte GPU automático (NVIDIA CUDA)
- Alertas por Telegram con foto
- Alertas por Email con foto adjunta
- Horarios programables para activar/desactivar alarma
- Bot de Telegram para control remoto
- Optimizado para video en tiempo real y streaming
- Python 3.8 o superior
- Sistema operativo: Windows 10/11, Linux, macOS
- GPU (opcional): NVIDIA con CUDA para aceleración
chmod +x instalar.sh
./instalar.shinstalar.bat- Abre Telegram y busca
@BotFather - Envía
/newbot - Sigue las instrucciones (nombre y username)
- Copia el token que te da
- Añade el token en tu archivo
.env - Envía
/starta tu nuevo bot en Telegram - Ejecuta:
python obtener_chat_id.py- Copia el Chat ID que aparece
cp .env.ejemplo .envEdita el archivo con tus datos:
TELEGRAM_TOKEN="123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
TELEGRAM_CHAT_ID="123456789"| Comando | Descripción |
|---|---|
/activar |
Activar alarma (forzado) |
/desactivar |
Desactivar alarma (forzado) |
/auto |
Modo automático (usa horario) |
/estado |
Ver estado actual |
/horario |
Ver horario configurado |
/sethorario HH:MM HH:MM |
Cambiar horario |
/setdias 1,2,3,4,5 |
Cambiar días activos |
/foto |
Obtener captura actual |
/help |
Ver comandos |
/sethorario 08:00 22:00 → Alertas de 8:00 a 22:00
/sethorario 22:00 06:00 → Horario nocturno
/setdias 1,2,3,4,5 → Lunes a Viernes
/setdias 6,7 → Solo fines de semana
Los días son: 1=Lun, 2=Mar, 3=Mié, 4=Jue, 5=Vie, 6=Sáb, 7=Dom
En el archivo .env:
HORARIO_INICIO="08:00"
HORARIO_FIN="22:00"
DIAS_ACTIVOS="1,2,3,4,5,6,7"Dejar vacío HORARIO_INICIO y HORARIO_FIN para alertas 24/7.
- Activa verificación en 2 pasos en Gmail
- Crea una contraseña de aplicación en https://myaccount.google.com/apppasswords
- Configura en
.env:
GMAIL_CUENTA="tu_correo@gmail.com"
GMAIL_PASSWORD="xxxx xxxx xxxx xxxx"proyecto/
├── main.py # Programa principal
├── chat_id.py # Utilidad para obtener Chat ID Telegram
├── install.sh # Instalador Linux/macOS
├── install.bat # Instalador Windows
├── requirements.txt # Dependencias Python
├── env.example # Plantilla de configuración
├── .env # Tu configuración (crear manualmente)
├── README.md # Este archivo
└── yolo_model/ # Modelo YOLOv8 (creado automáticamente)
├── yolov8n.onnx # Modelo convertido a ONNX
└── coco.names # Nombres de las 80 clases COCO
Edita main.py y cambia la variable URL:
# Archivo local:
URL = "mi_video.mp4"
# Streaming:
URL = "https://url-del-streaming/video"
# Webcam:
URL = 0python main.py| Tecla | Acción |
|---|---|
ESC |
Salir |
P |
Pausar / Reanudar |
R |
Reiniciar video |
S/W |
Ajustar sensibilidad YOLO |
A/D |
Ajustar sensibilidad movimiento |
Q/E |
Ajustar frecuencia YOLO |
M |
Ciclar alarma: ON → OFF → AUTO |
| Objeto | Color en pantalla |
|---|---|
| Persona | Verde |
| Perro | Naranja |
| Gato | Magenta |
Edita el diccionario CLASES_DETECTAR en el código:
CLASES_DETECTAR = {
"person": {"nombre": "PERSONA", "color": (0, 255, 0)},
"dog": {"nombre": "PERRO", "color": (0, 165, 255)},
"cat": {"nombre": "GATO", "color": (255, 0, 255)},
"car": {"nombre": "COCHE", "color": (255, 0, 0)},
}
IDS_DETECTAR = {0: "person", 15: "cat", 16: "dog", 2: "car"}| ID | Clase | ID | Clase |
|---|---|---|---|
| 0 | person | 2 | car |
| 1 | bicycle | 3 | motorcycle |
| 5 | bus | 7 | truck |
| 14 | bird | 15 | cat |
| 16 | dog | 17 | horse |
No se detectó GPU
nvidia-smi # Verificar drivers
pip install onnxruntime-gpu --force # ReinstalarNo module named cv2
pip install opencv-pythonNo module named onnxruntime
pip install onnxruntime-gpu # Con GPU
pip install onnxruntime # Sin GPUVideo entrecortado: Aumenta el intervalo de YOLO con la tecla E.
Bot de Telegram no responde: Verifica que el TELEGRAM_TOKEN y TELEGRAM_CHAT_ID sean correctos en .env.
Alertas no llegan: Verifica el horario configurado con /horario en Telegram.
| Hardware | Tiempo/frame | FPS |
|---|---|---|
| CPU (i7) | ~80ms | ~12 |
| GTX 1060 | ~15ms | ~66 |
| RTX 3090 | ~5ms | ~200 |
GNU GPLv3