Je veux faire un classificateur d'images, mais je ne connais pas python. Tensorflow.js fonctionne avec javascript, que je connais bien. Les modèles peuvent-ils être formés avec elle et quelles seraient les étapes pour le faire? Franchement, je n'ai aucune idée par où commencer.
La seule chose que j'ai trouvée est de savoir comment charger "mobilenet", qui est apparemment un ensemble de modèles pré-formés, et classer les images avec:
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);
ce qui fonctionne, mais cela ne me sert à rien car je veux former mon propre modèle en utilisant mes images avec des étiquettes que je crée.
=======================
Disons que j'ai un tas d'images et d'étiquettes. Comment les utiliser pour former un modèle?
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éthode, ou dans l'ensemble de données transmisfitDataset
, comme indiqué dans les exemples.Réponses:
Tout d'abord, les images doivent être converties en tenseurs. La première approche serait de créer un tenseur contenant toutes les entités (respectivement un tenseur contenant toutes les étiquettes). Cela ne devrait être le cas que si l'ensemble de données contient peu d'images.
Les étiquettes seraient un tableau indiquant le type de chaque image
Il faut maintenant créer un encodage à chaud des étiquettes
Une fois qu'il y a les tenseurs, il faudrait créer le modèle de formation. Voici un modèle simple.
Ensuite, le modèle peut être formé
Si l'ensemble de données contient beaucoup d'images, il faudrait plutôt créer un tfDataset. Cette réponse explique pourquoi.
Et utiliser
model.fitDataset(ds)
pour former le modèleCe qui précède est pour la formation dans nodejs. Pour effectuer un tel traitement dans le navigateur,
genFeatureTensor
peut être écrit comme suit:Une mise en garde est que faire un traitement lourd peut bloquer le thread principal dans le navigateur. C'est là que les travailleurs du Web entrent en jeu.
la source
tf.image.resizeBilinear
Prenons l'exemple https://codelabs.developers.google.com/codelabs/tfjs-training-classfication/#0
Ce qu'ils font c'est:
puis train
La construction de l'ensemble de données est la suivante:
La grande image est divisée en n morceaux verticaux. (n étant chunkSize)
Prenons un morceau de taille 2.
Étant donné la matrice de pixels de l'image 1:
Étant donné la matrice de pixels de l'image 2 est
Le tableau résultant serait
1 2 3 4 5 6 7 8 9 1 2 3
(la concaténation 1D en quelque sorte)Donc, fondamentalement, à la fin du traitement, vous avez un grand tampon représentant
[...Buffer(image1), ...Buffer(image2), ...Buffer(image3)]
Ce type de mise en forme se fait beaucoup pour les problèmes de classification. Au lieu de classer avec un nombre, ils prennent un tableau booléen. Pour prévoir 7 classes sur 10, nous considérerions
[0,0,0,0,0,0,0,1,0,0] // 1 in 7e position, array 0-indexed
Ce que vous pouvez faire pour commencer
Ci-dessous, je sous-classe
MNistData::load
(le reste peut être laissé tel quel (sauf dans script.js où vous devez plutôt instancier votre propre classe)Je génère toujours des images 28x28, j'écris un chiffre dessus et j'obtiens une précision parfaite car je n'inclus pas de bruit ou d'étiquettes volontairement erronées.
la source
J'ai trouvé un tutoriel [1] sur la façon d'utiliser le modèle existant pour former de nouvelles classes. Principales parties du code ici:
tête index.html:
index.html corps:
index.js:
L'idée principale est d'utiliser le réseau existant pour faire sa prédiction, puis de remplacer l'étiquette trouvée par la vôtre.
Le code complet est dans le tutoriel. Un autre prometteur, plus avancé dans [2]. Il a besoin d'un prétraitement strict, donc je ne le laisse qu'ici, je veux dire qu'il est beaucoup plus avancé.
Sources:
[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
la source
TL; DR
MNIST est la reconnaissance d'image Hello World. Après l'avoir appris par cœur, ces questions dans votre esprit sont faciles à résoudre.
Réglage de la question:
Votre principale question écrite est
à l'intérieur de votre bloc de code. Pour ceux que j'ai trouvé la réponse parfaite à partir d'exemples de la section d'exemples Tensorflow.js: exemple MNIST. Mes liens ci-dessous contiennent des versions javascript et node.js et une explication Wikipedia. Je vais les parcourir au niveau nécessaire pour répondre à la question principale dans votre esprit et j'ajouterai également des perspectives sur la façon dont vos propres images et étiquettes ont quelque chose à voir avec l'ensemble d'images MNIST et les exemples qui l'utilisent.
Tout d'abord:
Extraits de code.
où passer les images (exemple Node.js)
Remarques:
Le jeu de données MNIST est une image énorme, où dans un fichier il y a plusieurs images comme des tuiles dans un puzzle, chacune avec la même taille, côte à côte, comme des boîtes dans la table de coordination x et y. Chaque boîte a un échantillon et x et y correspondants dans le tableau des étiquettes ont l'étiquette. Dans cet exemple, il n'est pas très important de le transformer en plusieurs fichiers, de sorte qu'en fait, une seule image à la fois est donnée à la boucle while à gérer.
Étiquettes:
Remarques:
Ici, les étiquettes sont également des données d'octets dans un fichier. Dans le monde Javascript, et avec l'approche que vous avez dans votre point de départ, les étiquettes pourraient également être un tableau json.
former le modèle:
Remarques:
Voici
model.fit
la véritable ligne de code qui fait la chose: entraîne le modèle.Résultats de l'ensemble:
Remarque:
En Data Science, également cette fois-ci, la partie la plus intéressante est de savoir dans quelle mesure le modèle survit au test de nouvelles données et sans étiquettes, peut-il les étiqueter ou non? Car c'est la partie évaluation qui nous imprime maintenant quelques chiffres.
Perte et précision: [4]
..
Plus d'information:
Dans les pages github, dans le fichier README.md, il y a un lien vers le tutoriel, où tout dans l'exemple github est expliqué plus en détail.
[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] Comment interpréter la "perte" et la "précision" pour un modèle d'apprentissage automatique
la source