Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Hay varios métodos estáticos que se pueden aplicar en la clase LearningModel para cargar modelos de aprendizaje automático, como cargar el modelo desde un archivo de la aplicación, desde un archivo en el disco o cargar un modelo desde una secuencia.
La carga desde un método de flujo permite un mejor control sobre el modelo. En este caso, puede optar por tener el modelo cifrado en el disco y descifrarlo solo en memoria antes de llamar a uno de los métodos LoadFromStream.
En este tutorial, aprenderá a integrar un modelo de aprendizaje automático cifrado con la aplicación Windows ML (C#).
Las API de Windows ML no proporcionan el servicio de cifrado de aprendizaje automático y no se harán responsables de ningún daño ni pérdida de ningún tipo.
Obtención del modelo ONNX
En este tutorial, usará el modelo SqueezeNet en formato ONNX para realizar el cifrado, el descifrado y la carga desde el flujo de datos.
Descargue o clone la aplicación de ejemplo de detección de objetos de SqueezeNet de GitHub para obtener el modelo SqueezeNet.onnx.
Especificación de las declaraciones y variables necesarias
- Copie las siguientes declaraciones de instrucciones using para obtener acceso a todas las APIs que necesitará:
using System;
using System.Threading.Tasks;
using Windows.AI.MachineLearning;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Controls;
Definirá dos variables especiales para una clave y un vector de inicialización.
La clave es una variable de la clase CryptographicKey, que representa un par de claves simétrico (o asimétrico). Necesitará un objeto de esta clase, ya que usará el AsymmetricKeyAlgorithmProvider método para crear o importar claves.
El vector de inicialización es una variable de la clase IBuffer, que representa una matriz a la que se hace referencia de bytes que usan interfaces de lectura y escritura de secuencias de bytes.
Tanto CryptographicKey como IBuffer las variables de clase se usan para cifrar y descifrar la secuencia.
- Agregue dentro del espacio de nombres crypto las siguientes declaraciones de variable y la clase
MainPagedespués de las instrucciones using.
namespace crypto
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
private CryptographicKey _key;
private IBuffer _initialization_vector;
public MainPage()
{
this.InitializeComponent();
Run();
}
}
}
Cifrado del modelo
Las API de Windows proporcionan un amplio conjunto de características y funcionalidades, que pueden mejorar la funcionalidad del conjunto de API de Windows ML. Aquí, usará un servicio de cifrado y descifrado proporcionado en el conjunto de API de Windows para generar un flujo en memoria y utilizar las API de Windows ML para cargar el modelo desde ese flujo.
Puede usar cualquier servicio de cifrado para cifrar el modelo de Machine Learning, según su comodidad. En este tutorial, usaremos el método de cifrado : SymmetricAlgorithmNames - .AesCbcPkcs7.
La clase SymmetricAlgorithmNames le ayuda a recuperar algoritmos de clave simétrica para aplicar el cifrado de claves simétricas en el modelo. Este tipo de cifrado requiere que también se use la misma clave usada para el cifrado para el descifrado.
Con la SymmetricKeyAlgorithmProvider clase , puede seleccionar un algoritmo y crear la clave. En este tutorial, usaremos el .AesCbcPkcs7. algoritmo .
El AES_CBC_PKCS7 algoritmo representa un algoritmo avanzado de Estándar de Cifrado Avanzado (AES), junto con un modo de encadenamiento de bloques de operación y relleno de PKCS#7.
- El código siguiente muestra cómo generar la clave y cifrar el modelo.
async Task<IBuffer> EncryptAsync(StorageFile model_file)
{
// get a buffer for the model file
var file_buffer = await Windows.Storage.FileIO.ReadBufferAsync(model_file);
// set up the encryption algorithm
var algorithm = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
uint key_length = 32;
var key_buffer = CryptographicBuffer.GenerateRandom(key_length);
_key = algorithm.CreateSymmetricKey(key_buffer);
_initialization_vector = CryptographicBuffer.GenerateRandom(algorithm.BlockLength);
// perform the encryption
var encrypted_buffer = CryptographicEngine.Encrypt(_key, file_buffer, _initialization_vector);
return encrypted_buffer;
}
[NOTA] ¿Te interesa obtener más información sobre claves criptográficas? Revise la documentación de claves criptográficas.
Descifrar el modelo y cargar desde el flujo de datos
Antes de cargar el modelo, debe descifrarlo mediante el método CryptographicEngine.Decrypt.
CryptographicEngine.Decrypt es un método para descifrar el contenido que se cifró anteriormente mediante un algoritmo simétrico o asimétrico. Al llamar al método , deberá proporcionar la clave generada anteriormente.
Para acceder al modelo descifrado, usará la InMemoryRandomAccessStream clase , que proporciona acceso aleatorio de datos en flujos de entrada y salida almacenados en memoria en lugar de en el disco.
Como último paso, crearás una sesión para cargar el modelo desde la secuencia mediante el método LearningModel.LoadFromStreamAsync. Puede llamar a este método como una tarea sincrónica o asincrónica.
El código siguiente muestra cómo descifrar el modelo mediante la clave generada, escribirlo en una secuencia y, a continuación, cargar el modelo desde la secuencia.
async Task DecryptAndRunAsync(IBuffer encryptyed_buffer)
{
// decrypt the buffer
var decrypted_buffer = CryptographicEngine.Decrypt(_key, encryptyed_buffer, _initialization_vector);
// write it to a stream
var decrypted_stream = new InMemoryRandomAccessStream();
await decrypted_stream.WriteAsync(decrypted_buffer);
// load the model from the stream
var model = await LearningModel.LoadFromStreamAsync(RandomAccessStreamReference.CreateFromStream(decrypted_stream));
// create a session
var session = new LearningModelSession(model);
}
Ejecución del modelo
Copie el siguiente método Run para llamar a los métodos definidos anteriormente.
async Task Run()
{
// get the model file
var model_file = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/SqueezeNet.onnx"));
// encrypt the model file.
var encryptyed_buffer = await EncryptAsync(model_file);
// decrypt the model file and load it
await DecryptAndRunAsync(encryptyed_buffer);
}
Resumen
Ya está Ha cargado correctamente el modelo en la aplicación de Windows ML.
Después de cargar el modelo, puede seguir creando una sesión, enlazar entradas y salidas del modelo y evaluar el modelo para completar la aplicación de Windows ML.
Recursos adicionales
Para obtener más información sobre los temas mencionados en este tutorial, visite los siguientes recursos: