Retour au blog

Edge AI avec JavaScript : Comment Executer l'Intelligence Artificielle Directement dans le Navigateur et IoT en 2025

Salut HaWkers, imaginez ouvrir une application web et avoir la reconnaissance faciale, la traduction de langues et la detection d'objets fonctionnant instantanement, sans envoyer un seul octet de donnees a des serveurs distants. Ca semble magique ? C'est Edge AI, et JavaScript mene cette revolution.

En 2025, la question n'est plus "dois-je utiliser l'IA dans mon application ?", mais plutot "ou dois-je executer cette IA ?". Et de plus en plus, la reponse est : a la bordure du reseau - directement dans le navigateur, le smartphone ou les appareils IoT.

Qu'est-ce que Edge AI et Pourquoi Devriez-Vous Vous en Soucier ?

Edge AI signifie executer des modeles d'intelligence artificielle directement sur l'appareil de l'utilisateur (edge), au lieu d'envoyer des donnees a des serveurs cloud. Les avantages sont transformateurs :

Confidentialite Totale : Vos donnees ne quittent jamais l'appareil. Reconnaissance faciale pour la connexion ? Tout traite localement. Analyse de photos sensibles ? Zero upload.

Latence Zero : Il n'y a pas d'aller-retour vers le serveur. Les applications en temps reel (filtres video, assistants vocaux, jeux) deviennent possibles.

Fonctionnement Hors Ligne : Pas d'internet ? Pas de probleme. Edge AI fonctionne dans les avions, metros, zones rurales - n'importe ou.

Couts Reduits : Vous ne payez pas pour le traitement sur serveur, le stockage ou le transfert de donnees. L'echelle a zero cout incremental.

Experience Superieure : Les utilisateurs percoivent la difference quand il n'y a pas de delai reseau. C'est instantane.

Les Outils d'Edge AI en JavaScript

L'ecosysteme JavaScript a des outils puissants pour Edge AI. Decouvrons les principaux :

TensorFlow.js : Le Geant Polyvalent

import * as tf from '@tensorflow/tfjs';

class EdgeImageClassifier {
  constructor() {
    this.model = null;
    this.isReady = false;
  }

  async initialize() {
    console.log('Chargement du modele MobileNet dans le navigateur...');

    // MobileNet: modele optimise pour les appareils mobiles
    // ~16MB, fonctionne fluidement dans tout navigateur moderne
    this.model = await tf.loadLayersModel(
      'https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json'
    );

    this.isReady = true;
    console.log('Modele charge ! Pret a classifier des images.');
  }

  async classifyImage(imageElement) {
    if (!this.isReady) {
      throw new Error('Modele pas encore initialise');
    }

    // Convertir l'image en tensor
    const tensorImg = tf.browser.fromPixels(imageElement)
      .resizeBilinear([224, 224]) // MobileNet attend 224x224
      .expandDims(0)
      .toFloat()
      .div(127.5)
      .sub(1); // Normalisation [-1, 1]

    // Inference dans le navigateur
    const startTime = performance.now();
    const predictions = await this.model.predict(tensorImg).data();
    const inferenceTime = performance.now() - startTime;

    // Nettoyer la memoire (important !)
    tensorImg.dispose();

    // Obtenir les top 3 predictions
    const top3 = Array.from(predictions)
      .map((prob, idx) => ({ class: this.getClassName(idx), probability: prob }))
      .sort((a, b) => b.probability - a.probability)
      .slice(0, 3);

    return {
      predictions: top3,
      inferenceTime: `${inferenceTime.toFixed(2)}ms`,
      device: 'browser',
      modelSize: '~16MB'
    };
  }

  getClassName(index) {
    // En production, chargez le fichier de labels
    // Ceci est juste un exemple
    const labels = ['chat', 'chien', 'oiseau', 'voiture', 'personne'];
    return labels[index] || `classe_${index}`;
  }
}

// Utilisation dans une application web
const classifier = new EdgeImageClassifier();
await classifier.initialize();

// Classifier quand l'utilisateur uploade
document.getElementById('imageUpload').addEventListener('change', async (e) => {
  const file = e.target.files[0];
  const img = document.createElement('img');

  img.onload = async () => {
    const result = await classifier.classifyImage(img);
    console.log('Resultat:', result);
    // { predictions: [...], inferenceTime: '45.23ms', device: 'browser' }
  };

  img.src = URL.createObjectURL(file);
});

Ce code complet execute la classification d'images entierement dans le navigateur. Aucune donnee n'est envoyee au serveur.

