Danilo Lira

Mobile & Web Software Engineer

Como utilizar aprendizagem de máquina no seu app iOS


Recentemente desenvolvi um aplicativo com o objetivo de aprender a utilizar a biblioteca Core ML da Apple. Meu intuito era realmente aprender um pouco sobre aprendizagem de máquina, um assunto o qual eu não tinha nenhuma familiaridade. Desde que entrei na faculdade ouço falar sobre aprendizagem de máquina, porém esse tópico parecia muito complexo e místico quase como se fosse magia, mas durante esse projeto vi que a utilização dessa tecnologia, hoje, é bastante acessível até mesmo para pessoas que possuem pouco ou nenhum conhecimento, são necessárias apenas algumas horinhas de dedicação.

Pra facilitar ainda mais o processo decidi escrever este artigo mostrando como se faz para criar um modelo e utilizá-lo no seu app.

Mas o que é um modelo?

Provavelmente você deve estar se perguntando o que é isto, mas calma que o conceito é bem simples. Um modelo é uma representação do processo de aprendizagem de máquina, ou seja, é o programinha que vamos treinar para reconhecer certos padrões. No caso do meu projeto, o modelo era treinado ,com milhares de imagens diferentes de cada um, para reconhecer Pokemons.

Lista de imagens do Pokemon Abra

Para criar seu próprio modelo você pode utilizar diversos programas, o que escolhi para esse projeto foi o Create ML, que é um software da Apple voltado exatamente para isso. O modelo é o que vai definir o que será reconhecido e a sua precisão depende da qualidade do treino.

Criando seu modelo

O modelo é o que determina a capacidade de reconhecimento da sua máquina, é ele que será usado como referência na hora de identificar os padrões. O Create ML facilita demais esse processo de criação, nele podemos jogar imagens classificadas em pastas e o programa já reconhece quantos objetos diferentes precisará detectar.

Crie uma pasta contendo várias pastas dentro, cada uma delas deve ter várias fotos do objeto que você quer reconhecer. Se você pretender reconhecer Pokemons então cada pasta será o nome de um deles e irá conter várias fotos. É importante que essas imagens sejam bastante diversas com diferentes ângulos e luminosidade, isso melhora bastante a precisão do modelo.

Depois disso basta jogar a pasta no Create ML e ele irá criar o modelo pra você.

/media/8249728f09ff918ff05daafffd85a2c9Inserindo dados para criação do modelo

Quando o treino acabar, um arquivo do tipo .mlmodel será gerado, ele representa nosso modelo já treinado e é incrivelmente leve. Podemos testar a sua eficácia no próprio Create ML, jogando algumas imagens de teste para que ele retorne o seu palpite e nível de precisão

Exemplo de classificação do Create ML com o desenho do Bulbassauro

Como meu modelo foi treinado para reconhecer Pokemons, utilizei um desenho, feito por meu amigo Matheus, e mesmo que não esteja muito fiel foi reconhecido com uma boa precisão neste modelo. Agora com o modelo pronto, vamos inseri-lo no código para reconhecer nossos Pokemons.

Utilizando o modelo

Inserir o modelo treinado no código é tão simples quanto arrastar um arquivo, basta, literalmente, jogar o arquivo .mlmodel no seu Xcode e ele já possuirá todas as classes que poderão ser utilizadas.

Tela do modelo inserido no projeto com imagem sendo testada

No caso do reconhecimento de imagens, precisaremos criar um código que receberá nossas imagens no formato ideal para a identificação. Visando facilitar o entendimento irei dividir o processo de identificação em quatro funções dentro de uma classe chamada PokeIdentifier, cada uma será uma etapa do processo, mas você não precisa seguir essa estrutura. As etapas são: Preparar a imagem, criar a requisição, processar a requisição e obter resultados.

1- Preparar a imagem

Nesta etapa nós recebemos a imagem que queremos identificar no formato UIImage e iremos transformá-la em uma CIImage. Esse processo é necessário porque uma CIImage é um objeto que possui todos os dados de uma imagem, mas não é a imagem em por si só e com esse novo objeto podemos criar um manipulador de requisições, que é quem vai lidar com a solicitação de identificação e dizer se ela poderá ser executada ou não.

Esse manipulador é do tipo VNImageRequestHandler e recebe uma imagem e sua orientação (cima, baixo, esquerda, direita).

/media/94fc117a7e3e8b17a443469ad84b016aCódigo da função de identificação

Vamos utilizar o resultado dessa função mais tarde para processar nossa requisição, mas antes precisamos criá-la.

2- Criar a requisição

Nesta segunda etapa, vamos tentar criar nossa requisição utilizando o modelo treinado. Nela iremos apenas criar e configurar nossa requisição, nesse caso a única configuração feita foi relacionada ao recorte e escala da imagem, que foi configurado para ser centralizado.

/media/80ba7273e2dce6f65f4ed2aa2fa4ca0b

3- Obter resultados

Esta última função serve para pegarmos os resultados obtidos. Os resultados são retornados como uma lista das possíveis identificações do modelo junto com seu nível de precisão, essa lista está ordenada pelo maior nível de precisão. Aqui o processo de identificação já foi realizado e essa função tem o objetivo apenas de organizar o que foi resultado.

/media/0daae18b8885b752b05a82b030a2a7ae

4- Executar as funções

Por fim podemos criar uma função que será a responsável por chamar cada etapa desse processo na ordem correta e nos retornar os valores que queremos. Primeiro tratamos a imagem e recebemos o manipulador, depois criamos a requisição, em seguida iremos utilizar o manipulador para processar a requisição e por último iremos filtrar os resultados. Neste caso o meu interesse era o nome do Pokemon com maior precisão de acerto.

/media/0c22b2ec270f2e33a22854f2be098bb3

Considerações Finais

Adaptando as imagens do modelo e a função de obter resultados, você pode utilizar isso para reconhecer qualquer tipo de imagem nos seus projetos e se quiser ver como apliquei no meu projeto acesse o GitHub.


Espero ter conseguido mostrar como é fácil utilizar a aprendizagem de máquina com o Core ML e fazer coisas incríveis ou completamente inúteis com isso. Quero agradecer a Matheus Andrade por ter feito esse projeto comigo e me ensinado bastante e a você por ter lido até aqui.