header-ia-sentiment

Clasificación de texto con JavaScript y TensorFlow.js: Crea una aplicación web de análisis de sentimiento

Clasificación de texto con JavaScript y TensorFlow.js: Crea una aplicación web de análisis de sentimiento

La clasificación de texto es una tarea común en inteligencia artificial y aprendizaje automático. Con JavaScript y TensorFlow.js, podemos realizar este tipo de tareas directamente en una aplicación web, sin depender de servidores externos. En esta guía, aprenderás cómo crear una aplicación interactiva que analiza el sentimiento de un texto usando TensorFlow.js y el modelo pre-entrenado Universal Sentence Encoder.

Paso 1: Configuración del entorno

  1. Crea un nuevo proyecto de Node.js ejecutando el siguiente comando:
npm init -y

Esto generará el archivo package.json.

2. Instala las dependencias necesarias para este proyecto:

npm install @tensorflow/tfjs @tensorflow-models/universal-sentence-encoder --force

Usaremos la librería @tensorflow/tfjs para trabajar con TensorFlow en JavaScript y @tensorflow-models/universal-sentence-encoder como modelo pre-entrenado para procesar texto y generar embeddings.

Paso 2: Cargar el modelo Universal Sentence Encoder

El modelo Universal Sentence Encoder genera representaciones numéricas (embeddings) para oraciones. Vamos a cargar este modelo en nuestro proyecto.

Crea un archivo index.js y agrega el siguiente código:

import * as use from '@tensorflow-models/universal-sentence-encoder';

(async () => {
  const sentences = [
    'Me encanta el clima hoy.',
    'No me gusta nada este lugar.',
    'El café está delicioso.',
    'La película fue aburrida.',
  ];

  // Cargar el modelo pre-entrenado
  const model = await use.load();
  console.log('Modelo Universal Sentence Encoder cargado.');

  // Generar embeddings para las oraciones
  const embeddings = await model.embed(sentences);
  console.log('Embeddings generados:', embeddings.arraySync());
})();
  • Este código carga el modelo y genera embeddings (vectores numéricos) para una lista de oraciones.
  • Estos embeddings serán la base para analizar el sentimiento o clasificar el texto.

Paso 3: Clasificación de texto (simulada)

Como el modelo Universal Sentence Encoder no clasifica directamente el texto, crearemos una regla sencilla para simular el análisis de sentimiento utilizando los embeddings.

Actualiza tu index.js con el siguiente código:

async function classifyText(model, text) {
  const embeddings = await model.embed();
  const score = embeddings.arraySync()[0].reduce((sum, value) => sum + value, 0);

  // Simulación: Sentimiento positivo si el puntaje es mayor que 0
  return score > 0 ? 'positivo' : 'negativo';
}

(async () => {
  const sentences = [
    'Me encanta el clima hoy.',
    'No me gusta nada este lugar.',
    'El café está delicioso.',
    'La película fue aburrida.',
  ];

  const model = await use.load();
  console.log('Modelo cargado exitosamente.');

  for (const sentence of sentences) {
    const sentiment = await classifyText(model, sentence);
    console.log(`"${sentence}" es ${sentiment}.`);
  }
})();
"Me encanta el clima hoy." es positivo.
"No me gusta nada este lugar." es negativo.
"El café está delicioso." es positivo.
"La película fue aburrida." es negativo.

Paso 4: Integración en una aplicación web

Ahora integraremos el modelo en una aplicación web para que los usuarios puedan ingresar su propio texto y obtener una clasificación.

Creamos un archivo index.html con la siguiente estructura:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Clasificación de Sentimiento con TensorFlow.js</title>
  </head>
  <body>
    <h1>Análisis de Sentimiento</h1>
    <div>
      <textarea id="input-text" rows="4" cols="50" placeholder="Escribe aquí..."></textarea>
      <br />
      <button id="classify-button">Clasificar</button>
      <p>Resultado: <span id="result"></span></p>
    </div>

    <!-- Importar TensorFlow.js y Universal Sentence Encoder -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tf.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/[email protected]/dist/universal-sentence-encoder.min.js"></script>
    <script src="index.js"></script>
  </body>
</html>

Archivo JS: index.js

