Skip to content

liviazampereti/Indentific.ai

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Identific.ai

Badge em Desenvolvimento Badge last commit

Inteligência Artificial Embarcada

📃 Índice


ℹ Sobre o projeto

Identific.ai é um projeto que visa aplicar inteligência artificial para realizar a classificação de imagens com auxílio de uma câmera USB, tudo isso utilizando a estrutura embarcada de uma placa de desenvolvimento Toradex.

Materiais Necessários

Foram utilizados nesse projeto:

  • Apalis IMX8 (Computer on Module);
  • Ixora Carrier Board;
  • Torizon (Computer on Module OS);
  • Linux (Development PC OS).

Com essas informações, foi possível obter o Quickstart da Toradex. Além disso, para possibilitar o uso do microcontrolador e a sua conexão com o computador de desenvolvimento, foram usados:

  • Webcam USB Logitech C270;
  • Teclado USB;
  • Mouse USB;
  • Monitor;
  • Apalis Heatsink Fan
  • Antena e cabo wi-fi
  • Cabo Serial-DB9 e Serial-USB ou Conversor USB com 3 jumpers (Rx, Tx e GND);
  • 2 cabos Ethernet (Placa e computador de desenvolvimento);
  • Fonte 12V e 5A.

(voltar ao início)


🛠 Primeiros passos

Inicialmente, é necessário preparar a estrutura, fazendo a montagem do hardware e conectando o computador de desenvolvimento à placa. Essa fase varia para cada modelo de placa utilizada, porém a Toradex fornece suporte para todos os modelos que a empresa trabalha em seu site para desenvolvedores.

Conforme citado, foi utilizada a placa Apalis IMX8 - Ixora e recomenda-se um sistema operacional Linux no computador de desenvolvimento. Para os primeiros passos, conectando a fonte e demais periféricos à placa recomenda-se a leitura da primeira parte do módulo 1 do Quickstart.

Conexão da placa com o computador

Um ponto importante é elaborar a comunicação da placa com o computador de desenvolvimento, para isso há dois caminhos possíveis: utilizar a conexão serial ou fazer a conexão via rede.

Essas duas formas podem apresentar certos problemas e dificuldades, os quais serão explicados adiante.

Conexão serial

  • Cabo Serial-DB9 e Serial-USB:

    O cabo serial-DB9 possui uma linha vermelha, a qual indica o conector 1 do cabo, já a placa possui uma bolinha, indicando o 1 na porta X22. Quanto ao cabo Serial-USB, o USB vai conectado ao computador contendo o Linux.

    Abaixo estão algumas fotos do cabo serial-DB9 e de como a conexão deve ser feita com a placa, conforme descrito acima.

  • Cabo USB com 3 jumpers (Rx, Tx e USB):

    Para a ligação com o conversor USB, utilzando jumpers, é necessário conectá-los aos pinos da placa de maneira correta, na porta X22:

    • RxD - pino 3;
    • TxD - pino 5;
    • GND - pino 9;
    • Quanto ao conversor USB é só conectá-lo ao computador contendo o Linux.

    Para ilustrar, temos abaixo, à esquerda, imagens do conversor USB com os jumpers, indicando as cores de cada pino (RxD - Cinza, TxD - Roxo, GND - Preto) e também a conexão feita na placa.

    Obs: quando testamos esse modo de conexão, dependendo da maneira como conectássemos os cabos, a placa não ligava. Conversando com o suporte, foi levantada a dúvida sobre o problema estar no cabo, sugerindo trocá-lo. Outras vezes que a placa conseguiu ligar, foi observado muito ruído, acreditamos que a conexão estava errada.

  • Checagem da porta serial:

    Para checar qual porta se encontra no computador, no terminal do Linux:

    $ ls /dev/ttyUSB*

    Possivelmente a porta conectada será: /dev/ttyUSB0. Após isso, instalar o picocom e rodar o segundo comando:

    $ sudo apt install picocom
    $ sudo picocom -b 115200 /dev/ttyUSB0

    Caso o resultado do comando ls não tenha 0 como dígito final, altere no segundo comando acima. Com isso, será possível observar no terminal o que acontece no serial, permitindo a identificação da placa conectada.

Conexão via network

  • Descobrindo o IP:

    No terminal Linux, do computador desenvolvedor:

    $ ip a

    Serão printadas várias redes, procurar por enp ou eth , na imagem abaixo está localizado no número 2.

    Em seguida, digite o seguinte comando, substituindo a rede encontrada. No caso da imagem: "enp2s0f1".

    $ sudo arp-scan --localnet --interface=<rede encontrada>

    Obs: Caso o computador não encontre o comando digitado, digite o código abaixo e repita os passos descritos:

    $ sudo apt-get install arp-scan

    Dessa maneira, o IP da placa vai estar no terminal após a execução do comando, conforme a imagem abaixo.

    Um tutorial detalhado, fornecido pela Toradex, está localizado em Find the board IP - Toradex.

  • Conectando com a placa

    Executar o seguinte comando, substituindo o IP pelo endereço encontrado acima:

    $ ssh torizon@<IP>

    Obs: Após algum tempo ou caso hajam mudanças na rede conectada, esse endereço possivelmente será diferente, sendo necessário repetir o passo anterior de descobrir o IP a cada vez que o usuário trabalhe na placa.

    Confirmar a conexão com yes e insira o login e senha:

    Login: toradex

    Senha: 123