ONNX Runtime Web : Compatibilite Universelle

ONNX (Open Neural Network Exchange) est un format standard qui permet d'utiliser des modeles de n'importe quel framework (PyTorch, TensorFlow, scikit-learn) en JavaScript :

import * as ort from 'onnxruntime-web';

class UniversalEdgeAI {
  constructor(modelPath) {
    this.modelPath = modelPath;
    this.session = null;
  }

  async loadModel() {
    console.log('Chargement du modele ONNX...');

    // ONNX Runtime peut utiliser WebGL, WebGPU ou WASM automatiquement
    this.session = await ort.InferenceSession.create(this.modelPath, {
      executionProviders: ['webgpu', 'webgl', 'wasm'],
      graphOptimizationLevel: 'all'
    });

    console.log('Modele charge avec succes !');
    console.log('Provider utilise:', this.session.inputNames);
  }

  async runInference(inputData) {
    // Preparer le tensor d'input
    const tensor = new ort.Tensor('float32', inputData, [1, 3, 224, 224]);

    // Executer l'inference
    const feeds = { [this.session.inputNames[0]]: tensor };
    const startTime = performance.now();

    const results = await this.session.run(feeds);

    const inferenceTime = performance.now() - startTime;

    return {
      output: results[this.session.outputNames[0]].data,
      inferenceTime: `${inferenceTime.toFixed(2)}ms`,
      provider: this.session.executionProviders
    };
  }

  // Methode pour traiter un flux video en temps reel
  async processVideoStream(videoElement, onFrame) {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');

    canvas.width = videoElement.videoWidth;
    canvas.height = videoElement.videoHeight;

    const processFrame = async () => {
      // Capturer le frame de la video
      ctx.drawImage(videoElement, 0, 0);
      const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

      // Pre-traiter pour le modele
      const inputTensor = this.preprocessImage(imageData);

      // Inference
      const result = await this.runInference(inputTensor);

      // Callback avec le resultat
      onFrame(result);

      // Continuer le traitement (30 FPS)
      setTimeout(() => requestAnimationFrame(processFrame), 1000 / 30);
    };

    requestAnimationFrame(processFrame);
  }

  preprocessImage(imageData) {
    // Convertir ImageData en array Float32 normalise
    const { data, width, height } = imageData;
    const inputSize = 224;
    const tensor = new Float32Array(3 * inputSize * inputSize);

    // Redimensionner et normaliser
    for (let y = 0; y < inputSize; y++) {
      for (let x = 0; x < inputSize; x++) {
        const srcX = Math.floor(x * width / inputSize);
        const srcY = Math.floor(y * height / inputSize);
        const srcIdx = (srcY * width + srcX) * 4;

        // R, G, B dans des canaux separes
        tensor[y * inputSize + x] = data[srcIdx] / 255;
        tensor[inputSize * inputSize + y * inputSize + x] = data[srcIdx + 1] / 255;
        tensor[2 * inputSize * inputSize + y * inputSize + x] = data[srcIdx + 2] / 255;
      }
    }

    return tensor;
  }
}

// Exemple: Filtre video en temps reel
const detector = new UniversalEdgeAI('./models/face_detection.onnx');
await detector.loadModel();

// Traiter la webcam
const video = document.getElementById('webcam');
await navigator.mediaDevices.getUserMedia({ video: true })
  .then(stream => video.srcObject = stream);

detector.processVideoStream(video, (result) => {
  // Dessiner les bounding boxes des visages detectes
  drawDetections(result.output);
});

Avec ONNX, vous pouvez entrainer des modeles en Python/PyTorch et les executer dans le navigateur sans conversion complexe.

Edge AI dans les Appareils IoT avec JavaScript

L'une des applications les plus excitantes d'Edge AI est dans l'IoT. Creons un systeme de detection d'anomalies pour des capteurs industriels fonctionnant sur un Raspberry Pi avec Node.js :

import * as tf from '@tensorflow/tfjs-node';
import { SerialPort } from 'serialport';

class EdgeAnomalyDetector {
  constructor(modelPath, sensorPort) {
    this.model = null;
    this.sensorPort = new SerialPort({ path: sensorPort, baudRate: 9600 });
    this.buffer = [];
    this.windowSize = 50; // 50 lectures pour l'analyse
    this.threshold = 0.8;
  }

