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