O Detect My Scene foi um projeto realizado durante a live coding do meu canal na Twitch. O objetivo principal era realizar algum projeto assistivo, para suprir alguma necessidade. Através de discussões foi resolvido que poderíamos ajudar deficientes visuais, criando um programa que fosse capaz de descrever uma foto (que poderia ser extendido para vídeos também) através de texto ou áudio. Com isso o deficiente visual poderia tirar fotos em um ambiente ou até tirar fotos de alguma notícia ou artigo para rodar no software e ter uma breve descrição do que existe ali.
Para a criação dessa aplicação foram utilizados alguns conceitos de Inteligência Artificial e Processamento Digital de Imagens, com a biblioteca ImageAI e alguns cálculos e aplicações implementadas do zero. O projeto é realizado em alguns passos.
Para a maioria dos testes durante o desenvolvimento do projeto, a imagem a seguir foi utilizada, além de algumas outras para validações. Os objetos identificados nas imagens testadas no desenvolvimento mostram apenas objetos que o algoritmo tem 45% ou mais de certeza de ser de fato aquilo que foi identificado.
Esse passo é realizado pela própria biblioteca utilizada (ImageAI), onde são identificados todos os objetos reconhecidos na imagem, informando o nome, probabilidade de ser aquele objeto específico e suas delimitações na imagem. Essas informações base são essenciais para os próximos passos, pois são com elas que todas as informações são cruzadas e geram novos resultados.
Após o passo 1 o objetivo foi calcular o "ponto central" dos objetos, a partir da delimitação, conhecida como box_points. Determinar esse ponto foi necessário para que cada objeto tivesse sua posição em um ponto (x, y) na imagem, para que o próximo passo pudesse ser feito.
Com os objetos tendo suas posições devidamente identificadas, foi possível implementar e calcular a distância euclidiana entre cada um dos objetos identificados. Além de saber exatamente em que área da imagem cada objeto está, agora sabemos a distância entre cada um. Isso possibilita a implementação de outros algoritmos como KNN (Vizinho mais próximo), entre outros, a fim de criar uma relação entre os objetos e criar descrições para o/a deficiente visual cada vez mais detalhadas.
Além disso foi criada uma Matriz de Distância, com identificador entre cada objeto (como pode ser visto na imagem acima) e linhas indicando onde inicia e para. A tabela com os valores para a imagem de exemplo podem ser vistos abaixo (distância em pixels).
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
0 | 0 | 132 | 71 | 452 | 188 | 203 | 190 | 296 |
1 | 132 | 0 | 63 | 584 | 318 | 282 | 321 | 426 |
2 | 71 | 63 | 0 | 521 | 259 | 249 | 261 | 367 |
3 | 452 | 584 | 521 | 0 | 282 | 433 | 269 | 193 |
4 | 188 | 318 | 259 | 282 | 0 | 171 | 25 | 108 |
5 | 203 | 282 | 249 | 433 | 171 | 0 | 195 | 240 |
6 | 190 | 321 | 261 | 269 | 25 | 195 | 0 | 109 |
7 | 296 | 426 | 367 | 193 | 108 | 240 | 109 | 0 |
Tabela 1. Matriz de distância entre os objetos da imagem
De acordo com o que foi feito no passo 1 já é possível criar uma descrição textual do que pode ser encontrado na imagem e uma sonora também. Todos os tipos de objetos identificáveis pelo modelo foram traduzidos para que um dos principais diferenciais do projeto pudesse ser feito: descrição textual e sonora em português. A seguir é possível escutar o áudio gerado automaticamente depois da identificação dos objetos:
A partir do passo 2 é possível melhorar a descrição textual e sonora. Por isso foram criados dois tipos de descrição, uma simples (descrição anterior) e outra mais detalhada a respeito da licalização dos objetos. A descrição um pouco mais detalhada pode ser vista a seguir:
A partir do passo 3, com a criação da matriz de distância seria possível, através da identificação do objeto e a distância entre eles, estimar a distância entre cada um em métricas reais (metro) e a distância do objeto até o observador. Com isso seria possível criar uma descrição complexa e detalhada para o deficiente visual, entretanto não seria viável implementar isso durante as lives, visto que iria demandar muito tempo e ainda há muito o que aprender por aí em outros projetos!
Siga estas instruções para rodar o projeto na sua máquina.
- Python 3.7 ou superior
- Máquina com GPU (Pode ser feito sem GPU, será apenas mais lento)
Com o python 3.7.x
instalado, basta instalar com o gerenciador de pacotes do python o pipenv:
pip3 install pipenv
Clone o repositório para obter o código necessário:
git clone https://github.com/mateustoin/DetectMyScene
O arquivo de modelos utilizado para a identificações do projeto é o resnet50_coco_best_v2.0.1.h5
, pode ser encontrado o link de download na documentação do ImageAI. Cole ele na pasta raiz do projeto. Depois todas as dependências necessárias para a execução do projeto podem ser instaladas automaticamente com o comando:
pipenv install
Para utilizar o projeto, basta entrar no ambiente criado pelo pipenv.
pipenv shell
Depois que estiver rodando dentro do ambiente virtual, a execução do código é realizada através de uma simples API para facilitar a entrada de dados. Pode ser iniciada com:
uvicorn main:app
Um servidor se iniciará em 127.0.0.1:500
.
Escolha uma imagem e clique em Enviar. Após o processamento será retornado as descrições textuais como corpo da resposta e os áudios serão gerados na mesma pasta do projeto.