Creación de un complemento winML para Electron

En esta guía se muestra cómo crear un complemento nativo de C# que usa Windows Machine Learning (WinML) en la aplicación Electron. WinML permite ejecutar modelos machine learning (formato ONNX) localmente en dispositivos Windows para tareas como la clasificación de imágenes, la detección de objetos y mucho más.

Prerrequisitos

Nota:

WinML se ejecuta en cualquier dispositivo Windows 10 (1809 o posterior) o Windows 11. Para obtener el mejor rendimiento, se recomiendan dispositivos con GPU o NPUs, pero la API también funciona en la CPU.

Paso 1: Crear un complemento nativo de C#

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

Esto crea una carpeta winMlAddon/ con un proyecto de C# configurado con Windows SDK y referencias de Windows App SDK.

Compile el complemento:

npm run build-winMlAddon

Paso 2: Descargar el modelo de SqueezeNet

  1. Instalar AI Dev Gallery
  2. Navegue al ejemplo Clasificar Imagen.
  3. Descarga del modelo de SqueezeNet 1.1
  4. Copie el archivo .onnx en una carpeta models/ en la raíz del proyecto.

Nota:

El modelo también se puede descargar desde el Repositorio de Modelos de ONNX en GitHub.

Paso 3: Adición de paquetes NuGet necesarios

Actualice Directory.packages.props en la raíz del proyecto.

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

Actualice winMlAddon/winMlAddon.csproj para agregar las referencias del paquete:

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

Paso 4: Agregar el código de ejemplo

Ai Dev Gallery proporciona la implementación completa para la clasificación de imágenes con SqueezeNet. Puede encontrar el código adaptado en el ejemplo electron-winml.

Copie la winMlAddon/ carpeta del ejemplo o actualice winMlAddon/addon.cs manualmente con el código de ejemplo.

Detalles clave de implementación

Ruta raíz del proyecto: El complemento necesita que el código JavaScript pase la ruta de acceso raíz del proyecto para que pueda localizar el modelo ONNX y las dependencias nativas.

Precarga de dependencias nativas: el complemento incluye un método para cargar los archivos DLL necesarios que funcionan tanto para escenarios de desarrollo como de producción.

Configuración de Electron Forge: configure el empaquetador para desempaquetar archivos nativos:

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

Paso 5: Compilar el complemento

npm run build-winMlAddon

Paso 6: Probar el complemento

Abra src/index.js y cargue el complemento:

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

Agregue una función de prueba:

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

Prepare imágenes de prueba mediante la creación de una test-images/ carpeta con imágenes de ejemplo y, a continuación, ejecute:

npm start

Paso 7: Actualizar la identidad de depuración

npx winapp node add-electron-debug-identity

Nota:

Hay un error conocido de Windows con aplicaciones de Electron de empaquetado disperso que pueden provocar bloqueos o ventanas en blanco. Consulte la guía de configuración para encontrar una alternativa.

Pasos siguientes