Visão Computacional e Machine Learning
Utilizando visão computacional para detecção de objetos em uma Imagem
Introdução
Atualmente (20/03/2020) estou participando de uma iniciação científica no centro universitário FIAP (Faculdade de Informática e Administração Paulista) juntamente com mais 5 integrantes, Giulia Bussmann (gerente do projeto), Guilherme Cunha, Gustavo Maedo, Henrique Evangelista e Arthur Madureira. Projeto este se baseia na criação de um maquinário ou robô capaz de identificar lixos ou dejetos em superfícies e então proceder de alguma maneira diante uma ação pré-programada. Temos como utopia de projeto tornar todos os processos autônomos, dispensando assim qualquer interferência ou ajuda humana nas tarefas do robô, porém é evidente que tais tarefas pareçam ser difíceis para 1 ano apenas, isso denota a necessidade de extensão do projeto para até o fim do curso (que não necessariamente possa ocorrer).
Todos da equipe possuem posições de atuação bem definidas, cada um em sua área de preferência e comodidade, Giula Bussmann atuando como gerente de projetos está responsável na parte administrativa do projeto e na parte estrutural do robô, Arthur Madureira também faz parte da pesquisa e construção estrutural do robô, Guilherme Cunha participa em foco na área eletrônica do projeto, Gustavo Maedo e Henrique Evangelista são os programadores principais de todo os processos, por fim Gustavo Yamashita (autor da redação) atua de forma resiliente na parte eletrônica e nos algoritmos de detecção de objetos.
Objetivo
O projeto tem como propósito a entrega de um robô autônomo capaz de se locomover em determinados ambientes e então reconhecer objetos que podem ser considerados como descartáveis, diante essa recognição o robô irá coletar esses dejetos e armazenar em um recipiente próprio com a finalidade em despejar esses objetos nos locais adequados para o tratamento de lixos. A equipe espera poder apresentar este projeto no evento NEXT (evento relacionado a tecnologia) da FIAP e levar tal ideia para a criação de uma Startup (empresa emergente) que ocorrerá no quinto ano do curso (atualmente estamos no segundo ano, terceiro semestre).
Nesta redação focarei na pesquisa sobre o uso de ferramentas para o reconhecimento de objetos a partir de uma imagem, logo, explicações sobre a parte de motores, placas, estrutura física, escolha de sensores e administração da equipe não serão tratadas.
Ferramentas utilizadas
Algoritmos para processamento de imagens e bem como o reconhecimento de objetos são lógicas e cálculos que estão emergindo de forma exponencial na parte de utilidades no mercado, então temos a disposição diversas ferramentas que podem ser utilizados para o propósito deste projeto, daremos enfase duas delas, OpenCV e Dlib.
OpenCV
- Biblioteca mais popular para detecção de faces.
- OpenCV = Open Source computer vision.
- Criada pela Intel em 1999.
- Escrita em C/C++.
Dlib
- Escrita em C++.
- Criação de softwares complexos para resolver problemas no mundo real.
- Aplicação como robótica, sistemas embarcados, smartphones (aplicação de larga escala).
- Documentação excelente.
- Possui bibliotecas de machine learning: classificação, regressão e agrupamento.
- Máquinas de vetores de suporte (SVM) e deep learning (CNN).
Pycharm
- Ambiente de desenvolvimento integrado
- Usado para programar em Python
Cmake
- Sistema multiplataforma usado para realizar geração automatizada
- Gravado em C/C++
Notebook
- Marca Avell
- 16G de memória RAM
- Placa de vídeo GeForce Experience GTX 1050Ti
- HD 1 Tera
- Processador Intel COREi7 8th Gen
SVM
SVM ou Máquina de vetores de suporte é um algoritmo de reconhecimento de padrões, ou seja, esse sistema analisa determinada imagem utilizando vetores. Esta lógica é muito utilizada atualmente para a recognição de objetos e usaremos para este propósito.
O SVM é uma ferramenta utilizada para classificação e regressão, possuindo uma grande otimização em seu processo, irei explicar melhor com a seguinte imagem:
Imagine que nessa amostra existe uma divisão de 50% entre uma classe A (ponto amarelo) e uma classe B (ponto roxo).
O trabalho do SVM está em dividir essas duas classes por uma reta (hiperplano) para então conseguir diferenciar as características de cada Classe.
Testes
Nos testes inicias o programa identificará o logo da Coca-Cola, o motivo está em evitar interferência de possíveis deformidades ou diferenças na cor do objeto (garrafa no caso). Para isso devo selecionar minhas imagens referência, o que o programa fará é comparar as imagens de teste com as imagens referência.
Agora devo sinalizar nas imagens onde está o logo da Coca-Cola para então o programa reconhecer o padrão.
Foi feito um processo de demarcação do logo para ensinar o programa a reconhecer o padrão, ou seja, um processo puramente braçal e humano, essas duas imagens servem apenas para ilustrar. Se você analisar o lado esquerdo há uma lista com os nomes das imagens, esse "ensino" pra máquina foi feito várias vezes para aumentar a precisão.
Nesta parte do processo foi criado um programa de treinamento do computador, ele irá analisar as imagens referência com o logo demarcado e então encontrar o padrão vetorial, gerando assim nosso arquivo .svm referente a aprendizagem.
- Importamos a biblioteca dlib, responsável pelo reconhecimento de objetos.
- .
- Atribuímos a variável "opcoes" a função de reconhecimento do dlib.
- Em "opcoes" habilita função que muda o ângulo da imagem para diferentes reconhecimentos.
- C é o valor de precisão, quanto maior o C mais preciso será, porém se for muito preciso pode ser que o programa não reconheça o logo um pouco mais deformado que o normal.
- .
- Do arquivo XML criado quando desenhei os retângulos em volta do logo é gerado o vetor de padronização.
Neste código começa o processo de detecção, ou seja, o aprendizado já está completo. Devemos então escolher imagens para desafiar o programa a encontrar o logo da Coca-Cola.
Essa são as imagens que escolhi para desafiar o programa, rodando saberei do resultado obtido e a sua eficiência
Perceba de que em duas imagens obtivemos sucesso em reconhecer o logo da Coca-Cola que estava inteiro, os logos cortados não foram percebidos, faz sentido já que não ensinamos o programa a identificar a metade do logo, o processo se repetiu nas outras imagens.
Testes com uma WebCam
Evidentemente o robô não ficará tirando fotos e analisando-as, pois esse método gastaria uma memória desnecessária e processamento desnecessário, logo, o robô deve analisar a imagem observada por meio de uma câmera e fazer a análise em tempo real. para isso o código foi ligeiramente modificado.
Para mais detalhes do código me consultar |
Os testes mostraram alguns pontos interessante, primeiro que a luz interfere no ambiente, ou seja, o reflexo da garrafa atrapalha o reconhecimento do algoritmo, uma saída seria treinar a máquina com imagens onde existe algum tipo de reflexo. Um outro ponto é a questão da angulação do objeto, de certa forma essa angulação atrapalha o reconhecimento, uma solução é ter exemplos na treinamento com diversos ângulos. Percebemos também que o corte do logo "Coca-Cola" para "Coca", "Cola" ou até a sua ausência gera uma incerteza no reconhecimento.
Possíveis melhorias e atualizações
De acordo com Kai Fu Lee em seu livro "Inteligência Artificial", a inteligência artificial no foco de reconhecimento de objetos tem um limite no quesito de eficiência do código, o que realmente fará a diferença depois que o melhor programador atualizou o código será de fato as imagens referências, ou seja, os dados que alimentamos o programa. Esse é o reflexo de que quanto mais informações/referências inserimos, mais o programa identificará com precisão o que desejamos.
Seguindo esse raciocínio, devemos investir no nosso banco de dados referente ao que desejamos que o programa identifique.
Conclusão e próximos passos
O processo de reconhecimento de objetos usando como referência o logo é um método de evitar deformidades do objeto que possam atrapalhar a recognição, é evidente que uma garrafa sem seu logo passará despercebida, para isso então deve se aplicar outras imagens referências, o interessante deste código é a possibilidade de criar inúmeros arquivos SVM, podendo assim reforçar o aprendizado do programa.
O programa se demonstrou eficiente em seu uso, com um potencial de melhoria e avanço (mencionados no tópico anterior) que poderão evitar falsos positivos e erros durante o processo.
Foi dito anteriormente que o objetivo desse robô está em reconhecer não apenas uma garrafa de Coca-Cola, mas também lixos em geral, isso implica em um trabalho humano entre os integrantes da equipe para juntar dados suficientes para alimentar o "ensino" do robô, posteriormente poderá ser aplicado uma IA (inteligência Artificial) para facilitar o processo.
Para passo a passo de todo o processo acesse: https://www.udemy.com/course/reconhecimento-de-faces-e-de-objetos-com-python-e-dlib/
LinkdIn dos envolvidos
- Gustavo Yoshimi Yamashita: https://www.linkedin.com/in/gustavo-yamashita/
- Giulia Bussmann: https://www.linkedin.com/in/giulia-bussmann-688b17179/
- Henrique Evangelista: https://www.linkedin.com/in/henriqueevangelista/
- Guilherme Cunha: https://www.linkedin.com/in/henriqueevangelista/
- Gustavo Maedo: https://www.linkedin.com/in/gustavomaedo/
- Arthur Madureira: https://www.linkedin.com/in/arthur-madureira-barboza/
Referências Bibliográficas
LEE, Kai Fu. Inteligência Artifical. Tradução de Marcelo Barbão 1.ed. Globo S.A, Rio de Janeiro, 2019.
Curso Udemy. Reconhecimento de faces e de objetos: https://www.udemy.com/course/reconhecimento-de-faces-e-de-objetos-com-python-e-dlib/
Comentários
Postar um comentário