Identificación de fauna en vídeos mediante IA
domingo, 13 de abril de 2025 (Antes de ayer)Un par de años llevo con esto, que se dice rápido. Partiendo de las más absoluta ignorancia en IA (bendito ChatGPT), pero con una idea en la cabeza, imagina: poder poner las cámaras de fototrampeo/webcams en la finca y que te avisen en tiempo real sobre qué – quien – cuando – donde está pasado un animal, persona, pájaro, perro… Imagina, estar en tu casa viendo la tele y que te llegue un whatsapp que diga: «Tio!! la gineta está en el bebedero!! Corre p’allá!!«
Pues aunque parezca increible (sobre todo para mi mismo) estoy ya en condiciones de poder montarlo!! Os presento el sistema (tengo que buscarle un nombre digno) y os cuento como funciona. Trataré de ser conciso y poco técnico.
Pruebas iniciales
Obviamente de primeras di muchas vueltas y probé muchos sistemas de IA (basicamente librerias de PYTHON desarrolladas sobre tensorflow, Google 2015) para la clasificación de imágenes y redes neuronales. El «metodo» es basicamente el mismo en todos los casos: se le pasa a un software miles y miles de fotos acompañadas de un txt que les diga qué está viendo en cada caso y se les deja que las analizen (entrenamiento) durante un tiempo que tiende a ser largísimo o muy largísimo (se requieren equipos potentes).
Tras mucho tiempo de trabajo pude conseguir alguna cosa interesante pero el problema era siempre el mismo : muchisímos falsos positivos. Demasiados. Tantos que hacían inutil cualquier positivo auténtico. Si pones un sistema a monitorizar un streaming de vídeo y le dices «avisame cuando aparezca un perro«, peor que no te avise cuando pasa el perro es que si lo haga cuando no pasa.
El problema es que la inmensa mayoría de los proyectos de reconocimiento de objetos en imágenes están pensados y desarrollados para ejecutarse en situaciones muy acotadas, bien controladas y con poca variación: un sistema de clasificación visual de objetos que pasar por el escaner de un aeropuerto, el reconocimiento de texto escrito sobre un folio blanco, matrículas de coches en carretera, etc… situaciones con variación restringuida. Pero para mi proposito lo que necesitaba era un sistema capaz de «ver» un conejo que apenas ocupa el 5% de la superficie de la foto de 640 pixels, en un paisaje de piedras, vegetación, sombras, hierbas y viento, grabado por una cámara/webcam de 30€, sin enfoque automático, sin corrección de exposicion, abandonada en mitad del campo, que se moja por las noches o llena de polvo, grabando en unas condiciones pésimas de luz la mayor parte de las veces y que todavía empeora más cuando entra en modo nocturno, en blanco y negro, reduce la resolución y sobreexpone todo lo que haya en el centro.
YoloV5, el descubrimiento
Un dia aterrizé en el sistema de clasificación de imágenes de YOLO de Ultralytics. Opensource, bien documentado, gratuito, preentrenado con imágenes comunes, de dudosa calidad, en todo tipo de situaciones cambiantes como las que yo necesitaba, capaz no solo de «reconocer» un patrón preentrenado en la imagen pasada sino que era capaz de enmarcarlo en el fotograma, trackearlo e identificar individualmente de otros 300 de estos tracks en cada fotograma y todo esto en milisegundos, tan rápido que podía clasificar objetos en videos en tiempo real, laputahostia®, esto prometía mucho.
Era justo lo que buscaba y funcionaba muy bien. No solamente reconocía bien los animales entrenados sino que al ser capaz de devolver la ubicación del animal en cada fotograma era facilísimo calcular hacia donde se mueve un animal, a que velocidad lo hace, que rumbo lleva, si está solo o acompañado, cuantos y cuales!! un mundo de posibilidades!!lareputahostia®.
Sí, Yolov5 era justo lo que necesitaba y tenía tres gigantescas ventajas, solo comparables a su gigantesco inconveniente:
Ventaja 1: Delimita con un marco (Bounding Box) donde se encuentra el animal y un sistema de tracking que es capaz de seguir el objeto y considerar que es el mismo aunque se le pierda el rastro temporalmente. Ideal por ejemplo para clasificar un unico zorro y no 20 zorros aunque se le pierda el rastro al pasar por detrás de un arbusto. Y no solo eso, sino que puede identificar varias clases en el mismo fotograma, ubicarlas y delimitarlas y trackearlas individualmente!!
Ventaja 2: Se le
De hecho Ultralytics recomienda que se entrene a YOLO agregando hasta un 10% de imágenes background, es decir imágenes que no contengan ninguna de las clases que estamos entrenando.
Ventaja 3 El sistema es impresionantemente rapido, capaz de clasificar 90-120 imágenes de 1024px en menos de un segundo, o lo que es igual puede clasificar el contenido de un video bastante grande en tiempo real. Y soporta multitud de fuentes de datos: imágenes y vídeos en muchos formatos, streaming desde dispositivos locales y en red, urls de youtube, protocolo http o rtmp.
Inconveniente: Ahora no basta con pasarle miles de fotos recortadas al mismo tamaño y esperar, YOLO requiere que le pases la foto junto con un archivo JSON en el que se indica el nombre de la clase que están pasandole y el bounding box que delimita la ubicación del animal en la imagen y así para cada uno de los animales que salgan en la foto. Si en la foto salen 13 abejarucos en un árbol cada uno llevará un cuadradito localizandola y su nombre.
No os cuento la de miles de fotos que he tenido que abrir, etiquetar y guardar … porque me da verguenza decirlo. Menos mal que la misma IA que trataba de entrenar vino a rescartame antes de enloquecer.
Entrenar a YOLO con YOLO con FLICKR y con COCO, llega el automatismo
¿Y como automatizar la clasificación y el etiquetado de miles de fotos? Obviamente si estoy haciendo un sistema que clasifique los abejarucos que aparecen en un vídeo es porque no dispongo de dicho sistema ya hecho (lógicamente), si existiese un sistema capaz de ayudarme en la clasificación de estas especies pues … ¿para qué hacerlo?
Pues a medias. Es cierto que no existe una IA entrenada para las especies que yo buscaba, fauna del sureste con baja calidad fotográfica… PERO si que hay un proyecto genérico, llamado COCO (Objetos comunes en contexto, proyecto liberado por Microsoft en 2014 para entrenamiento y evaluación de algoritmos de visión por ordenador en condiciones del mundo real) que Ultralytics distribuye y que sí sabe reconocer, no un gavilán o una urraca, pero sí un pájaro (así en general), un gato, un perro, un humano, un coche, un tupperware… (hasta 80 categorias de lo más peregrinas)… pero si es capaz de reconocer un pájaro y un perro y un gato, pues ya tengo la mitad del trabajo hecho. Solo necesito pasarle miles de fotos de abejarucos y cuando termine renombrar lo que él a clasificado como «bird» y llamarlo «abejaruco»… y repetir con las otras 69 especies. No es que no tengas que hacer nada, no es que sea infalible, pero si que me quitó mucha carga de trabajo tedioso.
La requerimientos y lógica del script descargador:
- Lista con los nombres de las 70 especies y sus nombres en latin, castellano, inglés, frances, alemán y ruso.
- APIs de acceso a Google Images y Flicrk
- Un bucle en python coge el primer nombre de la primera especie y busca en Flickr todas las fotos que haya.
- Descarga en /tmp cada foto.
- Redimensiona y recorta la imagen a 512×512
- Obtiene su hash porcentual de la imagen y lo compara con los hash de las fotos descargadas anteriormente.
- Si no la hemos descargado antes guarda sus hash/datos en base de datos, renombra y mueve la imagen a una carpeta llamada como el nombre castellano de la especie.
- Una vez descarga todas las fotos disponibles para la especie en latín pasa al siguiente idioma.
- Una vez descarga todas las fotos disponibles en todos los idiomas cambia a Google Images y reinicia la busqueda
- Una vez descargadas todas las fotos disponibles en Google Images en todos los idiomas pasa a la siguiente especie.
Este proceso se repite varias veces (por limites de las API principalmente) y supuso muchos días de ejecución, al cabo de los cuales tendremos miles de fotos únicas, recortadas a 512×512 y ordenadas en carpetas con el nombre de las especies
La segunda parte del proceso, ya con miles de fotos ordenadas en carpetas, es ejecutar YOLOv8 cargadon con la red neuronal de COCO. Entre las configuraciones de YOLOv8 está la posibilidad de decirle que busque solo una de las clases para las que ha sido entrenado.
yolo predict model=coco2014.pt source="./fotos/abejaruco" classes=14 save_txt=True save=False
Es produce algo como:
14 0.53223 0.40182 0.15625 0.28906 0.85
La clase, el centro xy del Bounding Box, el AnchoAlto del Bounding Box y la confianza de la clasificación (85%).
Con eso ya podemos generar el txt que identificará a nuestra imagen en el entrenamiento. Voilá. A entrenar.
El entrenamiento, primeros resultados
El «truco» para conseguir una red neuronal potente y capaz de identificar un zorro (o lo que tu quieras) en casi cualquier sitio, estado, calidad, posicion, … es pasarle miles y miles de fotos. Cuantas más fotos mejor. Cuanto más distintas mejor.
En el argot de redes convolucionales cuando no se le pasan suficientes datos se habla de que provoca una mala generalización: es decir, el sistema es incapaz de reconocer ningún patron para lo que se le ha entrenado más alla de las fotos que se usaron para entrenarlo.
Recuerdo algún caso de gente que ha entrenado su red con cientos de fotos de gatos pero luego fallaba estrepitosamente al tratar de usarla… hasta que se dio cuenta de que todas las fotos con que la había entrenado eran gatos mirando para la izquierda. Si el gato miraba para la derecha el sistema no sabia ni que era.
Para evitar esto los entrenamientos suelen aplicar pequeñas modificaciones a las imagenes que reciben y además así amplian el volumen de datos. La miro, la giro, la vuelvo a mirar, el hago un mirror y la vuelvo a mirar,etc …
Despues de mucho trabajo y muchisimos entrenamiento mi red neuronal entrenada con Yolov8 tiene estos datos:
- 70 clases (1 clase = especie)
- 131.409 fotos a 512×512
- 131.409 archivos json, uno por foto etiquetando cada foto
- 9.483 fotos _background (fotos que no incluyen clases)
- (max) 3.585 fotos de zorros y (min) 534 fotos de Collalba rubia hembra
- modelo «best.pt» de «241018-x-optimizado-e70» entrenado a partir del modelo más potente «yolov8x.pt» durante 226 epocas
- Maxima precisión alcanzada: 0.93882
- Entrenado durante 18 días con una NVIDIA GTX3060 12Mb y 32Mb de RAM y Procesador AMD Ryzen3
- best.pt pesa 130Mg
El script python de clasificación
Todo el código tiene 1300 lineas está escrito en python3 cargando la librería YOLO de ULTRALYTICS (entre otras). Aunque es bastante complejo y lleno de funcionalidades que le he ido metiendo para todo tipo de tareas la lógica final y con la que estoy bastante contento es la siguiente:
- Se carga un video, varios o un directorio. Admite patterns
- La identificación del primer vídeo de demora unos 3-4 segundos en cargar la red neuronal en memoria. Las siguientes se ejecutan en décimas de segundo.
- Leemos el vídeo a x2 (un fotograma de cada dos. No altera en absolute la clasificación y acelera el procesado) y vamos pasando a YOLOv8 las imágenes
- Si YOLOv8 no ve nada aceleramos hasta x12, en cuanto detecta algo volvemos a x2.
- YOLOv8 nos devuelve un JSON a cada fotograma analizado con todos los datos (especie, confianza, posición)
- A cada frame vamos promediando los resultados de modo que cuanto más ve a una especie más le cuesta ver a otra y esto se multiplica por el grado de confianza de la detección.
Con esto clasificamos bien incluso en situaciones como:
- Un animal aparece a lo lejos y es pequeñito, poco pixels, redondo (un conejo 50%), pero cuando llega y está cerca, buena definición, vemos que es (Zorro 97%)
- Tenemos un zorro en primer plano (Zorro 98%) pero se da la vuelta, se pone de culo y se tumba, se convierte en un bulto gris (Jabalí 72%)
Prevalecen las buenas identificaciones con confianza alta frente a la duración de la identificación con baja confianza. - El sistema tracking se encarga de contar bien los animales que vé aunque estos salgan de pantalla y vuelven a entrar
- Al terminar la clasificación de un vídeo se imprime algo como «1 Zorro (95%)» o «13 estorninos (74%)» y pasa al siguiente
- Al terminar de clasificar todos los videos pasa todas las clasificaciones de la sesión a otra IA en la nube (gemini-1.5-flash-latest, via API) la cual se encarga de generar un «comentario/resumen» de lo que nuestra IA ha resuelto pero con lenguaje humano y amigable, produciendo algo como:
- Se han analizado 10 vídeos. Se detectó una gineta nocturna (¡fantástico!), un jabalí nocturno en tres ocasiones y un zorro nocturno y otro diurno. También hay un vídeo con una persona, y dos vídeos sin actividad, incluso tras un segundo análisis. La grabación de la gineta y uno de los jabalíes son especialmente relevantes por su alta confianza en la clasificación. El vídeo del zorro diurno tiene una confianza baja. En general, la mayoría de las detecciones fueron nocturnas, excepto el zorro diurno y el vídeo de la persona.
- Finalmente este parrafo se envía al telefono via PUSHOVER, una especie de sistema de envio de POPUP al telefono desde la web.
- El script finaliza y queda a la espera de nuevas identificaciones
- Todas las clasificaciones quedan registradas en una base de datos MONGO en local de modo que se pueden hacer búsquedas fácilmente.
Descargas
Para el etiquetado de imágenes he usado LabelMe.
Para el envio de notificaciones al movil uso PUSHOVER
Gemini para humanizar el texto de la clasificación
API Flickr para el entrenamiento de imágenes
Con conocimientos medios de Python podéis probar el mejor checkpoint que he conseguido entrenar hasta la fecha descargando desde DROPBOX 241018-x-optimizado-e70.
En esa carpeta tenéis el trailcam.yaml con las categorías y el checkpoint de pesos en la carpeta Weigth. Incluso los parametros de entrenamiento y gráficas estadísticas.
Para probarlo debería bastar con descargar «best.pt» y en un terminal hacer:
mkdir probando_trailcam
cd probando_trailcam
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install ultralytics
yolo predict model=./probando_trailcam/best.pt source="./mi/carpeta/*.jpg"
Suerte.
#1/ 14 de April/2025 a 11:56:57
Otros comentarios de «Sr. XX-Terror»
Wow fantástico
#2/ 14 de April/2025 a 16:55:50
Otros comentarios de «Trebol-a»
;)
Es un aperitivo por si alguien se atreve, pero incluso sin intención de profundizar con el archivo best.pt ya puedes clasificar 70 especies más habituales.
15 de April, 2025 @ 08:12