Este script conecta el HTML con el modelo de TensorFlow.js:

let model;

async function loadModel() {
  model = await use.load();
  console.log('Modelo cargado exitosamente.');
}

async function classifyText(text) {
  const embeddings = await model.embed();
  const score = embeddings.arraySync()[0].reduce((sum, value) => sum + value, 0);
  return score > 0 ? 'positivo' : 'negativo';
}

async function handleClassifyClick() {
  const inputText = document.getElementById('input-text').value;
  const resultElement = document.getElementById('result');

  if (!inputText) {
    resultElement.textContent = 'Por favor, ingresa un texto.';
    return;
  }

  const sentiment = await classifyText(inputText);
  resultElement.textContent = `Sentimiento: ${sentiment}`;
}

// Inicializar
loadModel();
document.getElementById('classify-button').addEventListener('click', handleClassifyClick);

Conclusión

En este artículo, aprendimos cómo usar TensorFlow.js y el modelo Universal Sentence Encoder para analizar y clasificar texto en una aplicación web.

Hemos visto:

  1. Cómo configurar el entorno y cargar el modelo.
  2. Cómo generar embeddings para el texto.
  3. Cómo integrar la funcionalidad en una aplicación interactiva que puede analizar el sentimiento de cualquier texto ingresado por el usuario.

Con esta base, puedes expandir el proyecto utilizando modelos más complejos o entrenando tus propios clasificadores. ¡El límite es tu imaginación!

pscode cover

Desarrollando una Aplicación de Generación de Código con Inteligencia Artificial

Desarrollando una Aplicación de Generación de Código con Inteligencia Artificial

La inteligencia artificial (IA) es un campo que ha avanzado a pasos agigantados en los últimos años, y su impacto se puede sentir en una variedad de aplicaciones y servicios.

En este artículo, quiero compartir una emocionante noticia con todos ustedes: he desarrollado una aplicación basada en Vue3 y Vuesax que utiliza la inteligencia artificial para generar código en múltiples lenguajes.

Lo mejor de todo es que es completamente gratuita y no almacena ningún dato personal.

Vue3 y Vuesax: Las Herramientas Clave

Para llevar a cabo este proyecto, he utilizado la última versión de VueJS (Vue3) y Vuesax como librería de componentes.

Estas herramientas me permitieron construir una interfaz de usuario elegante y funcional para nuestra aplicación de generación de código.

Vue3 es conocido por su facilidad de uso y flexibilidad, lo que lo convierte en una elección perfecta para proyectos de este tipo.

Por su parte, Vuesax proporciona una amplia gama de componentes predefinidos que facilitan la creación de una interfaz de usuario atractiva y receptiva.

Nuestra Fuente de Poder: Modelo «Phind/Phind-CodeLlama-34B-v2»

El corazón de la aplicación es el modelo de inteligencia artificial «Phind/Phind-CodeLlama-34B-v2«.

Este modelo ha sido puesto a disposición por la comunidad de desarrolladores en Hugging Face, un recurso valioso para la comunidad de IA.

Además, me gustaría reconocer a Meta la creación de este modelo, cuyo trabajo ha hecho posible que nuestra aplicación sea una realidad.

Generación de Texto y Código con Inteligencia Artificial

La generación de texto y código con modelos de inteligencia artificial es un campo en constante crecimiento.

Estos modelos son entrenados en enormes conjuntos de datos y pueden generar contenido de manera coherente y relevante en una variedad de lenguajes de programación.

La aplicación se basa en la capacidad de este modelo para comprender solicitudes de generación de código y proporcionar resultados precisos y útiles.

¡Pruébalo por Ti Mismo!

Si deseas experimentar con la aplicación de generación de código basada en IA, te invitamos a visitar https://ps-code.tecnops.es.

PS CODE

Espero que encuentres la herramienta útil y que te ayude a agilizar tus tareas de desarrollo de software.

Agradecimientos a la Comunidad

Quiero expresar mi más sincero agradecimiento a la comunidad de desarrolladores y entusiastas de la inteligencia artificial.

Los avances en este campo no serían posibles sin la colaboración y el espíritu de compartir conocimiento que caracterizan a esta comunidad.

