Utilizando ML.NET em aplicações Xamarin.Forms

Olá, hoje eu irei demonstrar como você pode utilizar o framework de Machine Learning ML.NET em suas aplicações Xamarin.Forms de uma maneira bem simples.

Este post é feito em parceria com Microsoft MVP Gabriel Schade, onde no post ML .NET: Classificador de Sentimentos ele explica o que é o ML.NET e como treinar um modelo de classificação de comentários.  Para este exemplo é de suma importância primeiro ler o post do Gabriel para que você entenda como criar e treinar o seu modelo.

Atualmente, o ML.NET 1.0 não é suportado na arquitetura de processador ARM, afetando aplicativos Xamarin (iOS, Android) e dispositivos IoT baseados em ARM, embora você sempre possa executar os modelos ML no “lado do servidor”  –  Microsoft Blog

Neste exemplo iremos executar o nosso modelo no servidor e consumir em nossas aplicações mobile.

Irei assumir que você acabou de criar um projeto Xamarin.Forms em branco.

O servidor irá retornar um JSON, então para desserialização do mesmo iremos utilizar o Plugin NewtonSoft.Json.

ADICIONANDO O NUGET PACKAGE

Instale o plugin em seu projeto compartilhado.

Screen Shot 2019-05-30 at 13.16.32

 

PredictionResult

Screen Shot 2019-05-30 at 13.28.10

Crie uma classe chamada PredictionResult, que será o objeto retornado pela api contendo as propriedades: Predicition, Probability e Score.

namespace DemoCommentary
{
public class PredictionResult
{
public bool Predicition { get; set; }
public float Probability { get; set; }
public float Score { get; set; }
}
}

view raw
PredictionResult.cs
hosted with ❤ by GitHub

Emoji

Para este exemplo foi utilizado dois emojis, um para quando o comentário é considerado satisfatório e outro para quando o comentário é insatisfatório.

Satisfatório
happy

Insatisfatório
sad

Android

Em seu projeto .Android, adicione as imagens na pasta drawable que se encontra dentro de Resources.
Screen Shot 2019-05-30 at 13.39.54

iOS

Em seu projeto .iOS, adicione as imagens na Resources.

Screen Shot 2019-05-30 at 13.42.39

 

XAML

No arquivo xaml, crie os seguintes componentes:

  • Entry – Para o usuário informar um comentário.
  • Button – Para chamar o método GetResult que irá realizar a chamada para api.
  • Image – Para demonstrar o emoji.
  • Label – Para demonstrar o que foi retornado da api.
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DemoCommentary"
x:Class="DemoCommentary.MainPage">
<StackLayout Margin="20">
<Entry Placeholder="Texto" x:Name="Texto"/>
<Button Text="Resultado" Clicked="GetResult"/>
<Image x:Name="Emoji" WidthRequest="60" HorizontalOptions="Center"/>
<Label x:Name="LblResult" HorizontalOptions="Center"/>
</StackLayout>
</ContentPage>

view raw
MainPage.xaml
hosted with ❤ by GitHub

 

C#

Crie o método “GetResult” que será responsável de realizar a chamada ao método commentary da API concatenando o texto desejado.

Observação: Para este exemplo estou utilizando a API localmente, por isso que o endereço é um endereço de IP.

Após o retorno da API, será demonstrado o emoji de acordo com o a propriedade Predicition. Sendo true para satisfatório e false para insatisfatório.

using System;
using System.ComponentModel;
using System.Net.Http;
using Newtonsoft.Json;
using Xamarin.Forms;
namespace DemoCommentary
{
[DesignTimeVisible(true)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
public async void GetResult(object sender, EventArgs e)
{
if (String.IsNullOrWhiteSpace(Texto.Text))
return;
using (var client = new HttpClient())
{
client.Timeout = new TimeSpan(0, 0, 0, 30);
var request = new HttpRequestMessage
{
RequestUri = new Uri("http://192.168.0.3:5000/api/commentary/" + Texto.Text),
Method = HttpMethod.Get
};
var result = await client.SendAsync(request);
if (!result.IsSuccessStatusCode)
throw new Exception(result.Content.ReadAsStringAsync().Result);
var json = result.Content.ReadAsStringAsync().Result;
var data = JsonConvert.DeserializeObject<PredictionResult>(json);
if (data.Predicition)
Emoji.Source = "happy.png";
else
Emoji.Source = "sad.png";
LblResult.Text = $"Predicition:{data.Predicition}\nScore:{data.Score}\nProbability: {data.Probability}";
}
}
}
}

view raw
MainPage.xaml.cs
hosted with ❤ by GitHub

 

Resultado

ezgif.com-video-to-gif.gif

 

Esse e todos os exemplos deste blog encontram-se disponíveis no GitHub.

icongithub

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s