Skapa ett WinML-tillägg för Electron

Den här guiden visar hur du skapar ett internt C#-tillägg som använder Windows Machine Learning (WinML) i din Electron-app. Med WinML kan du köra machine learning modeller (ONNX-format) lokalt på Windows-enheter för uppgifter som bildklassificering, objektidentifiering med mera.

Förutsättningar

  • Installationen av utvecklingsmiljön har slutförts
  • Windows 11 eller Windows 10 (version 1809 eller senare)

Anmärkning

WinML körs på valfri Windows 10 (1809+) eller Windows 11 enhet. För bästa prestanda rekommenderas enheter med GPU:er eller NPU:er, men API:et fungerar även på CPU.

Steg 1: Skapa ett internt C#-tillägg

npx winapp node create-addon --template cs --name winMlAddon

Detta skapar en winMlAddon/ mapp med en C# project konfigurerad med Windows SDK och Windows App SDK referenser.

Skapa tillägget:

npm run build-winMlAddon

Steg 2: Ladda ned SqueezeNet-modellen

  1. Installera AI Dev-galleriet
  2. Gå till exempel på Klassificera bild
  3. Ladda ned SqueezeNet 1.1-modellen
  4. Kopiera filen .onnx till mappen models/ i din project-rot

Anmärkning

Modellen kan också laddas ned från ONNX Model Zoo GitHub lagringsplats.

Steg 3: Lägg till nödvändiga NuGet-paket

Uppdatera Directory.packages.props i din projektrot:

<PackageVersion Include="Microsoft.ML.OnnxRuntime.Extensions" Version="0.14.0" />
<PackageVersion Include="System.Drawing.Common" Version="9.0.9" />

Uppdatera winMlAddon/winMlAddon.csproj för att lägga till paketreferenserna:

<PackageReference Include="Microsoft.ML.OnnxRuntime.Extensions" />
<PackageReference Include="System.Drawing.Common" />

Steg 4: Lägg till exempelkoden

AI Dev Gallery tillhandahåller en fullständig implementering för bildklassificering med SqueezeNet. Du hittar den anpassade koden i exemplet electron-winml.

winMlAddon/ Kopiera mappen från exemplet eller uppdatera winMlAddon/addon.cs manuellt med exempelkoden.

Viktig implementeringsinformation

Projektets rotsökväg: Tillägget kräver att JavaScript-koden skickar projektets rotsökväg så att det kan hitta ONNX-modellen och inbyggda beroenden.

Förinläsning av inbyggda beroenden: Tillägget innehåller en metod för att läsa in nödvändiga DLL:er som fungerar för både utvecklings- och produktionsscenarier.

Electron Forge-konfiguration: Konfigurera din paketerare för att packa upp inbyggda filer:

module.exports = {
  packagerConfig: {
    asar: {
      unpack: "**/*.{dll,exe,node,onnx}"
    },
    ignore: [
      /^\/.winapp\//,
      "\\.msix$",
      /^\/winMlAddon\/(?!dist).+/
    ]
  },
};

Steg 5: Skapa tillägget

npm run build-winMlAddon

Steg 6: Testa tillägget

Öppna src/index.js och läs in tillägget:

const winMlAddon = require('../winMlAddon/dist/winMlAddon.node');

Lägg till en testfunktion:

const testWinML = async () => {
  try {
    let projectRoot = path.join(__dirname, '..');
    if (projectRoot.includes('app.asar')) {
      projectRoot = projectRoot.replace('app.asar', 'app.asar.unpacked');
    }

    const addon = await winMlAddon.Addon.createAsync(projectRoot);
    console.log('Model loaded successfully!');

    const imagePath = path.join(projectRoot, 'test-images', 'sample.jpg');
    const predictions = await addon.classifyImage(imagePath);

    console.log('Top predictions:');
    predictions.slice(0, 5).forEach((pred, i) => {
      console.log(`${i + 1}. ${pred.label}: ${(pred.confidence * 100).toFixed(2)}%`);
    });
  } catch (error) {
    console.error('Error testing WinML:', error.message);
  }
};

Förbered testbilder genom att skapa en test-images/ mapp med exempelbilder och kör sedan:

npm start

Steg 7: Uppdatera felsökningsidentitet

npx winapp node add-electron-debug-identity

Anmärkning

Det finns en känd Windows-bugg med gles paketering av Elektronprogram som kan orsaka krascher eller tomma fönster. Se installationsguiden för lösningen.

Nästa steg