También quiero agradecer a Hugging Face y Meta por proporcionar el modelo que ha hecho posible nuestra aplicación.

En resumen, la aplicación de generación de código es un emocionante ejemplo de cómo la inteligencia artificial puede ser aplicada para facilitar el trabajo de los desarrolladores.

Esperamos que la encuentres útil y que contribuya a tu productividad en el mundo del desarrollo de software.

¡Explora, experimenta y únete a nosotros en la emocionante era de la IA aplicada!

Descarga y Crea Contenido con Nuestra Aplicación Educativa

Descarga y Crea Contenido con Nuestra Aplicación Educativa

Introducción

En el mundo de la programación, aprender cómo funcionan diferentes bibliotecas y tecnologías puede ser una tarea desafiante pero emocionante.

Mi última creación es una aplicación educativa desarrollada utilizando JavaScript, Vue3 y Quasar 2, yt-converter y Stable Difussion, que permite obtener información de videos de YouTube, descargar audios y videos en varias calidades, y crear impresionantes imágenes. ¡Lo mejor de todo es que es totalmente gratuita!

Para acceder a ella y disfrutarla puedes acceder desde aquí.

Como funciona

La aplicación tiene un interface de usuario muy sencillo:

stable 1

Con la primera pestaña podemos obtener información sobre videos de YouTube.

Gracias al uso de la librería yt-converter, ahora puedes explorar este vasto universo de contenido directamente desde nuestra aplicación.

Una vez que ingreses la URL del video de YouTube que te interese, nuestra aplicación recuperará y mostrará toda la información relevante sobre ese video. ¿Te preguntas cuántas vistas tiene tu video favorito? ¿Quieres saber la duración exacta para programar tu tiempo? ¿O tal vez necesitas una breve descripción para compartir con tus amigos? Nuestra aplicación te proporcionará todos estos detalles y más, en una interfaz fácil de usar y elegante.

Pero eso no es todo. Sabemos que muchas veces deseas guardar contenido de YouTube para verlo más tarde sin conexión o compartirlo con otros. Por eso, hemos incorporado dos tablas llenas de enlaces para descargar el audio y el video de YouTube que has seleccionado. Puedes elegir entre diferentes calidades de audio y video según tus necesidades y preferencias. ¿Quieres escuchar ese discurso inspirador en alta calidad o simplemente necesitas un archivo de audio ligero para un rápido repaso? ¡Tú decides!

stable 2

Con la segunda pestaña, puedes desatar tu creatividad con Stable Difussion.

Sabemos lo importante que es para los educadores y estudiantes estimular su creatividad, por esta razón he integrado el uso de WebSocket y Stable Difussion para crear imágenes donde puedes dar rienda suelta a tu imaginación.

¿Cómo funciona? Es fácil. Solo ingresa el texto que deseas en el campo de texto y, con solo un clic, nuestra aplicación generará imágenes impresionantes utilizando Stable Difussion.

Observa cómo tus palabras cobran vida en forma de arte visual. Desde hermosos fondos para presentaciones hasta diseños gráficos para publicaciones en redes sociales, la aplicación te ofrece un sinfín de posibilidades creativas. ¡Es una experiencia verdaderamente mágica!

Conclusión

Entiendo lo importante que es tener acceso a herramientas educativas de calidad sin costo alguno, por eso la aplicación es gratis, sin publicidad, sin almacenar datos, nada de nada.

La aplicación fue desarrollada con fines educativos y de aprendizaje, y mi intención es mantenerla gratuita.

Yo siempre he pensado que el conocimiento y el aprendizaje deben ser accesibles para todos, y esta aplicación es mi pequeña forma de contribuir a esta causa.

Así que, ¿por qué no te sumerges en el emocionante mundo de nuestra aplicación educativa? Descarga videos y audios, explora tus intereses y crea imágenes únicas. ¡Todo esto mientras aprendes y te diviertes!

Recuerda, esta aplicación es una idea que se puede mejorar, lo que significa que siempre estoy abierto a sugerencias y contribuciones. Si tienes alguna idea para mejorarla o agregar nuevas características, ¡compártela con nosotros! Tu opinión es valiosa y nos ayudará a hacer crecer esta herramienta educativa.

