--- title: HackMD Dark Theme tags: theme description: Use `{%hackmd theme-dark %}` syntax to include this theme. --- <style> html, body, .ui-content { background-color: #333; color: #ddd; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #000; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> # Trabalho de Conclusão de Trainee - Reconhecimento de Imagens no Trekking ## Por que capturamos imagens? No Trekking, as câmeras são um ponto chave para a qualidade dos nossos robôs. A partir delas, conseguimos calcular o erro da trajetória e detectar os obstáculos e suas respectivas distâncias, informações muito importantes para garantir um bom resultado nas competições. ![1000083352](https://hackmd.io/_uploads/SJ5IuP-Z0.jpg) [toc] ## **Opções de Câmera** Atualmente, o Trekking conta com algumas opções de câmera para fazer a captura da imagem a ser usada no reconhecimento dos obstáculos. São elas: - Webcam - OAK-D Lite (Estéreo) ![imagem_2024-04-14_214830518](https://hackmd.io/_uploads/SyvDFeclA.png) - ZED (Estéreo) ![imagem_2024-04-14_214851296](https://hackmd.io/_uploads/r12dFxceR.png) A principal diferença entre elas, para nós, é a forma com que pegamos a distância do objeto até o robô. Com a Webcam, por não ser uma câmera estéreo, deve ser feita uma aproximação matemática da distância, se baseando na altura do objeto detectado. Já as outras câmeras têm a vantagem de serem estéreo, o que significa que elas possuem mais de 1 câmera embutida em seu sistema, conseguindo simular o olho humano. Isso faz com que seja possível obter a distância dos obstáculos com maior precisão, o que torna os resultados aferidos mais confiáveis. Em geral, a OAK-D Lite e a ZED possuem maior qualidade também, gerando imagens com melhor resolução e frequência de quadros. A câmera ZED tem possui a vantagem de retornar ao usuário algo que chamamos de Pose. A Pose é um conjunto de coordenadas que tem origem na posição inicial do robô, (*x*, *y*, *θ*), onde *x* e *y* são a posição relativa e *θ* é o ângulo que o robô faz com o solo horizontal. Normalmente, seriam usados vários sensores diferentes para obter essa Pose, como encoders, IMUs e outras ferramentas, mas ainda assim não teria um resultado preciso, acumulando muitos erros por conta disso. Além dessa Pose, a ZED consegue mapear o ambiente ao seu redor e guardar em um arquivo (podendo ser visualizado de forma tridimensional), possibilitando que o robô seja capaz de se localizar naquele ambiente e saber por quais pontos ele já passou. Com esse ambiente representado em computador, é possível inclusive traçar o caminho a ser trilhado pelo robô, dando mais uma opção para como fazer a competição. Já a câmera OAK-D Lite é um pouco mais limitada que a ZED, mas também é uma boa alternativa. Em relação à webcam, que é a câmera que temos usado nos últimos meses, a OAK-D Lite tem uma imagem muito mais clara e rápida, usando 3 câmeras em seu interior. Essa opção também possui uma capacidade de processamento interna a ela, podendo melhorar o funcionamento do robô e torná-lo mais eficiente. ## **Uso da Jetson** No Trekking, utilizamos as Jetsons, pequenos computadores que vão embarcados dentro dos robôs. Elas são de grande importância na categoria, visto que são essenciais para o processamento das imagens recebidas. A vantagem de ter uma dessas Jetsons no robô é porque elas possuem unidades de processamento gráfico (GPUs), que facilitam e aceleram a manipulação das informações dadas pelas câmeras. A Jetson também possibilita o uso de outras ferramentas externas, como o ROS e NoMachine, não necessariamente relacionados com o reconhecimento de imagens. ![imagem_2024-04-14_215400926](https://hackmd.io/_uploads/BJf25x9g0.png) ![imagem_2024-04-14_215442636](https://hackmd.io/_uploads/r1jAqe5eA.png) ## **Treinamento de Modelos para Reconhecimento de Obstáculos** Para a criação e uso de um modelo funcional de reconhecimento, seguimos uma espécie de passo a passo para realizar cada etapa desse processo. A primeira etapa é estabelecer um dataset para o treinamento do modelo. Para tanto, primeiro é preciso obter várias imagens e rotulá-las de acordo com o objetivo. Normalmente, quanto mais imagens tivermos, melhor é o modelo, mas é importante evitar imagens repetidas ou semelhantes, pois pode afetar negativamente os nossos resultados. No nosso caso, temos cerca de 4500 imagens de cones, em diferentes ambientes, iluminações, posições, cores e tamanhos. Todas as fotos foram redimensionadas para 640x640, uma referência tirada de um [site com vários exemplos de datasets](https://universe.roboflow.com/search?q=cone%20object%20detection). Após isso, é necessário rotular as imagens. Ou seja, precisamos definir o que é um cone em cada imagem que tivermos e, a partir disso, é gerado um arquivo com essas informações. Exemplo: ![imagem_2024-04-19_204917961](https://hackmd.io/_uploads/HyDZmKeWR.png) Em seguida, o treinamento propriamente dito é realizado, com o uso da biblioteca TensorFlow. Existem duas principais formas de se realizar esse treinamento. Uma é com o uso do Google Colab, uma ferramenta que disponibiliza alguns recursos do Google através da nuvem. A outra é usando uma máquina local, sem depender de um limite de tempo ou de conexão constante à internet. Ambas as formas têm vantagens e desvantagens, e como essa etapa despende de muitos recursos computacionais, uma pode acabar se sobressaindo à outra, dependendo do caso. Há alguns tutoriais, tanto em [formato de vídeo](https://www.youtube.com/watch?v=XZ7FYAMCc4M) como em [formato de texto](https://colab.research.google.com/github/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi/blob/master/Train_TFLite2_Object_Detction_Model.ipynb#scrollTo=-19zML6oEO7l), de como realizar esse processo. Feito o treinamento, salvamos o modelo e o convertemos para um modelo ONNX (Open Neural Network Exchange), para assim poder ser realizada a inferência. No fim, todo o processo pode ser resumido por esse fluxograma: ![imagem_2024-04-19_210829682](https://hackmd.io/_uploads/S1PYwYebR.png) ## **Inferência** A inferência é o processo de passar dados por um modelo de aprendizado de máquina para calcular uma determinada saída. Para tanto, podemos usar bibliotecas como TensorRT e TFLite. A escolha é definida no arquivo de configuração do código e pode ser alterada conforme a necessidade. As duas bibliotecas possuem algumas diferenças em suas lógicas, mas realizam a mesma função: traduzir as informações da câmera para nossa implementação na programação. A principal diferença entre as duas é a forma como são utilizadas: TensorRT é usada em conjunto com a Jetson, possibilitando um rápido processamento de informações, enquanto TFLite é usada na ausência da Jetson, por exemplo, com um notebook. ## Referências - [Documentação Oficial da OAK-D Lite](https://docs.luxonis.com/projects/hardware/en/latest/pages/DM9095/) - [Documentação Oficial da ZED](https://www.stereolabs.com/docs) - [Sensoriamento com a ZED](https://gitlab.com/MinervaBots/robos/trekking/software/progwiki-atlas/-/wikis/Sensoriamento-com-a-ZED-2) - [Sistema de Coordenadas na Zed](https://gitlab.com/MinervaBots/robos/trekking/software/estrategia-segue-linha/wiki-da-estrategia-segue-linha/-/wikis/Posição-e-coordenadas) - [Treinamento e detecção de objetos usando TensorRT](https://gitlab.com/MinervaBots/robos/trekking/software/progwiki-atlas/-/wikis/Treinamento-e-detecção-de-objetos-usando-TensorRT) - [Datasets do site Roboflow](https://universe.roboflow.com/search?q=cone%20object%20detection) - [Dataset usado para o treinamento do modelo](https://drive.google.com/drive/folders/1NPK9hOsUTsX3biSdj0X1N2-oZ58RGM9u) - [Tutorial em vídeo para Treinamento de Modelo](https://youtu.be/XZ7FYAMCc4M?si=FURx3B34tO5xc940) - [Notebook do Colab para Treinamento de Modelo](https://colab.research.google.com/github/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi/blob/master/Train_TFLite2_Object_Detction_Model.ipynb#scrollTo=-19zML6oEO7l) - [Conversão do modelo TensorFlow para ONNX](https://colab.research.google.com/drive/1tC5zjTu0BIshawdLzLCEHh1a4ZNTT9D2?usp=sharing) - [Documentação TensorRT](https://docs.nvidia.com/deeplearning/tensorrt/) - [Documentação TFLite](https://www.tensorflow.org/lite/guide/inference?hl=pt-br)