Olá! Boas-vindas a mais um conteúdo de Android na Alura. Meu nome é Júnior, serei seu instrutor.
Audiodescrição: Junior Martins é uma pessoa de pele clara. Tem olhos castanhos e cabelos loiro-escuros, longos e amarrados atrás da cabeça. Usa óculos de grau com armação arredondada preta e está com uma camiseta também preta. Ao fundo, uma parede clara e lisa com iluminação em degradê, que vai do azul até o rosa.
Neste curso, vamos explorar mais utilidades da Biblioteca de Machine Learning (Aprendizado de Máquina) da Google para Android. Para isso, vamos utilizar o aplicativo Galeri-IA, que permite analisar imagens de diversas fontes, como do dispositivo da pessoa usuária final e aquelas de dentro do aplicativo em si.
Vamos ver como fazer a análise de uma imagem selecionada. Podemos selecionar, por exemplo, a imagem de um bolo. Quando selecionamos, são trazidas algumas tags, como, por exemplo, Food
e Cake
, indicando que é uma comida e que há um bolo presente.
Vamos ver que, além de conseguir analisar uma única imagem da galeria em que vamos focar, a aplicação também fará a análise de várias imagens simultaneamente.
Para cada imagem que clicarmos, vamos trazer seus respectivos rótulos. Para isso, vamos utilizar uma biblioteca da Google, a Image Labeling, focada na rotulagem de imagens para dispositivos móveis.
Vamos entender como definir alguns parâmetros, para que, por exemplo, não apareçam tantas tags, ou para fazer com que alguns rótulos apareçam de maneiras diferentes. Vamos entender como integrar toda a estrutura dessa biblioteca dentro do nosso projeto para trabalhar da maneira mais eficiente possível.
Vamos estudar, principalmente, como podemos utilizar a informação dessa biblioteca para implementar funções dentro dos aplicativos. Com o Galeri-IA, temos uma sessão de inteligência artificial, que, quando clicamos, faz uma organização e exibe todas as imagens pré-selecionadas em grupos. Com isso, temos uma facilidade muito maior para poder acessar algum conteúdo de interesse.
Também vamos entender como criar um modelo específico a depender da situação. No nosso caso, treinaremos um modelo com nossas próprias imagens para trazer um padrão personalizado para além do que a Google possui. Tudo isso rodando diretamente no dispositivo final, sem precisar de acesso à internet.
Para poder seguir com esse curso, alguns pré-requisitos são necessários. Nosso projeto utiliza Android e Jetpack Compose. Você também pode utilizar esse conhecimento com o sistema de Views. Contudo, o essencial é saber lidar com o sistema de gerenciamento de estados e de ViewModels.
Vamos abordar outros detalhes ao longo do curso, mas a qualquer momento, se houver alguma dúvida ou se quiser conversar sobre o conteúdo do curso, acesse e participe da nossa comunidade no Discord.
Dito isso, esperamos que tenha se animado para começar. Vamos lá!
O aplicativo que recebemos para adicionar recursos de inteligência artificial é o Galeri-IA. Por enquanto, ele é bastante semelhante a uma galeria que temos instalada em nossos dispositivos.
Quando o abrimos, ele possui um botão quadrado com um ícone de pasta centralizado na tela para conceder acesso aos arquivos. Ao clicar nesse botão, ele abre o seletor de arquivos do Android, permitindo navegar por pastas do dispositivo.
Vamos selecionar, por exemplo, a pasta "Exemplo 1", clicando duas vezes nela para abri-la. Na tela que exibe seu interior, vamos clicar no botão "Usar essa pasta", na parte inferior da tela, e selecionar "Permitir" na janela modal para conceder permissão.
Com isso, seremos direcionados para a tela da galeria, que exibe várias imagens. Ao clicar em alguma delas, uma tela é expandida mostrando a imagem selecionada, e abaixo dela, um espaço vazio que preencheremos com algum conteúdo em breve.
Na parte inferior da tela, temos dois botões: "Galeria", selecionado atualmente, e "IA". Ao clicar neste último, acessaremos a tela de IA que, por enquanto, não faz nada além de mostrar uma tela de carregamento.
Antes das imagens, no canto superior esquerdo da galeria, há um ícone de pasta. Se clicarmos nele, voltamos para a tela inicial, em cuja parte inferior temos o botão "Testar uma imagem". Ao clicar nele, veremos uma tela que serve como demonstração.
Vamos trabalhar para poder selecionar alguma imagem do dispositivo, clicar nela e, na seção "Tags" na parte inferior da tela, possamos substituir as tags pré-definidas #descrição #da #imagem
por aquelas que a biblioteca vai retornar como rótulos.
Esperamos que você nos acompanhe nessa jornada.
Agora que conhecemos o aplicativo, vamos dar uma olhada no código que está por trás de tudo isso. No Android Studio, já temos o projeto baixado, e deixamos previamente configurado tudo que é relacionado à parte de UI e de lógica, que não está relacionado com o que vamos mexer, de modo a evitar esse trabalho.
Vamos entender rapidamente a estrutura das pastas do projeto, no explorador de arquivos da lateral esquerda.
Acessando o caminho "app > src > main > java/com/br/alura/galeria", temos uma pasta "data" com alguns modelos que vamos utilizar. Temos algumas data classes com informações como, por exemplo, o nome da imagem e uma lista de rótulos.
Dentro da pasta "dataStore", temos um pequeno sistema para que, ao clicar em uma pasta, o aplicativo lembre qual foi o caminho, e ao abrir novamente o app, ele já mostra as imagens daquela pasta.
Também deixamos pronta boa parte da injeção de dependência. Na pasta "di.module", temos, por exemplo, o ImageClassifierModule
. Quando clicamos e damos um "Ctrl+B" em ImageClassifier
, seremos direcionados para o arquivo ImageClassifier.kt
, no qual podemos perceber que boa parte dessas classes possui apenas a injeção de dependência já feita, para não nos preocuparmos com isso. Já a implementação interna ficará a nosso cargo.
Lembrando que temos cursos sobre injeção de dependência e vários desses tópicos que estamos comentando. Nesse projeto, isso já está pronto, como, por exemplo, já estaria em um projeto que você trabalha no dia a dia. Vamos apenas mexer apenas na biblioteca.
Outro detalhe é que na pasta "extensions", temos a classe ContextExtensions
, que vai trabalhar com arquivos. Vamos abordar esses tópicos ao longo do curso, mas como se trata de um conteúdo denso que está fora do nosso escopo, recomendamos que você veja outros conteúdos que produzimos sobre isso. Mesmo assim, caso tenha interesse, o código já está pronto.
Dentro da pasta "mlkit", teremos apenas um único arquivo, por enquanto. Ele tem um contexto pronto, no qual vamos fazer a parte da biblioteca. Além disso, teremos a pasta "navigation", com componentes de navegação do próprio Jetpack Compose.
Já dentro da pasta "ui", teremos a parte de interface do usuário, as telas e o carregamento das imagens. Vamos explorar cada uma dessas telas e dessas pastas, conforme manipulamos certos fluxos do aplicativo.
Por fim, um detalhe que é interessante notarmos, é que no arquivo build.gradle.kts
oriundo de Module :app
, que está na pasta "Gradle Scripts", podemos perceber que ele já está atualizado para utilizar as dependências com o novo padrão recomendado pela equipe oficial do Android. Caso você não conheça, vamos deixar um material sobre esse assunto.
Não se preocupe, porque quando instalarmos alguma dependência, vamos explicar qual é a diferença dele em relação ao antigo e comentaremos um pouco melhor sobre essa situação.
Feita essa revisão, conhecemos o projeto. A seguir, vamos começar a fazer as implementações.
O primeiro desafio com esse aplicativo será trabalhar com uma tela que serve como uma espécie de tela de testes. Ela aparece quando clicamos no botão "Testar uma imagem". Ao clicar nela, visualizamos uma imagem de uma rua com algumas pessoas caminhando. No entanto, por enquanto, o que está na parte inferior não é a descrição da imagem, mas textos aleatórios.
image-labeling
Podemos utilizar uma biblioteca da própria Google, que utiliza o ML Kit: a biblioteca Marcação de imagens (Image Labeling, em inglês) que temos aberta no navegador. Essa biblioteca serve para extrair informações sobre entidades dentro de imagens.
Na página da biblioteca, é descrito de forma mais detalhada o que essa biblioteca é capaz de fazer, especialmente na seção "Principais recursos", que explica a existência de um classificador que reconhece mais de 400 categorias de objetos. Em seções posteriores, há exemplos disso.
Esta seção também explica que a biblioteca é capaz de se adaptar a diferentes casos de uso, porque além do modelo padrão, podemos colocar um modelo que nós mesmos somos capazes de treinar, além do modelo padrão que vem junto com a biblioteca. Aliás, vamos fazer isso também neste curso.
Apesar de todas essas funcionalidades, ela é uma API de alto nível, fácil de utilizar. Ou seja, não é preciso códigos muito complicados para conseguirmos ter os primeiros resultados.
Se deslizarmos um pouco mais para baixo nessa página, existem algumas classificações que a biblioteca é capaz de fazer. Existe uma imagem que representa bem todo esse conceito: que exibe um jogo de futebol, no qual o goleiro está pulando para tentar pegar a bola.
Abaixo dessa imagem, existe uma tabela que mostra qual foi a análise feita pelo código que vamos utilizar. Ela tem uma linha de título com o nome do rótulo de exemplo, abaixo da qual há duas linhas: "Texto" e "Confiança", onde há o texto do rótulo e a confiança do quanto a biblioteca acredita ter contemplado algo presente nessa imagem ou o que ela representa.
Rótulo 0 | # |
---|---|
Texto | Estádio |
Confiança | 0,9205354 |
Rótulo 1 | # |
-------- | -------- |
Texto | Esportes |
Confiança | 0,7531109 |
Rótulo 2 | # |
-------- | -------- |
Texto | Evento |
Confiança | 0,66905296 |
Rótulo 3 | # |
-------- | -------- |
Texto | Lazer |
Confiança | 0,59904146 |
… | … |
Como mencionado, é uma imagem de um estádio de jogo de futebol, e a biblioteca tem 92% de certeza de que é um estádio, 75% de certeza que tem alguma relação com esportes, 66% de certeza que é um evento, entre outras palavras que foram analisadas, como "futebol", "rede" e "planta". Conseguimos extrair essas informações diretamente com o poder de processamento do próprio dispositivo, sem precisar fazer uma conexão com a internet para isso.
Após conhecer melhor essa biblioteca, existe um detalhe que é importante se atentar: voltando à seção "Principais recursos", é mencionado que essa é uma biblioteca destinada à classificação de imagens estáticas, como no nosso caso, em que vamos pegar uma imagem fixa e tentar extrair as informações dela. Contudo, existe uma API semelhante, também do ML Kit, que analisa objetos com movimento, por exemplo, utilizando rastreamento de objetos.
Vamos acessar a seção "Como usar o modelo base", na qual temos dois botões: um para a versão de iOS e outra para a versão de Android vamos clicar no botão que diz "Android", e a partir da nova tela, podemos deslizar para o final da página, até achar a subseção "Para agrupar o modelo e o app".
Mencionamos essa subseção porque existem duas maneiras de lidar com essa biblioteca. A outra utiliza o Google Play Services. Não vamos utilizá-la porque ela necessita que façamos uma conexão com a internet.
Vamos copiar, então, a linha de código abaixo, no bloco da subseção que escolhemos. Nesse caso, a versão no momento é a 17.0.7:
implementation 'com.google.mlkit:image-labeling:17.0.7'
Vamos voltar para o Android Studio, abrir o projeto e acessar o arquivo build.gradle.kts
dentro da pasta "app". Em seu interior, deslizaremos para o final do bloco dependencies
e colaremos este código que copiamos acima da sua chave de fechamento.
build.gradle.kts
dependencies {
# Código omitido
implementation 'com.google.mlkit:image-labeling:17.0.7'
}
Vamos pular uma linha entre o código anterior e a linha que colamos e fazer alguns ajustes nesta última. Vamos trocar as aspas simples por aspas duplas. Se selecionarmos as aspas de abertura e a corrigirmos, a de fechamento será corrigida automaticamente. Também vamos envolver em parênteses o conteúdo entre aspas duplas.
Podemos perceber que o Android Studio vai acionar um alerta, sublinhando esse trecho em amarelo. Podemos posicionar o cursor em cima desse alerta, pressionar "Alt+Enter" e selecionar a opção "Replace with new library catalog declaration for image-labeling". Esse processo modificará o código, conforme vemos abaixo.
dependencies {
# Código omitido
implementation (libs.image.labeling)
}
Em seguida, podemos clicar no botão "Sync Now" em uma barra temporária que aparece no topo do arquivo, para que a biblioteca seja instalada no projeto. Depois, é só aguardar.
Após o projeto instalar a biblioteca, não temos mais erros na linha colada. Ao selecionar o labeling
nessa linha e pressionar "Ctrl+B", seremos direcionados para o arquivo libs.versions.toml
, no qual podemos perceber que aquela biblioteca foi adicionada entre as outras.
libs.versions.toml
[libraries]
# Código omitido
image-labeling = { module = "com.google.mlkit:image-labeling", version.ref = "image-labeling" }
Podemos subir o código para a seção de versões para perceber que ele criou o image-labeling
na linha 4, com a versão 17. Se quisermos atualizar futuramente, acessaremos esse local.
[versions]
# Código omitido
image-labeling = "17.0.7"
A biblioteca já está instalada, sabemos um pouco melhor o que podemos fazer e sabemos que a biblioteca é capaz de fazer isso. A seguir, vamos começar os primeiros testes.
O curso Android com IA: identificando imagens com Machine Learning possui 98 minutos de vídeos, em um total de 47 atividades. Gostou? Conheça nossos outros cursos de IA para Mobile em Inteligência Artificial, ou leia nossos artigos de Inteligência Artificial.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.