Gracias por ser parte de esta emocionante aventura educativa. ¡Disfruta y diviértete mientras aprendes y exploras con nuestra aplicación gratuita y de código abierto!

upscale cover

Upscaler.js: Redimensionando imágenes usando Inteligencia Artificial

Que es Upscaler.js

Upscaler.js es una librería de JavaScript que permite escalar imágenes desde el navegador usando Javascript y/o en un servidor usando Node.

Esta librería esta creada usando redes neuronales que permiten un escalado de hasta 4 veces el tamaño original, es de código abierto, es de uso gratuito y ofrece múltiples modelos listos para usar.

Empezando a codificar

A continuación vamos a detallar los pasos a seguir para hacer uso de esta librería en Javascript desde el navegador, no obstante si necesitamos aprender mas sobre esta librería desde aquí podemos acceder a la documentación oficial.

  1. Para utilizar Upscaler.js, primero debemos incluir la librería en nuestro proyecto, y para ello puedes descargar Upscaler.js desde GitHub y añadirlo a tu proyecto, o instalarlo a través de NPM usando el siguiente comando:
    npm install upscaler
  2. El siguiente paso es añadir la librería en nuestro HTML usando por ejemplo el tag script:
    <script src="node_modules/upscaler.js/dist/upscaler.min.js"></script>
  3. Ahora ya tenemos listo nuestro proyecto para hacer uso de la librería, y para ello necesitamos primero crear una instancia de Upscaler.js y pasarle la imagen que deseamos escalar como argumento. Luego, podemos llamar a la función scale para escalar la imagen:
    <!DOCTYPE html>
    <html lang="es">
      <head>
        <title>Upscaler.js</title>
        <meta charset="utf-8">
        <meta name="description" content="description">
        <meta name="format-detection" content="telephone=no">
        <meta name="msapplication-tap-highlight" content="no">
        <script src="./node_modules/upscaler/dist/browser/umd/upscaler.min.js"></script>
      </head>
      <body>
        <img id="myImage" src="myImage.jpg" width="100" height="100">
        <script>
           const upscaler = new Upscaler();
           const myImage = document.getElementById('myImage');
           upscaler.scale(myImage, function(scaledImage) {
              myImage.src = scaledImage.toDataURL();
           });
        </script>
      </body>
    </html>

Para finalizar, Upscaler.js ofrece varias opciones de configuración que puede especificar al crear una instancia de la biblioteca, por ejemplo podríamos especificar la calidad de la imagen escalada, el tamaño máximo de la imagen escalada, etc…

<!DOCTYPE html>
<html lang="es">
   <head>
      <title>Upscaler.js</title>
      <meta charset="utf-8">
      <meta name="description" content="description">
      <meta name="format-detection" content="telephone=no">
      <meta name="msapplication-tap-highlight" content="no">
      <script src="./node_modules/upscaler/dist/browser/umd/upscaler.min.js"></script>
   </head>
   <body>
      <img id="myImage" src="myImage.jpg" width="100" height="100">
      <script>
         const upscaler = new Upscaler({ quality: 0.8, maxWidth: 500, maxHeight: 500 });
         const myImage = document.getElementById('myImage');
         upscaler.scale(myImage, function(scaledImage) {
            myImage.src = scaledImage.toDataURL();
         });
      </script>
   </body>
</html>

Con esto ya tendríamos nuestra aplicación para escalar imágenes usando Inteligencia Artificial, además si quieres probar como funciona y los resultado que ofrece la librería, desde aquí puedes acceder a la aplicación de ejemplo que he creado.

Tensorflow.js y otros servicios API de inteligencia artificial

Tensorflow y los servicios API de Inteligencia Artificial

En esta nueva entrada vamos a crear algún ejemplo usando Tensorflow.js y algunos de los servicios de Inteligencia Artificial que nos ofrecen algunas de las empresas mas punteras y potentes actualmente.

Para realizar las pruebas usaremos los siguientes servicios y librerías:

  • Tensorflow.js: Librería para Javascript que se ejecuta en nuestro navegador.
  • IBM Watson: Usando una parte de sus servicios enfocados a la Inteligencia Artificial.

En principio solo estoy añadiendo las librerías y/o servicios que he usado para realizar alguna POC.

