---
# System prepended metadata

title: Reconhecimento de Imagens no Trekking

---

---
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)