Autor: Fernando Sanz García
Tutor: Nicolás Sáenz Lechón
Fecha de lectura: 2 de marzo de 2022
En el momento en el que nos encontramos, donde la proliferación de los servicios de reparto de todo tipo de productos a domicilio está a la orden del día y donde el contexto sociosanitario insta a evitar cualquier tipo de contacto personal innecesario.
La idea original sobre la que se construyen las bases del proyecto es el desarrollo y construcción de un robot autónomo cuyo objetivo se base en el reparto de medicinas desde la farmacia hasta el domicilio de los clientes. Esta iniciativa, (aunque en un futuro escalable a otros públicos) iría orientada a personas con problemas de movilidad a quienes les fuese complicado desplazarse a la farmacia, supliendo así una necesidad básica de este colectivo.
De esta idea tan amplia se han acotado una serie de objetivos para el proyecto, centrándose en el desarrollo de un prototipo robot, la implementación de la inteligencia artificial y del software relacionado con la clasificación, obtención y evitación de obstáculos en el funcionamiento diario del robot por medio de redes neuronales.
El primer paso a la hora de desarrollar una red neuronal eficaz y precisa es contar con un conjunto de imágenes amplio y bien categorizado con el que entrenar al robot. Para la obtención de dicho dataset se ha utilizado el desarrollo de un script en Python que descarga imágenes sin copyright de Google imágenes dando un criterio de búsqueda. Esta obtención automática de imágenes se ha supervisado para eliminar imágenes no adecuadas. Como añadido se ha investigado y utilizado el dataset Animals-10 de Kaggle.
A la hora de entrenar y desarrollar la red neuronal se ha utilizado el lenguaje Python por las facilidades y utilidades que dota al desarrollo de inteligencia artificial y Jupyter notebook como entorno de programación.
Respecto a las tecnologías que hemos usado, la red neuronal se apoya sobre Tensorflow y librerías útiles para el desarrollo y validación de redes neuronales como numpy, keras, scipy, image…
El modelo final es capaz de discriminar entre 18 categorías de obstáculos
Para dotar al prototipo de una red neuronal que mejore con el tiempo, que sea escalable y que tenga un mejor almacenamiento de modelos se ha integrado tanto el software como el proceso de reentrenamiento en “la nube”.
Esta implementación ha sido desarrollada bajo un servidor en Amazon Aws. En este punto se ha desarrollado una página web para validación de resultados, realizada en Flask, a la cual se pueden subir imágenes y devuelve una predicción y un porcentaje de acierto respecto a la red neuronal y el script de predicción activos en dicho servidor.
Una vez desarrollada la página web se ha desarrollado el software necesario para el reentrenamiento en la nube en el cual el robot, una vez al día en un horario determinado, se conecta al servidor, envía las imágenes que haya predicho con más de un 80% de precisión y se entrena nuevamente con estas imágenes, consiguiendo así que el modelo mejore con el tiempo.
Para hacer todo este proceso más visual se ha desarrollado una interfaz de validación en tkinter que permite acceder a la cámara del prototipo. Se ha establecido un tiempo periódico para la toma de imágenes y se han guardado en la memoria del prototipo las imágenes que haya predicho con más de un 80% de precisión para posteriormente ser enviadas al servidor.
Finalmente se ha desarrollado una conversión del modelo de TensorFlow a TensorFlow-lite, mucho más ligero y necesario para ser ejecutado por el procesador del prototipo.
Todo lo anteriormente mencionado se ha implementado en un prototipo robot que se ha ensamblado bajo una plataforma Nvidia Jetbot, dotándole así de la red neuronal que hará posible que reconozca obstáculos según vaya desplazándose.
Como ultimo desarrollo software se ha adaptado un código en github sobre evitación de obstáculos a nuestro caso de uso modificando parámetros y añadiendo código propio para que el robot pueda reconocer obstáculos y evitarlos de forma paralela además de en una segunda versión poder reconocer obstáculos mientras sigue una línea en el suelo.
Como resultado final del proyecto, se dispone de un prototipo robotizado que de manera autónoma evita colisiones, es capaz de reconocer y predecir obstáculos entre 18 categorías, almacena las imágenes de estos y una vez al día las envía a un servidor que reentrena y descarga del servidor un nuevo modelo actualizado y más preciso.