CoreML: Deep Learning embarcada — e em tempo real — no seu iPhone

Prof. João Gabriel Lima
6 min readSep 19, 2017

--

Captura e identificação de objetos usando o modelo MobileNets

Você que já conhece sobre este tema, talvez tenha achado o título bastante otimista. Bem, essa é a idéia!

Para você que gostaria de entender mais sobre o assunto, seja muito bem vindo e qualquer dúvida fique à vontade para entrar em contato comigo, pelos comentários ou por e-mail: joaogabriellima.eng@gmail.com

Neste artigo você verá:

  • O que é CoreML?
  • Quais são as limitações do framework?
  • Quais são os modelos computacionais suportados?
  • Os Prós e Contras
  • iDeepVision — Projeto showcase completo com 5 modelos de Deep Neural Networks para a identificação de objetos

Deep Learning é um dos temas em tecnologia mais divulgado nos últimos anos. Não é uma proposta recente, entretanto vem ganhando cada vez mais espaço. Modelos computacionais de inteligência, capazes de aprender padrões complexos, com alta capacidade de processamento e precisão nos resultados. Este artigo trata exatamente deste assunto, mas não executando dentro de uma poderosa cloud com GPU mas de dentro do seu próprio smartphone. =D

Vamos lá! O que é o CoreML?

Apresentado no WWDC 2017 em Junho deste ano, o CoreML é a proposta da Apple para embarcar modelos computacionais de inteligência em seus dispositivos. Uma forma simplificada para que os desenvolvedores possam explorar ao máximo as inovações em Machine Learning.

A Apple já havia nos presenteado com os frameworks Metal CNN e o BNN para a construção de Redes Neurais Convolucionais, mas com o CoreML ficou muito mais fácil a construção de aplicações mobile inteligentes.

Essa inovação está presente a partir do iOS 11.

Nestes passos iniciais, as aplicações mais comuns foram na área de Detecção de Objetos em tempo real. Que se trata de uma aplicação bastante interessante e que nos dá a oportunidade para a criação de soluções ainda mais complexas.

Nesta abordagem, sua utilização é muito simples: basta carregar os modelos pré-treinados em formato .mlmodel e executar a função de predição.

Basta carregar os modelos pré-treinados em formato .mlmodel e executar a função de predição.