El resto de los servicios que me gustaría probar como son Microsoft Azure, Google Cloud y Amazon, de momento no los vamos a usar, ya que o bien no tienen versiones de prueba o requieren pasar por caja previamente, cosa que de momento no vamos hacer.

Bien, como existen mas servicios y librerías vamos a continuar nuestras pruebas con otros servicios y/o librerías.

Tensorflow.js

Vamos a comenzar por Tensorflow.js, ya que no requiere de ningún registro previo para utilizar la librería permitiendo realizar todas las pruebas que queramos sin ningún límite.

Como en el tutorial anterior sentamos las bases para usar Tensorflow.js, ahora iremos al grano mostrando el código con el resultado para realizar las comparativas.

En cada sección mostrare solo el código correspondiente usado para cada librería y/o servicio, y al final del articulo mostrare el código completo de la aplicación y su enlace al repositorio en Github.

const tensorflowObjectDetection = msn => {
  ...
  const img = document.getElementById('imgPreview');
  mobilenet.load().then(model => {
    ...
    model.classify(img, totalClasses).then(predictions => {
      ...
      predictions.forEach((data, index) => {
        ...
      });
      container.appendChild(ul);
    });
  });
};

Como había comentado, en este trozo de código solo quiero mostrar lo simple que resulta usar los modelos pre-entrenados de Tensorflow, ya que al final esta el enlace a todo el código.

IBM Watson

Con este servicio podemos hacer entre otras muchas cosas, la clasificación de una imagen como hicimos en el ejemplo anterior.

El servicio ofrecido por IBM nos permite usar todas las características en su plan LITE pero con ciertas limitaciones.

Para realizar nuestra prueba, esas limitaciones no nos influyen.

El siguiente ejemplo lo voy a realizar en NodeJS, para lo cual tendremos que instalar la siguiente librería:

npm install ibm-watson@^5.2.1

Una vez instalada la dependencia, procederemos a usarla en nuestro código.

A continuación el código necesario en la parte de NodeJS para que funcione nuestro servicio:

...
const visualRecognition = new VisualRecognitionV3({
  version: '2018-03-19',
  authenticator: new IamAuthenticator({
    apikey: '{apiKey}',
  }),
  url: '{url}',
});
...
const classifyParams = {
  imagesFile: 'filename.jpg',
  owners: ['IBM', 'me'],
  threshold: 0.1,
};
...
visualRecognition.classify(classifyParams)
.then(response => {
  const classifiedImages = response.result;
  res.status(200).json(classifiedImages);
})
.catch(err => {
  res.status(400).json({ message: err });
  console.log('error:', err);
});
...

Y ahora el código para la parte de Javascript:

const IBMWatsonObjectDetection = () => {
  ...
  // Donde hemos levantado el servidor de NodeJS
  const url = new URL('https://localhost:3000/ibm-watson');
  ...
  fetch(url).then(response => response.json()).then(responseJson => {
    ...
    const { images } = responseJson;
    ...
  });
};

Es algo más de código pero realmente estamos dividiendo el trabajo, ya que en Javascript únicamente estamos pintado el resultado que nos devuelve el script de NodeJS.

Ahora el encargado de todo el trabajo es NodeJS mediante la librería de IBM Watson y su servicio.

En principio estas son las dos opciones que conozco y que puedo probar sin ningún coste directo asociado.

El resto de los servicios los he intentado probar, pero no he podido ver el resultado ya que me solicitan amablemente que realice el abono.

No obstante la cantidad de código necesario para ejecutar cualquiera de los otros servicios no llega a poco mas de 20 lineas.

Como había comentado al principio del artículo, voy a mostrar un pequeño vídeo ya que el servicio de IBM Watson tiene límites y una vez superados deja de funcionar.

Para finalizar el código lo puedes descargar desde su repositorio en Github.

Tensorflow para Javascript usando Tensorflow.js, ml5js y Processing (P5.js)

Empezando con Tensorflow.js, ml5js y Processing (P5.js)

En esta nueva entrada vamos a usar diferentes tecnologías para desarrollar algunos ejemplos muy curiosos y potentes.

Para unir todas estas tecnologías usaremos como punto de unión nuestro querido Javascript.

