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. Android
    Training
    Program
    PORTUGAL
    Aula #10
    TensorFlow Lite no
    Android

    View Slide

  2. ● 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

    View Slide

  3. Andres-Leonardo
    Martinez-Ortiz
    Google
    Carlos Mota
    Formador
    Renato Almeida
    Formador
    @davilagrau @cafonsomota @tallnato
    Equipa
    Daniela Ferreira
    Gestora de
    comunidades

    View Slide

  4. ● 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

    View Slide

  5. #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

    ✅ ✅ ✅

    View Slide

  6. Sumário
    Photo by Mika Baumeister on Unsplash
    ● Resumo da aula anterior
    ● TensorFlow Lite
    ● Kotlin para principiantes
    ● É Natal

    View Slide

  7. http://events.withgoogle.com/atp2020
    [email protected]
    http://bit.ly/atp2020-youtube
    http://bit.ly/atp2020-discord
    Links

    View Slide

  8. http://bit.ly/atp2020-live

    View Slide

  9. http://bit.ly/atp2020-codelabs

    View Slide

  10. http://bit.ly/kahoot-aula10

    View Slide

  11. Resumo da Aula #9

    View Slide

  12. ● 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

    View Slide

  13. https://about.google/intl/ALL_us/stories/seeingpotential/

    View Slide

  14. Navegação com uma conta registada

    View Slide

  15. https://about.google/intl/ALL_us/stories/save-the-bees/

    View Slide

  16. ● 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

    View Slide

  17. ● 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

    View Slide

  18. ● Detetar rostos
    ● Identificar características faciais
    ● Obter os contornos dos rostos
    Deteção de caras
    Visão

    View Slide

  19. ● 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

    View Slide

  20. ● 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

    View Slide

  21. ● 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

    View Slide

  22. ● 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

    View Slide

  23. ● 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

    View Slide

  24. ● Permite detetar o idioma apenas com algumas palavras
    ● Consegue identificar mais de 100 idiomas diferentes
    Identificação do idioma
    Linguagem natural

    View Slide

  25. ● 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

    View Slide

  26. ● 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

    View Slide

  27. Aula #10

    View Slide

  28. TensorFlow

    View Slide

  29. ● É 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?

    View Slide

  30. TensorFlow Lite

    View Slide

  31. ● 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?

    View Slide

  32. ● 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

    View Slide

  33. Mas o TensorFlow foi inicial desenvolvido para ser utilizado em
    servidores....

    View Slide

  34. ● 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?

    View Slide

  35. ● 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?

    View Slide

  36. ● 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?

    View Slide

  37. ● Pegar no ficheiro .tflite comprimido e
    adicionar à aplicação
    ● Correr os dados no modelo para obter as
    previsões
    Lançar
    Como funciona?

    View Slide

  38. ● 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?

    View Slide

  39. 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)

    View Slide

  40. E se o nosso modelo alterar?

    View Slide

  41. Lançar uma versão nova da aplicação?

    View Slide

  42. Lançar uma versão nova da aplicação?
    meh

    View Slide

  43. E se existir uma forma melhor?

    View Slide

  44. View Slide

  45. https://firebase.google.com/products/ml

    View Slide

  46. ● 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

    View Slide

  47. dependencies {
    implementation platform('com.google.firebase:firebase-bom:26.1.0')
    implementation 'com.google.firebase:firebase-ml-model-interpreter'
    }
    Como utilizar?
    Importar a biblioteca
    app/build.gradle

    View Slide

  48. View Slide

  49. 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

    View Slide

  50. 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

    View Slide

  51. 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

    View Slide

  52. 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

    View Slide

  53. Fabiana
    Clemente
    Federated Learning
    e casos de uso
    Chief Data Officer @YData
    @fab_clemente

    View Slide

  54. Exemplos

    View Slide

  55. ● 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

    View Slide

  56. ● 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/

    View Slide

  57. ● 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/

    View Slide

  58. ● 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

    View Slide

  59. ● É 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

    View Slide

  60. Transferência de estilo

    View Slide

  61. ● 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

    View Slide

  62. ● 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

    View Slide

  63. https://www.tensorflow.org/lite/examples

    View Slide

  64. Demos

    View Slide

  65. View Slide

  66. https://teachablemachine.withgoogle.com/

    View Slide

  67. https://emojiscavengerhunt.withgoogle.com/

    View Slide

  68. https://magenta.tensorflow.org/demos/

    View Slide

  69. https://experiments.withgoogle.com/search?q=tensorflow

    View Slide

  70. https://deepdreamgenerator.com/

    View Slide

  71. Casos de estudo

    View Slide

  72. ● 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

    View Slide

  73. ● 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

    View Slide

  74. ● 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

    View Slide

  75. ● 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

    View Slide

  76. 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

    View Slide

  77. TenserFlow Hub

    View Slide

  78. https://www.tensorflow.org/hub

    View Slide

  79. 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

    View Slide

  80. Abre o Android
    Studio e vamos
    começar a
    programar
    ‍‍

    View Slide

  81. https://codelabs.developers.google.com/codelabs/recognize-flowers-with-tensorflow-on-android

    View Slide

  82. http://vision.stanford.edu/aditya86/ImageNetDogs/

    View Slide

  83. http://vision.stanford.edu/aditya86/ImageNetDogs/

    View Slide

  84. VS
    Ronda 9

    View Slide

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

    View Slide

  86. @Deprecated
    fun getBreedsList(): List {
    // Código
    }
    val breeds = getBreedsList()
    @Deprecated
    public List getBreedsList() {
    // Código
    }
    List breeds = getBreedsList();
    getBreedsList() : List is deprecated. getBreedsList() : List is deprecated.
    Deprecated

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  92. 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

    View Slide

  93. 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

    View Slide

  94. 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

    View Slide

  95. @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

    View Slide

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

    View Slide

  97. @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

    View Slide

  98. fun deviceName()
    Chamar código escrito
    em Kotlin a partir de
    Java
    @file:JvmName
    ValuesKt.deviceName();
    Values.kt

    View Slide

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

    View Slide

  100. @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

    View Slide

  101. 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

    View Slide

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

    View Slide

  103. Natal
    Photo by Mel Poole Unsplash

    View Slide

  104. 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

    View Slide

  105. 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

    View Slide

  106. Balloon

    https://github.com/skydoves/Balloon
    Uma biblioteca muito leve que permite criar
    popups muito facilmente, customizáveis e com
    diferentes animações.

    View Slide

  107. RecyclerView animators

    https://github.com/wasabeef/recyclerview-animators
    Uma biblioteca de animações que podes utilizar
    nas RecyclerView’s da tua aplicação.

    View Slide

  108. SmallBang

    https://github.com/hanks-zyh/SmallBang
    Animação de favoritos numa vista.

    View Slide

  109. FABProgressCircle

    https://github.com/JorgeCastilloPrz/FABProgressCircle
    Animação de progresso em volta de um
    FloatingActionButton.

    View Slide

  110. AnimatedBottomBar

    https://github.com/Droppers/AnimatedBottomBar
    Uma bottom bar customizável com diferentes
    tipos de animações.

    View Slide

  111. Trabalho Para Casa
    ‍‍

    View Slide

  112. 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

    View Slide

  113. Dúvidas?

    View Slide

  114. Continuamos a
    responder no
    discord

    View Slide

  115. Obrigado
    ‍♀

    View Slide

  116. Android
    Training
    Program
    PORTUGAL
    Aula #11
    Resumo
    Próxima aula: 16 de Dezembro

    View Slide