Kabosu - Creando cosas
Publicado: 2024-06-29 (actualizado 2024-08-02)
Durante muchos años tenía rondando la cabeza la idea de hacer una aplicación que llevara un control de la comida que tenemos en la nevera (y en los armarios de la cocina). Un gestor de inventario familiar. Que pudiese saber desde cuándo algo está abierto, si quedan lentejas y cosas así. La razón principal es que somos varias personas en casa y cada una compra, come y cocina cuando le parece así que es difícil tener en la cabeza el estado de las provisiones. En este artículo explicaré un poco mi idea inicial, un prototipo que implementé y porqué finalmente me he dejado de tonterías y lo estoy haciendo "a mano".
Mi idea inicial consistía en hacer fotos a buena resolución de los distintos lugares de la cocina. Un sistema de inteligencia artificial analizaría las fotos para obtener un listado de productos que aparecen en esas imágenes. Todo se almacenaría en una base de datos que la aplicación usaría para cosas como:
Implementar esto requeriría hacer uso intensivo de múltiples técnicas de visión artificial pero tengo experiencia en eso y me sentía capacitado.
Antes no existía la IA generativa que tenemos ahora que puede decir (más o menos) lo que hay en una foto por lo que mi intención era combinar diversas técnicas de visión artificial que conocía para analizar las imágenes: corrección de iluminación y color, flujo óptico, detección de bordes y texto, etc. Hace 4 o 5 años me puse a crear un prototipo simplificado de este sistema para un hackathon.
Hice unas pocas fotos de la despensa en las que aparecían algunos botes de legumbres, cajas de cereales y paquetes de pasta perfectamente alineados para que se viera el texto de las etiquetas. Quería empezar por algo sencillo.
Cada foto la analizaba con la API de AWS Rekognition. Este servicio busca texto en las fotos y devuelve un lista de palabras y frases con sus coordenadas dentro de la imagen. Hoy en día usaría una solución local como Tesseract en vez de depender de la nube.
En paralelo, usaba OpenCV para segmentar la imagen y poder calcular dónde están los bordes de los productos. OpenCV es una librería open source de Intel con un montón de algoritmos de visión artificial que permiten procesar imágenes muy fácilmente. La he usado un poco en dos proyectos de trabajo así que estoy familiarizado con sus funciones básicas.
El plan era obtener los textos de la imagen con sus coordenadas con Rekognition y los rectángulos que delimitan cada producto con OpenCV. Juntando estas dos fuentes de datos se podría tener una estimación aproximada de los artículos que hay en la foto. Al menos esa era la idea, porque en las pruebas que hice me encontré con múltiples problemas. Los más importantes eran:
OpenCV podía detectar los bordes de los productos medianamente bien si eran cajas y estaban perfectamente alineadas con la cámara pero los algoritmos que tiene como el Hough Lines no eran capaces de detectar bordes más redondeados como las latas de conserva, botellas o los paquetes de pasta.
Rekognition es bastante bueno detectando texto con las fuentes típicas pero los envoltorios de los alimentos abusan mucho de los logos, iconos, textos curvados, distintos colores, etc que hacen prácticamente imposible detectar el texto automáticamente. Al menos con los modelos típicos de OCR. En la mayoría de casos era incapaz de detectar la marca del producto o lo hacía mal.
Además, esta aproximación hacía imposible detectar productos sin etiquetas como frutas y verduras. Tampoco funcionaba para objetos parcialmente ocultos o que no estuvieran mirando directamente a la cámara.
Aquí abandoné el prototipo. La única solución que se me ocurrió sería entrenar una red neuronal convolucional para cada producto distinto que quiera encontrar en las fotos. Iba a necesitar multitud de datos y me iba a costar bastante tiempo desarrollar el sistema. Además si un día se me ocurría comprar tomate frito de otra marca o simplemente la empresa decidía cambiar el diseño del envoltorio iba a tener que volver a obtener muestras y entrenar de nuevo las redes neuronales. Demasiado trabajo.
Durante estos últimos años cada vez que me enteraba de algún avance en el campo de la visión artificial pensaba si esa nueva técnica podría solucionar los problemas que encontré en mi prototipo pero no hice mucho más.
En concreto, desde hace un año o dos, existen modelos generativos muy potentes que son capaces de analizar imágenes y decir qué es lo que hay en ellas. Podría usar uno de esos modelos y ahorrarme todo el sistema de visión artificial que tenía pensado crear pero estas IAs generativas tienen un problema grave: no son demasiado precisas. Me parece un avance científico impresionante que un programa sea capaz de analizar una imagen y decirte qué hay en ella pero para usarlo como base de un sistema de control de inventario no es lo suficientemente robusto. Muchas veces se inventa las cosas o, por extrañas razones, no detecta cosas que están claramente en la imagen. Creo que sería una pérdida de tiempo hacer el esfuerzo de crear un sistema para saber si quedan huevos en la nevera si luego no te puedes fiar de él.
Reconocer productos con una precisión decente a partir de imágenes no es un problema nada fácil. Si Amazon no consiguió hacer algo parecido con sus tiendas automatizadas y ha decidido cerrarlas las posibilidades de hacerlo yo en mi casa eran escasas. Al final, pensándolo fríamente, crear un sistema así me costaría meses o años de desarrollo y no sería perfecto además que realmente yo solo lo usaría una o dos veces al día como mucho. No es que necesite saber a todas horas lo que hay en la nevera. Desde el punto de vista técnico es un problema casi irresoluble con las técnicas de IA que existen hoy en día y desde el punto de vista de gestión de proyectos la inversión necesaria (de tiempo) sería muchísimo mayor que los posibles usos que le daría.
A estas altura he descartado completamente implementar la idea pero hace unas semanas volví a pensar en ella. Me di cuenta de un detalle: para poder saber los productos que tengo en casa debía introducir la información en la aplicación manualmente. Eso requería ir cada día con el móvil tomando imágenes de la nevera y los armarios. En el prototipo usaba fotos por simplicidad pero sería mucho mejor si grabase un vídeo moviéndome por la cocina porque así sería más rápido y además podría usar un algoritmo de flujo óptico para calcular cuántas unidades hay de cada objeto incluso si están parcialmente ocultas. Entonces se me ocurrió que si el paso inicial de mi sistema iba a ser grabar un vídeo con el móvil que luego analizaría la IA podría simplemente grabar el vídeo y en caso de querer consultar si había leche en la despensa podría echar un vistazo al vídeo. Saltarme todo el paso de la IA.
En las últimas semanas he estado grabando un vídeo de la nevera cada mañana con mi móvil. En 30 segundos paso por todos los estantes y abro los cajones de la fruta y verdura. No me preocupo mucho si no se ve todo perfectamente.
Cuando tengo alguna duda simplemente reviso los vídeos que necesite. A veces con ver un trozo del último vídeo grabado ya sirve. Otras veces he tenido que ver 3 o 4 para salir de dudas.
Y otro caso que nunca se me había ocurrido:
En los más de 20 vídeos que he grabado he ido perfeccionando la técnica y ya puedo grabar todo en unos 60 segundos. Además como son casi iguales sé que, por ejemplo, a partir del segundo 20 está el cajón de la fruta y puedo ir allí directamente ahorrando tiempo. Aunque me ocurre algo curioso: al pasearme cada mañana por la cocina para grabar con el móvil también estoy "grabando" con mis ojos y "procesando" con la red neuronal que es mi cerebro así que en muchas casos no necesito ni mirar el vídeo porque sé lo que hay nevera. Simplemente por haber hecho una revisión consciente ese mismo día.
Me avergüenza poco pensar el tiempo que he usado a lo largo de estos años pensando cómo automatizar algo que es tan sencillo de hacer "a mano". Me gusta el campo de la visión artificial y me hubiera divertido mucho (además de aprender bastante) pero creo que es mejor emplear el tiempo en otras cosas. Quizá en otro momento hable de aquella vez que me propuse crear una aplicación de noticias de videojuegos que obtenía las noticias de la páginas oficiales de las desarrolladoras, las clasificaba con un modelo de IA y me mostraba un resumen hasta que me di cuenta de que estaba programando un lector de RSS modernillo.