Antes de empezar con la magia es importante explicar que son y como se usan las diferentes herramientas que explicaremos durante este tutorial.

  • Tensorflow.jsEs una librería de Machine Learning (ML) para Javascript creada por Google.
  • Ml5jsEs una librería que nos proporciona acceso a los algoritmos y modelos de aprendizaje automático usando Javascript y como única dependencia tensorflow.js.
  • P5.jsEs otra librería de Javascript  extremadamente potente que nos permite realizar programación gráfica sin mucha complicación y esta basada en Processing.
  • ProcessingEs un software enfocado en la programación gráfica.

Tensorflow.js

Con esta potente librería para computación numérica podemos construir y entrenar redes neuronales que permiten detectar y descifrar patrones y correlaciones, análogos al aprendizaje y razonamiento usados por los humanos.

Para usarlo en Javascript podemos hacerlo de diferentes formas:

  • Usando el tag <script> en nuestra página.
    • <script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tf.min.js"></script>
  • Instalándolo desde NPM / YARN.
    • YARN
      yarn add @tensorflow/tfjs
      
      NPM
      npm install @tensorflow/tfjs
  • Usando NPM/ YARN pero esta vez para Node.js
    • Instalando TensorFlow.js con enlaces nativos de C ++
    • YARN
      yarn add @tensorflow/tfjs-node
      
      NPM
      npm install @tensorflow/tfjs-node
    • Solo para linux y si tienes una tarjeta gráfica NVIDIA GPU con soporte CUDA, puedes usar estas dependencias para un mayor rendimiento.
    • YARN
      yarn add @tensorflow/tfjs-node-gpu
      
      NPM
      npm install @tensorflow/tfjs-node-gpu
    • Instalando la versión para Javascript, que es la opción más lenta en cuanto a rendimiento.
    • YARN
      yarn add @tensorflow/tfjs
      
      NPM
      npm install @tensorflow/tfjs

Si necesitas saber más de Tensorflow.js, en esta guía oficial de Tensorflow.js tienes toda la información necesaria para practicar y profundizar sobre esta impresionante librería.

Para nuestro tutorial usare los modelos pre-entrenados que nos ofrecen desde Tensorflow.

En el siguiente ejemplo usaremos Mobilenet, pero…., ¿que es Mobilenet?

Mobilenet son modelos pequeños, de baja latencia y baja potencia parametrizados para cumplir con las limitaciones de recursos de una variedad de casos de uso, pudiendo realizar la clasificación, detección, incrustaciones y segmentación de forma similar a cómo se utilizan otros modelos populares a gran escala.

La ventaja de usar este modelo de TensorFlow.js es que no requiere que sepas sobre el aprendizaje automático, pudiendo tomar como entrada cualquier tag de imagen basado en el navegador (img, video, canvas) y esta devuelve una serie de predicciones más probables y sus confidencias.

El código fuente esta disponible en Github, no obstante también lo añado en la entrada para un copy/paste rápido.

<!-- index.html -->
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Clasificación de imágenes</title>
  <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet">
  <link href="./style.css" rel="stylesheet">
</head>
<body>
  <h1>Clasificación de imágenes usando <b>Tensorflow.js</b> y <b>Mobilenet</b></h1>
  <div>
    <label for="image">Seleccionar una imagen</label>
    <input type="file" id="image" accept=".gif,.jpg,.jpeg,.png">
    <label for="classify" onclick="classify()" class="lock">Clasificar la imagen</label>
  </div>
  <img id="imgPreview" class="hide" />
  <div id="result"></div>
  <div class="loading hide">
    <div class="lds-ripple">
      <div></div>
      <div></div>
    </div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]"></script>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/[email protected]"></script>
  <script src="./index.js"></script>
