Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
LearningModel sınıfına uygulamanızdaki bir dosyadan, diskteki bir dosyadan modeli yükleme veya bir akıştan model yükleme gibi makine öğrenmesi modellerini yüklemek için uygulayabileceğiniz birkaç statik yöntem vardır.
Akış yönteminden yükleme, model üzerinde daha iyi denetim sağlar. Bu durumda, LoadFromStream yöntemlerinden birini çağırmadan önce modelin diskte şifrelenmesini ve şifresinin yalnızca bellekte çözülmesini seçebilirsiniz.
Bu öğreticide, şifrelenmiş bir makine öğrenmesi modelini Windows ML uygulaması (C#) ile tümleştirmeyi öğreneceksiniz.
Windows ML API'leri makine öğrenmesi şifreleme hizmeti sağlamaz ve herhangi bir zarar veya kayıptan sorumlu tutulmaz.
ONNX modelini alma
Bu öğreticide, şifrelemeyi, şifre çözmeyi ve akıştan yüklemeyi gerçekleştirmek için ONNX biçiminde SqueezeNet modelini kullanacaksınız.
SqueezeNet.onnx modelini almak için GitHub'dan SqueezeNet Nesne Algılama örnek uygulamasını indirin veya kopyalayın.
Gerekli bildirimleri ve değişkenleri belirtin
- İhtiyacınız olacak tüm API'lere erişmek için aşağıdaki using deyimlerini kopyalayın.
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;
Bir anahtar ve başlatma vektöru için iki özel değişken tanımlayacaksınız.
anahtar, simetrik (veya asimetrik) bir anahtar çiftini temsil eden CryptographicKey sınıfının bir değişkenidir. Bu sınıftan bir nesneye ihtiyacınız olacak çünkü AsymmetricKeyAlgorithmProvider yöntemini kullanarak anahtar oluşturacak veya içeri aktaracaksınız.
Başlatma vektör, bayt akışı okuma ve yazma arabirimleri tarafından kullanılan başvurulan bayt dizisini temsil eden IBuffer sınıfının bir değişkenidir.
Hem CryptographicKey hem de IBuffer sınıf değişkenleri akışı şifrelemek ve şifresini çözmek için kullanılır.
- Şifreleme ad alanı içinde using deyimlerinden sonra aşağıdaki değişken bildirimlerini ve
MainPagesınıfını ekleyin:
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();
}
}
}
Modeli Şifreleme
Windows API'leri, Windows ML API kümesinin işlevselliğini geliştirebilen zengin bir özellik ve özellik kümesi sağlar. Burada, bellekte bir akış oluşturmak için Windows API kümesinde sağlanan bir şifreleme ve şifre çözme hizmeti kullanacak ve modeli bu akıştan yüklemek için Windows ML API'lerini kullanacaksınız.
Makine öğrenmesi modelinizi şifrelemek için istediğiniz şifreleme hizmetini kullanabilirsiniz. Bu öğreticide şifreleme yöntemini kullanacağız: SymmetricAlgorithmNames - .AesCbcPkcs7.
SymmetricAlgorithmNames sınıfı, modelinize simetrik anahtar şifrelemesi uygulamak için simetrik anahtar algoritmalarını almanıza yardımcı olur. Bu şifreleme türü şifreleme için kullanılan anahtarın şifre çözme için de kullanılmasını gerektirir.
sınıfını SymmetricKeyAlgorithmProvider kullanarak bir algoritma seçebilir ve anahtarınızı oluşturabilirsiniz. Bu öğreticide .AesCbcPkcs7. algoritmasını kullanacağız.
Algoritma AES_CBC_PKCS7 , şifreleme bloğu zincirleme çalışma modu ve PKCS#7 doldurma ile birlikte gelişmiş bir Şifreleme Standardı (AES) algoritmasını temsil eder.
- Aşağıdaki kodda anahtarın nasıl oluşturulacağı ve modelin nasıl şifrelenmesi gösterilmektedir.
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;
}
[DİKKAT!] Şifreleme Anahtarları hakkında daha fazla bilgi edinmek istiyor musunuz? Lütfen Şifreleme anahtarları belgelerini gözden geçirin.
Modelin şifresini çözme ve akıştan yükleme
Modeli yüklemeden önce CryptographicEngine.Decrypt yöntemini kullanarak şifresini çözmeniz gerekir.
CryptographicEngine.Decrypt , daha önce simetrik veya asimetrik algoritma kullanılarak şifrelenen içeriğin şifresini çözmek için kullanılan bir yöntemdir. yöntemini çağırırken, daha önce oluşturulan anahtarı sağlamanız gerekir.
Şifresi çözülen modele erişmek için disk yerine bellekte depolanan giriş ve çıkış akışlarındaki verilere rastgele erişim sağlayan sınıfını kullanacaksınız InMemoryRandomAccessStream .
Son adım olarak, LearningModel.LoadFromStreamAsync yöntemini kullanarak akıştan modeli yüklemek için bir oturum oluşturacaksınız. Bu yöntemi zaman uyumlu veya zaman uyumsuz bir görev olarak çağırabilirsiniz.
Aşağıdaki kod, oluşturulan anahtarı kullanarak modelin şifresini çözmeyi, bir akışa yazmayı ve ardından modeli akıştan yüklemeyi gösterir.
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);
}
Modeli çalıştırma
Daha önce tanımlanan yöntemleri çağırmak için aşağıdaki Run yöntemini kopyalayın.
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);
}
Özet
Bu kadar! Modeli Windows ML uygulamanıza başarıyla yüklediniz.
Modeli yükledikten sonra bir oturum oluşturmaya, model girişlerini ve çıkışlarını bağlamaya ve Windows ML uygulamanızı tamamlamak için modeli değerlendirmeye devam edebilirsiniz.
Ek Kaynaklar
Bu öğreticide bahsedilen konular hakkında daha fazla bilgi edinmek için aşağıdaki kaynakları ziyaret edin: