Învățare automată în Node.js cu TensorFlow.js

Blog

Învățare automată în Node.js cu TensorFlow.js

Învățarea automată în Node.js cu TensorFlow.js - TensorFlow.js este o nouă versiune a popularei biblioteci open-source care aduce învățarea profundă în JavaScript. Dezvoltatorii pot defini, instrui și rula acum modele de învățare automată utilizând biblioteca de nivel înalt API.

Modele pre-antrenate înseamnă că dezvoltatorii pot efectua acum cu ușurință sarcini complexe precum recunoașterea vizuală , generând muzică sau detectarea ipostazelor umane cu doar câteva linii de JavaScript.

După ce a început ca o bibliotecă front-end pentru browserele web, s-au adăugat actualizări recente sprijin experimental pentru Node.js. Acest lucru permite ca TensorFlow.js să fie utilizat în aplicații JavaScript backend fără a fi nevoie să utilizați Python.

Citind despre bibliotecă, am vrut să o testez cu o sarcină simplă ... 🧐

Utilizați TensorFlow.js pentru a efectua recunoașterea vizuală a imaginilor folosind JavaScript de la Node.js
Din păcate, majoritatea documentație și exemplu de cod cu condiția să utilizeze biblioteca într-un browser. Utilități de proiect furnizate pentru a simplifica încărcarea și utilizarea modelelor pre-antrenate nu au fost încă extinse cu suportul Node.js. Funcționarea acestui lucru a sfârșit prin faptul că am petrecut mult timp citind fișierele sursă Typescript pentru bibliotecă.

Cu toate acestea, după câteva zile de hacking, am reușit să obțin aceasta s-a finalizat ! Ura! 🤩

Înainte de a ne arunca cu capul în cod, să începem cu o prezentare generală a diferitelor biblioteci TensorFlow.

TensorFlow

TensorFlow este o bibliotecă software open-source pentru aplicații de învățare automată. TensorFlow poate fi utilizat pentru a implementa rețele neuronale și alți algoritmi de învățare profundă.

terra (portofel lunar)

Lansat de Google în noiembrie 2015, TensorFlow a fost inițial un Biblioteca Python . Acesta a folosit calcule bazate pe CPU sau GPU pentru instruirea și evaluarea modelelor de învățare automată. Biblioteca a fost inițial concepută pentru a rula pe servere de înaltă performanță cu GPU-uri scumpe.

Actualizările recente au extins software-ul pentru a rula în medii cu resurse limitate, cum ar fi dispozitivele mobile și browserele web.

TensorFlow Lite

Tensorflow Lite , o versiune ușoară a bibliotecii pentru dispozitive mobile și încorporate, a fost lansată în mai 2017. Aceasta a fost însoțită de o nouă serie de modele de învățare profundă pre-instruite pentru sarcini de recunoaștere a vederii, numite MobileNet . Modelele MobileNet au fost concepute pentru a funcționa eficient în medii cu resurse limitate, cum ar fi dispozitivele mobile.

TensorFlow.js

După Tensorflow Lite, TensorFlow.js a fost anunțat în martie 2018. Această versiune a bibliotecii a fost concepută pentru a rula în browser, bazându-se pe un proiect anterior numit deeplearn.js . WebGL oferă acces GPU la bibliotecă. Dezvoltatorii folosesc un API JavaScript pentru a instrui, încărca și rula modele.

TensorFlow.js a fost recent extins pentru a rula pe Node.js, folosind un biblioteca de extensii numit tfjs-node.

Extensia Node.js este o versiune alfa și este încă în curs de dezvoltare activă.

Importul modelelor existente în TensorFlow.js

Modelele existente TensorFlow și Keras pot fi executate folosind biblioteca TensorFlow.js. Modelele trebuie convertite într-un format nou folosind acest instrument înainte de executare. Sunt modele pre-instruite și convertite pentru clasificarea imaginilor, detectarea pozelor și k-cei mai apropiați vecini disponibil pe Github .

Utilizarea TensorFlow.js în Node.js

Instalarea bibliotecilor TensorFlow

TensorFlow.js poate fi instalat din Registrul NPM .

npm install @tensorflow/tfjs @tensorflow/tfjs-node // or... npm install @tensorflow/tfjs @tensorflow/tfjs-node-gpu

