La inteligencia artificial en el entorno de escritorio ya no está limitada a la nube. Windows proporciona soporte nativo para la ejecución de modelos ONNX directamente desde una app WinUI 3 utilizando Windows ML. Esto permite realizar inferencia local con alto rendimiento y sin necesidad de conexión a internet, ideal para escenarios de privacidad, baja latencia o ejecución offline.
En este artículo se describe cómo integrar un modelo ONNX a una app moderna, cómo usar la API de Windows ML y cómo estructurar un flujo de inferencia optimizado con soporte para entrada y salida de datos reales.
Requisitos
- Windows 11 (recomendado build 22621+)
- Visual Studio 2022 con Windows App SDK 1.3+
- Proyecto WinUI 3 empaquetado (MSIX)
- Referencia al paquete
Microsoft.AI.MachineLearning
- Modelo ONNX compatible (puede ser descargado de onnxruntime zoo)
Paso 1: Agregar el paquete NuGet de Windows ML
Agregar al proyecto:
Install-Package Microsoft.AI.MachineLearning
Esto permite cargar y ejecutar modelos ONNX directamente desde código.
Paso 2: Copiar el modelo ONNX al proyecto
Ejemplo: modelo_mnist.onnx
copiado a la carpeta Assets/ML
Configurar en propiedades:
- Build Action: Content
- Copy to Output Directory: Copy if newer
Paso 3: Cargar el modelo ONNX
Importar:
using Microsoft.AI.MachineLearning;
Cargar desde archivo:
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/ML/modelo_mnist.onnx"));
var session = LearningModelSession.CreateFromModel(LearningModel.LoadFromFilePath(file.Path));
Esto crea una sesión de inferencia desde el modelo.
Paso 4: Preparar entrada para inferencia
Ejemplo para imagen de 28x28 píxeles escala de grises:
float[] input = new float[1 * 1 * 28 * 28]; // NCHW
// Rellenar input con los valores de píxeles normalizados (0.0–1.0)
var tensor = TensorFloat.CreateFromArray(new[] { 1u, 1u, 28u, 28u }, input);
var binding = new LearningModelBinding(session);
binding.Bind("Input3", tensor);
Paso 5: Ejecutar inferencia
var result = await session.EvaluateAsync(binding, "Inferencia1");
var outputTensor = result.Outputs["Plus214_Output_0"] as TensorFloat;
var output = outputTensor.GetAsVectorView();
int predictedIndex = output.ToList().IndexOf(output.Max());
Esto retorna el índice con mayor probabilidad (en este caso, el dígito 0–9).
Paso 6: Mostrar resultados en UI
ResultadoText.Text = $"Predicción: {predictedIndex}";
En XAML:
<StackPanel>
<Image x:Name="InputPreview"/>
<TextBlock x:Name="ResultadoText"/>
</StackPanel>
Paso 7: Optimización y aceleración
Windows ML usa DirectML y soporte para GPU si está disponible. No se requiere configuración extra: el runtime lo detecta automáticamente.
Validar el dispositivo utilizado:
var deviceKind = session.DeviceKind.ToString(); // CPU, GPU, DirectML
Paso 8: Alternativas para modelos
- Convertir PyTorch / TensorFlow → ONNX
- Usar modelos preentrenados:
squeezenet
,resnet18
,mobilenetv2
- Exportar modelos propios con herramientas como
onnxruntime-tools
otf2onnx
Casos de uso reales
- Clasificación de imágenes (productos, documentos)
- Detección de anomalías locales
- Asistentes inteligentes offline
- Modelos de NLP ligeros ejecutados localmente
- Reconocimiento de escritura a mano o números
Buenas prácticas
- Validar entradas antes de ejecutar inferencia
- Manejar fallback si no hay aceleración GPU
- No cargar el modelo en cada inferencia (persistir sesión)
- Reducir tamaño del modelo con quantization si es posible
Conclusión
La integración de ONNX y Windows ML en aplicaciones modernas WinUI 3 permite ejecutar inferencia local de modelos de IA de forma nativa, segura y sin latencia de red. Esto convierte a Windows en una plataforma ideal para aplicaciones inteligentes en el borde, desde escritorios empresariales hasta dispositivos autónomos. El soporte de Windows App SDK lo hace accesible a cualquier desarrollador de apps modernas.
Ver también
- Construcción de un asistente contextual para escritorio usando IA local con acceso al sistema
- Integración con servicios locales vía App Services y extensión de funcionalidades entre apps
- Implementación de Background Tasks persistentes en apps modernas
- Empaquetado de apps modernas con MSIX y configuración avanzada del manifiesto
- Creación de ventanas flotantes estilo Widget con posicionamiento persistente en pantalla