Escolar Documentos
Profissional Documentos
Cultura Documentos
TCC - Desenvolvimento de Skill520classificadora de Imagens para Amazon Alexa
TCC - Desenvolvimento de Skill520classificadora de Imagens para Amazon Alexa
Florianópolis - SC
2021 / 1
UNIVERSIDADE FEDERAL DE SANTA CATARINA
DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA
CURSO DE SISTEMAS DE INFORMAÇÃO
Florianópolis - SC
2021 / 1
2
BRUNO HENRIQUE BERTOZZO
THIAGO BREZINSKI
________________________
Prof. Dr. Elder Rizzon Santos
Orientador
Universidade Federal de Santa Catarina
Banca Examinadora:
________________________
Prof. Dr. Frank Siqueira
Avaliador
Universidade Federal de Santa Catarina
________________________
Prof. Dr. Maicon Rafael Zatelli
Avaliador
Universidade Federal de Santa Catarina
3
Este trabalho é dedicado às famílias dos autores, pelo suporte
despendido durante o seu desenvolvimento.
4
AGRADECIMENTOS
Agradecemos ao Prof. Dr. Elder Rizzon Santos, pelas diversas sessões de orientação e
prontidão durante os meses de desenvolvimento, assim como às famílias dos autores, pelo
suporte emocional, para que isto fosse possível.
5
“Você nunca alcança o sucesso verdadeiro a
menos que você goste do que está fazendo.”
— Dale Carnegie
6
RESUMO
Skills, no âmbito dos dispositivos Amazon Alexa, são como aplicativos para smartphones.
Permitem customizar a experiência do usuário com funcionalidades novas, agregando valor a
estes dispositivos sem um esforço direto da empresa que os disponibiliza. Este projeto tem
como objetivo o desenvolvimento de uma skill que permita que usuários requisitem, via
comandos de voz, imagens de um assunto desejado. A skill vai encarregar-se de identificar o
assunto proposto, requisitar imagens do assunto em uma API de imagens, processar e
classificar as imagens através do modelo de machine learning MobileNetV2, e apresentar os
resultados e classificações para o usuário via Telegram.
7
ABSTRACT
Skills, in the context of Amazon Alexa, are like apps for smartphones. They allow
customization of the user experience with new features, adding value to these devices without
a direct effort of the company that provides them. This project has the objective of
developing a skill that allows the users to request, via voice commands, images about a
specific subject. The skill will take charge of identifying the subject, requesting images about
it within an image API, process and classify the images through the machine learning model
MobileNetV2, and present the results and classifications to the user via Telegram.
8
LISTA DE FIGURAS
9
LISTA DE TABELAS
10
LISTA DE ABREVIATURAS E SIGLAS
11
SUMÁRIO
1. INTRODUÇÃO 14
1.1. Objetivo Geral 14
1.2. Objetivos Específicos 14
1.3. Metodologia 14
1.4. Justificativa 15
1.5. Organização do texto 16
2. FUNDAMENTAÇÃO TEÓRICA 16
2.1. Machine Learning 16
2.2. Redes Neurais 17
2.2.1. Redes Neurais Recorrentes 18
2.2.2. Redes Neurais Convolucionais 18
2.3. Automatic Speech Recognition 19
3. TRABALHOS RELACIONADOS 20
3.1. Trabalhos com abordagem técnica 20
3.1.1. Accelerating CNN on FPGA 20
3.1.2. TensorFlow Enabled Deep Learning Model Optimization for enhanced
Realtime Person Detection using Raspberry Pi operating at the Edge 20
3.1.3. study on Image Classification based on Deep Learning and Tensorflow 21
3.2. Trabalhos com foco em aplicação 21
3.2.1. Edge computed NILM: a phone-based implementation using MobileNet
compressed by Tensorflow Lite 21
3.2.2. Using Alexa for Flashcard-based Learning 21
3.3. Posicionamento deste estudo 22
4. DESENVOLVIMENTO 24
4.1. Arquitetura / Modelo da skill 24
4.1.1. Fluxo de primeiro uso 26
4.1.2. Fluxo de uso convencional 27
4.2. Implementação da arquitetura 29
4.2.1. Unsplash 29
4.2.2. Telegram 29
4.2.3. Tensorflow e MobileNet 29
4.2.4. AWS Lambda 30
4.2.5. AWS DynamoDB 30
4.3. Experimentos 30
4.3.1. Modelos pré-treinados 31
4.3.1.1. VGG16 31
4.3.1.2. ResNet50 32
4.3.1.3. EfficientNetB0 33
12
4.3.1.4. MobileNetV2 35
4.3.2. Métricas 35
4.3.2.1. Acurácia 35
4.3.2.2. Precisão 36
4.3.2.3. Matriz de confusão entre as classes 36
4.3.3. Comparação dos modelos 37
4.3.4. Análise Qualitativa 41
4.3.4.1. Nome de invocação 41
4.3.4.2. Utterances 41
4.3.4.3. API do Unsplash 43
4.3.4.4. Arquitetura implementada 46
4.3.4.5. Acurácia 46
4.4. Avaliação / Resultados 48
5. CONCLUSÃO 50
6. REFERÊNCIAS 52
13
1. INTRODUÇÃO
Desenvolvimento de uma skill para dispositivos Alexa que aceite, via solicitação por
voz, um assunto e, mediante métodos de reconhecimento de imagens, entregue imagens
acerca do assunto desejado.
1.3. Metodologia
14
modelo de classificação MobileNetV2. Os relacionamentos entre os dados foram
persistidos utilizando o banco de dados na nuvem AWS DynamoDB.
Já para os experimentos, utilizou-se da linguagem de programação Python, na
plataforma Google Colaboratory. O código interage com as bibliotecas do Tensorflow
para predição das classes através dos modelos de classificação, numpy para estruturas
de dados complexas, sklearn para geração das matrizes de confusão, seaborn para
imprimir as matrizes geradas, matplotlib para imprimir outros gráficos, entre outros
utilitários. Compilou-se um dataset de 50 imagens provenientes do serviço de
imagens Unsplash, divididas entre 5 classes pertencentes ao ImageNet (10 imagens
por classe), que foram iteradas buscando a acurácia e precisão média de cada modelo
de classificação.
Por fim, para os resultados, utilizou-se da própria skill desenvolvida para
comparação de 5 termos de pesquisa, cada um utilizando 3 imagens provenientes do
serviço de imagens Unsplash. Construiu-se uma tabela comparando o termo de
pesquisa, se este pertencia ao banco de imagens do ImageNet, a acurácia média,
precisão média, e se o resultado foi satisfatório para o usuário final.
1.4. Justificativa
A motivação para realização deste estudo inicia pela vontade dos autores de
trabalhar com as tecnologias aqui expostas, visto que, com base nas pesquisas
realizadas nos maiores portais acadêmicos, pouco se encontra sobre o
desenvolvimento de skills para Amazon Alexa, ainda menos se relacionado com
classificação de imagens. Embora a busca de imagens já seja possível através de
outras assistentes virtuais, tais são atreladas a sistemas operacionais (Siri, atrelada ao
iOS e Google Assistant atrelada ao Android), o que torna a operação mais fácil, mas
também menos customizável. O fato de a Amazon Alexa ser executada
independentemente de um sistema operacional e ser uma plataforma aberta à skills a
torna altamente customizável, ao custo de possuir menor número de integrações
diretamente da fabricante. Resta à comunidade (assim como este estudo) desenvolver
integrações úteis para a mesma.
Assim, entende-se que o fluxo de busca, classificação e envio de imagens aqui
desenvolvido possa, futuramente, em uma versão evoluída, servir para usos mais
nobres como a garantia de encontrar, de maneira rápida, a imagem correta de uma
ferramenta em uma situação de risco, como um utensílio médico ou uma peça
danificada de um veículo.
15
1.5. Organização do texto
2. FUNDAMENTAÇÃO TEÓRICA
O ecossistema das assistentes virtuais, como a Amazon Alexa, é uma rede complexa
de conceitos e tecnologias no seu estado da arte. Abrange desde os conceitos mais técnicos,
da programação e ciência de dados, relacionados à sua implementação, até os conceitos de
mais alto nível, pois precisa interagir com o usuário final, leigo, que espera uma interação
descomplicada e o mais parecida possível com a vida real. Dito isso, neste capítulo serão
abordados conceitos como Machine Learning (bem presente neste estudo), Deep Learning,
Redes Neurais, Automatic Speech Recognition, entre outros.
16
- Clustering: divide os dados em grupos que possuam significado, utilidade ou ambos;
- Associação: encontra associações entre conjuntos de objetos frequentes;
- Redes Neurais: rede de camadas interconectadas que realizam cálculos e tiram
conclusões sobre os dados de entrada, retornando uma probabilidade para cada um —
detalhado na seção 2.2.
Assistentes virtuais, como a Amazon Alexa, ainda se utilizam de Deep Learning, uma
área de estudo do Machine Learning, para funções como encontrar a skill mais relevante para
lidar com o enunciado do usuário, tarefa não-trivial num ecossistema que já possui mais de
40.000 skills registradas, com milhares destas com funcionalidades similares, como a de listar
os ingredientes de uma receita de bolo, por exemplo.
Com o tempo surgiram diversas variações deste modelo, duas dessas sendo Redes
Neurais Recorrentes (RNNs, em inglês) e Redes Neurais Convolucionais (CNNs, em inglês),
que serão mais abordadas neste estudo.
17
2.2.1. Redes Neurais Recorrentes
As RNNs são uma variação comumente utilizada quando o contexto do que está
sendo analisado é importante, como na análise de um texto, em que as palavras anteriores
influenciam na análise da palavra atual — onde a sequência é mais importante que os objetos
individuais. São baseadas na estrutura das Redes Neurais Feedforward, que são, em suma,
múltiplas camadas de Perceptrons, citados acima. Desta forma, também é ideal para
utilização em Processamento de Linguagem Natural (NLP, em inglês), sendo largamente
utilizada pela Amazon Alexa e outras assistentes virtuais, visto a necessidade de entender e
reagir à uma entrada de voz do usuário.
18
nos dados de entrada, deslizando o filtro da esquerda para a direita, de cima para baixo até
percorrer a imagem toda, resultando no feature map, que nos dá informações como a
localização das bordas e pontas da imagem. As camadas de pooling vêm em seguida
reduzindo o tamanho do feature map e, consequentemente, os custos computacionais.
O feature map é então achatado em um vetor unidimensional e encaminhado para a
segunda etapa, de classificação, que possui camadas Fully-connected e de dropout. As
camadas fully-connected dão início à classificação, realizando cálculos com pesos e vieses.
Por fim, a camada de dropout descarta randomicamente uma porcentagem (configurável) de
nodos para redução do tamanho da rede.
"Antes do ASR, nossa fala era simplesmente uma gravação de áudio com
picos e vales na "mente" de um computador. Com ASR, os computadores
podem detectar padrões nas formações de ondas dos áudios, associá-los com
os sons de uma linguagem e identificar as palavras que falamos."
(AMAZON, 2021)
19
3. TRABALHOS RELACIONADOS
Para a tese com título Accelerating CNN on FPGA, Redes Neurais Convolucionais
(CNN) é um algoritmo de deep learning que tem revolucionado a área de visão
computacional. Uma de suas aplicações é a classificação de imagens. No entanto, existe o
problema neste algoritmo que envolve um grande número de operações e parâmetros, o que
limita sua possibilidade em aplicações embarcadas com restrição de tempo e recursos.
MobileNet, uma rede neural que usa camadas convolucionais separáveis em vez de camadas
convolucionais padrões, reduz amplamente o consumo computacional em comparação com
os modelos tradicionais de CNN. Com a implementação da MobileNet em FPGA, os
problemas de classificação de imagens podem ser amplamente acelerados. Dessa forma, a
tese implementou uma MobileNet simplificada com aceleração FPGA e a usou para resolver
um problema de classificação de gestos (imagens) realista. O sistema proposto acelerou
amplamente a fase de inferência da MobileNet, operando sobre uma frequência baixa e com
baixo consumo energético.
20
inferência para uma arquitetura de solução habilitada para TensorFlow adequadamente
otimizada é significativamente menor do que para um modelo não quantizado. O modelo de
rede neural profunda é treinado usando o conjunto de dados de referência de detecção de
pessoas INRIA.
21
limitado para que as Skills da Alexa acomodem os recursos necessários para o aprendizado
eficaz de idiomas. Descrevem uma investigação sobre a implementação de ‘repetição
espaçada’, um método não trivial de aprendizagem baseado em cartões de memória, através
do desenvolvimento de uma Skill para Alexa chamada ‘Japanese Flashcards’. No texto,
mostram que os recursos de desenvolvimento da Alexa, como a persistência de skills,
permitem a implementação eficaz da repetição espaçada e sugerem uma adaptação heurística
do modelo que é apropriado para uso com assistentes de voz (VAs). No geral, a investigação
mostra que Alexa pode facilitar com sucesso o aprendizado de idiomas baseando-se em
flashcards L2-L1 (segunda língua - língua nativa) e destaca o potencial da Alexa para ser
usado como uma ferramenta sofisticada e eficaz de aprendizagem de idiomas.
22
Com base nesse levantamento de artigos de classificação de imagens com base em
machine learning e desenvolvimento de skills Alexa, pode-se assim fazer a extração e análise
das informações relevantes sobre os processos e técnicas de classificação de imagens, assim
como o estudo do desenvolvimento de uma skill Alexa, de forma que as informações
extraídas potencializam o desenvolvimento do presente trabalho.
Alguns dos artigos estudados abordam os assuntos de Redes Neurais, Deep Learning
e Automatic Speech Recognition com foco aplicado a computação de borda (Edge
computing). Isso se dá por um dos objetivos ser a rentabilidade, sabendo que isso permitirá
usar hardwares com menor poder de processamento computacional, se terá menor gasto
energético, trazendo menores custos com servidores em nuvem.
23
4. DESENVOLVIMENTO
24
Por fim, o modelo de interação da skill redireciona a requisição para o trecho
pertinente da lógica da aplicação (etapa 3). Ativar a intenção de conectar à conta do
Telegram executará somente um trecho de código, enquanto que ativar a intenção de
procurar imagens executará outro. O modelo de funcionamento das skills, descrito
acima, pode ser resumido pela Figura 3. É na terceira etapa que as skills se
diferenciam, com lógica e fluxos próprios, assim como conexões a outros serviços.
Fonte: Amazon
A skill desenvolvida neste estudo foi nomeada “Procure Uma Imagem”, nome
que diz jus à sua funcionalidade primária: resgatar, através da voz, imagens curadas
acerca de um assunto, para um meio de comunicação de fácil acesso. As imagens
serão obtidas através das APIs do Unsplash, classificadas com Tensorflow, e enviadas
para o usuário através do Telegram. Embora a skill só possua um real fluxo de
funcionamento (buscar, classificar e enviar imagens), é necessário um segundo fluxo,
de uso único, para realizar a conexão da skill à conta Telegram do usuário, para que
este possa receber os resultados.
25
4.1.1. Fluxo de primeiro uso
O fluxo de primeiro uso pode ser descrito pela Figura 4. As duas primeiras
etapas são comuns a todas skills Alexa, conforme descrito no item 4.1.
Fonte: Autores
O usuário, de posse do código único que recebeu como resposta falada ao seu
comando, deverá enviá-lo para o bot do Telegram (Figura 5), construído também para
os fins deste estudo, que fará a captura do código para uso no próximo fluxo.
Fonte: Autores
26
4.1.2. Fluxo de uso convencional
Fonte: Autores
27
Em seguida, extrai-se o assunto do slot para ser encaminhado às APIs de busca
de imagens do Unsplash. Três imagens são retornadas pelo serviço, que servirão de
input para a classificação através do Tensorflow, mais especificamente do modelo de
machine learning MobileNet. O resultado da classificação será então enviado ao
usuário através das APIs do Telegram.
Como resultado, o usuário receberá em sua conversa com o bot as imagens e
suas respectivas classificações, simulando uma conversa. Na Figura 7, exibe-se o
resultado para o comando “Alexa, procure imagens de cachorro”, em que a palavra
destacada é o assunto extraído.
Fonte: Autores
28
4.2. Implementação da arquitetura
4.2.1. Unsplash
4.2.2. Telegram
29
4.2.4. AWS Lambda
4.3. Experimentos
30
4.3.1. Modelos pré-treinados
4.3.1.1. VGG16
31
Figura 8 - Estrutura do modelo VGG16
Além disso, existem variações do modelo VGG16, que são basicamente melhorias
para ele, como o VGG19 (19 camadas). Não abordaremos esse modelo no presente trabalho.
4.3.1.2. ResNet50
𝐻(𝑥) = 𝑓(𝑥) + 𝑥
32
Figura 9 - Bloco residual da rede ResNet
4.3.1.3. EfficientNetB0
33
Na Figura 10, “MBConv” representa “convolução de gargalo invertido móvel”
(semelhante a MobileNetV2). Eles também propõem a fórmula de escalonamento composto
com os seguintes coeficientes de escalonamento:
● Profundidade = 1,20
● Largura = 1,10
● Resolução = 1,15
Como pode-se ver, mesmo o modelo B0 de base começa com uma precisão muito
maior, que só aumenta, e isso também com menos parâmetros. Por exemplo, EfficientB0 tem
apenas 5,3 milhões de parâmetros, que é pouco se comparado com outros modelos.
34
4.3.1.4. MobileNetV2
4.3.2. Métricas
4.3.2.1. Acurácia
𝑇 𝑃 + 𝑇𝑁
𝐴𝐶𝐶 = 𝑇 𝑃 + 𝑇𝑁 + 𝐹𝑃 + 𝐹𝑁
35
4.3.2.2. Precisão
𝑇𝑃
𝑃 = 𝑇 𝑃 + 𝐹𝑃
Cão Gato
Classe real
Fonte: Autores
36
4.3.3. Comparação dos modelos
EfficientNetB0 29 MB - - 5,330,571 -
Fonte: Adaptado de Keras Applications.
Para uma comparação com dados de teste fiéis ao uso real da aplicação, compilou-se
um dataset de 50 imagens provenientes do provedor de imagens Unsplash, distribuídas entre
5 classes pertencentes ao ImageNet (10 imagens por classe).
Como já citado no item 4, o desenvolvimento da skill se deu através da linguagem de
programação JavaScript, utilizando o framework Node.js. Estes permitiram a fácil utilização
do modelo MobileNetV2 através da biblioteca oficial da plataforma Tensorflow. Contudo, os
outros modelos aqui apresentados não estão disponíveis como plugins, então optou-se pela
plataforma Google Colaboratory para comparação dos modelos, que permite escrita e
execução remota de código Python, assim como acesso gratuito a GPUs e compartilhamento
de código. Neste caso, utilizou-se dos modelos disponibilizados através da biblioteca Keras,
da plataforma Tensorflow para Python.
37
Tabela 4 - Comparação dos modelos de classificação de imagens
Modelo pré-treinado Acurácia média (%) Precisão (%)
MobileNetV2 67 62
VGG16 73 62
ResNet50 80 74
EfficientNetB0 75 80
Fonte: Autores
Nas figuras 12 e 13, encontram-se as matrizes de confusão para cada modelo, em que
a sua diagonal principal evidencia os True Positives, quando a classe verdadeira coincide com
o que foi predito. Calculando a razão True Positives / Número total de imagens, obtém-se a
precisão para o modelo.
Fonte: Autores
38
Figura 13 - Matriz de confusão para ResNet50 e EfficientNetB0
Fonte: Autores
Exemplos de acurácia por imagens individuais podem ser encontrados nas figuras 14,
15 e 16, separados pelos modelos.
Fonte: Autores
39
Figura 15 - Comparação de Acurácia 2
Fonte: Autores
Fonte: Autores
40
4.3.4. Análise Qualitativa
Uma limitação da skill “Procure Uma Imagem” é que ainda não está publicada na loja
da Amazon. Isso impede que adicionem-se as chamadas Intent Launch Phrases, ou, em
português, Frases de Invocamento de Intenção. Como explicado no item 4.1, intenções são
fluxos definidos que são executados através de uma frase de invocamento. Neste caso, se a
skill estivesse publicada, seria liberado o acesso ao cadastro de frases como “Alexa, me
manda uma imagem de cachorro” sem que fosse preciso chamar um comando para abrir a
skill em um primeiro momento. Dito isso, para utilização desta skill, no momento é
necessário primeiramente chamar o seu nome de invocação: “Procure Uma Imagem”,
análogo a pressionar o ícone de um aplicativo de smartphone, para depois poder utilizar de
suas funções. Outra limitação é que o nome de invocação deve ser chamado exatamente
como cadastrado, do contrário a API da Alexa não entenderá a requisição. Na Figura 17,
exibe-se alguns testes realizados com o nome de invocação, em que somente o último,
utilizando o nome exato, teve sucesso.
Fonte: Autores
4.3.4.2. Utterances
41
imagem, e conectar a conta do Telegram do usuário, respectivamente. Considera-se um ponto
forte desta skill a presença de diversos enunciados disponíveis para ativação de sua atividade
principal (procurar imagens). A Figura 18 representa um recorte da plataforma interna da
Amazon que gerencia as informações da skill. Percebe-se que existem 15 frases cadastradas,
de diversas maneiras e utilizando diferentes preposições e maneiras comuns (e informais) de
se solicitar imagens na língua portuguesa. Desta forma, espera-se que o usuário final não
tenha problemas em solicitar uma imagem, assim que já tiver aberto (e estiver dentro do
contexto) da skill.
Fonte: Autores
42
Figura 19 - Usuário solicita imagens através de diferentes enunciados
Fonte: Autores
Fonte: Autores
43
Figura 21 - Resultado da pesquisa “Buldogue francês” no site
Fonte: Autores
44
Analisando-se os resultados para “French bulldog” (figura 22), nota-se que todos os
resultados apresentados na primeira página poderiam ser considerados satisfatórios,
evidenciando uma limitação da API na sua versão em português.
Fonte: Autores
45
4.3.4.4. Arquitetura implementada
4.3.4.5. Acurácia
46
Figura 23 - Resultados para “Cabo ethernet” Figura 24 - Resultados para “Hipopótamo”
Fonte: Autores
Nota-se que o termo não coberto pelas classes com qual o modelo foi treinado possui
predições insatisfatórias, como “gas pump” (inglês para “bomba de gasolina”), que não
condiz com o esperado “ethernet”. Observa-se, também, que os níveis de confiança são
baixos, neste caso, de aproximadamente 20% e 57%.
Por outro lado, ao classificar as imagens do termo “hipopótamo”, observa-se com
facilidade que é uma classe pertencente ao conjunto de treinamento do ImageNet, visto que
todas as predições contemplam o exato termo, e com probabilidades acima de 99%, o que é
altamente satisfatório.
47
4.4. Avaliação / Resultados
48
classes do ImageNet, o modelo falhou na predição, resultando em classes como “oil pump”
(“bomba de gasolina”, em português), e com uma acurácia média insatisfatória de 34%.
Por último, ao pesquisar por “Farol”, o usuário também recebe resultados
satisfatórios, com todas as imagens correspondentes, porém, o modelo falha na precisão,
predizendo um dos resultados como “quebra-mar” ou “cais” ao invés do exato termo,
resultando em uma precisão média de 67%. Contudo, ainda considera-se bons resultados,
visto que o usuário foi satisfeito e a precisão média de 90%.
49
5. CONCLUSÃO
50
tentar mitigar as limitações da API do Unsplash em português. Todas as implementações
estão públicas no GitHub1 e podem ser utilizadas como estudo para futuras implementações
ou ser adaptadas para outros projetos.
1
https://github.com/thiagobrez/procure-uma-imagem
51
REFERÊNCIAS
AMAZON. The Scalable Neural Architecture behind Alexa’s Ability to Select Skills.
Disponível em:
https://www.amazon.science/blog/the-scalable-neural-architecture-behind-alexas-ability-to-se
lect-skills. Acesso em: 12 abr. 2021.
52
PRÖVE, Paul-Louis. Rosenblatt’s perceptron, the first modern neural network. Towards
Data Science. Disponível em:
https://towardsdatascience.com/types-of-convolutions-in-deep-learning-717013397f4d.
Acesso em: 10 jul. 2021.
Simonyan, Karen & Zisserman, Andrew. (2014). Very Deep Convolutional Networks for
Large-Scale Image Recognition. arXiv 1409.1556.
TENSORFLOW. Tensorflow. Disponível em: https://www.tensorflow.org/. Acesso em: 05
nov. 2020.
53
Kth Royal Institute Of Technology School Of Electrical Engineering And Computer Science,
Stockholm, 2019.
AHMED, Shamim; BONS, Marc. Edge computed NILM. In: BUILDSYS '20: THE 7TH
ACM INTERNATIONAL CONFERENCE ON SYSTEMS FOR ENERGY-EFFICIENT
BUILDINGS, CITIES, AND TRANSPORTATION, 20., 2020, New York, Ny, Usa.
Proceedings of the 5th International Workshop on Non-Intrusive Load Monitoring. New
York, Ny, Usa: Acm, 2020. p. 1-5.
Mohandas, R. et al. TensorFlow Enabled Deep Learning Model Optimization for
enhanced Realtime Person Detection using Raspberry Pi operating at the Edge. AICS
(2020).
Skidmore, L. and Moore, R.K. orcid.org/0000-0003-0065-3311 (2019) Using Alexa for
flashcard-based learning. In: Proceedings of Interspeech 2019. Interspeech 2019, 15-19
Sep 2019, Graz, Austria. ISCA , pp. 1846-1850.
54
APÊNDICE A – Código desenvolvido
/* *
* This sample demonstrates handling intents from an Alexa skill
using the Alexa Skills Kit SDK (v2).
* Please visit https://alexa.design/cookbook for additional
examples on implementing slots, dialog management,
* session persistence, api calls, and more.
* */
if (!response.ok)
throw new Error(`unexpected response ${response.statusText}`);
55
try {
if (!fs.existsSync(tmpPath)) {
fs.mkdirSync(tmpPath);
}
} catch (err) {
console.error(err);
}
await streamPipeline(response.body,
fs.createWriteStream(filePath));
return filePath;
}
const LaunchRequestHandler = {
canHandle(handlerInput) {
return (
Alexa.getRequestType(handlerInput.requestEnvelope) ===
"LaunchRequest"
);
},
async handle(handlerInput: HandlerInput) {
const speakOutput =
'Bem vindo ao Procure Uma Imagem. Você pode dizer: "Procure
uma imagem do Will Smith", por exemplo.';
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse();
},
};
56
const LinkTelegramIntentHandler: RequestHandler = {
canHandle(handlerInput: HandlerInput): boolean {
return (
Alexa.getRequestType(handlerInput.requestEnvelope) ===
"IntentRequest" &&
Alexa.getIntentName(handlerInput.requestEnvelope) ===
"LinkTelegramIntent"
);
},
async handle(handlerInput: HandlerInput): Promise<Response> {
const deviceId =
Alexa.getDeviceId(handlerInput.requestEnvelope);
const token = totp.generate(secret);
const attributesManager = handlerInput.attributesManager;
const attributes = await
attributesManager.getPersistentAttributes();
const telegramTokens = attributes.telegramTokens || {};
attributesManager.setPersistentAttributes({
...attributes,
telegramTokens: {
...telegramTokens,
[deviceId]: token,
},
});
await attributesManager.savePersistentAttributes();
57
},
async handle(handlerInput: HandlerInput): Promise<Response> {
const deviceId =
Alexa.getDeviceId(handlerInput.requestEnvelope);
const imagem =
Alexa.getSlotValue(handlerInput.requestEnvelope, "imagem");
let speakOutput = `Certo, te enviei algumas imagens de
${imagem}`;
const attributesManager = handlerInput.attributesManager;
const attributes = await
attributesManager.getPersistentAttributes();
const telegramToken = attributes.telegramTokens?.[deviceId];
let telegramId = attributes.linkedDevices?.[deviceId];
const isDeviceLinked = !!telegramId;
if (!isDeviceLinked) {
if (telegramToken) {
const telegramBotUpdates = await fetch(
"https://api.telegram.org/INSIRA_SEU_BOT_ID_AQUI/getUpdates"
);
const { result: telegramResponse } = await
telegramBotUpdates.json();
58
return
handlerInput.responseBuilder.speak(speakOutput).getResponse();
}
}
// @ts-ignore
const unsplash = createApi({
accessKey: "INSIRA_UNSPLASH_API_KEY",
fetch,
});
console.log("unsplashresponse", unsplashResponse);
console.log('predictions', predictions);
const sendPhotoPromises =
unsplashResponse.results.map((result, index) => {
return fetch(
59
"https://api.telegram.org/INSIRA_SEU_BOT_ID_AQUI/sendPhoto",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
chat_id: telegramId,
photo: result.urls.regular,
caption: `Description:
${result.alt_description}\n\nPrediction:
${predictions[index][0].className}\n\nProbability:
${predictions[index][0].probability}`,
}),
}
);
});
await Promise.all(sendPhotoPromises);
return
handlerInput.responseBuilder.speak(speakOutput).getResponse();
},
};
/* *
* FallbackIntent triggers when a customer says something that
doesn't map to any intents in your skill
* It must also be defined in the language model (if the locale
supports it)
* This handler can be safely added but will be ingnored in
locales that do not support it yet
* */
const FallbackIntentHandler = {
canHandle(handlerInput) {
return (
Alexa.getRequestType(handlerInput.requestEnvelope) ===
"IntentRequest" &&
Alexa.getIntentName(handlerInput.requestEnvelope) ===
"AMAZON.FallbackIntent"
);
},
handle(handlerInput) {
60
console.log(handlerInput);
const speakOutput =
'Desculpe, não entendi essa. Tente dizer: "Procure uma
imagem de cachorro';
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse();
},
};
/* *
* SessionEndedRequest notifies that a session was ended. This
handler will be triggered when a currently open
* session is closed for one of the following reasons: 1) The user
says "exit" or "quit". 2) The user does not
* respond or says something that does not match an intent defined
in your voice model. 3) An error occurs
* */
const SessionEndedRequestHandler = {
canHandle(handlerInput) {
return (
Alexa.getRequestType(handlerInput.requestEnvelope) ===
"SessionEndedRequest"
);
},
handle(handlerInput) {
console.log(
`~~~~ Session ended:
${JSON.stringify(handlerInput.requestEnvelope)}`
);
// Any cleanup logic goes here.
return handlerInput.responseBuilder.getResponse(); // notice
we send an empty response
},
};
/* *
* The intent reflector is used for interaction model testing and
debugging.
61
* It will simply repeat the intent the user said. You can create
custom handlers for your intents
* by defining them above, then also adding them to the request
handler chain below
* */
const IntentReflectorHandler = {
canHandle(handlerInput) {
return (
Alexa.getRequestType(handlerInput.requestEnvelope) ===
"IntentRequest"
);
},
handle(handlerInput) {
const intentName =
Alexa.getIntentName(handlerInput.requestEnvelope);
const speakOutput = `You just triggered ${intentName} +=+=`;
return (
handlerInput.responseBuilder
.speak(speakOutput)
//.reprompt('add a reprompt if you want to keep the
session open for the user to respond')
.getResponse()
);
},
};
/**
* Generic error handling to capture any syntax or routing errors.
If you receive an error
* stating the request handler chain is not found, you have not
implemented a handler for
* the intent being invoked or included it in the skill builder
below
* */
const ErrorHandler = {
canHandle() {
return true;
},
handle(handlerInput, error) {
const speakOutput =
"Desculpe, tive dificuldades para fazer o que você pediu.
62
Por favor, tente novamente.";
console.log(`~~~~ Error handled: ${JSON.stringify(error)}`);
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse();
},
};
const LogRequestInterceptor = {
process(handlerInput) {
// Log Request
// console.log("==== REQUEST ======");
// console.log(JSON.stringify(handlerInput.requestEnvelope,
null, 2));
},
};
/**
* Response Interceptor to log the response made to Alexa
*/
const LogResponseInterceptor = {
process(handlerInput, response) {
// Log Response
// console.log("==== RESPONSE ======");
// console.log(JSON.stringify(response, null, 2));
},
};
/**
* This handler acts as the entry point for your skill, routing
all request and response
* payloads to the handlers above. Make sure any new handlers or
interceptors you've
* defined are included below. The order matters - they're
processed top to bottom
* */
exports.handler = Alexa.SkillBuilders.custom()
.addRequestHandlers(
LaunchRequestHandler,
ImageSearchIntentHandler,
LinkTelegramIntentHandler,
63
FallbackIntentHandler,
SessionEndedRequestHandler,
IntentReflectorHandler
)
.addErrorHandlers(ErrorHandler)
.withCustomUserAgent("sample/hello-world/v1.2")
.withPersistenceAdapter(
new Adapter.DynamoDbPersistenceAdapter({
tableName: "procure-uma-imagem",
createTable: true,
dynamoDBClient: new AWS.DynamoDB({
apiVersion: "latest",
region: "us-east-1",
credentials: {
accessKeyId: "AMAZON_ACCESS_KEY_ID",
secretAccessKey: "AWS_SECRET_ACCESS_KEY",
},
}),
})
)
.addRequestInterceptors(LogRequestInterceptor)
.addResponseInterceptors(LogResponseInterceptor)
.lambda();
64
APÊNDICE B – Artigo sobre o Trabalho de Conclusão de Curso
{bruno.bertozzo, thiago.brezinski}@grad.ufsc.br
Abstract. Skills, in the context of Amazon Alexa, are like apps for smartphones.
They allow customization of the user experience with new features, adding value to
these devices without a direct effort of the company that provides them. This project
has the objective of developing a skill that allows the users to request, via voice
commands, images about a specific subject. The skill will take charge of identifying
the subject, requesting images about it within an image API, process and classify
the images through the machine learning model MobileNetV2, and present the
results and classifications to the user via Telegram.
Resumo. Skills, no âmbito dos dispositivos Amazon Alexa, são como aplicativos
para smartphones. Permitem customizar a experiência do usuário com
funcionalidades novas, agregando valor a estes dispositivos sem um esforço direto
da empresa que os disponibiliza. Este projeto tem como objetivo o desenvolvimento
de uma skill que permita que usuários requisitem, via comandos de voz, imagens de
um assunto desejado. A skill vai encarregar-se de identificar o assunto proposto,
requisitar imagens do assunto em uma API de imagens, processar e classificar as
imagens através do modelo de machine learning MobileNetV2, e apresentar os
resultados e classificações para o usuário via Telegram.
1. Introdução
Este trabalho visa o desenvolvimento de uma skill (complemento) para dispositivos
Amazon Alexa. Skills estão para dispositivos Amazon Alexa tal qual aplicativos estão para
smartphones. Logo, o desenvolvimento deste complemento adicionará uma nova
funcionalidade para tais dispositivos, através de download via loja virtual.
O usuário requisitará, através de comando de voz, uma imagem acerca de algum
assunto e a skill proposta vai encarregar-se de identificar o assunto proposto, requisitar
imagens do assunto no mecanismo de busca definido, processar e classificar as imagens
através de modelos de inteligência artificial e machine learning, e enviar os resultados da
classificação para o usuário através do dispositivo informado.
Durante este estudo, será analisado o estado da arte das áreas da computação de
inteligência artificial e machine learning, procurando realizar testes com a aplicação
desenvolvida nos quesitos de acurácia, precisão e satisfação do usuário.
65
2. Objetivos
2.1. Objetivo Geral
Desenvolvimento de uma skill para dispositivos Alexa que aceite, via solicitação por
voz, um assunto e, mediante métodos de reconhecimento de imagens, entregue imagens
acerca do assunto desejado.
- Analisar o estado da arte nos temas de Redes Neurais, Deep Learning e Automatic
Speech Recognition (ASR);
- Desenvolver uma skill que busque por imagens do assunto solicitado nas APIs do
serviço de imagens Unsplash, classifique-as utilizando o modelo de inteligência
artificial MobileNetV2 e apresente os resultados para o usuário em sua conta do
serviço de mensageria Telegram;
- Levantar modelos pré-treinados para classificação de imagens alternativos ao
MobileNet, observando pontos positivos e negativos para utilização de cada um;
- Comparar a acurácia dos diferentes modelos analisados para o mesmo dataset e
ponderar se o MobileNet é realmente a melhor opção.
66
Por fim, o modelo de interação da skill redireciona a requisição para o trecho
pertinente da lógica da aplicação (etapa 3). Ativar a intenção de conectar à conta do Telegram
executará somente um trecho de código, enquanto que ativar a intenção de procurar imagens
executará outro. O modelo de funcionamento das skills, descrito acima, pode ser resumido
pela Figura 1. É na terceira etapa que as skills se diferenciam, com lógica e fluxos próprios,
assim como conexões a outros serviços.
A skill desenvolvida neste estudo foi nomeada “Procure Uma Imagem”, nome que diz
jus à sua funcionalidade primária: resgatar, através da voz, imagens curadas acerca de um
assunto, para um meio de comunicação de fácil acesso. As imagens serão obtidas através das
APIs do Unsplash, classificadas com Tensorflow, e enviadas para o usuário através do
Telegram. Embora a skill só possua um real fluxo de funcionamento (buscar, classificar e
enviar imagens), é necessário um segundo fluxo, de uso único, para realizar a conexão da
skill à conta Telegram do usuário, para que este possa receber os resultados.
67
Neste fluxo, o usuário solicitará por voz “Alexa, conectar Telegram”, comando que
desencadeará 3 ações:
- O identificador único do dispositivo físico será extraído;
- Um código único alfanumérico será gerado e retornado para o usuário;
- Será persistido no banco de dados uma associação entre o identificador e o código
único.
O usuário, de posse do código único que recebeu como resposta falada ao seu
comando, deverá enviá-lo para o bot do Telegram (Figura 3), construído também para os fins
deste estudo, que fará a captura do código para uso no próximo fluxo.
O fluxo de uso convencional pode ser descrito pela Figura 4. As duas primeiras etapas
são comuns a todas skills Alexa.
68
Neste fluxo, o usuário solicitará por voz “Procure imagens de <assunto>”. O primeiro
passo será sempre solicitar às APIs do Telegram as mensagens recebidas. Assim, têm-se
acesso aos códigos únicos dos usuários enviados para o bot. Toda mensagem enviada para o
bot acompanha um identificador único deste usuário no Telegram. Logo, com as duas tuplas
(id telegram, código único) e (id dispositivo físico, código único), cruzam-se as informações
e têm-se a relação entre um dispositivo físico e um usuário Telegram, tornando possível o
envio de mensagens diretas.
Em seguida, extrai-se o assunto do slot para ser encaminhado às APIs de busca de
imagens do Unsplash. Três imagens são retornadas pelo serviço, que servirão de input para a
classificação através do Tensorflow, mais especificamente do modelo de machine learning
MobileNet. O resultado da classificação será então enviado ao usuário através das APIs do
Telegram.
Como resultado, o usuário receberá em sua conversa com o bot as imagens e suas
respectivas classificações, simulando uma conversa. Na Figura 5, exibe-se o resultado para o
comando “Alexa, procure imagens de cachorro”, em que a palavra destacada é o assunto
extraído.
Figura 5. Usuário recebe imagens e suas classificações através do Telegram
69
6. Experimentos
Para o desenvolvimento do projeto, tem-se a necessidade de entender, de forma
quantitativa em um primeiro momento, métodos que classifiquem as imagens solicitadas pelo
usuário da skill. Para isso, abordou-se alguns dos principais modelos de classificação de
imagem, comparando-os sistematicamente utilizando métricas como acurácia, precisão e
matriz de confusão para chegar em uma escolha que mais se adeque às necessidades da
aplicação final.
Em conjunto a isso, de forma qualitativa, visando as funcionalidades da skill e o
resultado para o usuário, buscou-se testar e analisar as limitações, a arquitetura escolhida, os
modelos pré-treinados e a implementação com um todo, com o objetivo de implementar cada
etapa da aplicação de forma mais adequada e que trará o melhor resultado considerando as
limitações existentes.
6.2. Métricas
As métricas são importantes para avaliar o desempenho das redes escolhidas. Nas
tarefas de classificação, que é o caso deste trabalho, busca-se prever qual é a categoria a que
uma amostra pertence, como, por exemplo, determinar se uma imagem é de um cachorro ou
de um gato.
A primeira métrica adotada foi a Acurácia, que em problemas de classificação é o
número de previsões corretas feitas pelo modelo sobre todos os tipos de previsões feitas.
Juntamente com a acurácia, utilizamos a Precisão, que é a razão de previsões corretas para o
total de observações positivas previstas da classe. Também foi utilizada a Matriz de Confusão
entre as classes, podendo comparar as previsões de um modelo com o padrão verdadeiro. A
diagonal principal da matriz representa classes que foram corretamente previstas, enquanto
elementos fora da diagonal representam indivíduos que foram classificados de forma errada.
Dessa forma, é possível calcular as métricas para avaliar se o algoritmo está ou não
conseguindo bons resultados.
70
Tabela 1. Redes neurais e suas respectivas acurácias no dataset ImageNet (Fonte: Adaptado de Keras
Applications)
EfficientNetB0 29 MB - - 5,330,571 -
Para uma comparação com dados de teste fiéis ao uso real da aplicação, compilou-se
um dataset de 50 imagens provenientes do provedor de imagens Unsplash, distribuídas entre
5 classes pertencentes ao ImageNet (10 imagens por classe).
Como já citado, o desenvolvimento da skill se deu através da linguagem de
programação JavaScript, utilizando o framework Node.js. Estes permitiram a fácil utilização
do modelo MobileNetV2 através da biblioteca oficial da plataforma Tensorflow. Contudo, os
outros modelos aqui apresentados não estão disponíveis como plugins, então optou-se pela
plataforma Google Colaboratory para comparação dos modelos, que permite escrita e
execução remota de código Python, assim como acesso gratuito a GPUs e compartilhamento
de código. Neste caso, utilizou-se dos modelos disponibilizados através da biblioteca Keras,
da plataforma Tensorflow para Python.
MobileNetV2 67 62
VGG16 73 62
ResNet50 80 74
EfficientNetB0 75 80
71
contexto. Inclusive, o usuário final se beneficiará de um modelo mais enxuto
(aproximadamente 37 vezes menor em memória, e 39 vezes menos parâmetros utilizados que
o VGG16), já que neste fluxo o tempo de espera é uma maior prioridade. Por fim, este
modelo ainda é o único disponível oficialmente como plugin para Tensorflow em Javascript.
7. Avaliação / Resultados
Na tabela 3, encontram-se os resultados da comparação de 5 termos de pesquisa
testados na skill desenvolvida. Para cada termo de pesquisa, foram utilizadas 3 imagens
provenientes da API do serviço de imagens, tal qual o usuário final receberá em um uso real.
Registrou-se se o termo de pesquisa é uma classe pertencente ao ImageNet (banco de
imagens utilizado no pré-treinamento do MobileNetV2), a acurácia e precisão médias, assim
como se o resultado obtido foi satisfatório, do ponto de vista do usuário.
72
classes do ImageNet, o modelo falhou na predição, resultando em classes como “oil pump”
(“bomba de gasolina”, em português), e com uma acurácia média insatisfatória de 34%.
Por último, ao pesquisar por “Farol”, o usuário também recebe resultados
satisfatórios, com todas as imagens correspondentes, porém, o modelo falha na precisão,
predizendo um dos resultados como “quebra-mar” ou “cais” ao invés do exato termo,
resultando em uma precisão média de 67%. Contudo, ainda considera-se bons resultados,
visto que o usuário foi satisfeito e a precisão média de 90%.
8. Conclusão
No contexto da aplicação aqui desenvolvida, tem-se como principal objetivo a
entrega, via solicitação por voz, de imagens curadas, com boa confiança, de maneira rápida e
prática para o usuário. Nesse âmbito, considera-se mais do que suficiente a utilização do
modelo de classificação de imagens MobileNetV2, que, a um pequeno custo de acurácia e
precisão, fornece uma classificação igualmente confiável mas mais rápida, leve e enxuta.
Este estudo buscou tocar a superfície do que se é possível fazer juntando as
tecnologias de reconhecimento e processamento de voz, redes neurais, machine learning e
classificação de imagens. Como resultado, obteve-se uma aplicação de uso simples para o
usuário final, mas de grandes complexidades internas, em sua arquitetura. Os autores
consideram um sucesso (mesmo que em pequena escala) os resultados obtidos e esperam que
o trabalho aqui desenvolvido possa servir de inspiração para mais evoluções no tema.
Considera-se que os objetivos foram alcançados. O programa é capaz de buscar por
imagens de um assunto definido abertamente pelo usuário — via voz — em uma API de
imagens, classificá-las utilizando um modelo de aprendizado de máquina, e apresentar os
resultados para o usuário em um meio de comunicação usual. Entende-se como suas
principais vantagens a rapidez e praticidade para se pesquisar imagens em uma situação
cotidiana, não-acadêmica. Como desvantagens, nota-se a falta de granularidade e
customização, visto que não é possível definir o número de imagens retornadas e o provedor
das imagens, ao menos em sua primeira versão.
Para trabalhos futuros, sugere-se a criação do próprio modelo de classificação de
imagens, otimizado para imagens com cunho de uso diário e informal, como stock images,
através da composição de camadas da rede neural. Para isso, seria necessário a compilação de
um grande banco de imagens deste tipo, que entende-se como um desafio. Porém, caso
alcançado, será possível presenciar um modelo de classificação mais preciso e tão enxuto
quanto o escolhido para utilização neste estudo. Ainda, pode-se melhorar a interação do
usuário com a skill, adicionando mais enunciados (utterances), quantidade de imagens
retornadas (explorar Alexa Conversations), tratamentos de erro e customização do canal de
recebimento por outro meio ou aplicativo. Por fim, sugere-se também avaliar a utilização de
um serviço de tradução (para inglês) do texto enviado para a pesquisa das imagens, a fim de
tentar mitigar as limitações da API do Unsplash em português. Todas as implementações
estão públicas no GitHub e podem ser utilizadas como estudo para futuras implementações
ou ser adaptadas para outros projetos.
73
9. Referências
AMAZON. The Scalable Neural Architecture behind Alexa’s Ability to Select Skills.
Disponível em:
https://www.amazon.science/blog/the-scalable-neural-architecture-behind-alexas-ability-to-se
lect-skills. Acesso em: 12 abr. 2021.
Simonyan, Karen & Zisserman, Andrew. (2014). Very Deep Convolutional Networks for
Large-Scale Image Recognition. arXiv 1409.1556.
74
BUILDINGS, CITIES, AND TRANSPORTATION, 20., 2020, New York, Ny, Usa.
Proceedings of the 5th International Workshop on Non-Intrusive Load Monitoring. New
York, Ny, Usa: Acm, 2020. p. 1-5.
Mohandas, R. et al. TensorFlow Enabled Deep Learning Model Optimization for
enhanced Realtime Person Detection using Raspberry Pi operating at the Edge. AICS
(2020).
Skidmore, L. and Moore, R.K. orcid.org/0000-0003-0065-3311 (2019) Using Alexa for
flashcard-based learning. In: Proceedings of Interspeech 2019. Interspeech 2019, 15-19
Sep 2019, Graz, Austria. ISCA , pp. 1846-1850.
75