PROYECTOS
EVENTOS
talleres
NOTICIAS
PERSONAS

Somos el laboratorio de Fabricación Digital de la Universidad de Chile. Apoyamos proyectos y emprendimientos en donde la ciencia y la tecnología estén al servicio de la sociedad!

PROYECTO DESTACADO FABLAB
PROYECTO DESTACADO COMUNIDAD

Algoritmo de detección visual en tiempo real

Tarea Universitaria 07 Dic 2017

El proyecto consiste en la realización de un algoritmo de detección visual en tiempo real usando el lenguaje de programación Python. El proyecto se lleva a cabo utilizando únicamente librerías que se pueden descargar gratuitamente desde la interfaz de Python, principalmente TensorFlow la cual es una biblioteca de código abierto para aprendizaje automático desarrollado por Google. La principal característica de TensorFlow corresponde a que es capaz de construir y entrenar redes neuronales para detectar y descifrar patrones y correlaciones, lo cual es fundamental para realizar la comparación de la imagen entrante (tomada por la cámara) con relación a distintas bases de datos. Únicamente utilizando la cámara frontal de un notebook como material, se realizó este algortimo el cual es lo suficientemente robusto como para poder detectar sin problema distintas personas (aún cuando estas no aparezcan completas frente a la cámara) y distintos tipos de objetos que se posen en el rango de captura de la cámara en tiempo real. Dado el alto potencial que las redes neuronales tienen en el ámbito de la robótica, se considera que la mejora de este algoritmo y su implementación en distintos dispositivos electro-mecánicos como los realizados en el FabLab pueden entregar grandes y simples soluciones a problemas cotidianos, como por ejemplo saber si quien se encuentra parado fuera de la puerta de nuestro hogar es alguien conocido o no. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Las librerías utilizadas para Python: Numpy TensorFlow Pillow Lxml Jupyter (unicamente para revisar el código por celdas) Matplolib OpenCV (es externo a Python, se utilizó para obtener las imágenes de la cámara) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- La base de datos para las comparaciones, así como el modelo de comparación se obtiene de: https://github.com/tensorflow/models --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Video del algoritmo en funcionamiento: https://youtu.be/I6XrZlTq0uc --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Este proyecto se basó en el trabajo realizado previamente sobre la detección de objetos utilizando TensorFlow por Daniel Stang, en la página medium.com, tal como se especificó en las referencias.

