Quiero hacer un clasificador de imágenes, pero no sé python. Tensorflow.js funciona con javascript, con el que estoy familiarizado. ¿Pueden los modelos entrenarse con él y cuáles serían los pasos para hacerlo? Francamente, no tengo idea de por dónde empezar.
Lo único que descubrí es cómo cargar "mobilenet", que aparentemente es un conjunto de modelos previamente entrenados, y clasificar imágenes con él:
const tf = require('@tensorflow/tfjs'),
mobilenet = require('@tensorflow-models/mobilenet'),
tfnode = require('@tensorflow/tfjs-node'),
fs = require('fs-extra');
const imageBuffer = await fs.readFile(......),
tfimage = tfnode.node.decodeImage(imageBuffer),
mobilenetModel = await mobilenet.load();
const results = await mobilenetModel.classify(tfimage);
lo que funciona, pero no me sirve porque quiero entrenar mi propio modelo usando mis imágenes con etiquetas que creo.
=======================
Digamos que tengo un montón de imágenes y etiquetas. ¿Cómo los uso para entrenar a una modelo?
const myData = JSON.parse(await fs.readFile('files.json'));
for(const data of myData){
const image = await fs.readFile(data.imagePath),
labels = data.labels;
// how to train, where to pass image and labels ?
}
fit
método, o en el conjunto de datos pasadofitDataset
, como se muestra en los ejemplos.Respuestas:
En primer lugar, las imágenes deben convertirse en tensores. El primer enfoque sería crear un tensor que contenga todas las características (respectivamente, un tensor que contenga todas las etiquetas). Este debería ser el camino a seguir solo si el conjunto de datos contiene pocas imágenes.
Las etiquetas serían una matriz que indica el tipo de cada imagen.
Ahora se necesita crear una codificación activa de las etiquetas.
Una vez que están los tensores, sería necesario crear el modelo para el entrenamiento. Aquí hay un modelo simple.
Entonces el modelo puede ser entrenado
Si el conjunto de datos contiene muchas imágenes, sería necesario crear un conjunto de datos tf. Esta respuesta discute por qué.
Y usar
model.fitDataset(ds)
para entrenar al modeloLo anterior es para entrenar en nodejs. Para realizar dicho procesamiento en el navegador,
genFeatureTensor
puede escribirse de la siguiente manera:Una advertencia es que realizar un procesamiento pesado podría bloquear el hilo principal en el navegador. Aquí es donde los trabajadores web entran en juego.
fuente
tf.image.resizeBilinear
Considere el ejemplo https://codelabs.developers.google.com/codelabs/tfjs-training-classfication/#0
Lo que hacen es:
luego entrenar
La construcción del conjunto de datos es la siguiente:
La imagen grande se divide en n trozos verticales. (n siendo trozo)
Considere un trozo Tamaño del tamaño 2.
Dada la matriz de píxeles de la imagen 1:
Dada la matriz de píxeles de la imagen 2 es
La matriz resultante sería
1 2 3 4 5 6 7 8 9 1 2 3
(la concatenación 1D de alguna manera)Básicamente, al final del procesamiento, tiene un gran búfer que representa
[...Buffer(image1), ...Buffer(image2), ...Buffer(image3)]
Ese tipo de formato se hace mucho para problemas de clasificación. En lugar de clasificar con un número, toman una matriz booleana. Para predecir 7 de cada 10 clases, consideraríamos
[0,0,0,0,0,0,0,1,0,0] // 1 in 7e position, array 0-indexed
Lo que puedes hacer para comenzar
A continuación, subclase
MNistData::load
(el resto se puede dejar como está (excepto en script.js donde necesita crear una instancia de su propia clase)Todavía genero imágenes de 28x28, escribo un dígito en él y obtengo una precisión perfecta ya que no incluyo ruido o etiquetado incorrecto voluntariamente.
fuente
Encontré un tutorial [1] sobre cómo usar el modelo existente para entrenar nuevas clases. Principales partes del código aquí:
cabeza index.html:
cuerpo index.html:
index.js:
La idea principal es utilizar la red existente para hacer su predicción y luego sustituir la etiqueta encontrada con la suya.
El código completo está en el tutorial. Otro prometedor, más avanzado en [2]. Necesita un procesamiento previo estricto, por lo que lo dejo solo aquí, quiero decir que es mucho más avanzado.
Fuentes:
[1] https://codelabs.developers.google.com/codelabs/tensorflowjs-teachablemachine-codelab/index.html#6
[2] https://towardsdatascience.com/training-custom-image-classification-model-on-the-browser-with-tensorflow-js-and-angular-f1796ed24934
fuente
TL; DR
MNIST es el reconocimiento de imágenes Hello World. Después de aprenderlo de memoria, estas preguntas en su mente son fáciles de resolver.
Configuración de preguntas:
Su pregunta principal escrita es
dentro de su bloque de código. Para aquellos que encontré la respuesta perfecta de ejemplos de la sección de ejemplos de Tensorflow.js: ejemplo de MNIST. Mis enlaces a continuación tienen versiones de javascript y node.js puras y explicaciones de Wikipedia. Los examinaré en el nivel necesario para responder la pregunta principal en su mente y agregaré también perspectivas sobre cómo sus propias imágenes y etiquetas tienen algo que ver con el conjunto de imágenes MNIST y los ejemplos que lo usan.
Lo primero es lo primero:
Fragmentos de código.
dónde pasar las imágenes (muestra de Node.js)
Notas:
El conjunto de datos MNIST es una imagen enorme, donde en un archivo hay varias imágenes como mosaicos en rompecabezas, todas y cada una con el mismo tamaño, una al lado de la otra, como cuadros en la tabla de coordinación x e y. Cada cuadro tiene una muestra y las correspondientes xey en la matriz de etiquetas tienen la etiqueta. A partir de este ejemplo, no es un gran problema convertirlo a varios formatos de archivo, por lo que en realidad solo se le da una imagen a la vez al ciclo while para manejar.
Etiquetas:
Notas:
Aquí, las etiquetas también son datos de bytes en un archivo. En el mundo Javascript, y con el enfoque que tiene en su punto de partida, las etiquetas también podrían ser una matriz json.
entrenar al modelo:
Notas:
Aquí
model.fit
está la línea de código real que hace la cosa: entrena el modelo.Resultados de todo el asunto:
Nota:
En Data Science, también esta vez aquí, la parte más fascinante es saber qué tan bien el modelo sobrevive a la prueba de nuevos datos y sin etiquetas, ¿puede etiquetarlos o no? Para eso es la parte de evaluación que ahora nos imprime algunos números.
Pérdida y precisión: [4]
..
Más información:
En las páginas de github, en el archivo README.md, hay un enlace al tutorial, donde todo en el ejemplo de github se explica con mayor detalle.
[1] https://github.com/tensorflow/tfjs-examples/tree/master/mnist
[2] https://github.com/tensorflow/tfjs-examples/tree/master/mnist-node
[3] https://en.wikipedia.org/wiki/MNIST_database
[4] Cómo interpretar "pérdida" y "precisión" para un modelo de aprendizaje automático
fuente