{"id":6213,"date":"2022-12-21T23:00:28","date_gmt":"2022-12-21T22:00:28","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=6213"},"modified":"2023-03-13T09:33:47","modified_gmt":"2023-03-13T08:33:47","slug":"papelera-inteligente-con-machine-learning","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/","title":{"rendered":"Papelera Inteligente con Machine Learning"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Alumnos<\/h2>\n\n\n\n<p>Alejandro Delgado Garc\u00eda&nbsp;<\/p>\n\n\n\n<p>Marco Zucchi Mesia<\/p>\n\n\n\n<p>Joaqu\u00edn Ferrer N\u00fa\u00f1ez&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introducci\u00f3n y objetivo de la pr\u00e1ctica<\/h2>\n\n\n\n<p>En primer lugar, esta pr\u00e1ctica consist\u00eda en realizar un proyecto en el que se use lo que se ha aprendido en clase con Arduino de manera pr\u00e1ctica. De esta manera, se adquirir\u00eda mayor soltura con los componentes electr\u00f3nicos en proyecto real. Nuestro grupo decidi\u00f3 crear una papelera que detecte distintos tipos de residuos, y seg\u00fan el tipo de residuo lo dirija a un contenedor u otro. Para ello, se ha hecho uso del kit de Machine Learning de Arduino (creado por Edge Impulse\u00ae), con el fin de poder identificar los objetos que se deseen tirar a la basura. La idea de este proyecto es poder reciclar abstrayendo al usuario de a d\u00f3nde tirar cada residuo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Video de muestra:<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"video-container\"><iframe loading=\"lazy\" title=\"Papelera inteligente - Proyecto Grupo 13 - Dise\u00f1o de sistemas empotrados\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/kzB4mwzKiDI?feature=oembed&#038;wmode=opaque\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Materiales utilizados y precios<\/h2>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td>Objeto<\/td><td>Precio<\/td><\/tr><tr><td>Caja de cart\u00f3n&nbsp;<\/td><td>5,49\u20ac&nbsp;<\/td><\/tr><tr><td>Spray pintura verde&nbsp;<\/td><td>3,89\u20ac&nbsp;<\/td><\/tr><tr><td>Servomotor (2)&nbsp;<\/td><td>2,52\u20ac (5,04\u20ac)&nbsp;<\/td><\/tr><tr><td>Kit Machine Learning&nbsp;<\/td><td>Proporcionad por la universidad&nbsp;<\/td><\/tr><tr><td>Kit Arduino Uno R3&nbsp;<\/td><td>Proporcionad por la universidad&nbsp;<\/td><\/tr><tr><td><strong>Total:<\/strong>&nbsp;<\/td><td><strong>14,42\u20ac<\/strong>&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Montaje de la caja<\/h2>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"625\" height=\"469\" data-id=\"6223\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-2.jpg\" alt=\"\" class=\"wp-image-6223\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-2.jpg 625w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-2-300x225.jpg 300w\" sizes=\"auto, (max-width: 625px) 100vw, 625px\" \/><figcaption class=\"wp-element-caption\">Imagen 1<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"465\" data-id=\"6222\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/11111111-2.jpg\" alt=\"\" class=\"wp-image-6222\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/11111111-2.jpg 620w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/11111111-2-300x225.jpg 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><figcaption class=\"wp-element-caption\">Imagen 2<\/figcaption><\/figure>\n<\/figure>\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<p>El montaje consiste en dos rampas, una m\u00e1s grande (la inferior), que se mueve por un servomotor hacia delante y hacia detr\u00e1s, y una m\u00e1s peque\u00f1a (la superior), que gira hacia la derecha o hacia la izquierda gracias a otro servomotor.<\/p>\n\n\n\n<p>En la parte inferior de la caja (aunque no se puede apreciar bien en las im\u00e1genes) se encuentran unas separaciones en forma de cruz para formar los cuatro cub\u00edculos que hacen de contenedores. En la parte exterior de la caja se encuentran cuatro puertas que van a dichos cub\u00edculos que indican que contiene dicho cub\u00edculo y a que numero del mando pertenece.<\/p>\n\n\n\n<p>En la segunda imagen, en la parte que se ha coloreado con un c\u00edrculo rojo, es donde se esperaba que se posicionase el m\u00f3dulo de Machine Learning con la c\u00e1mara, para que identificase los objetos que se colocasen en la rampa superior y proceder a tirarlo a su contenedor correspondiente. Como al final no se pudo implementar el m\u00f3dulo de Machine Learning por razones que se explicar\u00e1n m\u00e1s adelante, se situ\u00f3 el circuito como se ve en la primera imagen. Adem\u00e1s, en la mini-protoboard se encuentra el sensor de infrarrojo para el mando.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Circuito<\/h2>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"712\" height=\"460\" data-id=\"6221\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/circuito1-1.png\" alt=\"\" class=\"wp-image-6221\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/circuito1-1.png 712w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/circuito1-1-300x194.png 300w\" sizes=\"auto, (max-width: 712px) 100vw, 712px\" \/><figcaption class=\"wp-element-caption\">Circuito 1<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"580\" height=\"440\" data-id=\"6220\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/circuito2-1.png\" alt=\"\" class=\"wp-image-6220\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/circuito2-1.png 580w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/circuito2-1-300x228.png 300w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><figcaption class=\"wp-element-caption\">Circuito 2<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p>Ahora a continuaci\u00f3n se proceder\u00e1 a explicar el circuito. El circuito cuenta con dos servomotores conectados a los pines PWM 11 y 9. Estos, adem\u00e1s, tambi\u00e9n est\u00e1n conectados a los 5V de la placa y al GND. Por otra parte, se encuentra el sensor infrarrojo posicionado en la <em>protoboard<\/em>. Al igual que los servos, est\u00e1 conectado a la alimentaci\u00f3n de 5V, al GND, y a un pin PWM, que en su caso es el 3.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"245\" height=\"238\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML1.jpg\" alt=\"\" class=\"wp-image-6224\"\/><\/figure>\n\n\n\n<p>En caso de usar el m\u00f3dulo de machine learning, los dos servos ir\u00edan conectados a los pines digitales D12 y D11 del <em>shield<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Machine Learning<\/h2>\n\n\n\n<p>En cuanto a la parte de Machine Learning, se trataba del grueso del proyecto y una de las partes que nos resultaron m\u00e1s dif\u00edciles de comprender. Para ello cont\u00e1bamos con varios componentes y <em>frameworks <\/em>de desarrollo, que facilitaron la obtenci\u00f3n de im\u00e1genes de prueba, el entrenamiento y por \u00faltimo, la compresi\u00f3n del modelo en el sistema embebido de Arduino Nano, que ven\u00eda en el kit de Machine Learning de Edge Impulse<a>\u00ae:<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JMD <em>Imagescraper <\/em>(<a href=\"https:\/\/github.com\/joedockrill\/jmd_imagescraper\">repositorio<\/a>)<\/li>\n\n\n\n<li>Tensorflow Lite y Tensorflow Lite Micro<\/li>\n\n\n\n<li>Arduino IDE<\/li>\n<\/ul>\n\n\n\n<p>El primer repositorio proporcionaba una serie de scripts que permit\u00edan de manera m\u00e1s o menos sencilla obtener gran cantidad de im\u00e1genes etiquetadas por directorio para ciertas b\u00fasquedas. Esto se llevaba a cabo mediante b\u00fasquedas en el buscador <a href=\"https:\/\/duckduckgo.com\/\">Duckduckgo<\/a>. En segundo lugar, tenemos el <em>framework open-source <\/em>para entrenamiento de modelos de red neuronal Tensorflow Lite y Tensorflow Lite Micro (versi\u00f3n para microcontroladores, con limitaciones de memoria y capacidades de procesamiento muy limitadas). Por \u00faltimo, el Arduino IDE se trata de un entorno de desarrollo que nos permite interactuar con los dispositivos de Arduino, mediante la programaci\u00f3n del bootloader en un lenguaje parecido a C.<\/p>\n\n\n\n<p>Por \u00faltimo en esta introducci\u00f3n, cabe destacar que muchos de los conocimientos de Machine Learning, as\u00ed como parte del despliegue en la plataforma de Arduino, se deben a los tres cursos de Harvard con el kit de Machine Learning TinyMLx :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/learning.edx.org\/course\/course-v1:HarvardX+TinyML1+1T2022\/home\">Curso 1<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/learning.edx.org\/course\/course-v1:HarvardX+TinyML2+1T2022\/home\">Curso 2<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/learning.edx.org\/course\/course-v1:HarvardX+TinyML3+1T2022\/home\">Curso 3<\/a><\/li>\n<\/ul>\n\n\n\n<p>Ahora a continuaci\u00f3n se proceder\u00e1 a explicar las distintas fases dentro del Machine Learning:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\">\n<li>Obtenci\u00f3n de im\u00e1genes de prueba (para entrenar, validar y evaluar el modelo)<\/li>\n\n\n\n<li>propio del modelo<\/li>\n\n\n\n<li>Compresi\u00f3n del modelo para que quepa en las limitaciones f\u00edsicas del Arduino Nano<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Obtenci\u00f3n de im\u00e1genes de prueba<\/h3>\n\n\n\n<p>Para que la red neuronal pueda aprender, necesita un <em>dataset <\/em>etiquetado y dividido en las diferentes clases que queremos clasificar. Para ello, como se ha mencionado anteriormente, se us\u00f3 el script de JMD imagescraper, que permite obtener im\u00e1genes de DuckDuckGo, usando palabras claves. La estructura de directorios resultante es la siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"355\" height=\"271\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML2.png\" alt=\"\" class=\"wp-image-6225\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML2.png 355w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML2-300x229.png 300w\" sizes=\"auto, (max-width: 355px) 100vw, 355px\" \/><\/figure>\n\n\n\n<p>En cada una de las subcarpetas, se encontrar\u00e1n las diferentes im\u00e1genes que se <a>pasar\u00e1n<\/a> al modelo en las fases de entrenamiento, validaci\u00f3n o evaluaci\u00f3n.<\/p>\n\n\n\n<p>El script resultante para descargar las im\u00e1genes es el siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"480\" height=\"457\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML3.png\" alt=\"\" class=\"wp-image-6226\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML3.png 480w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML3-300x286.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Entrenamiento del modelo<\/h3>\n\n\n\n<p>El entrenamiento del modelo se ha hecho con Tensorflow en Python, ya que se tiene m\u00e1s capacidad de c\u00f3mputo para entrenar el modelo.<\/p>\n\n\n\n<p>En primer lugar, se ha cargado el <em>dataset <\/em>de la carpeta, con par\u00e1metros para que se dividiese en dos, <em>dataset<\/em> de entranamiento y de validaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"586\" height=\"233\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML4.png\" alt=\"\" class=\"wp-image-6227\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML4.png 586w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML4-300x119.png 300w\" sizes=\"auto, (max-width: 586px) 100vw, 586px\" \/><\/figure>\n\n\n\n<p>Luego, se construy\u00f3 la arquitectura de la red neuronal, con cuatro capas a alto nivel: la capa de aumentaci\u00f3n de datos (transformaciones al <em>dataset <\/em>original), modelo base pre-entrenado, capas adicionales para clasificaci\u00f3n espec\u00edfica a nuestro caso de uso y capa de predicci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"330\" height=\"198\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML5.png\" alt=\"\" class=\"wp-image-6228\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML5.png 330w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML5-300x180.png 300w\" sizes=\"auto, (max-width: 330px) 100vw, 330px\" \/><\/figure>\n\n\n\n<p>Luego, se construy\u00f3 la arquitectura de la red neuronal, con cuatro capas a alto nivel: la capa de aumentaci\u00f3n de datos (transformaciones al <em>dataset <\/em>original), modelo base pre-entrenado, capas adicionales para clasificaci\u00f3n espec\u00edfica a nuestro caso de uso y capa de predicci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML6.png\" alt=\"\" class=\"wp-image-6229\" width=\"333\" height=\"200\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML6.png 330w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML6-300x180.png 300w\" sizes=\"auto, (max-width: 333px) 100vw, 333px\" \/><\/figure>\n\n\n\n<p>A continuaci\u00f3n, se muestran, cada una de las capas a alto nivel individualmente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"493\" height=\"294\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML7.png\" alt=\"\" class=\"wp-image-6230\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML7.png 493w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML7-300x179.png 300w\" sizes=\"auto, (max-width: 493px) 100vw, 493px\" \/><\/figure>\n\n\n\n<p>En \u00faltimo lugar, se muestra c\u00f3mo se han entrenado los modelos y guardado en archivos:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"583\" height=\"81\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/MLM8.png\" alt=\"\" class=\"wp-image-6231\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/MLM8.png 583w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/MLM8-300x42.png 300w\" sizes=\"auto, (max-width: 583px) 100vw, 583px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Compresi\u00f3n del modelo<\/h3>\n\n\n\n<p>En esta fase, se ha comprimido el modelo con ciertas optimizaciones para poder reducir el tama\u00f1o que ocupa (dado que en el Arduino Nano tenemos solo 1MB de memoria flash y 256KB de RAM). Para ello, se ha convertido, primero en un formato .tflite y segundo, en un array estilo-C para poder ponerlo dentro del Arduino Nano. Se muestra el c\u00f3digo a continuaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"181\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML9.png\" alt=\"\" class=\"wp-image-6233\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML9.png 629w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML9-300x86.png 300w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Arduino<\/h3>\n\n\n\n<p>El c\u00f3digo de Arduino es muy largo, pero en cuanto a compresi\u00f3n del modelo, existen diferentes t\u00e9cnicas que permiten reducir incluso m\u00e1s el tama\u00f1o del modelo. Estas t\u00e9cnicas se encuentran dentro del marco de Tensorflow Lite Micro (\u201cpara microcontroladores\u201d) y permiten a\u00f1adir, solo las operaciones de la librer\u00eda de Tensorflow que se necesitan en el modelo.<\/p>\n\n\n\n<p>Para determinar las operaciones que necesita el modelo se puede usar una p\u00e1gina visualizadora de capas como <a href=\"https:\/\/netron.app\">Netron<\/a>. A continuaci\u00f3n, se muestran algunas de las capas de nuestro modelo, junto con una captura que muestra c\u00f3mo se a\u00f1aden dichas capas en fichero .ino<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML10-2.png\" alt=\"\" class=\"wp-image-6238\" width=\"97\" height=\"289\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML10-2.png 161w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML10-2-101x300.png 101w\" sizes=\"auto, (max-width: 97px) 100vw, 97px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"395\" height=\"266\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML11-2.png\" alt=\"\" class=\"wp-image-6239\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML11-2.png 395w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML11-2-300x202.png 300w\" sizes=\"auto, (max-width: 395px) 100vw, 395px\" \/><\/figure>\n\n\n\n<p>En el c\u00f3digo anterior, tambi\u00e9n se muestra el int\u00e9rpretede Tensorflow Lite Micro que permite modificar instrucciones del modelo sin tener que recompilar el c\u00f3digo y solo a\u00f1adiendo una ligera latencia (despreciable debido a las numerosas iteraciones\/epochs del modelo).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C\u00e1mara OV7675<\/h3>\n\n\n\n<p>Un inciso sobre la c\u00e1mara OV7675. Nos hemos guiado de ejemplos de Arduino en Github, que permit\u00edan obtener una imagen, mediante el siguiente c\u00f3digo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML12.png\" alt=\"\" class=\"wp-image-6240\" width=\"482\" height=\"403\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML12.png 572w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/ML12-300x251.png 300w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3digo de Arduino <\/h2>\n\n\n\n<p>En cuanto al c\u00f3digo, se ha decidido dividirlo en distintos archivos, debido a que entre todos los archivos es muy pesado (el modelo tiene m\u00e1s de 10.000 l\u00edneas de c\u00f3digo). El c\u00f3digo se  puede encontrar completo en el siguiente enlace: <a href=\"https:\/\/gist.github.com\/marcozucchi\/24256f1e4142c39c3fad6f1333f7441e\">https:\/\/gist.github.com\/marcozucchi\/24256f1e4142c39c3fad6f1333f7441e<\/a> <\/p>\n\n\n\n<p>El c\u00f3digo del archivo principal es el siguiente: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;TensorFlowLite.h&gt;\n\n\/\/librerias de machine learning\n#include \"tensorflow\/lite\/micro\/micro_interpreter.h\"\n#include \"tensorflow\/lite\/micro\/micro_mutable_op_resolver.h\"\n#include \"tensorflow\/lite\/schema\/schema_generated.h\"\n#include \"model.h\"\n#include \"model_settings.h\"\n#include \"detection_responder.h\"\n#include \"tensorflow\/lite\/micro\/system_setup.h\"\n#include \"tensorflow\/lite\/micro\/micro_log.h\"\n\n\/\/librerias de servomotores y sensor infrarrojo\n#include &lt;Servo.h&gt;\n#include &lt;IRremote.h&gt;\n\n\/\/teclas del mando\n#define TECLA1 0xF30CFF00\n#define TECLA2 0xE718FF00\n#define TECLA3 0xA15EFF00\n#define TECLA4 0xF708FF00\n \nServo servomotor1;\nServo servomotor2;\nint IR =12;\n\n\/\/creacion de modelo, interprete, error reporter y entradas a null, as\u00ed como el tama\u00f1o de memoria del modelo.\nnamespace {\n  tflite::ErrorReporter* error_reporter = nullptr;\n  const tflite::Model* model = nullptr;\n  tflite::MicroInterpreter* interpreter = nullptr;\n  TfLiteTensor* input = nullptr;\n\n  constexpr int kTensorArenaSize = 90*1024;\n  uint8_t tensor_arena[kTensorArenaSize];\n\n}\n\n\/\/funciones auxiliares para el movimiento de los servomotores\nvoid papel(int servo1, int servo2)\n{\n       \n    while(servo1 &lt; 160 || servo2 &lt; 160)\n    {\n      servomotor1.write(servo1);\n      servomotor2.write(servo2);\n      delay(25);\n      servo1++;\n      servo2++;\n    } \n    Serial.println(servo1);\n    Serial.println(servo2);\n    delay(100);\n    while(servo1 &gt; 90 || servo2 &gt; 90)\n    {\n      servomotor1.write(servo1);\n      servomotor2.write(servo2);\n      delay(25);\n      servo1--;\n      servo2--;\n    }\n    Serial.println(servo1);\n    Serial.println(servo2);\n\n}\nvoid plastico(int servo1, int servo2)\n{\n   \n     while(servo1 &gt; 20 || servo2 &gt; 20)\n    {\n      servomotor1.write(servo1);\n      servomotor2.write(servo2);\n      delay(25);\n      servo1--;\n      servo2--;\n    } \n    delay(100);\n    \n    while(servo1 &lt; 90 || servo2&lt; 90)\n    {\n      servomotor1.write(servo1);\n      servomotor2.write(servo2);\n      delay(25);\n      servo1++;\n      servo2++;\n    }   \n}\nvoid organico(int servo1, int servo2)\n{\n    while(servo1 &lt; 160 || servo2 &gt; 20)\n    {\n      servomotor1.write(servo1);\n      servomotor2.write(servo2);\n      delay(25);\n      servo1++;\n      servo2--;\n    } \n     delay(100);\n    while(servo1 &gt; 90 &amp;&amp; servo2 &lt; 90)\n    {\n      servomotor1.write(servo1);\n      servomotor2.write(servo2);\n      delay(25);\n      servo1--;\n      servo2++;\n    }\n  \n}\nvoid pilas(int servo1, int servo2)\n{\n    while(servo1 &lt; 20 || servo2 &lt; 160)\n    {\n      servomotor1.write(servo1);\n      servomotor2.write(servo2);\n      delay(25);\n      servo1--;\n      servo2++;\n    } \n    \n    while(servo1 &lt; 90 &amp;&amp; servo2 &gt; 90)\n    {\n      servomotor1.write(servo1);\n      servomotor2.write(servo2);\n      delay(25);\n      servo1++;\n      servo2--;\n    }  \n}\n\n\/\/inicializacion de variables\nvoid setup() {\n  tflite::InitializeTarget();\n  Serial.begin(9600);\n  \/\/ponemos los pines de los servomotores y del modulo de infrarrojos\n  servomotor1.attach(13);\n  IrReceiver.begin(IR, DISABLE_LED_FEEDBACK); \n  servomotor2.attach(11);\n  \n  \/\/escribimos la posicion neutra\n  servomotor1.write(90);\n  servomotor2.write(90);\n\n\n  \/\/inicializacion del modelo y comprobacion de que ha cargado correctamente\n  model = tflite::GetModel(g_model);\n  if (model-&gt;version() != TFLITE_SCHEMA_VERSION) {\n    MicroPrintf(\n        \"Model provided is schema version %d not equal \"\n        \"to supported version %d.\",\n        model-&gt;version(), TFLITE_SCHEMA_VERSION);\n    return;\n  }\n\n  static tflite::MicroMutableOpResolver&lt;7&gt; micro_op_resolver;\n  micro_op_resolver.AddResizeBilinear();\n  micro_op_resolver.AddAveragePool2D();\n  micro_op_resolver.AddConv2D();\n  micro_op_resolver.AddDepthwiseConv2D();\n  micro_op_resolver.AddReshape();\n  micro_op_resolver.AddSoftmax();\n  micro_op_resolver.AddResizeNearestNeighbor();\n\n\n  \/\/creacion del interprete\n  static tflite::MicroInterpreter static_interpreter(\n    model, micro_op_resolver, tensor_arena, kTensorArenaSize\n  );\n  interpreter = &amp;static_interpreter;\n\n\/\/comprueba los tensores y escribe errores\n  TfLiteStatus allocate_status = interpreter-&gt;AllocateTensors();\n if (allocate_status != kTfLiteOk) {\n    MicroPrintf(\"AllocateTensors() failed\");\n    return;\n  }\n\n  \/\/guarda la entrada\n  input = interpreter-&gt;input(0);\n\n\n  if ((input-&gt;dims-&gt;size != 4) || (input-&gt;dims-&gt;data[0] != 1) ||\n      (input-&gt;dims-&gt;data[1] != kNumRows) ||\n      (input-&gt;dims-&gt;data[2] != kNumCols) ||\n      (input-&gt;dims-&gt;data[3] != kNumChannels) || (input-&gt;type != kTfLiteInt8)) {\n    MicroPrintf(\"Bad input tensor parameters in model\");\n    return;\n  }\n}\n\nvoid loop() {\n\n\/\/recoge la imagen y comprueba que no ha habido ningun error\nif (kTfLiteOk != GetImage(input)) {\n    MicroPrintf(\"Image capture failed.\");\n  }\n\n  \/\/ Inferencia\n  if (kTfLiteOk != interpreter-&gt;Invoke()) {\n    MicroPrintf(\"Invoke failed.\");\n  }\n\n\n  TfLiteTensor* output = interpreter-&gt;output(0);\n\n  \/\/ Post-processing\n  \n  \/\/recogemos los valores de los papeles, plastico, organico y bateria del modelo\n  int8_t paper_score = output-&gt; data.uint8[kPaperIndex];\n  int8_t plastic_score = output-&gt;data.uint8[kPlasticIndex];\n  int8_t organic_score = output-&gt;data.uint8[kOrganicIndex];\n  int8_t battery_score = output-&gt;data.uint8[kBatteryIndex];\n\n  \/\/comprobamos cual de todos es mayor y lo ejecutamos\n  if(paper_score &gt; plastic_score &amp;&amp; paper_score &gt; organic_score &amp;&amp; paper_score &gt; battery_score &amp;&amp; paper_score &gt; 50)\n  papel(90,90);\n  else if(plastic_score &gt; paper_score &amp;&amp; plastic_score &gt; organic_score &amp;&amp; plastic_score &gt; battery_score &amp;&amp; plastic_score &gt; 50)\n  plastico(90, 90);\n  else if(organic_score &gt; paper_score &amp;&amp;organic_score &gt; plastic_score &amp;&amp; organic_score &gt; battery_score &amp;&amp; organic_score &gt; 50)\n  organico(90, 90);\n  else if(battery_score &gt; paper_score &amp;&amp; battery_score &gt; plastic_score &amp;&amp; battery_score &gt; organic_score &amp;&amp; battery_score &gt; 50)\n  pilas(90, 90);\n  else if (IrReceiver.decode()) \n   {   \n     Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);       \n    IrReceiver.resume();     \n    if(IrReceiver.decodedIRData.decodedRawData == TECLA1)\n    {   \n      papel(90,90);\n    }\n    if(IrReceiver.decodedIRData.decodedRawData == TECLA2)\n    {\n      plastico(90,90);\n     \n    }\n    if(IrReceiver.decodedIRData.decodedRawData == TECLA3)\n    {\n      organico(90, 90);\n    }\n    if(IrReceiver.decodedIRData.decodedRawData == TECLA4)\n    {\n      pilas(90, 90);      \n    }\n  delay (50);       \n  }\n}\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Problemas y soluciones encontradas<\/h2>\n\n\n\n<p>En cuanto a las dificultades, se han encontrado bastantes. En primer lugar, se encontraron dificultades a la hora de plantear el montaje del proyecto. Se pensaron en distintas estructuras, como puede ser una estructura que se fuese moviendo con una plataforma y que debajo de esa plataforma tuviese un determinado objeto pesado y se fuese moviendo alrededor de esa plataforma, pero se concluy\u00f3 que podr\u00eda dar diferentes problemas m\u00e1s adelante.<\/p>\n\n\n\n<p>Es por ello que se decidi\u00f3 que el montaje fuese dos plataformas que girasen a la izquierda o derecha (dependiendo del material del objeto) seg\u00fan los cuatro compartimentos.<\/p>\n\n\n\n<p>Tras esta decisi\u00f3n se produjo otro problema, y es que determinados objetos pod\u00edan llegar a rebotar en la segunda plataforma por sus dimensiones, y podr\u00eda entrar en una papelera que no fuera la suya. La soluci\u00f3n que se encontr\u00f3 a este problema fue que ambas rampas girasen a la vez, de tal forma que es muy dif\u00edcil que los objetos reboten.<\/p>\n\n\n\n<p>Una vez se decidi\u00f3 el tipo de proyecto, se tuvo que pensar que las rampas no deb\u00edan de chocar entre ellas, por lo que solo deber\u00edan de rotar un cierto grado de \u00e1ngulo. Se encontr\u00f3 que el servomotor no rotaba correctamente debido al apoyo que ten\u00eda en el otro lado, por lo que se reforz\u00f3 con un tornillo para ayudar a los servomotores a girar, sin que ocasionasen ning\u00fan problema. Se cre\u00f3 un agujero detr\u00e1s de cada servomotor para poder pasar los cables sin ning\u00fan problema.<\/p>\n\n\n\n<p>Por otro lado, hubo algunas dificultades con Machine learning. En un principio se utiliz\u00f3 la librer\u00eda del kit de Machine Learning asociada a un curso de Harvard. Esta librer\u00eda causar\u00eda bastantes problemas al final, en primer lugar, porque la versi\u00f3n de la librer\u00eda se tratar\u00eda versi\u00f3n alfa antiguas, por lo que muchas funcionalidades no las pod\u00eda cumplir. Otro de los problemas que dar\u00eda es que no estaba actualizada. Dicha librer\u00eda estaba basada en la <a href=\"https:\/\/github.com\/tensorflow\/tflite-micro-arduino-examples\">librer\u00eda oficial de TensorFlowLite Micro<\/a> pero no actualizaba funcionalidad desde 2019. La soluci\u00f3n a este problema vino dada una que estaba en el administrador de librer\u00edas, sino que estaba en GitHub, por lo que se procedi\u00f3 a descargarla <a href=\"https:\/\/github.com\/tensorflow\/tflite-micro-arduino-examples\">aqu\u00ed<\/a>.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones y mejoras de cara al futuro<\/h2>\n\n\n\n<p>Como conclusiones de esta pr\u00e1ctica, podemos destacar el aprendizaje desde 0 de un modelo de machine Learning, as\u00ed como su despliegue en un sistema empotrado como es el Arduino Nano. Este proyecto se podr\u00eda ampliar y mejorar a un nivel comercial haciendo la detecci\u00f3n de c\u00e1mara m\u00e1s precisa, usando servomotores con un mayor torque, ampliando los contenedores para que puedan almacenar m\u00e1s residuos, as\u00ed como mejorando la precisi\u00f3n del modelo empleado.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alumnos Alejandro Delgado Garc\u00eda&nbsp; Marco Zucchi Mesia Joaqu\u00edn Ferrer N\u00fa\u00f1ez&nbsp; Introducci\u00f3n y objetivo de la pr\u00e1ctica En primer lugar, esta pr\u00e1ctica consist\u00eda en realizar un proyecto en el que se use lo que se&#46;&#46;&#46;<\/p>\n","protected":false},"author":63,"featured_media":6216,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[8,137,116],"class_list":["post-6213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyectos","tag-arduino","tag-machine-learning","tag-papelera-inteligente"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Papelera Inteligente con Machine Learning - Proyectos con Arduino.<\/title>\n<meta name=\"description\" content=\"Papelera inteligente de reciclaje hecha con Arduino\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Papelera Inteligente con Machine Learning - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Papelera inteligente de reciclaje hecha con Arduino\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-21T22:00:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-03-13T08:33:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"625\" \/>\n\t<meta property=\"og:image:height\" content=\"469\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Papelera Inteligente con Machine Learning\",\"datePublished\":\"2022-12-21T22:00:28+00:00\",\"dateModified\":\"2023-03-13T08:33:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/\"},\"wordCount\":1888,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/12\\\/2222222-1.jpg\",\"keywords\":[\"Arduino\",\"Machine learning\",\"Papelera Inteligente\"],\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/\",\"name\":\"Papelera Inteligente con Machine Learning - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/12\\\/2222222-1.jpg\",\"datePublished\":\"2022-12-21T22:00:28+00:00\",\"dateModified\":\"2023-03-13T08:33:47+00:00\",\"description\":\"Papelera inteligente de reciclaje hecha con Arduino\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/12\\\/2222222-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/12\\\/2222222-1.jpg\",\"width\":625,\"height\":469},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/papelera-inteligente-con-machine-learning\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Papelera Inteligente con Machine Learning\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Papelera Inteligente con Machine Learning - Proyectos con Arduino.","description":"Papelera inteligente de reciclaje hecha con Arduino","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/","og_locale":"es_ES","og_type":"article","og_title":"Papelera Inteligente con Machine Learning - Proyectos con Arduino.","og_description":"Papelera inteligente de reciclaje hecha con Arduino","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2022-12-21T22:00:28+00:00","article_modified_time":"2023-03-13T08:33:47+00:00","og_image":[{"width":625,"height":469,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-1.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"","Tiempo de lectura":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/"},"author":{"name":"","@id":""},"headline":"Papelera Inteligente con Machine Learning","datePublished":"2022-12-21T22:00:28+00:00","dateModified":"2023-03-13T08:33:47+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/"},"wordCount":1888,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-1.jpg","keywords":["Arduino","Machine learning","Papelera Inteligente"],"articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/","name":"Papelera Inteligente con Machine Learning - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-1.jpg","datePublished":"2022-12-21T22:00:28+00:00","dateModified":"2023-03-13T08:33:47+00:00","description":"Papelera inteligente de reciclaje hecha con Arduino","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/12\/2222222-1.jpg","width":625,"height":469},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/papelera-inteligente-con-machine-learning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Papelera Inteligente con Machine Learning"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/6213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=6213"}],"version-history":[{"count":12,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/6213\/revisions"}],"predecessor-version":[{"id":6316,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/6213\/revisions\/6316"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/6216"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=6213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=6213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=6213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}