fablab img
NUEVOS PROYECTOS
Biomixer
Tarea Universitaria

  CONTEXTO A veces, hay elementos considerados desechos y son eliminados en la basura, no considerando que pueden tener propiedades que le permitan tener otro uso, afectando así al medio ambiente y las personas mismas. En esto, la biofabricación cumple un rol importante, siendo un gran cambio de paradigma para la producción y el consumo, pues significa enmarcar la producción dentro de una economía más circular y sustentable, generando materiales y productos basados en materia orgánica y biodegradable. Se trata de diseñar considerando los ciclos de vida completos. Bajo este contexto, en el FabLab se pretenden crear 6 máquinas como parte de un kit Open Hardware de Biofabricación Digital, el primero de esta naturaleza en en el mundo, utilizando desechos del laboratorio y de la Facultad, domiciliarios e industriales. Además de productivo y funcional, el kit será una herramienta educativa, por lo que es muy importante que las máquinas sean lo más “transparentes posibles”, utilicen la menor cantidad de material, y tengan buenas terminaciones en lo posible. Una de las máquinas de este kit, y la que se describe en el presente documento, es la Biomixer, una cocina en la que se mezclan los ingredientes, cuyas cantidades son indicadas por el usuario, y se calientan para que, el material resultante, se vierta en un molde y pase por otro proceso y, al final, generar el producto deseado. Durante enero-febrero de 2019 se estuvo trabajando en esta máquina. Al momento de retomar el proyecto en el semestre primavera 2019, la máquina se encontraba en el siguiente estado: Aplicación paa interactuar con la máquina hecha con Flask, HTML, CSS (Boostrap), servidor en una Raspberry. *** Estado inicial de la máquina ** ETAPAS DE DESARROLLO Describe las etapas del desarrollo proyecto, incluyendo aciertos y errores FAMILIARIZACIÓN CON EL PROYECTO Para facilitar este proceso de mezcla y cocción para el usuario, se crea una aplicación para que este pueda ingresar qué ingredientes y qué cantidad de ellos va a utilizar, y luego monitorear el estado de la mezcla mientras dure el proceso. Considerando esto, este proyecto considera la parte física (hardware) y la aplicación (software), por lo que se divide el trabajo en estas partes. DESARROLLO   HARDWARE *** Desarrollo de la parte física de la máquina *** SOFTWARE Los requisitos que debe cumplir la aplicación es que: La interfaz sea simple, intuitiva y pensada para usuarios de competencias diversas. El código debe estar documentado. Funcione para múltiples usuarios, en diferentes plataformas. Después de discutir las herramientas, lenguajes y tecnologías a utilizar, se propone el siguiente modelo de comunicación entre la aplicación, el servidor y la máquina, y cómo interactua el usuario con la interfaz: En este modelo, la parte del usuario representa su interacción con la interfaz, y la máquina tiene 2 arduinos, uno que servirá para accionar el proceso de mezclado y cocción, y uno para monitorear el estado de este. En base a ese modelo, esta parte se divide en las siguientes etapas: Ingresar a la aplicación y la mezcla: Trabajo en la interfaz que vería el usuario al momento de ingresar a la aplicación e indicar las cantidades de los distintos ingredientes. Verificaciones: Trabajo en las verificaciones para el correcto funcionamiento de la máquina Verificaciones de usuario: la aplicación debe verificar que los valores ingresados para la mezcla sea correctos. Verificaciones del servidor: Ver que hay suficiente material en la máquina para los valores ingresados por el usuario. Verificaciones de la máquina: Ver que la olla esté puesta. Envío de datos: Trabajo en enviar los datos ingresados por el usuario al servidor, y de ahí a la máquina para que comience la mezla, e indicarle al usuario que los datos fueron guadados y enviados sin problemas. Vista de los datos: Trabajo en el monitoreo del proceso, para ver la temperatura. También trabajo en darle la opción al usuario de pausar o detener completamente la cocción en casos de ser necesario. A continuación, se prueba la aplicación existente, encontrándose el siguiente problema a solucionar: velocidad de respuesta de la Raspberry como servidor es lenta, demoraba alrededor de 40 segundos en cargar cada pantalla. Las posibles causas son: Insuficiencia de procesador. Ineficiencia del proceso de conexión. Página demasiado pesada. Framework ineficiente (Flask). Se investiga cuál de las causas anteriores es la más probable para solucionarla, y se prueba con enviar pines entre distintas direcciones IP de la red local. Funcionó bien, desde la interfaz del Router, en Chromium y desde el terminal. Desde el terminal era un poco más rápido el proceso. Observaciones: Había un proceso (pedido de cierta página web abierta) que no se ejecutó, pero trataba de realizarse constantemente, lanzando un error, incluso luego de cerrada la interfaz. La cantidad de memoria y de procesador, analizado con TOP, se veía en niveles normales, sin embargo las RPi se quedó pegada. Se decide cambiar el framework de trabajo de Flask a XAMPP (Apache, PHP, MySQL), por lo que se recosntruye el estilo (CSS) en XAMPP y se cambian las sintaxis para adecuarse a los nuevos lenguajes. Finalmente, la aplicación quedó en HTML, CSS (con Bootstrap), Javascript, viendo de la manera siguiente: Vista de la aplicación en celular y en computador. En esta iteración, el código para la interfaz (las pantallas principales, siguiendo el flujo que seguiría el usuario) es la siguiente: Landing page: <!DOCTYPE html> <html lang="en">   <head>     <!-- Required meta tags -->     <meta charset="utf-8">     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">     <title> Bio Mixer</title>     <link rel="stylesheet" href="static/fontawesome-free-5.6.3-web/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s\" crossorigin="anonymous">     <link rel="stylesheet" href="static/bootstrap4-neon-glow.min.css">     <link rel="stylesheet" href="static/font-roboto.css">     <link rel='stylesheet' href="static/hack.min.css">   </head>   <body>       <!-- Button Menu (move between pages) -->       <div class="navbar-dark text-white">         <div class="container">           <nav class="navbar px-0 navbar-expand-lg navbar-dark">             <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">               <span class="navbar-toggler-icon"></span>             </button>             <div class="collapse navbar-collapse" id="navbarNavAltMarkup">               <div class="navbar-nav">                 <a href="index.html" class="pl-md-0 p-3 text-light">Home</a>                 <a href="library.html" class="p-3 text-decoration-none text-light">Library</a>                 <a href="prepare.html" class="p-3 text-decoration-none text-light">Prepare a Mix</a>               </div>             </div>           </nav>         </div>       </div>       <!-- Main Page -->       <div class="jumbotron bg-transparent mb-0 radius-0">           <div class="container">             <div class="row">               <div class="col-xl-6">                   <!-- Title -->                 <h1 class="display-2">Bio Mixe<span class="vim-caret">r</span></h1>                 <div class="lead mb-3 text-mono text-success">Bio Mixer interface 1.1</div>                 <div class="text-mono">                   <!-- Button 1 -->                   <a href="library.html"                      title="Download Theme"                      class="btn btn-success btn-shadow px-3 my-2 ml-0 text-left">                     Check Material Library                   </a>                   <!-- Button 2 -->                   <a href="prepare.html"                      class="btn btn-danger btn-shadow px-3 my-2 ml-0 ml-sm-1 text-left">                     Preparing a Mix                   </a>                 </div>                 <!-- Description -->                 <div class="text-darkgrey text-mono my-2">Welcome to Bio Mixer. A new experience in Material Fabrication</div>                 <!-- Client -->                 <p class="mt-5 text-grey text-spacey">                   FabLab Uchile Prototype                 </p>               </div>             </div>         </div>       </div>       <div class="container py-5">         <h1></h1>         <!-- Credits to the HTML template form -->         <!--         <p>Thank you for downloading this theme. If you have trouble or find a bug, please open an issue on GitHub:<br>           <a href="https://github.com/HackerThemes/theme-machine">https://github.com/HackerThemes/theme-machine</a></p>         -->         <!-- Developer info-->         <p class ="text-darkgrey text-mono my-2">Created for Marcelo Becerra A. consulting to marcelo.becerra@ug.uchile.cl</p>       </div>       <!-- Optional JavaScript -->       <!-- jQuery first, then Popper.js, then Bootstrap JS -->       <script src="static/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>       <script src="static/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>       <script src="static/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>   </body> </html> Que resulta en la siguiente pantalla: Preparar la mezcla: <!DOCTYPE html> <html lang="en">   <head>     <style>       .form-control { display: inline-block !important; }     </style>     <!-- Required meta tags -->     <meta charset="utf-8">     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">     <title>Prepare Mix</title>     <!-- Fonts -->     <link rel="stylesheet" href="static/fontawesome-free-5.6.3-web/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">     <link href="static/font-roboto.css" rel="stylesheet">     <!-- Style and Colors -->     <link rel="stylesheet" href="static/bootstrap4-neon-glow.min.css">     <link rel='stylesheet' href='static/hack.min.css'>     <!-- Script -->     <script type=text/javascript src="static/jquery.js"></script>   </head>   <body>     <!-- Upside Buttons -->     <div class="navbar-dark text-white">       <div class="container">         <nav class="navbar px-0 navbar-expand-lg navbar-dark">           <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">             <span class="navbar-toggler-icon"></span>           </button>           <div class="collapse navbar-collapse" id="navbarNavAltMarkup">             <div class="navbar-nav">               <a href="index.html" class="pl-md-0 p-3 text-light">Home</a>               <a href="library.html" class="p-3 text-decoration-none text-light">Library</a>               <a href="prepare.html" class="p-3 text-decoration-none text-light">Prepare a Mix</a>             </div>           </div>         </nav>       </div>     </div>     <!-- Main Body-->     <div class="container py-5 mb5">       <!-- Title -->       <h1 class="mb-5">Preparing the Mix</h1>       <!-- MATERIALS INPUT -->       <div class="row py-4">         <!-- Size & Distribution -->         <div class="col-md-8 order-md-2 mb-4">           <!-- Subtitle -->           <h4 class="d-flex justify-content-between align-items-center mb-3">             <span class="text-muted">Materials</span>             <span class="badge badge-primary badge-pill">4 base materials available</span>           </h4>           <!-- Listed Container-->           <form id="proportion" method="post">           <ul class="list-group">             <!-- Material 1 -->             <li class="list-group-item d-flex justify-content-between lh-condensed">                 <div class="col-9">                   <h6 class="my-0">Agar Agar</h6>                   <small class="text-muted">Use: binder Type: polysaccharide Origin: alga </small>                 </div>                 <div class = "col-3" style="text-align: right">                   <rigth><input type="number" class="form-control" name="agar" id="agar" placeholder="0 (g)" required onchange="tagg(this.value, 0)"></rigth>                 </div>             </li>             <!-- Material 2 -->             <li class="list-group-item d-flex justify-content-between lh-condensed">               <div class="col-9">                 <h6 class="my-0">Glycerin</h6>                 <small class="text-muted">Use: Type: poly-ol Origin: propylene (not bio ingredient :( ) </small>               </div>               <div class = "col-3" style="text-align: right">                 <rigth><input type="number" class="form-control" id="glycerin" placeholder="0 (ml)" required onchange="tagg(this.value, 1)"></rigth>               </div>             </li>             <!-- Material 3 -->             <li class="list-group-item d-flex justify-content-between lh-condensed">               <div class="col-9">                 <h6 class="my-0">Common Water</h6>                 <small class="text-muted">Use: solvent Type: water plus ions and unknown traces Origin: uncertain</small>               </div>               <div class = "col-3" style="text-align: right">                 <rigth><input type="number" class="form-control" id="water" placeholder="0 (ml)" required onchange="tagg(this.value, 2)"></rigth>               </div>             </li>             <!-- Material 4 -->             <li class="list-group-item d-flex justify-content-between lh-condensed">               <div class="col-9">                 <label for="Add">Additive</label>                 <select class="custom-select d-block w-100" id="Add" required>                   <option value="">Choose...</option>                   <option>Coffee</option>                   <option>Cornstarch</option>                   <option>Detergent</option>                   <option>Orange peel</option>                   <option>other</option>                   <input style="visibility: hidden">                 </select>               </div>               <div class = "col-3" style="text-align: right">                 <rigth><input type="number" class="form-control" id="Additive" placeholder="0 (g)" required onchange="tagg(this.value, 3)"></rigth>               </div>             </li>             <!-- Total -->             <li class="list-group-item d-flex justify-content-between">               <span>Mix Number</span>               <strong><p id="sum"></p></strong>             </li>             <!-- Submit -->             <li class="list-group-item d-flex justify-content-between">                 <right></right><a id="send" type="submit" class="btn btn-primary" onclick="load()">Mix</a></right>             </li>           </ul>           </form>         </div>       </div>       <small class="text-muted">BioMixer Interface 1.1 FabLab Uchile </small>       <div><left></left><small id="ready" class="text-muted" onchange="load">Mix status: not ready</small></div>     </div>   </body> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <!-- <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>--> <script src="static/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script> <script src="static/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> <script type=text/javascript src="static/jquery.js"></script> <script>   var values = [0,0,0,0];   /* Sumar dos números. */   function sumar (valor1, indice) {       valor = parseFloat(valor1); // Convertir el valor a un float (número).       if (values[indice] != valor){         if (isNaN(valor)){             valor = 0;           }           var i;           values[indice] = valor;           var total = 0;           for (i=0; i <3; i++){               total = total + values[i];           }           values[3] = total;           // window.alert(values)       }   // Colocar el resultado de la suma en el control "span".   document.getElementById('sum').innerHTML = values[3];   }   function tagg (value, index){       var val= parseFloat(value);       if (values[index] != val) {           if (isNaN(val)) {               val = 0;           }           values[index] = val;           var i;           var tag = "";           for (i = 0; i < 3; i++) {               tag = tag + values[i] + "/";           }       }       document.getElementById('sum').innerHTML = tag;   } </script> <script>     function load(){       window.location.assign("mixing.html");     } </script> <script type=text/javascript>   //jquery   //$SCRIPT_ROOT = {{ request.script_root|tojson|safe }};   /*     $(function() {       $('a#send').on('click', function() {         $.getJSON($SCRIPT_ROOT + '/mixing',          {           agar: $('input[id="agar"]').val(),           glyc: $('input[id="glycerin"]').val(),           water: $('input[id="water"]').val()         },          function() {           $("#ready").text("Mix status: ready");           window.location.assign("google.com");         });         return false;       });     });     function load() {     }*/ </script> </html> Lo que resulta en la siguiente pantalla: Monitoreo de la mezcla: <!DOCTYPE html> <html lang="en"> <head>     <style>         #progress {           width: 50%;           height: 30px;           position: relative;           background-color: #ddd;         }         #tempBar {           background-color: #4CAF50;           width: 10px;           height: 30px;           position: absolute;         }     </style>     <!-- Required meta tags -->     <meta charset="utf-8">     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">     <title>Prepare Mix</title>     <!-- Fonts -->     <link rel="stylesheet" href="static/fontawesome-free-5.6.3-web/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">     <link href="static/font-roboto.css" rel="stylesheet">     <!-- Style and Colors -->     <link rel="stylesheet" href="static/bootstrap4-neon-glow.min.css">     <link rel='stylesheet' href='static/hack.min.css'>     <meta charset="UTF-8">     <script src="static/jquery.js"></script>     <title>Mixing</title> </head> <body>         <center><h1 style="align-content: center">Mixing!</h1></center>         <center><div class="lead mb-3 text-mono text-success">Making your Mix. Please Relax and wait</div></center>         <div class='row'>             <!-- Show Temperature -->             <div class="col-6">                 <h4>Temperature Monitor</h4>                 <div id = "progress">                     <div id="tempBar"></div>                 </div>                 <div>                     <p id="demo"></p>                 </div>             </div>             <!-- Mix quanties -->             <div class="col-6">                 <h4>Mix information</h4>                 <p>agar</p>                 <small class="text-muted" id="agar"> q1</small>                 <p>water</p>                 <small class="text-muted" id="water"> q2 </small>                 <p>glycerin</p>                 <small class="text-muted" id="glyc"> q3 </small>             </div>         </div> <!-- Actualize temp  monitor --> <script type=text/javascript>     var t;     setInterval(actualize,3000);     function actualize(){     $(document).ready(function () {        $.getJSON($SCRIPT_ROOT + '_showing',{        }, function (data) {            $("#demo").text(data.temp)        });        return false;     });} </script>      <script type=text/javascript>       var tempBar = document.getElementById("tempBar");       var width = 0;       var timer = setInterval(actualize_temp, 1000);       function actualize_temp() {         //window.location.assign("{{ url_for('mixing') }}");         if (width == 100) {           clearInterval(timer);         } else {           //width++;           width = parseInt(document.getElementById("demo").innerHTML) * 10;           tempBar.style.width = width*2 + '%';         }       }              //Test information       // Storing data:       var myObj = {name: "HI", age: 31, city: "New York"};       var myJSON = JSON.stringify(myObj);       localStorage.setItem("testJSON", myJSON);       // Retrieving data:       text = localStorage.getItem("testJSON");       obj = JSON.parse(text);       document.getElementById("demo").innerHTML = obj.name; </script> <!-- Test Function --> <script type=text/javascript>   //jquery   //$SCRIPT_ROOT = {{ request.script_root|tojson|safe }};   $(function() {     $('a#calculate').on('click', function() {       $.getJSON($SCRIPT_ROOT + '/_add_numbers', {         a: $('input[name="a"]').val(),         b: $('input[name="b"]').val()       }, function(data) {         $("#result").text("hey");       });       return false;     });   }); </script> <script>     document.getElementById("agar").innerHTML = 5;     document.getElementById("water").innerHTML = 5 ;     document.getElementById("glyc").innerHTML = 5 ;     document.getElementById("agar").innerHTML = document.getElementById("agar").innerHTML  + " (g)"     document.getElementById("water").innerHTML = document.getElementById("water").innerHTML  + " (ml)"     document.getElementById("glyc").innerHTML = document.getElementById("glyc").innerHTML  + " (ml)" </script> </body> </html> Lo que resulta en la siguiente pantalla: MATERIALES Y TECNOLOGÍAS UTILIZADAS Indicar lista de materiales y tecnologías utilizados o a utilizar en el prototipo Como ya se ha mencionado, para trabajar en el proyecto, se ha dividido en software y hardware. Por lo tanto, los materiales y tecnologías utilizadas, en resumen, para cada parte fueron: Materiales y tecnologías utilizadas. Hardware Software             PROYECCIONES Indica trabajo futuro y proyecciones o alcance       La narrativa del proyecto considera a un lector que requiere continuar o replicar el proyecto Incluye material gráfico como fotografías de buena calidad y si hubiese, códigos y planimetrías de la máquina

fablab img
INDICADORES DE PROYECTOS

94

tarea universitaria

14

investigación academica

52

proyecto personal

28

experimentación

12

nuevas máquinas

0

nuevos software

INDICADORES DE EMPRENDIMIENTOS

0

dispositivos

6

productos

1

servicios

PRÓXIMOS EVENTOS
TALLERES
  • 18

    DIC

    Taller de fabricación de placas electrónicas PCB

    El objetivo de este taller es capacitar a los participantes para que puedan utilzar la máquina CNC Router (Roland Modela MDX-20) del Fablab. 2 sesiones, teórica+demo y práctica.

    Inscribir capacitación
  • 16

    DIC

    Taller de Impresión 3D y tecnologías aditivas

    Dos sesiones consecutivas, una teórico-práctica y una de evaluación. Posteriormente se envía un link para realizar reservas.

    Inscribir capacitación