</body>
</html>
/* style.css */
body {
  font-family: 'Montserrat', sans-serif;
}
#imgPreview {
  box-shadow: 0px 5px 10px rgba(0,0,0,0.4);
  padding: 20px;
  margin-top: 20px;
}
input[type="file"]#image {
  width: 0.1px;
  height: 0.1px;
  opacity: 0;
  overflow: hidden;
  position: absolute;
  z-index: -1;
}
label {
  font-size: 14px;
  font-weight: 600;
  color: #ffffff;
  background-color: #106BA0;
  box-shadow: 0px 3px 6px rgba(0,0,0,0.3);
  display: inline-block;
  transition: all .5s;
  cursor: pointer;
  padding: 15px 40px;
  text-transform: uppercase;
  width: fit-content;
  text-align: center;
}
.lock {
  pointer-events: none;
  opacity: 0.3;
}
.hide {
  display: none;
}
.lds-ripple {
  display: inline-block;
  position: absolute;
  width: 80px;
  height: 80px;
  left: calc(50% - 40px);
  top: calc(50% - 40px);
}
.lds-ripple div {
  position: absolute;
  border: 4px solid #e90202;
  opacity: 1;
  border-radius: 50%;
  animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite;
}
.lds-ripple div:nth-child(2) {
  animation-delay: -0.5s;
}
@keyframes lds-ripple {
  0% {
    top: 36px;
    left: 36px;
    width: 0;
    height: 0;
    opacity: 1;
  }
  100% {
    top: 0px;
    left: 0px;
    width: 72px;
    height: 72px;
    opacity: 0;
  }
}
.loading {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  opacity: 0.7;
  background: #cccccc;
}
// index.js
const init = () => {
  document.querySelector("#image").onchange = evt => {
    let reader = new FileReader();
    reader.readAsDataURL(evt.target.files[0]);
    reader.onload = () => {
      const img = document.querySelector('#imgPreview');
      const container = document.querySelector('#result');
      img.setAttribute('src', reader.result);
      img.classList.remove('hide');
      document.querySelector('label[for="classify"]').classList.remove('lock');
      container.innerHTML = '';
    };
  }
};

const classify = () => {
  const loading = document.querySelector('.loading');
  loading.classList.remove('hide');
  const img = document.querySelector('#imgPreview');
  mobilenet.load().then(model => {
    model.classify(img).then(predictions => {
      const body = document.body;
      const container = document.querySelector('#result');
      container.innerHTML = '';
      predictions.forEach(data => {
        const porcent = parseFloat(data.probability * 100).toFixed(2);
        const progress = document.createElement('progress');
        const label = document.createElement('div');
        const info = document.createElement('span');
        label.innerHTML = `<b>Elemento reconocidos:</b> <i>${data.className}</i>`;
        progress.setAttribute('max', 100);
        progress.setAttribute('value', porcent);
        info.innerHTML = ` <b>${porcent}%</b>`;
        container.classList.add('result');
        container.appendChild(label);
        container.appendChild(progress);
        container.appendChild(info);
      });
      body.appendChild(container);
      loading.classList.add('hide');
    });
  });
};

window.onload = init();

Me gustaría seguir profundizando un poco más en el uso de Tensorflow.js, no solo para clasificar imágenes, ya que podríamos hacerlo también sobre videos, detectar objetos, detectar la segmentación de personas, estimación de posiciones, etc…, pero debemos continuar con el resto de las herramientas.

Ml5.js

Como habíamos comentado al principio, ml5.js es una interfaz de alto nivel, muy simple, de código abierto para TensorFlow.js, que nos permite manejar operaciones matemáticas aceleradas por GPU y gestión de memoria para algoritmos de aprendizaje automático.

Viendo el código anterior y lo que se puede conseguir, podríamos pensar que no se puede hacer mas fácil, pero si se puede hacer todavía mas sencillo y sobre todo más potente.

Para empezar usaremos el tag script para acceder al CDN de la librería y poder hacer uso de ella.

<script src="https://unpkg.com/[email protected]/dist/ml5.min.js"></script>

Igual que en el ejemplo de Tensorflow.js, podéis acceder también a su repositorio en Github.

No obstante añadiré el código en el tutorial para un acceso mas rápido.

<!-- index.html -->
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Ml5.js y P5.js</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/addons/p5.dom.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/addons/p5.sound.min.js"></script>
  <script src="https://unpkg.com/[email protected]/dist/ml5.min.js"></script>
  <link rel="stylesheet" href="./style.css" />
</head>
<body>
  <div class="loading hide">
    Analizando imagen
  </div>
  <script src="./index.js"></script>
