Page 48 - Revista_60.pub
P. 48

C#







        WINDOWS ML (ML.NET C#)

           ge.xaml.cs  instanciamos  o  modelo  os  inputs  e  outputs  que       ButtonLoad.IsEnabled = true;
         serão utilizados.                                           ButtonRun.IsEnabled = false;
                                                                     ButtonReset.IsEnabled = false;
         public sealed partial class MainPage : Page
         {                                                           StatusBlock.Text = "Model unloaded";
             private const string _kModelFileName =              }
                                               "model.onnx";
             private const string _kLabelsFileName =             private async void ButtonLoad_Click(object
                                              "Labels.json";                            sender, RoutedEventArgs e)
             private LearningModel _model = null;                {
             private LearningModelSession _session;                  int ticks = Environment.TickCount;
          private List<string> _labels = new List<string>();
             private int _runCount = 0;                              // carrega o modelo
         ...                                                         await LoadModelAsync();

         }                                                           ticks = Environment.TickCount - ticks;

               Feito  isto  vamos  carregar  o  modelo  usando  o  método       // define o estado dos botões
         LoadModelAsync, que deverá ser chamado antes de chamar-      ButtonLoad.IsEnabled = false;
         mos qualquer método do modelo.                              ButtonRun.IsEnabled = true;
                                                                     ButtonReset.IsEnabled = true;

         private async Task LoadModelAsync()                         StatusBlock.Text = $"Model loaded in
         {                                                                         { ticks } ticks, ready to run";
                                                                 }
             if (_model != null) return;
                                                                       Posto isto falta criar o botão executar que irá carregar
             StatusBlock.Text = $"Carregando
                           {_kModelFileName} ...paciencia ";     a imagem e chamar o método que será chamado por esse
                                                                 botão,  que  irá  avaliar  a  imagem,  de  acordo  com  o  modelo
             try                                                 treinado.  Este  botão  irá  criar  um  FileOpenPicker que nos
             {
                 // Faz o parse das labels a partir de um        permitirá escolher o ficheiro, e carregar esse mesmo ficheiro.
                 //ficheiro json                                 De seguida mostrará a imagem, e fará o seu encapsulamen-
                 // entries are already sorted in order.         to num VideoFrame para ser unida e avaliada pelo modelo.
                 var fileString = File.ReadAllText($"Assets/
                                       {_kLabelsFileName}");
                 var fileDict =                                  /// <summary>
                               JsonConvert.DeserializeObject     /// Abre o file picker para escolher a imagem
                   <Dictionary<string, string>>(fileString);     /// </summary>
                 foreach (var kvp in fileDict)                   /// <param name="sender"></param>
                 {                                               /// <param name="e"></param>
                     _labels.Add(kvp.Value);                     private async void ButtonRun_Click(object sender,
                 }                                               RoutedEventArgs e)
                                                                 {
                 // carrega e cria o modelo                          ButtonRun.IsEnabled = false;
                 var modelFile = await StorageFile.                  UIPreviewImage.Source = null;
                      GetFileFromApplicationUriAsync(new Uri         StatusBlock.Text = "Carregando a imagem...";
                  ($"ms-appx:///Assets/{_kModelFileName}"));         try
                 _model = await LearningModel                        {
                       .LoadFromStorageFileAsync(modelFile);          //abre um file picker para escolher a imagem
                                                                         FileOpenPicker fileOpenPicker = new
                 //Cria uma sessão de avaliação de acordo                                        FileOpenPicker();
                 //com o modelo de dispositivo disponível                fileOpenPicker.SuggestedStartLocation =
                 _session = new LearningModelSession(_model,                     PickerLocationId.PicturesLibrary;
                  new LearningModelDevice(GetDeviceKind()));             fileOpenPicker.FileTypeFilter.Add
             }                                                                                           (".jpg");
             catch (Exception ex)                                        fileOpenPicker.FileTypeFilter.Add
             {                                                                                           (".png");
                 StatusBlock.Text = $"error: {ex.Message}";              fileOpenPicker.ViewMode =
                 _model = null;                                                          PickerViewMode.Thumbnail;
             }                                                           StorageFile selectedStorageFile = await
         }                                                                   fileOpenPicker.PickSingleFileAsync();

               Com o modelo carregado, vamos criar dois botões um           SoftwareBitmap softwareBitmap;
         para carregar o modelo e outro para limpar (resetar) para reco-          using (IRandomAccessStream stream = await
                                                                                     selectedStorageFile.OpenAsync
         meçarmos.                                                                          (FileAccessMode.Read))
                                                                         {
         private async void ButtonReset_Click(object sender,                 //Cria uma stream de descodificação
         RoutedEventArgs e)                                                  BitmapDecoder decoder = await
         {                                                                      BitmapDecoder.CreateAsync(stream);
             Reset();
                                                                             // obtem a representação
             // define o estado dos botões                             SoftwareBitmap do ficheiro em formado BGRA8
                                                                             softwareBitmap = await



                                                           48
   43   44   45   46   47   48   49   50   51   52   53