/ Proyectos / Industria / Detección de casco de seguridad

Detección de uso de casco de seguridad con YOLOv5

Detección automática de casco de seguridad en imágenes de obra con transfer learning, y cómo simplificar las clases del modelo elevó el mAP de 0.61 a 0.917.

10 min de lectura Python · YOLOv5 · PyTorch Datos: dataset público de detección de cascos Aplicable a tesis y proyectos aplicados de visión artificial
Deteccion automatica de uso de casco de seguridad en imagenes de obra con YOLOv5

El objetivo era detectar automáticamente si los trabajadores en una imagen de obra llevaban puesto el casco de seguridad, entrenando un modelo de detección de objetos con transfer learning sobre YOLOv5. El problema real no fue de arquitectura, fue de datos: el dataset original tenía tres clases (casco, cabeza sin casco, y persona completa), pero la clase "persona" tenía muy pocas instancias etiquetadas respecto a las otras dos.

La decisión que definió el resultado final del proyecto fue remover la clase "persona" por completo. El mAP saltó de aproximadamente 0.61 a 0.917, sin tocar la arquitectura del modelo ni los hiperparámetros de entrenamiento. La clase mal representada no solo aportaba poco, estaba arrastrando hacia abajo el promedio general de las otras dos clases que sí funcionaban bien.


Mapa del casoContenido


Estructura de alto nivelDiagrama de la solución

Entrada Imagenes de obra/planta Anotacion y formato PASCAL VOC -> formato YOLOv5 3 clases (original) Incluye "persona" poco representada 2 clases (final) Casco / sin casco clase persona removida Entrenamiento YOLOv5 Transfer learning desde COCO Evaluacion (mAP) 0.917 sin "persona" vs ~0.61 con "persona" Deteccion de cascos Monitoreo de cumplimiento EPP

Pasa el cursor sobre cada bloque para ver que hace ese paso.

La decisión de pasar de 3 a 2 clases se tomó antes de la fase de sintonización de hiperparámetros, porque ajustar el modelo sobre un desbalance de clases sin corregir habría optimizado la configuración equivocada.


De la teoría a la prácticaConstrucción de la solución

Condiciones del proyecto

RestricciónDato
Fuente del datasetDataset público de detección de cascos de seguridad, alojado en Roboflow
Clases originalesCasco, cabeza sin casco, persona completa
Balance de clasesLa clase "persona" tenía muy pocas instancias etiquetadas frente a las otras dos
Cómputo disponibleGPU de Google Colab, con límites de uso continuo
OpciónPor qué se descartó
Mantener las 3 clases originales y ajustar hiperparámetrosEl desbalance de clases seguía arrastrando el mAP promedio hacia abajo, sin importar el ajuste
Sobremuestrear artificialmente la clase "persona"Con muy pocas instancias base, el sobremuestreo repite las mismas imágenes sin agregar variabilidad real
Remover la clase "persona" y entrenar solo con casco / sin cascoEs exactamente la información que el caso de uso necesita, sin la clase que estaba dañando el promedio

Pasos

1

Manejo de la API key de Roboflow

Agente: escribió la API key directamente en el código para simplificar la descarga del dataset.
Criterio aplicado: mover la key a una variable de entorno, y agregar una validación explícita que detiene la ejecución si la variable no está definida, en vez de fallar más adelante de forma confusa.

2

Definición de clases del modelo

Agente: propuso entrenar con las 3 clases originales del dataset sin cuestionar el balance.
Criterio aplicado: revisar el conteo de instancias por clase antes de entrenar, y remover la clase "persona" al confirmar que estaba muy subrepresentada frente a las otras dos.

3

Elección del checkpoint base

Agente: sugirió entrenar desde cero para tener control total sobre los pesos.
Criterio aplicado: usar transfer learning desde `yolov5s.pt` preentrenado en COCO, porque el dataset de cascos es pequeño para entrenar una arquitectura de este tamaño desde cero con buenos resultados.

4

Evaluación del modelo

Agente: propuso reportar solo el mAP final como métrica de éxito.
Criterio aplicado: comparar explícitamente el mAP con y sin la clase "persona", para que la decisión de removerla quedara respaldada por un número, no solo por intuición.

Proceso de iteración

Ajuste documentado, no forzado

El entrenamiento se detuvo en 100 épocas por las limitaciones de uso continuo de GPU en Google Colab, no porque el modelo hubiera dejado de mejorar. Es probable que más épocas hubieran subido el mAP todavía más allá de 0.917. Esta es una restricción real de infraestructura, documentada explícitamente en vez de presentar el resultado final como si fuera el techo del enfoque — la diferencia entre un proyecto honesto y uno que exagera sus resultados está exactamente en admitir esto.


CierreLecciones importantes

Una clase mal representada no es neutral, activamente arrastra hacia abajo el promedio de las clases que sí funcionan bien. Simplificar el problema al mínimo necesario para el caso de uso real, en vez de mantener todas las clases "por si acaso", mejoró tanto el desempeño como la simplicidad del sistema final. Y ninguna API key debería vivir escrita directamente en un notebook, sin importar qué tan informal parezca el proyecto.

Si quieres ver un enfoque publicado con una idea similar, detección de equipo de protección personal con YOLO en entornos industriales, este artículo es una buena referencia del nivel de la contribución: Deep learning-based safety helmet detection in construction sites.

Termina ya tu proyecto

¿Tienes un proyecto similar y no sabes por dónde empezar? Yo te ayudo a diseñarlo.

El 92% de los profesionales de datos desbloquea sus proyectos al ver ejemplos completos resueltos.

53
proyectos
8
sectores
100%
aplicado

Sin registro. Acceso inmediato