Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Training Program - Portugal, Aula 10

ATP Portugal
December 10, 2020

Android Training Program - Portugal, Aula 10

Aula #10 Tensorflow Lite no Android 🤖

Continuação da aula anterior. A partir do modelo treinado anteriormente, vamos agora importá-lo para a nossa aplicação.

Está na altura de abrirmos a câmara e ver se reconhecemos algum dos objetos à nossa volta!

- Importar os modelos
- Detetar objetos

ATP Portugal

December 10, 2020
Tweet

More Decks by ATP Portugal

Other Decks in Education

Transcript

  1. • Sejam excelentes uns para os outros • Fale mais

    alto se vir ou ouvir alguma coisa • O assédio não é tolerado • Pratique "Sim e" um ao outro Código de conduta Mais informações: http://bit.ly/2IhF0l3
  2. Andres-Leonardo Martinez-Ortiz Google Carlos Mota Formador Renato Almeida Formador @davilagrau

    @cafonsomota @tallnato Equipa Daniela Ferreira Gestora de comunidades
  3. • 12 aulas • 1h30 cada aula • ~1 aula

    por semana • 14 Outubro a 16 Dezembro • YouTube live • Suporte assíncrono contínuo via Discord/email • Todo o código disponível no GitHub Photo by Arif Riyanto on Unspla O programa
  4. #0 14 de Outubro Pronto para começar #1 21 de

    Outubro Bem-vindos ao Android #2 28 de Outubro Fundações I #3 04 de Novembro Fundações II #4 11 de Novembro Fundações III #5 18 de Novembro Listas, listas e mais listas #6 25 de Novembro Jetpack, Jetpack, Jetpack! #7 - #8 02 - 03 de Dezembro Firebase #9 - #10 09 - 10 de Dezembro MLKit & TensorFlow #11 16 de Dezembro Resumo Semana Semana Calendário ✅ ✅ ✅ ✅ Direto ✅ ✅ ✅ ✅
  5. Sumário Photo by Mika Baumeister on Unsplash • Resumo da

    aula anterior • TensorFlow Lite • Kotlin para principiantes • É Natal
  6. • Pode ser visto como uma forma de ajudar o

    software a realizar uma tarefa sem programar explicitamente ou criar regras • Na programação tradicional, um programador especifica as regras que o computador deve usar • Focado mais em análise de dados do que em programação • São disponibilizados um conjunto de exemplos e o computador aprende a partir destes dados • Podemos ver o machine learning como “programar com dados” Machine learning
  7. • O ML Kit leva a experiência em machine learning

    até aos dispositivos móveis • É uma biblioteca poderosa e fácil de utilizar • Permite que as aplicações Android/iOS ◦ Sejam personalizadas com base nas interações dos utilizadores ◦ Ao mesmo tempo, está otimizada para correr nestes dispositivos • Totalmente gratuito Machine learning para dispositivos móveis
  8. • Identificar e processar códigos de barras • Suporta a

    maioria dos formatos de 1D e 2D disponíveis Detectar códigos de barras Visão
  9. • Detetar rostos • Identificar características faciais • Obter os

    contornos dos rostos Deteção de caras Visão
  10. • Detetar e extrair informações dos objetos • Identifica objetos,

    locais, espécies de animais, produtos, entre outros • Consegue identificar cerca de 400 entidades diferentes Classificação de imagens Visão
  11. • Localizar e seguir até 5 objetos diretamente da câmera

    ou de uma imagem, fornecendo a sua posição e um ID que permite identificar esse objeto num vídeo • Permite personalizar a classificação de objetos com modelos do TensorFlow Lite Detectar e seguir objetos Visão
  12. • Reconhecimento e extração de texto de imagens • Facilita

    a deteção de cartões de crédito, recibos ou cartões de visita Reconhecimento de texto Visão
  13. • Reconhece texto manuscrito e formas desenhadas à mão numa

    superfície digital • Usa a mesma tecnologia utilizada no teclado GBoard e Google tradutor para deteção de escrita manual Reconhecimento de escrita Visão
  14. • Permite detetar a posição do corpo humano em tempo

    real de um vídeo ou de uma imagem estática • Detecta partes do corpo humano tais como ombros e cintura Deteção de poses Visão
  15. • Permite detetar o idioma apenas com algumas palavras •

    Consegue identificar mais de 100 idiomas diferentes Identificação do idioma Linguagem natural
  16. • Permite traduzir entre 58 idiomas, tudo no dispositivo, mas

    apenas para traduções simples • Permite transferir outros idiomas (30MB cada) Tradução no dispositivo Linguagem natural
  17. • Gera sugestões relevantes de respostas em conversas de texto

    • Utiliza o contexto de toda a conversa para dar sugestões • Tudo no dispositivo, sem necessitar de enviar as conversas para o servidor • Apenas funciona em Inglês Sugestões de respostas Linguagem natural
  18. • É uma biblioteca de código aberto, desenvolvida pela Google

    • Oferece API’s que facilitam a implementação de machine learning • Tem um tempo de compilação inferior comparando com outras bibliotecas • Permite fazer o processamento tanto no CPU e GPU • Tem ganho bastante relevo na área • Permite que qualquer pessoa, com ou sem experiência em machine learning, possa construir e utilizar os modelos de machine learning O que é o TensorFlow?
  19. • Latência muito mais reduzida ◦ Uma vez que corre

    tudo localmente • Funciona offline • Os dados nunca saem do dispositivo ◦ Ideal para o caso destes serem sensíveis • Mais eficiente ◦ Não é necessário estar a enviar/ receber dados do servidor • Todos os sensores já se encontram disponíveis nos telemóveis atuais Porquê correr nos telemóveis?
  20. • Recursos limitados ◦ Não é possível modificar o hardware

    dos telemóveis… ◦ … a não ser comprando um novo • Outras aplicações também se encontram a competir por recursos • Limites de memória • Tem de utilizar pouca energia de forma a poupar as baterias • Baixo poder computacional Dificuldades
  21. • O TensorFlow Lite é uma versão do TensorFlow mais

    leve, desenvolvida especificamente para dispositivos móveis ou dispositivos embutidos • Tipicamente têm menos capacidade de processamento e armazenamento • O TensorFlow Lite permite que o processamento seja feito no dispositivo, evitando o envio dos dados para o servidor para posterior análise • Disponível para Android, iOS e Linux O que é o TensorFlow Lite?
  22. • Um modelo de TensorFlow é uma estrutura de dados

    que contém a lógica e conhecimento de uma rede de machine learning treinada para resolver uma problema específico • Para utilizar um modelo no TensorFlow Lite é primeiro preciso converter um treinado previamente no formato do TensorFlow. Escolher um modelo Como funciona?
  23. • Para utilizar um modelo TensorFlow no TensorFlow Lite é

    necessário converter o modelo • A conversão do modelo reduz o tamanho do ficheiro e introduz o otimizações que não afectam a precisão Converter Como funciona?
  24. • Pegar no ficheiro .tflite comprimido e adicionar à aplicação

    • Correr os dados no modelo para obter as previsões Lançar Como funciona?
  25. • O TF Lite tem ferramentas para otimizar o tamanho

    e performance dos modelos, com impacto mínimo na precisão. • Modelos otimizados podem precisar de um treino, conversão ou integração mais complexos • O objetivo, é chegar a um equilíbrio ideal de desempenho, tamanho do modelo e precisão para um determinado dispositivo Otimizar Como funciona?
  26. Resumo Como funciona? Treinado Modelo de TensorFlow Convertido (para o

    formato do TensorFlow lite) Android App (Java/C++ API) iOS App (C++ API) Linux (ex. Pi) (Python/Java/C++ API)
  27. • O Firebase ML permite guardar o nosso modelo num

    servidor, e depois distribuir pelos utilizadores • Permite reduzir o tamanho do APK, sendo que a transferência do modelo é feito posteriormente • Permite ainda realizar testes A/B, para medir a performance e valor dos diferentes modelos • Permite atualizar o modelo sem ter que lançar uma aplicação nova Firebase ML
  28. val remoteModel = FirebaseCustomRemoteModel.Builder("dogs").build() val conditions = FirebaseModelDownloadConditions.Builder() .requireWifi() .build()

    FirebaseModelManager.getInstance().download(remoteModel, conditions) .addOnCompleteListener { // Usar o modelo } Como utilizar? Transferir o modelo
  29. val remoteModel = FirebaseCustomRemoteModel.Builder("dogs").build() val conditions = FirebaseModelDownloadConditions.Builder() .requireWifi() .build()

    FirebaseModelManager.getInstance().download(remoteModel, conditions) .addOnCompleteListener { // Usar o modelo } Como utilizar? Transferir o modelo
  30. val remoteModel = FirebaseCustomRemoteModel.Builder("dogs").build() val conditions = FirebaseModelDownloadConditions.Builder() .requireWifi() .build()

    FirebaseModelManager.getInstance().download(remoteModel, conditions) .addOnCompleteListener { // Usar o modelo } Como utilizar? Transferir o modelo
  31. val remoteModel = FirebaseCustomRemoteModel.Builder("dogs").build() val conditions = FirebaseModelDownloadConditions.Builder() .requireWifi() .build()

    FirebaseModelManager.getInstance().download(remoteModel, conditions) .addOnCompleteListener { // Usar o modelo } Como utilizar? Transferir o modelo
  32. • Solução que permite reconhecer a partir de um modelo

    pré-treinado, 1000 tipos de itens diferentes diretamente da câmera de um dispositivo móvel • Curiosidade: ◦ Exemplo disponível para Raspberry Pi Classificação de imagens https://github.com/tensorflow/examples/tree/master/lite/examples/image_classification/android
  33. • Utilizando um modelo pré-treinado, permite desenhar um retângulo com

    a respectiva descrição de mais de 1000 objetos Deteção de objectos https://github.com/tensorflow/examples/blob/master/lite/examples/object_detection/android/
  34. • Este exemplo deteta continuamente as partes do corpo que

    estão visíveis pela câmera do dispositivo Deteção de pose https://github.com/tensorflow/examples/blob/master/lite/examples/posenet/android/
  35. • A segmentação de uma imagem é o processo de

    dividir a imagem em vários segmentos • O objetivo é simplificar a representação da imagem para algo com mais significado e fácil de analisar Segmentação https://github.com/tensorflow/examples/tree/master/lite/examples/image_segmentation/android
  36. • É uma técnica que permite pegar no estilo de

    uma imagem e aplicar a outra Transferência de estilo https://github.com/tensorflow/examples/tree/master/lite/examples/style_transfer/android
  37. • BERT ◦ Bidirectional Encoder Representations from Transformers • Permite

    utilizar um modelo pré-treinado para responder a questões baseadas num excerto de texto BERT - Questões e respostas https://github.com/tensorflow/examples/tree/master/lite/examples/bert_qa/android
  38. • Recomendações personalidades são usadas numa variedade de casos, como

    sugestão de uma produto, sugestão de próximo vídeo a ver, ou aplicação a abrir • As recomendações são baseados nas opções feitas pelo utilizador Recomendações https://github.com/tensorflow/examples/tree/master/lite/examples/recommendation/android
  39. • Utiliza o TensorFlow de forma a melhorar a experiência

    dos hóspedes. • Através do Machine Learning conseguiram categorizar as imagens das casas permitindo agrupar e identificar as várias divisões da casa. • Com isto também conseguiram validar as características das casas, e por exemplo, validar o número de quartos https://medium.com/airbnb-engineering/categorizing-listing-photos-at-airbnb-f9483f3ab7e3 Airbnb Casos de estudo
  40. • Com a API de detecção de objetos, conseguiram rapidamente

    detetar objetos e outras propriedades que constituem uma casa, através da análise das imagens • Isto permite fornecer ao hóspede a hipótese de escolher a casa em função das características pretendidas https://medium.com/airbnb-engineering/categorizing-listing-photos-at-airbnb-f9483f3ab7e3 Airbnb Casos de estudo
  41. • A Coca-Cola utilizou machine learning para detetar os códigos

    das tampas das garrafas em dispositivos móveis • Os OCR’s convencionais não eram suficientemente eficazes a ler códigos, que por vezes até eram difíceis de ler com o olho humano https://developers.googleblog.com/2017/09/how-machine-learning-with-tensorflow.html Coca-Cola Casos de estudo
  42. • O PayPal utilizar TensorFlow para estar sempre na vanguarda

    no que diz respeito à deteção de fraudes • Usando TensorFlow, deep transfer learning e generative modeling, o PayPal foi capaz de reconhecer cada vez com mais precisão possíveis fraudes enquanto que ao mesmo tempo melhora a experiência de utilização aos clientes legítimos https://medium.com/paypal-engineering PayPal Casos de estudo
  43. https://blog.tensorflow.org/2019/03/ranking-tweets-with-tensorflow.html Twitter Testemunhos • O Twitter usa machine learning para

    melhorar a feed dos utilizadores • Usando várias variáveis, como quando foi feito o Tweet, o número de Retweets ou likes, interações passadas entres os utilizadores, entre outras coisas • Permite que seja feita uma ordenação dos Tweets em função das preferências do utilizador
  44. TensorFlow Hub • O TensorFlow Hub é um repositório de

    modelos de machine learning já treinados, prontos a serem utilizados e lançados em qualquer plataforma • Permite utilizar modelos já treinados, tais como o BERT, apenas com algumas linhas de código • É aberto a contributos da comunidade
  45. @Deprecated fun getBreedsList(): List<Dog> { // Código } val breeds

    = getBreedsList() Deprecated @Deprecated public List<Dog> getBreedsList() { // Código } List<Dog> breeds = getBreedsList();
  46. @Deprecated fun getBreedsList(): List<Dog> { // Código } val breeds

    = getBreedsList() @Deprecated public List<Dog> getBreedsList() { // Código } List<Dog> breeds = getBreedsList(); getBreedsList() : List<Dog> is deprecated. getBreedsList() : List<Dog> is deprecated. Deprecated
  47. @Deprecated( message = “Use getBreeds() instead”, replaceWith = ReplaceWith(“getBreeds()”) fun

    getBreedsList(): List<Dog> { // Código } val breeds = getBreedsList() @Deprecated public List<Dog> getBreedsList() { // Código } List<Dog> breeds = getBreedsList(); Deprecated
  48. @Deprecated( message = “Use getBreeds() instead”, replaceWith = ReplaceWith(“getBreeds()”) fun

    getBreedsList(): List<Dog> { // Código } val breeds = getBreedsList() @Deprecated public List<Dog> getBreedsList() { // Código } List<Dog> breeds = getBreedsList(); getBreedsList() : List<Dog> is deprecated. Replace with ‘getBreeds()’ Replace usages of ‘getBreedsList() on List<Dog>’ in whole project Deprecated
  49. @Deprecated( message = “Use getBreeds() instead”, replaceWith = ReplaceWith(“getBreeds()”) fun

    getBreedsList(): List<Dog> { // Código } val breeds = getBreedsList() @Deprecated public List<Dog> getBreedsList() { // Código } List<Dog> breeds = getBreedsList(); getBreedsList() : List<Dog> is deprecated. Replace with ‘getBreeds()’ Replace usages of ‘getBreedsList() on List<Dog>’ in whole project alt + enter Deprecated
  50. @Deprecated( message = “Use getBreeds() instead”, replaceWith = ReplaceWith(“getBreeds()”) fun

    getBreedsList(): List<Dog> { // Código } val breeds = getBreeds() @Deprecated public List<Dog> getBreedsList() { // Código } List<Dog> breeds = getBreedsList(); getBreedsList() : List<Dog> is deprecated. Deprecated
  51. fun createDog(name: String, breed: String) {} createDog(“Fifi”, “Yorkshire Terrier”) public

    void createDog(String name, String breed) {} createDog(“Fifi”, “Yorkshire Terrier”) Constructor overloads
  52. fun createDog(name: String = “unknown”, breed: String) {} createDog(“Fifi”, “Yorkshire

    Terrier”) createDog(breed = “Yorkshire Terrier”) public void createDog(String name, String breed) {} public void createDog(String breed) { String name = “unknown” } createDog(“Fifi”, “Yorkshire Terrier”) createDog(“Yorkshire Terrier”) Constructor overloads
  53. fun createDog(name: String = “unknown”, breed: String = “unknown”) {}

    createDog(“Fifi”, “Yorkshire Terrier”) createDog(breed = “Yorkshire Terrier”) createDog() public void createDog(String name, String breed) {} public void createDog(String breed) { String name = “unknown” } public void createDog() { String name = “unknown” String breed = “unkown” } createDog(“Fifi”, “Yorkshire Terrier”) createDog(“Yorkshire Terrier”) createDog() Constructor overloads
  54. fun createDog(name: String = “unknown”, breed: String = “unknown”) {}

    createDog(“Fifi”, “Yorkshire Terrier”) createDog(breed = “Yorkshire Terrier”) createDog() public void createDog(String name, String breed) {} public void createDog(String breed) { String name = “unknown” } public void createDog() { String name = “unknown” String breed = “unkown” } createDog(“Fifi”, “Yorkshire Terrier”) createDog(“Yorkshire Terrier”) createDog() Constructor overloads Kotlin, vem dar uma mão nas chamadas a partir de Java
  55. @JvmOverloads fun createDog(name: String = “unknown”, breed: String = “unknown”)

    {} createDog(“Fifi”, “Yorkshire Terrier”) createDog(breed = “Yorkshire Terrier”) createDog() createDog(“Fifi”, “Yorkshire Terrier”) createDog(“Yorkshire Terrier”) createDog() @JvmOverloads
  56. fun createDog(name: String = “unknown”, breed: String = “unknown”) {

    // Código } Chamar código escrito em Kotlin a partir de Java @JVMOverloads .decompiled.java
  57. @JvmOverloads fun createDog(name: String = “unknown”, breed: String = “unknown”)

    { // Código } Chamar código escrito em Kotlin a partir de Java @JVMOverloads @JvmOverloads public createDog(String name, String breed) {} @JvmOverloads public createDog(String name) { createDog(name, “unknown”) } @JvmOverloads public createDog() { createDog(“unknown”, “unknown”) } .decompiled.java
  58. fun deviceName() Chamar código escrito em Kotlin a partir de

    Java @file:JvmName ValuesKt.deviceName(); Values.kt
  59. @file:JvmName(“Cat”) @file:JvmMultifileClass fun deviceName() Chamar código escrito em Kotlin a

    partir de Java @file:JvmMultifileClass @file:JvmName(“Cat”) @file:JvmMultifileClass fun hasBattery() Values.kt DeviceInfo.kt
  60. class Values { companion object { fun dogs() {} }

    } Chamar código escrito em Kotlin a partir de Java @JvmStatic Valueskt.dogs() // Erro Values.dogs() // Erro Values.kt
  61. class Values { companion object { @JvmStatic fun dogs() {}

    } } Chamar código escrito em Kotlin a partir de Java @JvmStatic Values.dogs() Values.kt
  62. Lottie Uma biblioteca para Android e iOS que permite utilizar

    as animações criadas com o Adobe After Effects (exportadas no formato JSON) nativamente no telemóvel. https://github.com/airbnb/lottie-android
  63. AppIntro https://github.com/AppIntro/AppIntro Biblioteca Android que te permite construir muito facilmente

    um ecrã introdutório para a tua app. Tens ainda a possibilidade de integrar com o sistema de permissões nativo
  64. Balloon https://github.com/skydoves/Balloon Uma biblioteca muito leve que permite criar popups

    muito facilmente, customizáveis e com diferentes animações.
  65. Trabalho para casa • Adicionar à nossa aplicação a opção

    de identificar a raça de um cão ◦ Ou se quiserem, vários cães ao mesmo tempo 1 - Yorkshire Terrier 2 - Labrador Retriever 3 - Boxer