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.
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.
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.
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.
-
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.
-
Descobrindo o IP:
No terminal Linux, do computador desenvolvedor:
$ ip a
Serão printadas várias redes, procurar por
enp
oueth
, 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
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
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
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.
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
.
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.
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.
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á:
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
egst_example
.
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
evideo3
.
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:
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.
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.
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:
- Tutorial criação de container - Toradex
- Thread sobre acesso de camera USB no Torizon - Toradex
- Uso do Open-CV no Torizon - Toradex
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.
- 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:
- Página da comunidade
- Email: [email protected]
- Telefone: (19) 3327-3732
- 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.
Ana Letícia Garcez |
Lívia Zamperetti |
Rafael Saud |
---|