Por exemplo, o modelo ResNet50, uma rede neural residual profunda para o reconhecimento de imagem, com 50 camadas (mais detalhes em: Deep Residual Learning for Image Recognition https://arxiv.org/pdf/1512.03385.pdf), pode ser utilizada da seguinte forma:

Inicializa um novo objeto a partir da classe do modelo:

let model = ResNet50()

Obtém uma imagem e, através do objeto model instanciado anteriormente, executa a predição, resulta a classe que foi identificada na imagem.

let pixelBuffer: CVPixelBuffer = /*Instância da nova imagem*/if let prediction = try? model.prediction(image: pixelBuffer) {
print(prediction.classLabel)
}

O processo de instância do modelo e execução da detecção pode ser visto abaixo através da imagem extraída da apresentação oficial no WWDC 2017.

Processo de identificação de de imagens com CoreML — Fonte: Apresentação oficial WWDC 2017

Importante destacar que o CoreML irá decidir por você se precisará o usar a CPU ou GPU, além disso, ao contrário do Metal, você pode executá-lo usando o simulador, facilitando ainda mais o processo de desenvolvimento.

E as limitações?

Apesar de ser uma abordagem fantástica, temos que conhecer bem as suas limitações e saber tomar a decisão de utilizar corretamente o framework.

Conheça abaixo as principais limitações do CoreML:

  • Os tipos de modelos suportados são apenas para o aprendizado supervisionado. Logo, modelos não supervisionados e por reforço estão fora desta abordagem inicial do framwork
  • Você precisa carregar modelos pré-treinados, não sendo possível o treinamento dentro do dispositivo.
  • Só serão executados os modelos que possuem as camadas suportadas pelo CoreML, caso utilize alguma camada na sua deep neural que não seja suportada, ele não será executado.
  • Você não verá as saídas produzidas pelas camadas intermediárias, apenas o resultado final da camada de saída
  • Você não determinará se sua aplicação usará a CPU ou GPU (mais indicado), e terá que confiar que o framework escolherá a melhor forma de executar seu modelo.
  • Você não terá o controle total sobre como o CoreML está processando seu modelo. Se isso for importante para seu projeto, talvez queira usar diretamente o Metal Performance Shader https://developer.apple.com/documentation/metalperformanceshaders
  • Não é open source =/

Atualmente quais os modelos suportados?

Com o CoreML você pode integrar uma grande variedade de modelos de Machine Learning em suas aplicações mobile.

No próprio site da apple https://developer.apple.com/machine-learning/ você poderá baixar os mais famosos modelos para identificação de imagens e detecção de objetos, como: Inception v3, MobileNet, SqueezeNet, ResNet50, VGG16

Modelos implementados no projeto showcase — iDeepVision

Apesar da aplicação mais comumente divulgada ser a detecção de objetos, podemos utilizar o CoreML em outras soluções, como por exemplo: Outras redes neurais do tipo CNN, RNN, Feed Forward, Regressão linear e logística, Árvores de Decisão, Suporte Vector Machines (SVM).

Como funciona o .mlmodel?

Como já dito anteriormente, para executar você precisa de um modelo no formato .mlmodel.

Primeiramente você precisa entender que para converter um modelo pre-treinado para mlmodel você irá usar a ferramenta coremltools, um pacote python que irá facilitar sua vida. Então, tendo em vista que o mlmodel é baseado no modelo de serialização de arquivo protobuf. A Apple nos disponibiliza o arquivo de especificação completo do CoreML aqui.

Ao abrir o arquivo Model.proto, você você algo parecido com a imagem abaixo:

import public “ArrayFeatureExtractor.proto”;
import public “CategoricalMapping.proto”;
import public “DictVectorizer.proto”;
import public “FeatureTypes.proto”;
import public “FeatureVectorizer.proto”;
import public “GLMRegressor.proto”;
import public “GLMClassifier.proto”;
import public “Identity.proto”;
import public “Imputer.proto”;
import public “NeuralNetwork.proto”;
import public “Normalizer.proto”;
import public “OneHotEncoder.proto”;
import public “Scaler.proto”;
import public “SVM.proto”;
import public “TreeEnsemble.proto”;
package CoreML.Specification;

Tudo o que for suportado pelo CoreML você verá neste arquivo. Dai você me pergunta: "É possível ver a arquitetura dos modelos de deep neural networks também para ver suas camadas a estrutura?" Sim! Absolutamente.

Perceba, portanto, que não estamos tratando de uma caixa preta, pois você conseguirá entender como o modelo funciona e quais os resultados esperados de sua execução.

Quer começar a criar aplicações mais inteligentes?

Estou disponibilizando no github (https://github.com/jgabriellima/ideepvision) um projeto completo, contando com os 5 modelos principais de detecção de objetos e identificação de imagens.

O projeto foi chamado de iDeepVision, fazendo uma alusão aos projetos apple ( "i" ) somado a proposta principal de visão computacional utilizando Deep Neural Netwoks.

Deixe seu comentário e no próximo artigo, mostrarei a implementação passo a passo do projeto.

https://github.com/jgabriellima/ideepvision

Prós e Contras de usar o CoreML

Você precisa entender que o CoreML não faz mágica. Apesar de ser uma proposta muito interessante e que surgiu no momento certo da evolução tecnológica, nesta seção vou apresentar alguns prós e contras que lhe guiarão na melhor decisão sobre como utilizar o framework.

Prós:

  • Suporta a conversão de modelos construídos a partir das principais plataformas disponíveis no mercado, como: Keras e Caffe
  • Além de Deep Learning, suporta os modelos clássicos de Machine Learning
  • Fácil de integrar e usar, onde a principal limitação fica a critério da sua própria imaginação.

Contras:

  • Funciona apenas a partir do iOS 11
  • Você terá pouco controle sobre sua execução. A API é bastante básica e se limita em carregar o modelo e executá-lo.
  • A ferramenta de conversão coremltools, atualmente suporte apenas alguns pacotes de treinamento, deixando de fora o famoso e muito utilizado Tensorflow.

Já existiram outras propostas de embarcar os modelos de deeplearning!

E todas são muito interessantes! Algumas mais complexas de implementar e integrar em sua aplicação, entretanto merecem estar aqui por sua notoriedade e contribuição para a evolução da tecnologia.

Abaixo você verá a lista dessas principais propostas:

Considerações Finais

A apresentação oficial pode ser baixada em: https://devstreaming-cdn.apple.com/videos/wwdc/2017/710vxa4hl8hyb72/710/710_core_ml_in_depth.pdf e em https://developer.apple.com/videos/play/wwdc2017/710/

Se você gostou, Deixe um feedback! No próximo artigo vou mostrar a construção passo-a-passo da aplicação showcase iDeepVision para que você entenda com detalhes como implementar um novo projeto com um modelo de deep neural network embarcado.

Linkedin: https://www.linkedin.com/in/joaogabriellima/

Twitter: https://twitter.com/jgabriel_lima

Github: https://github.com/jgabriellima

--

--