<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Javier Maciá Sempere on Medium]]></title>
        <description><![CDATA[Stories by Javier Maciá Sempere on Medium]]></description>
        <link>https://medium.com/@javiermaciasempere?source=rss-22712508b773------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*q2EIy0fI4P3OcPyYPJoi0g.jpeg</url>
            <title>Stories by Javier Maciá Sempere on Medium</title>
            <link>https://medium.com/@javiermaciasempere?source=rss-22712508b773------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 26 May 2026 07:39:17 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@javiermaciasempere/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[SmartBite]]></title>
            <link>https://medium.com/@javiermaciasempere/smartbite-11c9fb0f6479?source=rss-22712508b773------2</link>
            <guid isPermaLink="false">https://medium.com/p/11c9fb0f6479</guid>
            <category><![CDATA[image-recognition]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Javier Maciá Sempere]]></dc:creator>
            <pubDate>Wed, 26 Jun 2024 20:41:22 GMT</pubDate>
            <atom:updated>2024-06-26T21:49:03.866Z</atom:updated>
            <content:encoded><![CDATA[<p><a href="https://sergiolms.github.io/smartbite/">SmartBite</a> es un proyecto cuya finalidad principal es la de facilitar a la población el reconocimiento de los nutrientes que se encuentran en un plato determinado para, así, poder llevar un mejor control de aquello que se ingesta, así como evitar también aquellos alimentos que contengan alérgenos que resulten nocivos para la persona. La alimentación es la base de todo. Una buena dieta implica una buena salud, un mayor rendimiento y un mejor desempeño en todos los aspectos de la vida de una persona.</p><h3>¿Quiénes somos?</h3><ul><li><a href="https://www.linkedin.com/in/sergiolms/">Maciá Sempere, Sergio Leonardo</a></li><li><a href="https://www.linkedin.com/in/antonio-d%C3%ADaz-8b6140201/">Díaz-Parreño Lajara, Antonio</a></li><li><a href="https://www.linkedin.com/in/javiermaciasempere/">Maciá Sempere, Javier</a></li></ul><h3>Motivación del proyecto</h3><p>El principal objetivo y motivación de este proyecto es facilitar a las personas el reconocimiento de alérgenos en los platos, así como también la de poder reconocer los macro nutrientes e ingredientes que se encuentran en los platos para que así puedan llevar un mejor control de los mismos.</p><p>Desde el principio, el reconocimiento de las imágenes ha sido algo que ha llamado la atención del grupo, y era una vertiente de la inteligencia artificial que se deseaba aplicar a la buena alimentación.</p><h3>Fase 0: Elección del Modelo de IA</h3><p>Para el proyecto se han utilizado dos datasets:</p><ul><li><a href="https://www.kaggle.com/datasets/dansbecker/food-101">Food101</a> [1]. Reúne 101.000 fotos de comida pertenecientes a 101 categorías diferentes.</li><li><a href="https://world.openfoodfacts.org/data">OpenFoodFacts</a> [2] Reúne información nutricional sobre alimentos.</li></ul><p>Para elegir el modelo se ha tenido en cuenta el caso de uso a tratar, es decir, procesar imágenes de comida para obtener una categoría. Por ello, se han elegido las redes neuronales convolucionales (CNN) por su facilidad para tratar con imágenes, procesarlas, obtener sus características y categorizarlas según estas.</p><h3>¿Qué son las redes neuronales convolucionales?</h3><p>Las <a href="https://dcain.etsin.upm.es/~carlos/bookAA/05.7_RRNN_Convoluciones_CIFAR_10_INFORMATIVO.html#ejercicio-practico-de-entrenamiento-de-un-conjunto-de-imagenes-usando-convoluciones">redes neuronales convolucionales</a> [3] son un tipo especializado de red neuronal para procesar datos que tiene una topología similar a una cuadrícula. Este tipo de redes se diseñaron para procesar imágenes y tratan de simular el funcionamiento de la visión humana. Las CNN modelan de forma consecutiva pequeñas piezas de información, tratando de extraer información sobre diferentes patrones de cada imagen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*Ag4D_wSBRXumxjrc" /></figure><h3>¿Cómo se ha aplicado el modelo de CNN al proyecto?</h3><p>Para aplicar el modelo de CNN al contexto de clasificación de imágenes de comida, se siguen los siguientes pasos:</p><ol><li><strong>Preparación de datos</strong>: Se utiliza un dataset de imágenes de comida, dividiéndolo en conjuntos de entrenamiento y prueba. Estas imágenes se han normalizado y etiquetado según unas categorías de alimentos.</li><li><strong>Modelado con CNN</strong>: Configuración del modelo y ajuste al problema.</li><li><strong>Evaluación y Validación</strong>: Entrenar el modelo con los datos de entrenamiento y evaluar su rendimiento con los datos de validación.</li></ol><p>Se usará un modelo que ha sido entrenado previamente para ofrecer las <a href="https://www.linkedin.com/advice/3/what-advantages-disadvantages-using-pre-trained-cnn?lang=es&amp;originalSubdomain=es">ventajas </a>[4] de ser eficiente, permitir superar el problema de sobreajuste y permitir un desarrollo más rápido. La elección de modelo preentrenado para este proyecto ha sido InceptionV3 por ser preciso, eficiente, permitir reducir parámetros y ser adaptable [5].</p><p><a href="https://cloud.google.com/tpu/docs/inception-v3-advanced?hl=es-419">InceptionV3</a> [6] es un modelo de reconocimiento de imágenes que puede alcanzar una exactitud superior al 78.1% en el conjunto de datos de <a href="https://cloud.google.com/tpu/docs/imagenet-setup?hl=es-419">ImageNet</a> [7]. La arquitectura del modelo es la siguiente:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*JhY_CB56tKz3c0HV" /></figure><h3>Fase 1: Preparación del Proyecto</h3><p>La estructura del proyecto contiene los siguientes directorios:</p><pre>|- smartbite<br>  |-datasource<br>    |-food_info: Tiene un JSON con información nutricional de los platos.<br>    |-images: Contiene todas las imágenes de Food101<br>    |-meta: Contiene los archivos de metadatos, <br>            como los datos de entrenamiento y de test y sus categorías.<br>  |-model:<br>    |-model_trained_3class.keras: Es el modelo entrenado. Se utilizará para cargar el modelo y utilizarlo para la interfaz. Se creará con &quot;training.py&quot;.<br>  |-scripts:<br>    |-data-generation.py: Incorpora OpenFoodFacts al proyecto<br>    |-evaluate.py: Evalúa precisión y pérdida del modelo.<br>    |-generate_summary.py: Genera un resumen del modelo.<br>    |-showcase.py: Es la interfaz de usuario del programa.<br>    |-training.py: Genera y entrena el modelo a usar.</pre><h3>Fase 2: Análisis de datos exploratorio (EDA)</h3><p>En esta fase se eliminan datos irrelevantes y se normalizan para poder entrenarlos. Se abren los directorios “images”, “classes.txt” y “labels.txt”, y se carga la información de los archivos JSON de train y test, encontrados en el directorio “meta” de datasource. Como se ha mencionado, el dataset contiene 101000 imágenes en total, 1000 imágenes por categoría, y usaremos el 75% del total para entrenar al modelo y el 25% para validarlo. Esto es 75750 imágenes para entrenamiento y 25250 imágenes para validación.</p><p>Debido al alto volumen de datos para entrenar y validar, necesitamos crear un objeto “ImageDataGenerator” para cargar y procesar todas las imágenes del dataset, donde se normalizan los valores de los píxeles de las imágenes, de 0–255 a 0–1.</p><h3>Fase 3: Configuración del Modelo elegido</h3><p>Para adaptar el modelo InceptionV3 de la API <a href="https://www.tensorflow.org/api_docs/python/tf/keras/applications/InceptionV3">Tensorflow</a> [8] al proyecto, se han de seguir los siguientes pasos:</p><ol><li>Ajustar el tamaño del lote en 32 para que procese 32 imágenes a la vez durante el entrenamiento.</li><li>Cargar el modelo preentrenado con los pesos de ImageNet. También se indica la exclusión de las capas de clasificación finales del modelo original para así añadir capas propias y adaptarlo al caso de uso. Sus capas son:</li></ol><p>2. a. Capa de <strong>pooling</strong>: permite tomar cada mapa de características 2D generado por la capa convolucional anterior y calcular el promedio de todos los valores en ese mapa. Permite reducir la dimensión espacial de los mapas de características y simplificar el modelo al reducir el número de parámetros. Ayuda a evitar el sobreajuste y mejora la eficiencia computacional.</p><p>2.b. Capa <strong>densa</strong>: totalmente conectada, con 128 neuronas y la función de activación ReLU.</p><p>2. c. Capa de <strong>dropout: </strong>con una tasa de 0.2 para reducir el sobreajuste. Permite desactivar de forma aleatoria el 20% de las neuronas durante el entrenamiento.</p><p>2. d. Capa <strong>final</strong>: se encargará de predecir la clase del plato que ha sido introducido como entrada. Utilizamos la regularización L2 para evitar el sobreajuste y la función de activación softmax para generar probabilidades de clase.</p><p>Se define el modelo con las entradas del modelo InceptionV3 y las salidas de la capa de predicción personalizada, y se compila el modelo optimizando con <a href="https://arxiv.org/abs/1502.03167">SGD</a> [9], con una tasa de aprendizaje del 0.0001 y un momento de 0.9; respecto a la función de pérdida usamos ‘categorical_crossentropy’. Se usa también la precisión como métrica para evaluar el rendimiento del modelo durante el entrenamiento y la validación.</p><p>A continuación, se guarda el modelo en el archivo “best_model.keras” únicamente si se obtiene un mejor rendimiento que en la época actual, de esta forma siempre se puede guardar el mejor modelo durante el entrenamiento.</p><p>Se guarda el historial de entrenamiento en un archivo CSV llamado “history.log”, así es posible realizar un seguimiento detallado de las métricas de rendimiento durante el entrenamiento.</p><p>Por último, se comprueba la arquitectura de nuestro modelo. Se podrá ver cómo de inmensa es debido a que tiene gran cantidad de capas. Esto se debe a que el modelo ‘InceptionV3’ ha sido preentrenado y solo ha sido necesario configurarlo y adaptarlo al caso de uso del proyecto para conseguir los resultados que se verán en la siguiente fase.</p><h3>Fase 4: Entrenamiento y Validación</h3><p>En esta fase se entrenará y validará el modelo que ha sido configurado en la fase anterior. De esta forma podremos comprobar la calidad y rendimiento de nuestro modelo.</p><p>Se realiza el entrenamiento con la función fit de Keras, donde se realizarán 30 épocas y, por cada una, se realiza una copia del mejor modelo y su historial en archivos csv mediante callbacks.</p><p>Una vez entrenado el modelo, conviene guardar el modelo para no tener que entrenarlo cuando vayamos a usarlo. De esta forma se evita el tiempo de entrenamiento que, en ocasiones, puede ser muchísimo tiempo. En el caso de este proyecto, cada época tardaba 9 horas de media por lo que se ha estado entrenando una aproximación de 270 horas en total.</p><p>Ha sido definido un trozo de código que permite pausar el entrenamiento anterior y poder entrenarlo en cualquier otro momento con los mismos parámetros, para ellos hacemos uso del archivo CSV “history.log” y del mejor modelo guardado hasta el momento “best_model.keras”:</p><p>Este modelo obtiene los siguientes valores:</p><ul><li><strong>Test Loss </strong>≈ 0.9252. “Loss” indica cómo se adapta el modelo a nuevos datos. Va de 0 a infinito, por lo que nuestro modelo se adapta bastante bien.</li><li><strong>Test Accuracy </strong>≈ 0.8326. “Accuracy” indica la tasa de aciertos del modelo. Va de 0 a 1, por lo que nuestro modelo tiene una precisión del 83.26% de acierto.</li></ul><h3>Fase 5: Creación de la Interfaz de Usuario</h3><p><a href="https://www.gradio.app/">Gradio</a> [10] es una biblioteca de Python que permite crear interfaces de usuario interactivas y fáciles de usar para demostrar nuestros modelos de machine learning. Se encarga de recibir una función que procesa la entrada, en este caso una imagen, para que devuelva la salida, la predicción. Esta función se descompone en los siguientes pasos:</p><ol><li>Dada la etiqueta numérica (0…100) y la lista de etiquetas de la comida, se devuelve la correspondiente etiqueta de la lista a partir de su correspondiente numérica.</li><li>Se procesa la imagen de entrada y se usa el modelo para realizar la predicción devolviendo un número del 0 al 100.</li><li>Se obtiene toda la información de un archivo JSON que contiene toda la información nutricional de todos los platos en este formato.</li><li>Se guardan las categorías de los alimentos en una lista.</li><li>Se carga el modelo compilado a partir del directorio base y el directorio donde se encuentra el modelo.</li><li>Se carga la interfaz y se realiza la predicción de la imagen.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*EDgKWOk17hMEfqzS" /></figure><h3>Próximas maneras de avanzar</h3><p>Con esta herramienta, se puede avanzar en diversos aspectos. Por ejemplo, se podría ayudar a nutricionistas y dietistas, guardando histórico de platos analizados a sus pacientes para complementarlos en sus consultas, ayudándoles a hacer un mejor seguimiento de los pacientes. Otra utilidad podría ser la de utilizar esta aplicación como diario de comidas para ayudar a los pacientes a ser conscientes de su ingesta y así prevenir enfermedades relacionadas con la obesidad y la diabetes. Sería también muy posible generar avisos de energía consumida durante el día, o informes semanales.</p><p>Además, gracias a esta aplicación se podría utilizar para concienciar y promover una alimentación equilibrada y sostenible.</p><h3>Conclusiones</h3><p>Utilizar redes neuronales convolucionales que previamente han sido entrenadas ha resultado ser un acierto al utilizar una arquitectura ya establecida y tener que adaptarla únicamente a nuestro proyecto, sin embargo, esto puede ser un inconveniente porque, dependiendo del modelo preentrenado que elijamos, puede ser más complejo o más sencillo. Se ahorra mucho tiempo a la hora de entrenar, debido a que estos modelos han sido entrenados con millones de imágenes del dataset de ImageNet por lo que va a resultar más sencillo para el modelo encontrar características en las imágenes.</p><p>Por otro lado, conviene mejor no entrenar al modelo de golpe e ir guardando cada cierto tiempo el mejor modelo entrenado durante la fase de entrenamiento, de esta forma podemos entrenar cuando queramos y cuando queramos.</p><p>Por último, el uso de interfaces gráficas como gradio facilita la visualización del modelo de inteligencia artificial al disponer de un aprendizaje muy rápido.</p><h3>Bibliografía</h3><p>[1] Kaggle, “Food 101”. En línea. Disponible:</p><p><a href="https://www.kaggle.com/datasets/dansbecker/food-101">https://www.kaggle.com/datasets/dansbecker/food-101</a></p><p>[2] “Open Food Facts” Dataset:</p><p><a href="https://world.openfoodfacts.org/data">world.openfoodfacts.org/data</a></p><p>[3]05.7 Redes Neuronales Convoluciones.</p><p><a href="https://dcain.etsin.upm.es/~carlos/bookAA/05.7_RRNN_Convoluciones_CIFAR_10_INFORMATIVO.html#ejercicio-practico-de-entrenamiento-de-un-conjunto-de-imagenes-usando-convoluciones">https://dcain.etsin.upm.es/~carlos/bookAA/05.7_RRNN_Convoluciones_CIFAR_10_INFORMATIVO.html#ejercicio-practico-de-entrenamiento-de-un-conjunto-de-imagenes-usando-convoluciones</a></p><p>[4] ¿Cuáles son las ventajas y desventajas de usar modelos CNN previamente entrenados para la detección de objetos?:</p><p><a href="https://www.linkedin.com/advice/3/what-advantages-disadvantages-using-pre-trained-cnn?lang=es&amp;originalSubdomain=es">https://www.linkedin.com/advice/3/what-advantages-disadvantages-using-pre-trained-cnn?lang=es&amp;originalSubdomain=es</a></p><p>[5] Rethinking the Inception Architecture for Computer Vision:</p><p><a href="https://arxiv.org/abs/1512.00567">https://arxiv.org/abs/1512.00567</a></p><p>[6] Guía avanzada de InceptionV3:</p><p><a href="https://cloud.google.com/tpu/docs/inception-v3-advanced?hl=es-419">https://cloud.google.com/tpu/docs/inception-v3-advanced?hl=es-419</a></p><p>[7] ImageNet:</p><p><a href="https://cloud.google.com/tpu/docs/imagenet-setup?hl=es-419">https://cloud.google.com/tpu/docs/imagenet-setup?hl=es-419</a></p><p>[8] Tensorflow — InceptionV3:</p><p><a href="https://www.tensorflow.org/api_docs/python/tf/keras/applications/InceptionV3">https://www.tensorflow.org/api_docs/python/tf/keras/applications/InceptionV3</a></p><p>[9] Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift:</p><p><a href="https://arxiv.org/abs/1502.03167">https://arxiv.org/abs/1502.03167</a></p><p>[10] Gradio:</p><p><a href="https://www.gradio.app/">https://www.gradio.app/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=11c9fb0f6479" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>