Reconocimiento Facial en Tiempo Real en Raspberry Pi – Guía Completa
Este tutorial te guía para construir un sistema de reconocimiento facial en tiempo real en una Raspberry Pi usando OpenCV y una Pi-Cam. Desde la configuración de hardware hasta el entrenamiento del reconocedor, cada paso se presenta con fragmentos de código claros y consejos prácticos.
A continuación verás una demo en vivo de la Pi-Cam detectando caras en tiempo real.
El proyecto se basa en la librería open-source OpenCV, optimizada para rendimiento en tiempo real. Aunque nos centramos en una Raspberry Pi con Raspbian, el mismo código funciona en macOS y Windows con ajustes menores.
3 Fases
Un flujo de trabajo completo de reconocimiento facial se divide en tres etapas distintas:
- Detección de Caras y Recolección de Datos
- Entrenamiento del Reconocedor
- Reconocimiento Facial en Tiempo Real
El diagrama siguiente resume estas fases.
Paso 1: Lista de Materiales (BOM)
Componentes esenciales:
- Raspberry Pi 3 – 32,00 $
- Módulo de Cámara Mini 5 MPx 1080p OV5647 – 13,00 $
Paso 2: Instalación de OpenCV 3
Recomendamos seguir la guía de Adrian Rosebrock para una instalación limpia de OpenCV 3 en Raspbian Stretch. Tras el tutorial, activa el entorno virtual Python dedicado:
source ~/.profile
workon cv
Dentro del entorno, verifica la versión de Python y la instalación de OpenCV:
python
>>> import cv2
>>> cv2.__version__
Deberías ver un número de versión como 3.3.0 o superior.
Paso 3: Probar tu Cámara
Si la cámara no se detecta, habilita el driver con:
sudo modprobe bcm2835-v4l2
El siguiente snippet Python abre el stream de la Pi-Cam, lo muestra en color y escala de grises, y lo voltea verticalmente (ajusta si tu orientación difiere):
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
while True:
ret, frame = cap.read()
frame = cv2.flip(frame, -1)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', frame)
cv2.imshow('gray', gray)
if cv2.waitKey(30) & 0xff == 27:
break
cap.release()
cv2.destroyAllWindows()
Ejecútalo con python simpleCamTest.py (disponible en el GitHub del proyecto). Pulsa ESC para salir.
Paso 4: Detección Facial
El clasificador Haar Cascade de OpenCV es un enfoque ligero de machine learning para detectar caras. Descarga el archivo XML pre-entrenado (haarcascade_frontalface_default.xml) y colócalo en una carpeta Cascades. El siguiente script demuestra detección facial en tiempo real con cajas delimitadoras:
import cv2
faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
while True:
ret, img = cap.read()
img = cv2.flip(img, -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray, scaleFactor=1.2, minNeighbors=5, minSize=(20, 20)
)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imshow('video', img)
if cv2.waitKey(30) & 0xff == 27:
break
cap.release()
cv2.destroyAllWindows()
Los parámetros de detectMultiScale controlan la sensibilidad: scaleFactor reduce el tamaño de imagen cada iteración, minNeighbors filtra falsos positivos, y minSize establece la cara detectable más pequeña.
Ejemplos Adicionales
Explora más opciones de detección en el GitHub del proyecto:
- faceEyeDetection.py
- faceSmileDetection.py
- faceSmileEyeDetection.py
Tutorial Haar Cascade – Detección de Cara y Ojo
Paso 5: Recolección de Datos
Recopilar un dataset etiquetado es esencial para entrenar. Crea una carpeta de proyecto (ej. FacialRecognitionProject) y un subdirectorio dataset:
mkdir FacialRecognitionProject
cd FacialRecognitionProject
mkdir dataset
Descarga el archivo Haar Cascade en la raíz del proyecto. Luego ejecuta 01_face_dataset.py para capturar 30 imágenes faciales por usuario:
import cv2
import os
cam = cv2.VideoCapture(0)
cam.set(3, 640)
cam.set(4, 480)
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_id = input('\nIntroduce ID de usuario (numérico) y pulsa → ')
print('\n[INFO] Iniciando captura facial. Mira a la cámara…')
count = 0
while True:
ret, img = cam.read()
img = cv2.flip(img, -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
count += 1
cv2.imwrite(f'dataset/User.{face_id}.{count}.jpg', gray[y:y+h, x:x+w])
cv2.imshow('image', img)
if cv2.waitKey(100) & 0xff == 27 or count >= 30:
break
if count >= 30:
break
cam.release()
cv2.destroyAllWindows()
print('\n[INFO] Saliendo del programa y limpiando.')
Cada imagen se nombra User.{id}.{count}.jpg (ej. User.1.4.jpg). Ajusta el número de muestras según necesidad.
Paso 6: Entrenador
Usando las imágenes recopiladas, entrena un reconocedor facial de OpenCV. El modelo resultante se guarda como archivo .yml en una carpeta trainer. Consulta el script completo de entrenamiento en el repositorio del proyecto para detalles de implementación.
Leer más: Reconocimiento Facial en Tiempo Real – Proyecto Completo
Proceso de manufactura
- Instalar Google Assistant en MATRIX Voice Raspberry Pi: guía paso a paso
- Speathe: comunicación impulsada por respiración para usuarios paralizados
- Construye una Puerta con Reconocimiento Facial Segura usando Windows IoT y Raspberry Pi
- Seguimiento Automático de Objetos por Visión Artificial con Raspberry Pi y OpenCV
- Construye un Reconocedor de Dígitos con Raspberry Pi, TensorFlow y OpenCV
- Construye un Rover con Windows IoT Core en Raspberry Pi 2 – Guía de Principiante a Avanzado
- Extensión de GoPiGo v2 en Windows 10 IoT Core para Raspberry Pi 3
- Dominando operadores en Python: Guía completa
- Operaciones con Listas en Python: Creación, Acceso, Modificación y Técnicas Avanzadas
- Dominando Tuplas en Python: Creación, Acceso y Operaciones Avanzadas
- Dominando Diccionarios en Python: Creación, Manipulación y Técnicas Avanzadas