</body>
</html>
/* style.css */
.loading {
  position: absolute;
  left: calc(50% - 100px);
  top: calc(50% - 10px);
  width: 200px;
  text-align: center;
  background: #6677aa;
  padding: 20px 0px;
  border-radius: 100px;
  font-size: 20px;
  color: #ffffff;
}
.hide {
  display: none;
}
.result {
  padding: 10px;
  box-shadow: 0px 6px 12px rgba(0,0,0,0.3);
  margin-top: 20px;
  width: 500px;
}
canvas {
  box-shadow: 0px 6px 12px rgba(0,0,0,0.3);
  margin-bottom: 20px;
}
// index.js
let mobilenet;
let img;
window.onerror = (errorMsg, url, lineNumber) => {
  console.log('----- ERROR ------');
  console.log(errorMsg, url, lineNumber);
  console.log('------------------');
  return false;
}

const show = (el, status) => {
  document.querySelector(el).classList[status ? 'remove' : 'add']('hide');
};

function modelReady() {
  console.log('model is ready!!');
}

function gotResult(error, results) {
  show('.loading', false);
  if (error) {
    console.error(error);
  } else {
    console.log(results);
    const body = document.body;
    const container = document.createElement('div');
    results.forEach(data => {
      const porcent = nf(data.confidence, 0, 4) * 100;
      const progress = document.createElement('progress');
      const label = document.createElement('div');
      const info = document.createElement('span');
      label.innerHTML = `Elemento reconocidos: ${data.label}`;
      progress.setAttribute('max', 100);
      progress.setAttribute('value', porcent);
      info.innerHTML = ` ${porcent}%`;
      container.classList.add('result');
      container.appendChild(label);
      container.appendChild(progress);
      container.appendChild(info);
    });
    body.appendChild(container);
  }
}
window.onload = () => {
  show('.loading', true);
}
function imageReady() {
  image(img,0,0 , width, height);
  mobilenet.predict(img, gotResult);
}
function preload() {
  classifier = ml5.imageClassifier('MobileNet');
  img = loadImage('img1.jpg');
}

function setup() {
  createCanvas(640, 480);
  img = createImg('img1.jpg', imageReady);
  img.hide();
  background(0);
  mobilenet = ml5.imageClassifier('MobileNet',modelReady);
}

Si comparáis el código y el resultado, ambos realizan la misma acción, clasificar una imagen.

La diferencia esta en que usando la librería ml5.js podemos hacer uso de la GPU, y usando p5.js podemos crear canvas y realizar una programación gráfica mucho mas rápida ya que no tenemos que complicarnos con el canvas y como pintar en el, que aunque para este ejemplo es muy simple para otros puede ser algo más doloroso.

Como he dicho en el punto anterior, me gustaría continuar profundizando pero debemos continuar con la última herramienta.

Processing (p5.js)

Processing es un software que nos permite programar de una forma muy simple pero obteniendo unos resultado bastante buenos.

Esto suena maravilloso pero como siempre digo, «el movimiento se demuestra andando».

 

Puedes encontrar el código en Github y para un acceso rápido añado también el código en la página.

<!-- index.html -->
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Processing P5.JS</title>
</head>
<body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.min.js"></script>
  <script src="./index.js"></script>
</body>
</html>
// index.js
function setup() {
  createCanvas(710, 400, WEBGL);
}

function draw() {
  background(0);

  translate(-240, -100, 0);
  normalMaterial();
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  plane(70);
  pop();

  translate(240, 0, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  box(70, 70, 70);
  pop();

  translate(240, 0, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  cylinder(70, 70);
  pop();

  translate(-240 * 2, 200, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  cone(70, 70);
  pop();

  translate(240, 0, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  torus(70, 20);
  pop();

  translate(240, 0, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  sphere(70);
  pop();
}

Como has podido comprobar el resultado es muy llamativo, pero lo mas llamativo son las pocas lineas de código que han sido necesarias para generar este ejemplo.

Con Processing (P5.js) damos por finalizado este pequeño tutorial de Tensorflow.js, no obstante en breve intentare publicar otra entrada con mas detalle sobre sobre Tensorflow.js y el ecosistema que ofrece.