Ambele extensii Node.js folosesc dependențe native care vor fi compilate la cerere.

Se încarcă bibliotecile TensorFlow

TensorFlow’s API JavaScript este expus din biblioteca de bază. Modulele de extensie pentru a activa suportul Node.js nu expun API-uri suplimentare.

const tf = require('@tensorflow/tfjs') // Load the binding (CPU computation) require('@tensorflow/tfjs-node') // Or load the binding (GPU computation) require('@tensorflow/tfjs-node-gpu')

Se încarcă modelele TensorFlow

TensorFlow.js oferă un Biblioteca NPM (modele tfjs) pentru a facilita încărcarea modelelor pre-antrenate și convertite pentru clasificarea imaginii , detectarea pozelor și k-cei mai apropiați vecini .

The Modelul MobileNet folosit pentru clasificarea imaginilor este o rețea neuronală profundă pregătită pentru identificați 1000 de clase diferite .

În README al proiectului, urmând exemplul de cod este folosit pentru a încărca modelul.

import * as mobilenet from '@tensorflow-models/mobilenet'; // Load the model. const model = await mobilenet.load();

Una dintre primele provocări pe care le-am întâmpinat a fost că acest lucru nu funcționează pe Node.js.

Error: browserHTTPRequest is not supported outside the web browser.

Privind la cod sursa , biblioteca mobilenet este un înveliș în jurul clasei de bază tf.Model. Când se apelează metoda load (), descarcă automat fișierele de model corecte de pe o adresă HTTP externă și instanțiază modelul TensorFlow.

Extensia Node.js nu acceptă încă solicitări HTTP pentru recuperarea dinamică a modelelor. În schimb, modelele trebuie încărcate manual din sistemul de fișiere.

tic tac toe html

După ce am citit codul sursă pentru bibliotecă, am reușit să creez un work-around ...

Încărcarea modelelor dintr-un sistem de fișiere

În loc să apeleze metoda de încărcare a modulului, dacă clasa MobileNet este creată manual, variabila de cale generată automat care conține adresa HTTP a modelului poate fi suprascrisă cu o cale de sistem de fișiere locală. După ce ați făcut acest lucru, apelarea metodei de încărcare pe instanța clasei va declanșa clasa încărcătorului sistemului de fișiere , mai degrabă decât să încercați să utilizați încărcătorul HTTP bazat pe browser.

const path = 'mobilenet/model.json' const mn = new mobilenet.MobileNet(1, 1); mn.path = `file://${path}` await mn.load()

Minunat, funcționează!

Dar de unde provin fișierele de modele?

Modele MobileNet

Modelele pentru TensorFlow.js constau din două tipuri de fișiere, un fișier de configurare a modelului stocat în JSON și ponderile modelului într-un format binar. Greutățile modelului sunt adesea împărțite în mai multe fișiere pentru o mai bună stocare în cache de către browsere.

Privind la cod de încărcare automată pentru modelele MobileNet, configurația modelelor și cioburile de greutate sunt preluate dintr-o găleată de stocare publică la această adresă.

git flow vs github flow
https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v${version}_${alpha}_${size}/

Parametrii șablonului din adresa URL se referă la versiunile modelului listate Aici . Rezultatele preciziei clasificării pentru fiecare versiune sunt, de asemenea, afișate pe pagina respectivă.

In conformitate cu cod sursa , numai modelele MobileNet v1 pot fi încărcate folosind biblioteca tensorflow-models / mobilenet.

Codul de recuperare HTTP încarcă fișierul model.json din această locație și apoi preluează recursiv toate fragmentele de greutate ale modelului de referință. Aceste fișiere sunt în formatul groupX-shard1of1.

Descărcarea manuală a modelelor

Salvarea tuturor fișierelor model într-un sistem de fișiere poate fi realizată prin recuperarea fișierului de configurare a modelului, analizarea fișierelor de referință de greutate și descărcarea manuală a fiecărui fișier de greutate.

Vreau să folosesc modulul MobileNet V1 cu valoarea 1.0 alfa și dimensiunea imaginii de 224 pixeli. Acest lucru îmi dă următoarea adresă URL pentru fișierul de configurare a modelului.

https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/model.json

Odată ce acest fișier a fost descărcat local, pot folosi fișierul instrument jq pentru a analiza toate numele fișierelor de greutate.

