Udostępnij za pośrednictwem


Tworzenie dodatku WinML dla Electron

W tym przewodniku pokazano, jak utworzyć natywny dodatek języka C#, który używa systemu Windows Machine Learning (WinML) w aplikacji Electron. Język WinML umożliwia lokalne uruchamianie modeli machine learning (format ONNX) na urządzeniach z systemem Windows na potrzeby zadań takich jak klasyfikacja obrazów, wykrywanie obiektów i nie tylko.

Wymagania wstępne

Uwaga / Notatka

Oprogramowanie WinML działa na dowolnym urządzeniu Windows 10 (1809 lub nowszym) lub Windows 11. Aby uzyskać najlepszą wydajność, zalecane są urządzenia z procesorami GPU lub procesorami NPU, ale interfejs API działa również na procesorze CPU.

Krok 1. Tworzenie natywnego dodatku języka C#

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

Spowoduje to utworzenie folderu winMlAddon/ z projektem języka C#, skonfigurowanym z referencjami do Windows SDK i Windows App SDK.

Skompiluj dodatek:

npm run build-winMlAddon

Krok 2. Pobieranie modelu SqueezeNet

  1. Instalowanie galerii deweloperów sztucznej inteligencji
  2. Przejdź do przykładu Klasyfikuj obraz
  3. Pobierz model SqueezeNet 1.1
  4. Skopiuj plik .onnx do folderu models/ w katalogu głównym project

Uwaga / Notatka

Model można również pobrać z repozytorium GitHub ONNX Model Zoo.

Krok 3. Dodawanie wymaganych pakietów NuGet

Zaktualizuj Directory.packages.props w katalogu głównym projektu:

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

Zaktualizuj winMlAddon/winMlAddon.csproj , aby dodać odwołania do pakietu:

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

Krok 4. Dodawanie przykładowego kodu

Galeria deweloperów sztucznej inteligencji udostępnia pełną implementację klasyfikacji obrazów za pomocą aplikacji SqueezeNet. Ten zaadaptowany kod jest dostępny w przykładzie elektron-winml.

winMlAddon/ Skopiuj folder z przykładu lub ręcznie zaktualizuj winMlAddon/addon.cs go przy użyciu przykładowego kodu.

Kluczowe szczegóły implementacji

Ścieżka główna projektu: dodatek wymaga kodu JavaScript, aby przekazać ścieżkę główną projektu, aby móc zlokalizować model ONNX i zależności natywne.

Wstępne ładowanie zależności natywnych: dodatek zawiera metodę ładowania wymaganych bibliotek DLL, które działają zarówno w scenariuszach programistycznych, jak i produkcyjnych.

Konfiguracja narzędzia Electron Forge: skonfiguruj pakiet do rozpakowywania plików natywnych:

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

Krok 5. Kompilowanie dodatku

npm run build-winMlAddon

Krok 6. Testowanie dodatku

Otwórz src/index.js i załaduj dodatek:

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

Dodaj funkcję testową:

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);
  }
};

Przygotuj obrazy testowe, tworząc test-images/ folder z przykładowymi obrazami, a następnie uruchom polecenie:

npm start

Krok 7. Aktualizowanie tożsamości debugowania

npx winapp node add-electron-debug-identity

Uwaga / Notatka

Istnieje znana usterka systemu Windows z rozrzednymi pakietami aplikacji Electron, które mogą powodować awarie lub puste okna. Zapoznaj się z przewodnikiem instalacji , aby uzyskać obejście problemu.

Następne kroki