Compartilhar via


Criando um complemento WinML para Electron

Este guia mostra como criar um complemento nativo em C# que usa o WinML (Windows Machine Learning) em seu aplicativo Electron. O WinML permite que você execute machine learning modelos (formato ONNX) localmente em dispositivos Windows para tarefas como classificação de imagem, detecção de objetos e muito mais.

Pré-requisitos

Observação

O WinML é executado em qualquer dispositivo Windows 10 (1809+) ou Windows 11. Para obter melhor desempenho, dispositivos com GPUs ou NPUs são recomendados, mas a API também funciona na CPU.

Etapa 1: Criar um complemento nativo em C#

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

Isso cria uma pasta winMlAddon/ com um projeto em C# configurado com o SDK do Windows e referências do Windows App SDK.

Crie o complemento:

npm run build-winMlAddon

Etapa 2: Baixar o modelo SqueezeNet

  1. Instalar a Galeria de Desenvolvimento de IA
  2. Navegue até o exemplo Classificar Imagem
  3. Baixar o modelo SqueezeNet 1.1
  4. Copie o arquivo .onnx para uma pasta models/ na raiz do project

Observação

O modelo também pode ser baixado do repositório ONNX Model Zoo GitHub.

Etapa 3: Adicionar pacotes NuGet necessários

Atualize Directory.packages.props na raiz do seu projeto:

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

Atualize winMlAddon/winMlAddon.csproj para adicionar as referências do pacote:

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

Etapa 4: Adicionar o código de exemplo

A Galeria de Desenvolvimento de IA fornece a implementação completa para classificação de imagem com SqueezeNet. Você pode encontrar o código adaptado no exemplo electron-winml.

Copie a winMlAddon/ pasta do exemplo ou atualize winMlAddon/addon.cs manualmente com o código de exemplo.

Principais detalhes de implementação

Caminho raiz do projeto: o addon requer que o código JavaScript forneça o caminho raiz do projeto para localizar o modelo ONNX e as dependências nativas.

Pré-carregamento de dependências nativas: O complemento inclui um método para carregar DLLs necessárias que funciona para cenários de desenvolvimento e produção.

Configuração do Electron Forge: configure o empacotador para desempacotar arquivos nativos:

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

Etapa 5: Criar o complemento

npm run build-winMlAddon

Etapa 6: Testar o complemento

Abra src/index.js e carregue o complemento:

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

Adicionar uma função de teste:

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 imagens de teste criando uma test-images/ pasta com imagens de exemplo e execute:

npm start

Etapa 7: Atualizar identidade usada para depuração

npx winapp node add-electron-debug-identity

Observação

Há um bug conhecido no Windows associado a aplicativos Electron com embalagem esparsa, que pode resultar em falhas ou janelas em branco. Consulte o guia de configuração para a solução alternativa.

Próximas Etapas