$ cat model.json | jq -r '.weightsManifest[].paths[0]' group1-shard1of1 group2-shard1of1 group3-shard1of1 ...

Folosind instrumentul sed, pot prefixa aceste nume cu adresa URL HTTP pentru a genera adrese URL pentru fiecare fișier de greutate.

$ cat model.json | jq -r '.weightsManifest[].paths[0]' | sed 's/^/https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224//' https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/group1-shard1of1 https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/group2-shard1of1 https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/group3-shard1of1 ...

Folosind comenzile paralel și curl, pot descărca toate aceste fișiere în directorul meu local.

cat model.json | jq -r '.weightsManifest[].paths[0]' | sed 's/^/https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224//' | parallel curl -O

Clasificarea imaginilor

Acest exemplu de cod este furnizat de TensorFlow.js pentru a demonstra returnarea clasificărilor pentru o imagine.

const img = document.getElementById('img'); // Classify the image. const predictions = await model.classify(img);

Acest lucru nu funcționează pe Node.js din cauza lipsei unui DOM.

Clasificați metodă acceptă numeroase elemente DOM (pânză, video, imagine) și va prelua și converti automat octeții de imagine din aceste elemente într-un clasa tf.Tensor3D care este folosit ca intrare la model. Alternativ, intrarea tf.Tensor3D poate fi transmisă direct.

În loc să încerc să folosesc un pachet extern pentru a simula un element DOM în Node.js, am găsit mai ușor să construiesc manual tf.Tensor3D.

Generarea Tensor3D dintr-o imagine

Citind cod sursa pentru metoda utilizată pentru a transforma elementele DOM în clase Tensor3D, următorii parametri de intrare sunt utilizați pentru a genera clasa Tensor3D.

const values = new Int32Array(image.height * image.width * numChannels); // fill pixels with pixel channel bytes from image const outShape = [image.height, image.width, numChannels]; const input = tf.tensor3d(values, outShape, 'int32');

pixeli este o matrice 2D de tip (Int32Array) care conține o listă secvențială a valorilor canalelor pentru fiecare pixel. numChannels este numărul de valori ale canalului pe pixel.

Crearea valorilor de intrare pentru.jpeg '> biblioteca jpeg-js este un model javascript.jpeg pur> MobileNet fiind utilizat clasifică imaginile cu lățimea și înălțimea de 224 pixeli. Tensorii de intrare trebuie să conțină valori flotante, între -1 și 1, pentru fiecare dintre cele trei canale ale pixelilor.

Valorile de intrare pentru imaginile cu dimensiuni diferite trebuie redimensionate înainte de clasificare. În plus, valorile pixelilor din.jpeg '> se ocupă automat această problemă!

Dezvoltatorii pot transmite intrări Tensor3D de tip int32 și dimensiuni diferite la metoda de clasificare și convertește intrarea în formatul corect înainte de clasificare. Ceea ce înseamnă că nu e nimic de făcut ... Super.

următorul exemplu dactilografiat js

Obținerea Predicțiilor

Modelele MobileNet din Tensorflow sunt instruite pentru a recunoaște entități din primele 1000 de clase în ImageNet set de date. Modelele generează probabilitățile ca fiecare dintre aceste entități să fie clasificate în imagine.

Lista completă a claselor instruite pentru modelul utilizat poate fi găsită în acest fișier .

Biblioteca tfjs-models / mobilenet expune o metodă de clasificare pe clasa MobileNet pentru a returna clasele X de top cu cele mai mari probabilități dintr-o intrare de imagine.

const predictions = await mn_model.classify(input, 10);

predicțiile este o serie de clase X și probabilități în formatul următor.

{ className: 'panda', probability: 0.9993536472320557 }

Exemplu

După ce am lucrat la utilizarea bibliotecii TensorFlow.js și a modelelor MobileNet pe Node.js, acest script va clasifica o imagine dată ca argument de linie de comandă.

cod sursa

testându-l

npm install
wget http://bit.ly/2JYSal9 -O panda.jpg '> Biblioteca Core TensorFlow.js   
  • @ tensorflow / tfjs-node - TensorFlow.js Node.js extensie
  • @ tensorflow / tfjs-node-gpu - TensorFlow.js Node.js extensie cu suport GPU
  • nod script.js mobilenet / model.json panda.jpg '>