Utilização do Visual Studio Code

O VS Code possui suporte para conexão com as placas de desenvolvimento da Toradex, para isso, é necessário instalar a extensão da empresa no programa e conectar com a placa via rede ou serial.

A Toradex fornece um guia bem completo para realizar essa operação na sua página de desenvolvedores, no seguinte link: Visual Studio Code Extension for Torizon

Interface da placa de desenvolvimento

Até então, tudo foi feito conectando-se remotamente a placa com o computador, porém, o microcontrolador já vem com o sistema operacional da Toradex, o Torizon e a aplicação utilizada para gerenciar seus containers é o Portainer.io. Ele já vem com alguns containers básicos e permite a instalação de outros, necessários para a aplicação do usuário. Informações de como utilizar o Portainer, iniciar, gerenciar e criar novos containers estão descritas no Módulo 2 do Quickstart da Toradex, porém recomendamos aos usuários seguirem o tutorial desde o início para sanar quaisquer dúvidas.

Outra informação relevante é que, ao iniciar a placa, será necessário fornecer um login e senha para o Portainer, as credenciais utilizadas atualmente são:

Login: identific_ai

Senha: identificai

(voltar ao início)


📷 Testes iniciais com a câmera

Para a realização do projeto é necessário uma câmera USB, a qual será conectada posteriormente na placa de desenvolvimento. Porém, antes é importante testar o funcionamento da câmera e o uso da biblioteca OpenCV, utilizando o próprio computador.

Testando e encontrando a câmera

No terminal Linux, para instalar o gucview:

$ sudo add-apt-repository ppa:pj-assis/testing
$ sudo apt-get update
$ sudo apt-get install guvcview

Com isso, é só procurar por "Visualizador de Vídeo".

Para encontrar os endereços que estão conectando à câmera USB, mantenha-a desconectada e coloque no terminal Linux:

$ cd /dev
$ ls video

Veja quais vídeos aparecem, no nosso caso, foram video0 e video1, esses são os endereços da webcam embutida ao notebook. Agora repita os comandos com a câmera conectada e veja quais novos vídeos aparecem, eles são referentes à webcam USB, entre os que aparecem para nós está o video3.

Capturando imagens da câmera usando OpenCV

Segue abaixo código em Python para capturar a imagem da câmera no Linux:

python
import cv2

cap = cv2.VideoCapture("/dev/video3") # check this
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Display the resulting frame
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Vale ressaltar que tudo isso deve ser feito no computador de desenvolvimento, visando checar o funcionamento da câmera e do código.

(voltar ao início)


💻 Aplicação embarcado

Agora, considerando que todos os componentes foram devidamente testados e estão funcionando, vamos focar na aplicação do Identific.ai para o sistema embarcado.

📡 Conexão wi-fi

Entre os periféricos que acompanham o sistema embarcado está uma antena para permitir comunicação wi-fi da placa, como mostra a imagem abaixo.

Para se conectar com uma rede, devem ser seguidos os seguintes passos no terminal da placa, acessado via ssh:

$ sudo -i
Password: 

A senha é a mesma da conexão ssh

Após isso, insira a seguinte sequência de comandos:

$ rfkill unblock all
$ nmcli radio wifi on
$ nmcli dev wifi list

Será printada uma lista com todas as redes disponíveis para conexão, conforme a imagem abaixo:

Selecione a sua rede e conecte com o comando abaixo, digitando em seguida a senha do wi-fi:

$ nmcli --ask dev wifi connect <Nome da rede>
Password: 

$ ifconfig mlan0

Caso esteja tudo certo, o resultado será:

(voltar ao início)


📸 Capturando imagens com a placa

Criando o container

Inicialmente é necessário clonar o repositório de samples da Toradex no computador de desenvolvimento, disponível no Github

$ git clone https://github.com/toradex/torizon-samples

Neste Github estão os arquivos para do GStreamer, um framework que permite o desenvolvimento de aplicações com captura de imagens. Para a sua utilização na placa, será necessário construir um container com a aplicação e carregá-lo em uma conta Docker, seguindo os seguintes comandos no computador:

$ cd ~/torizon-samples/gstreamer/bash/simple-pipeline
$ docker build --build-arg BASE_NAME=wayland-base-vivante --build-arg IMAGE_ARCH=linux/arm64/v8 -t <username_dockerhub>/<dockerfile_name>
$ docker push <dockerhub-username>/<dockerfile_name>