  async initialize() {
    console.log('Initialisation du detecteur d\'anomalies...');

    // Charger le modele entraine pour detecter des patterns anormaux
    this.model = await tf.loadLayersModel(`file://${this.modelPath}`);

    console.log('Modele charge. Demarrage de la surveillance...');
    this.startMonitoring();
  }

  startMonitoring() {
    this.sensorPort.on('data', (data) => {
      // Parse des donnees du capteur (temperature, vibration, etc.)
      const reading = this.parseSensorData(data);

      this.buffer.push(reading);

      // Quand nous avons assez de donnees, analyser
      if (this.buffer.length >= this.windowSize) {
        this.detectAnomaly();
        this.buffer.shift(); // Supprimer la lecture la plus ancienne
      }
    });
  }

  async detectAnomaly() {
    // Preparer les donnees pour le modele
    const inputTensor = tf.tensor2d([this.buffer]);

    // Inference
    const prediction = await this.model.predict(inputTensor);
    const anomalyScore = await prediction.data();

    // Nettoyer la memoire
    inputTensor.dispose();
    prediction.dispose();

    if (anomalyScore[0] > this.threshold) {
      this.handleAnomaly({
        score: anomalyScore[0],
        timestamp: Date.now(),
        readings: this.buffer.slice(-10) // 10 dernieres lectures
      });
    }
  }

  handleAnomaly(details) {
    console.warn('ANOMALIE DETECTEE !');
    console.log('Score:', details.score);
    console.log('Heure:', new Date(details.timestamp).toISOString());

    // Actions: declencher alarme, envoyer notification, etc.
    this.triggerAlert(details);

    // Sauvegarder localement pour analyse ulterieure
    this.logAnomaly(details);
  }

  parseSensorData(buffer) {
    // Convertir les bytes du capteur en valeurs numeriques
    // Format specifique depend du materiel
    return {
      temperature: buffer.readFloatLE(0),
      vibration: buffer.readFloatLE(4),
      pressure: buffer.readFloatLE(8)
    };
  }

  triggerAlert(details) {
    // En production: webhook, MQTT, LoRaWAN, etc.
    // Ici juste un exemple local
    const fs = require('fs');
    fs.appendFileSync(
      './alerts.log',
      JSON.stringify(details) + '\n'
    );
  }

  logAnomaly(details) {
    // Stocker dans SQLite local ou fichier
    // Pour analyse ulterieure ou retraining du modele
  }
}

// Initialiser sur Raspberry Pi
const detector = new EdgeAnomalyDetector(
  './models/anomaly_detector/model.json',
  '/dev/ttyUSB0'
);

await detector.initialize();
console.log('Systeme de detection actif. Surveillance des capteurs...');

Ce systeme traite les donnees des capteurs localement, detecte les problemes en temps reel et n'envoie des alertes que quand necessaire - economisant de la bande passante et garantissant une reponse instantanee.

Cas d'Utilisation Reels d'Edge AI avec JavaScript

1. E-commerce : Essayage Virtuel

Les utilisateurs essaient des vetements/lunettes virtuellement en utilisant la camera, le tout traite dans le navigateur.

2. Sante : Triage Preliminaire

Les apps de sante analysent les symptomes, photos de peau, etc., localement avant une consultation medicale.

3. Retail : Checkout Automatise

Les cameras detectent les produits pris dans les rayons et facturent automatiquement (style Amazon Go).

4. Industrie : Maintenance Predictive

Les capteurs sur les machines detectent les anomalies et predisent les pannes avant qu'elles ne se produisent.

5. Securite : Detection d'Intrusion

Les cameras IoT detectent les personnes/vehicules non autorises sans envoyer de video au cloud.

L'Avenir d'Edge AI en JavaScript

Les tendances pour les prochains mois incluent :

WebGPU : Nouvelle API qui donnera un acces direct au GPU, 10x plus rapide que WebGL pour l'IA.

WebNN (Web Neural Network) : API native du navigateur pour executer des reseaux neuronaux, sans frameworks externes.

Modeles Federes : Entrainer des modeles collectivement sans partager les donnees brutes (privacy-preserving ML).

Edge TPUs dans les Navigateurs : Chrome experimente deja l'acces au materiel d'IA dedie.

Si vous etes enthousiasme par les possibilites d'IA distribuee, vous aimerez aussi : WebAssembly et Machine Learning : Performance Extreme pour l'IA sur le Web ou nous explorons comment combiner WASM et ML pour des resultats encore plus rapides.

C'est parti !

Commentaires (0)

Cet article n'a pas encore de commentaires. Soyez le premier!

Ajouter des commentaires