Sistema de Inspección Automatizada por Visión Artificial
Prototipo Edge modular para inspección de calidad de posicionamiento de bandejas de pollo y monitoreo ergonómico del operario en línea de empaque.
[Terminal 1] worker_bandejas.py ──┐
[Terminal 2] worker_postura.py ──┼──> [SQLite + WAL] <── [Terminal 3] dashboard.py
│
└──> [HAL: ActuadorMock] ---> (Fase 2: Arduino)
Procesos independientes aislados por SO para evitar bloqueos por GIL. Si un nodo cae, el resto sobrevive.
- Python 3.10+
- Cámaras 2x (una para bandejas, una para postura)
- SO: Windows (winsound para alertas en Fase 1)
# 1. Clonar repositorio
git clone <url> && cd Vision-MVP
# 2. Crear entorno virtual (recomendado)
python -m venv .venv
.venv\Scripts\activate
# 3. Instalar dependencias
pip install -r requirements.txtAbrir 3 terminales en la carpeta del proyecto:
# Terminal 1: Inspección de bandejas
python worker_bandejas.py
# Terminal 2: Monitoreo ergonómico
python worker_postura.py
# Terminal 3: Dashboard
streamlit run dashboard.py# Terminal 1: Worker con reinicio automático
watchdog.bat worker_bandejas.py
# Terminal 2: Worker con reinicio automático
watchdog.bat worker_postura.py
# Terminal 3: Dashboard
streamlit run dashboard.pyVision-MVP/
├── config.py # Constantes y umbrales parametrizables
├── db.py # Persistencia SQLite + WAL
├── hal.py # Hardware Abstraction Layer (Adapter)
├── worker_bandejas.py # Worker 1: Inspección de posición
├── worker_postura.py # Worker 2: Monitoreo ergonómico
├── dashboard.py # HMI: Streamlit dashboard
├── watchdog.bat # Auto-healing wrapper
├── requirements.txt # Dependencias Python
├── README.md # Esta documentación
└── tests/
├── test_db.py # Tests de persistencia
└── test_hal.py # Tests del HAL
Todos los parámetros se ajustan en config.py:
| Parámetro | Default | Descripción |
|---|---|---|
CAM_BANDEJAS_INDEX |
0 |
Índice de cámara para bandejas |
CAM_POSTURA_INDEX |
1 |
Índice de cámara para postura |
BANDEJA_ROI |
(100,80,440,340) |
Región de interés (x,y,w,h) |
MAX_BACK_INCLINATION |
20.0° |
Umbral de inclinación de espalda |
MAX_NECK_FLEXION |
30.0° |
Umbral de flexión cervical |
POSTURA_FRAMES_ALERTA |
10 |
Frames consecutivos para alerta |
ACTUADOR_MODO |
"mock" |
"mock" o "arduino" |
- Worker Bandejas: OpenCV clásico. ROI fija +
cv2.findContours. Sin redes neuronales. - Worker Postura: MediaPipe Pose. Captura degradada a 5-7 FPS. Resolución 640x480.
- SQLite3 con
PRAGMA journal_mode=WALpara concurrencia (2 writers + 1 reader). - Tabla unificada
eventoscon columnatipo_evento.
- Patrón Adapter.
actuador.trigger(motivo)es la interfaz genérica. - Fase 1:
ActuadorMock(beep Windows). Fase 2:ArduinoActuador(UART pyserial).
- Streamlit con
st_autorefresh(interval=2000). Modelo Pull/Polling. - Cero estado en frontend. Puro visor de SQLite.
collections.deque(maxlen=100)— sinlist.append()global.cap.release()+cv2.destroyAllWindows()enfinally.- Watchdog
.batpara auto-restart ante crashes.
python -m pytest tests/ -v- Fase 1: Prototipo con ActuadorMock
- Fase 2: Integración Arduino (pyserial + UART)
- Fase 3: Modelo IA para validación de sellado