Após esperar o código rodar (pode levar um tempo), é importante conferir se o upload foi concluído com sucesso, verificando o seu dockerhub

Para evitar confusões ao analisar os próximos prints, os nomes de usuário e arquivo usados no Docker foram, respectivamente, identificai e gst_example.

Verificando endereço da webcam

Será necessário verificar qual endereço a placa está dando para a webcam, similarmente como foi feito para os testes no computador, para isso deve ser utilizado o comando ls /dev/video* com o USB desconectado da placa e então repetir com ele conectado.

Nos dois casos serão printados alguns endereços, conforme imagem abaixo. Os que aparecerem apenas no segundo comando são os endereços a ser utilizados posteriormente.

No nosso caso e no decorrer do documento serão usados video2 e video3.

Carregando o container na placa

Agora, o container carregado no Dockerhub será instalado na placa, para isso, acessando a placa via conexão ssh

$ docker pull <dockerhub-username>/<dockerfile_name>
$ docker run --rm -it -v /tmp:/tmp -v /var/run/dbus:/var/run/dbus -v /dev:/dev -v /sys:/sys \
    --device /dev/video2 --device /dev/video3\
    --device-cgroup-rule='c 199:* rmw' \
    <dockerhub-username>/<dockerfile_name>
# Lembrar de alternar os videos no comando anterior, caso os endereços obtidos sejam diferentes

# Testando as duas entradas de vídeo
$ gst-launch-1.0 v4l2src device='/dev/video2'  ! "video/x-raw, format=YUY2, framerate=5/1, width=640, height=480" ! fpsdisplaysink video-sink=waylandsink text-overlay=false sync=false
$ gst-launch-1.0 v4l2src device='/dev/video3'  ! "video/x-raw, format=YUY2, framerate=5/1, width=640, height=480" ! fpsdisplaysink video-sink=waylandsink text-overlay=false sync=false

Com um dos dois últimos comandos, um temporizador estará disponível no terminal e o vídeo exibido no monitor, conforme as imagens e gif abaixo:

(voltar ao início)


🧠 Desenvolvimento da Inteligência Artificial

YOLO

Para o reconhecimento das faces será usada a rede neural YOLO, capaz de detectar e classificar objetos, visando o nosso objetivo ela precisa ser treinada com um dataset próprio. Essa rede foi escolhida por ser mais leve, logo, facilitando a implementação em um sistema embarcado e todo o seu desenvolvimento foi feito em Pytorch.

A arquitetura visa a extração das chamadas features, ou seja, características que contribuem para a classificação. Feito essa extração, o algoritmo cria várias bounding boxes e um mapa de probabilidade de classes, de maneira a obter os objetos que buscamos identificar e suas respectivas bounding boxes. Abaixo estão algumas imagens ilustrando a arquitetura e o comportamento da rede:

Os arquivos necessários para uso e instalação dessa rede estão na pasta YOLOV5 deste repositório, incluindo um README explicando passo a passo.

Interface com o usuário (GUI)

Também foi elaborada uma GUI para permitir a comunicação do usuário com a aplicação, o programa foi elaborado utilizando o framework Qt e em Python, os códigos e algumas imagens da interface estão na pasta gui do repositório. Devido à complexidade do projeto como um todo, ainda não foi criado o container responsável pela GUI no Docker, nem sua implementação.

(voltar ao início)


🔗 Integração IA com a câmera

Uma das maneiras para transferir o código e uso da camera embarcado, é a criação de dois containers:

  • Primeiro: responsável pela conexão com a câmera, como já foi explicado no documento;
  • Segundo: responsável por realizar a interface gráfica e o processamento.

Alguns links importantes são:

(voltar ao início)


💭 Próximos passos

Entre os próximos passos para a finalização do projeto estão:

  • Aperfeiçoamento e estabilização da captura de imagens;
  • Adaptação das imagens capturadas, para que sejam aplicadas ne rede neural;
  • Melhorias na interface do usuário e integração com o sistema;
  • Criação de containers para cada função do sistema;
  • Treinamento da YOLO para reconhecimento de faces;
  • Testagem da YOLO embarcada com a câmera;
  • Correção de eventuais bugs e melhorias.

(voltar ao início)


❗ Informações extras

  • Se placa começar a reiniciar sozinha, checar a fonte, sua voltagem e o funcionamento da tomada;
  • O Torizon trabalha com vários containers, inclusive o terminal é um container;
  • A Toradex tem um suporte bem eficiente e com respostas bem rápidas para casos de dúvidas ou problemas técnicos, entre as possíveis formas de suporte estão:
  • A página de desenvolvedores da Toradex tem bastante informações úteis e que ajudam muito, mas elas ficam um pouco espalhadas, é preciso ter paciência e procurar bem.

(voltar ao início)


👩‍💻 Autores


Ana Letícia Garcez

Lívia Zamperetti

Rafael Saud

(voltar ao início)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages