<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexandre Justen Filho</title>
    <description>The latest articles on DEV Community by Alexandre Justen Filho (@alexandrejusten).</description>
    <link>https://dev.to/alexandrejusten</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1262521%2Fa2a4964d-b744-4122-9b06-b471a987fe47.jpeg</url>
      <title>DEV Community: Alexandre Justen Filho</title>
      <link>https://dev.to/alexandrejusten</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexandrejusten"/>
    <language>en</language>
    <item>
      <title>IA Não é Só Chat: o Mundo de Computer Vision, 3D e IA Multimodal</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Sun, 30 Aug 2026 05:25:31 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/computer-vision-de-imagens-a-reconstrucao-3d-e-ia-multimodal-1gh3</link>
      <guid>https://dev.to/alexandrejusten/computer-vision-de-imagens-a-reconstrucao-3d-e-ia-multimodal-1gh3</guid>
      <description>&lt;p&gt;Quando alguém fala em Computer Vision, a primeira coisa que costuma vir à cabeça é detecção de objetos.&lt;/p&gt;

&lt;p&gt;É uma parte importante, mas está longe de ser tudo.&lt;/p&gt;

&lt;p&gt;Na prática, Computer Vision reúne problemas bem diferentes: entender imagens, acompanhar objetos em vídeo, estimar profundidade, descobrir a posição de uma câmera, reconstruir ambientes em 3D, trabalhar com LiDAR, interpretar documentos e, mais recentemente, conectar visão com modelos de linguagem.&lt;/p&gt;

&lt;p&gt;Um sistema mais completo pode ter algo parecido com isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera / LiDAR / IMU
        ↓
Preprocessing
        ↓
Detection / Segmentation
        ↓
Tracking / Pose
        ↓
Depth / Geometry
        ↓
SfM / MVS / SLAM
        ↓
Point Cloud
        ↓
Mesh / 3D Representation
        ↓
Scene Understanding
        ↓
Vision-Language Model
        ↓
LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia deste texto é organizar esse universo de forma prática para quem desenvolve software e quer entender como as peças se encaixam.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. O mapa geral
&lt;/h2&gt;

&lt;p&gt;Uma forma simples de dividir Computer Vision é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COMPUTER VISION
│
├── Imagens
│   ├── Classification
│   ├── Detection
│   ├── Segmentation
│   ├── OCR
│   ├── Image Retrieval
│   ├── Image Restoration
│   └── Image Generation
│
├── Vídeo
│   ├── Object Tracking
│   ├── Action Recognition
│   ├── Optical Flow
│   └── Motion Analysis
│
├── Geometria
│   ├── Camera Models
│   ├── Camera Calibration
│   ├── Stereo Vision
│   ├── Depth Estimation
│   ├── Epipolar Geometry
│   ├── SfM
│   ├── MVS
│   └── 3D Reconstruction
│
├── 3D
│   ├── LiDAR
│   ├── Point Clouds
│   ├── Registration
│   ├── SLAM
│   ├── Mesh Reconstruction
│   ├── NeRF
│   ├── Gaussian Splatting
│   └── 3D Object Detection
│
├── Humanos
│   ├── Face Detection
│   ├── Face Recognition
│   ├── Pose Estimation
│   ├── Hand Tracking
│   └── Gesture Recognition
│
└── IA Moderna
    ├── CNN
    ├── Vision Transformers
    ├── Vision-Language Models
    ├── Embeddings
    ├── Multimodal AI
    └── Vision + LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O interessante é que essas áreas não ficam isoladas. Em projetos reais, normalmente existe uma combinação delas.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Imagem é um tensor
&lt;/h2&gt;

&lt;p&gt;Antes de falar de modelos, vale entender o dado de entrada.&lt;/p&gt;

&lt;p&gt;Uma imagem RGB pode ser representada como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;H × W × 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1920 × 1080 × 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em frameworks de Deep Learning, é comum encontrar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[B, C, H, W]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;B&lt;/code&gt; = batch;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;C&lt;/code&gt; = canais;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;H&lt;/code&gt; = altura;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;W&lt;/code&gt; = largura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma imagem pode ser vista como uma função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I(x, y, c)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onde &lt;code&gt;x&lt;/code&gt; e &lt;code&gt;y&lt;/code&gt; representam a posição do pixel e &lt;code&gt;c&lt;/code&gt; o canal.&lt;/p&gt;

&lt;p&gt;Parece uma definição simples, mas praticamente todo pipeline de visão começa aqui.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Image Processing
&lt;/h2&gt;

&lt;p&gt;Antes de colocar uma imagem em uma rede neural, muitas vezes é necessário prepará-la.&lt;/p&gt;

&lt;p&gt;Algumas operações comuns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;resize;&lt;/li&gt;
&lt;li&gt;crop;&lt;/li&gt;
&lt;li&gt;padding;&lt;/li&gt;
&lt;li&gt;normalização;&lt;/li&gt;
&lt;li&gt;conversão de espaço de cor;&lt;/li&gt;
&lt;li&gt;redução de ruído;&lt;/li&gt;
&lt;li&gt;sharpening;&lt;/li&gt;
&lt;li&gt;thresholding;&lt;/li&gt;
&lt;li&gt;detecção de bordas;&lt;/li&gt;
&lt;li&gt;operações morfológicas;&lt;/li&gt;
&lt;li&gt;correção de distorção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um pipeline básico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imagem original
      ↓
Resize
      ↓
Normalização
      ↓
Correção / filtragem
      ↓
Modelo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bibliotecas muito usadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenCV
Pillow
NumPy
scikit-image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nem todo problema precisa de Deep Learning. Em alguns casos, OpenCV resolve praticamente tudo.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Classification
&lt;/h2&gt;

&lt;p&gt;Classification responde:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Qual é a classe dessa imagem?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imagem
  ↓
Modelo
  ↓
dog: 0.96
cat: 0.03
horse: 0.01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Formalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P(class | image)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arquiteturas clássicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LeNet;&lt;/li&gt;
&lt;li&gt;AlexNet;&lt;/li&gt;
&lt;li&gt;VGG;&lt;/li&gt;
&lt;li&gt;GoogLeNet;&lt;/li&gt;
&lt;li&gt;ResNet;&lt;/li&gt;
&lt;li&gt;DenseNet;&lt;/li&gt;
&lt;li&gt;EfficientNet;&lt;/li&gt;
&lt;li&gt;ConvNeXt;&lt;/li&gt;
&lt;li&gt;Vision Transformer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Classification é normalmente o ponto de entrada para quem começa a estudar visão computacional com Deep Learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. CNNs
&lt;/h2&gt;

&lt;p&gt;As Convolutional Neural Networks foram responsáveis por uma grande parte da evolução inicial do Deep Learning aplicado a imagens.&lt;/p&gt;

&lt;p&gt;A convolução percorre a imagem utilizando filtros que aprendem padrões.&lt;/p&gt;

&lt;p&gt;De forma simplificada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
  ↓
Convolution
  ↓
Feature Map
  ↓
Activation
  ↓
Pooling
  ↓
More Features
  ↓
Classifier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No começo da rede aparecem padrões mais simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;edges
corners
textures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nas camadas seguintes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shapes
parts
objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E no final:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;semantic representation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Object Detection
&lt;/h2&gt;

&lt;p&gt;Classification diz o que existe.&lt;/p&gt;

&lt;p&gt;Detection também precisa dizer onde.&lt;/p&gt;

&lt;p&gt;Uma saída típica contém:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class
confidence
x1
y1
x2
y2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class
confidence
center_x
center_y
width
height
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visualmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────┐
│                              │
│    ┌───────────────┐         │
│    │    person     │         │
│    └───────────────┘         │
│                              │
│                  ┌────────┐  │
│                  │  car   │  │
│                  └────────┘  │
│                              │
└──────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Object Detection: principais abordagens
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Two-stage detectors
&lt;/h3&gt;

&lt;p&gt;Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R-CNN
Fast R-CNN
Faster R-CNN
Mask R-CNN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia geral:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
 ↓
Region Proposals
 ↓
Classification
 ↓
Bounding Box Refinement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  One-stage detectors
&lt;/h3&gt;

&lt;p&gt;Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YOLO
SSD
RetinaNet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
 ↓
Neural Network
 ↓
Boxes + Classes + Confidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa abordagem costuma ser muito interessante quando existe requisito de tempo real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transformer-based detectors
&lt;/h3&gt;

&lt;p&gt;Um exemplo conhecido é o DETR.&lt;/p&gt;

&lt;p&gt;Aqui a detecção é formulada de uma maneira diferente, usando a arquitetura Transformer para prever os objetos.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. IoU e NMS
&lt;/h2&gt;

&lt;p&gt;Detection gera muitas previsões.&lt;/p&gt;

&lt;p&gt;Duas bounding boxes podem representar o mesmo objeto.&lt;/p&gt;

&lt;p&gt;Para medir a sobreposição, usamos IoU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IoU = Intersection / Union
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quanto mais próximo de &lt;code&gt;1&lt;/code&gt;, maior a sobreposição.&lt;/p&gt;

&lt;p&gt;Depois, algoritmos como Non-Maximum Suppression (NMS) ajudam a remover previsões duplicadas.&lt;/p&gt;

&lt;p&gt;Uma versão simplificada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Detections
   ↓
Ordenar por confidence
   ↓
Escolher melhor box
   ↓
Comparar IoU
   ↓
Remover duplicatas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Segmentation
&lt;/h2&gt;

&lt;p&gt;Detection trabalha com bounding boxes.&lt;/p&gt;

&lt;p&gt;Segmentation trabalha em nível de pixel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Semantic Segmentation
&lt;/h3&gt;

&lt;p&gt;Cada pixel recebe uma classe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pixel → class
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;road
car
person
sky
building
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instance Segmentation
&lt;/h3&gt;

&lt;p&gt;Aqui cada objeto é uma instância separada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;person #1
person #2
person #3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mesmo todos pertencendo à classe &lt;code&gt;person&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Panoptic Segmentation
&lt;/h3&gt;

&lt;p&gt;Combina semantic segmentation e instance segmentation para representar a cena de forma mais completa.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Segment Anything
&lt;/h2&gt;

&lt;p&gt;Modelos como SAM popularizaram uma abordagem mais geral para segmentação.&lt;/p&gt;

&lt;p&gt;Em vez de ter um modelo treinado exclusivamente para uma classe específica, podemos fornecer diferentes tipos de prompt.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;point
box
mask
text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um pipeline pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imagem
  ↓
Prompt
  ↓
Segmentation Model
  ↓
Mask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso é útil para ferramentas interativas, edição de imagens e pipelines de anotação.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. OCR
&lt;/h2&gt;

&lt;p&gt;OCR significa Optical Character Recognition.&lt;/p&gt;

&lt;p&gt;O objetivo é transformar texto presente em pixels em texto digital.&lt;/p&gt;

&lt;p&gt;Um pipeline tradicional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
 ↓
Preprocessing
 ↓
Text Detection
 ↓
Text Recognition
 ↓
Post-processing
 ↓
Text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Imagem de documento
       ↓
"NOTA FISCAL"
"VALOR: R$ 1.250,00"
"CNPJ: ..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OCR moderno pode combinar CNNs, LSTMs, Transformers e modelos multimodais.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Document AI
&lt;/h2&gt;

&lt;p&gt;OCR resolve apenas uma parte do problema.&lt;/p&gt;

&lt;p&gt;Um documento real também possui layout, tabelas, campos e relações entre informações.&lt;/p&gt;

&lt;p&gt;Um pipeline de Document AI pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document
   ↓
OCR
   ↓
Layout Analysis
   ↓
Entity Extraction
   ↓
Document Understanding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O sistema pode identificar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;invoice_number
customer
company
date
total
tax
items
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso aparece bastante em automação de processos, sistemas financeiros, jurídico e governo.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Image Retrieval
&lt;/h2&gt;

&lt;p&gt;Outra aplicação é encontrar imagens semelhantes.&lt;/p&gt;

&lt;p&gt;A ideia moderna é transformar uma imagem em um embedding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
  ↓
Vision Encoder
  ↓
Embedding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0.12, -0.81, 0.43, 0.19, ...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois armazenamos esses vetores e fazemos busca por similaridade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query Image
     ↓
Embedding
     ↓
Vector Database
     ↓
Nearest Neighbors
     ↓
Similar Images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tecnologias comuns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FAISS
Qdrant
Milvus
Weaviate
pgvector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. Vídeo
&lt;/h2&gt;

&lt;p&gt;Um vídeo é uma sequência temporal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frame 1
Frame 2
Frame 3
...
Frame N
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então temos duas dimensões importantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spatial information
+
temporal information
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É isso que torna vídeo mais complicado que uma imagem isolada.&lt;/p&gt;




&lt;h2&gt;
  
  
  15. Object Tracking
&lt;/h2&gt;

&lt;p&gt;Detection identifica objetos.&lt;/p&gt;

&lt;p&gt;Tracking tenta manter a identidade desses objetos ao longo dos frames.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frame 1 → person #17
Frame 2 → person #17
Frame 3 → person #17
Frame 4 → person #17
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim podemos obter uma trajetória:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(x1, y1)
(x2, y2)
(x3, y3)
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas abordagens conhecidas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Kalman Filter
SORT
DeepSORT
ByteTrack
BoT-SORT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  16. Optical Flow
&lt;/h2&gt;

&lt;p&gt;Optical Flow tenta estimar o movimento aparente dos pixels entre frames.&lt;/p&gt;

&lt;p&gt;Um vetor pode ser representado por:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;u(x,y)
v(x,y)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado é um campo de movimento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;→ → →
→ → →
→ → →
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;motion estimation;&lt;/li&gt;
&lt;li&gt;estabilização de vídeo;&lt;/li&gt;
&lt;li&gt;tracking;&lt;/li&gt;
&lt;li&gt;action recognition;&lt;/li&gt;
&lt;li&gt;robótica.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  17. Action Recognition
&lt;/h2&gt;

&lt;p&gt;Agora o objetivo não é apenas descobrir que existe uma pessoa.&lt;/p&gt;

&lt;p&gt;Queremos descobrir o que ela está fazendo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;walking
running
jumping
falling
sitting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso exige informação temporal.&lt;/p&gt;

&lt;p&gt;Arquiteturas podem utilizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CNN + RNN
3D CNN
Video Transformer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  18. Motion Analysis
&lt;/h2&gt;

&lt;p&gt;Depois de detectar e acompanhar objetos, podemos analisar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trajetória;&lt;/li&gt;
&lt;li&gt;velocidade;&lt;/li&gt;
&lt;li&gt;direção;&lt;/li&gt;
&lt;li&gt;aceleração;&lt;/li&gt;
&lt;li&gt;interação entre objetos;&lt;/li&gt;
&lt;li&gt;comportamento temporal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Video
 ↓
Detection
 ↓
Tracking
 ↓
Trajectory
 ↓
Motion Analysis
 ↓
Event Detection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É uma base para aplicações como monitoramento, análise esportiva e robótica.&lt;/p&gt;




&lt;h2&gt;
  
  
  19. Camera Model
&lt;/h2&gt;

&lt;p&gt;Para entrar em visão 3D, precisamos entender como uma câmera transforma o mundo 3D em uma imagem 2D.&lt;/p&gt;

&lt;p&gt;Um ponto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P = (X, Y, Z)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pode ser projetado aproximadamente como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x = fX/Z
y = fY/Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onde &lt;code&gt;f&lt;/code&gt; representa a distância focal.&lt;/p&gt;

&lt;p&gt;Uma câmera real normalmente é representada por uma matriz intrínseca:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;K =
[ fx  0  cx ]
[ 0  fy  cy ]
[ 0   0   1 ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso aparece constantemente em reconstrução 3D.&lt;/p&gt;




&lt;h2&gt;
  
  
  20. Camera Calibration
&lt;/h2&gt;

&lt;p&gt;Calibration determina os parâmetros da câmera.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intrinsics
&lt;/h3&gt;

&lt;p&gt;Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fx
fy
cx
cy
k1
k2
k3
p1
p2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os primeiros representam parâmetros internos da câmera e os demais podem representar distorção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extrinsics
&lt;/h3&gt;

&lt;p&gt;Representam a pose da câmera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R
t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R = rotation
t = translation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma transformação pode ser escrita como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P_camera = R P_world + t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  21. Lens Distortion
&lt;/h2&gt;

&lt;p&gt;Lentes reais introduzem distorções.&lt;/p&gt;

&lt;p&gt;As mais conhecidas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;radial distortion
tangential distortion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um pipeline pode começar com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Distorted Image
      ↓
Undistortion
      ↓
Rectified Image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso é especialmente importante em aplicações geométricas.&lt;/p&gt;




&lt;h2&gt;
  
  
  22. Stereo Vision
&lt;/h2&gt;

&lt;p&gt;Duas câmeras permitem estimar profundidade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Left Camera             Right Camera
      \                     /
       \                   /
        \                 /
             Object
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferença entre a posição de um ponto nas duas imagens é a disparidade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;disparity = d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma relação simplificada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Z = fB / d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Z = profundidade
f = focal length
B = baseline
d = disparity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quanto maior a disparidade, normalmente menor a distância do objeto.&lt;/p&gt;




&lt;h2&gt;
  
  
  23. Depth Estimation
&lt;/h2&gt;

&lt;p&gt;Depth estimation tenta produzir um mapa de profundidade.&lt;/p&gt;

&lt;p&gt;Entrada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RGB Image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Depth Map
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pode ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;monocular;&lt;/li&gt;
&lt;li&gt;stereo;&lt;/li&gt;
&lt;li&gt;RGB-D;&lt;/li&gt;
&lt;li&gt;baseado em sensores;&lt;/li&gt;
&lt;li&gt;baseado em múltiplas imagens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Representação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RGB
 ↓
Depth Network
 ↓
Depth Map
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modelos modernos utilizam arquiteturas profundas, inclusive Transformers.&lt;/p&gt;




&lt;h2&gt;
  
  
  24. Epipolar Geometry
&lt;/h2&gt;

&lt;p&gt;Em stereo e reconstrução 3D, epipolar geometry é fundamental.&lt;/p&gt;

&lt;p&gt;Um ponto em uma imagem não corresponde a qualquer lugar da segunda imagem. Ele está restrito a uma linha epipolar.&lt;/p&gt;

&lt;p&gt;Conceitos importantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fundamental Matrix
Essential Matrix
Epipoles
Epipolar Lines
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma relação clássica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x'ᵀ F x = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onde &lt;code&gt;F&lt;/code&gt; é a Fundamental Matrix.&lt;/p&gt;




&lt;h2&gt;
  
  
  25. Feature Detection
&lt;/h2&gt;

&lt;p&gt;Para reconstruir uma cena a partir de imagens, precisamos encontrar pontos que possam ser reconhecidos em diferentes views.&lt;/p&gt;

&lt;p&gt;Algoritmos clássicos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SIFT
SURF
ORB
AKAZE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um feature normalmente envolve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;keypoint
+
descriptor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O keypoint representa a localização.&lt;/p&gt;

&lt;p&gt;O descriptor representa as características daquela região.&lt;/p&gt;




&lt;h2&gt;
  
  
  26. Feature Matching
&lt;/h2&gt;

&lt;p&gt;Depois de extrair features de duas imagens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image A
  ↓
Descriptors A

Image B
  ↓
Descriptors B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;podemos procurar correspondências:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A[124] ↔ B[87]
A[233] ↔ B[152]
A[901] ↔ B[421]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses matches são a matéria-prima de muitos pipelines de reconstrução.&lt;/p&gt;




&lt;h2&gt;
  
  
  27. RANSAC
&lt;/h2&gt;

&lt;p&gt;Nem todo match é correto.&lt;/p&gt;

&lt;p&gt;Alguns são outliers.&lt;/p&gt;

&lt;p&gt;RANSAC é usado para estimar modelos geométricos de forma robusta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Matches
  ↓
RANSAC
  ↓
Inliers + Outliers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os inliers são usados para estimar uma transformação ou modelo geométrico mais confiável.&lt;/p&gt;




&lt;h2&gt;
  
  
  28. Structure from Motion
&lt;/h2&gt;

&lt;p&gt;SfM, ou Structure from Motion, tenta recuperar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;camera poses
+
3D structure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a partir de várias imagens.&lt;/p&gt;

&lt;p&gt;Um pipeline simplificado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Images
  ↓
Feature Extraction
  ↓
Feature Matching
  ↓
Camera Pose Estimation
  ↓
Triangulation
  ↓
Sparse Point Cloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A grande vantagem é que não precisamos necessariamente de um sensor de profundidade dedicado.&lt;/p&gt;

&lt;p&gt;A geometria pode ser recuperada a partir das imagens.&lt;/p&gt;




&lt;h2&gt;
  
  
  29. Triangulation
&lt;/h2&gt;

&lt;p&gt;Se temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera A
Camera B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e um mesmo ponto aparece nas duas imagens, podemos estimar sua posição 3D.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera A
    \
     \
      P
     /
    /
Camera B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse processo é chamado de triangulação.&lt;/p&gt;

&lt;p&gt;O resultado é um ponto no espaço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P = (X, Y, Z)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  30. Bundle Adjustment
&lt;/h2&gt;

&lt;p&gt;Durante SfM, as estimativas iniciais podem conter erros.&lt;/p&gt;

&lt;p&gt;Bundle Adjustment otimiza simultaneamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;camera poses
+
3D points
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;buscando minimizar o erro de reprojeção.&lt;/p&gt;

&lt;p&gt;Conceitualmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minimize Σ || observed_pixel - projected_3D_point ||²
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse tipo de otimização é uma das partes mais importantes de um pipeline de reconstrução fotogramétrica.&lt;/p&gt;




&lt;h2&gt;
  
  
  31. Multi-View Stereo
&lt;/h2&gt;

&lt;p&gt;SfM normalmente produz uma reconstrução esparsa.&lt;/p&gt;

&lt;p&gt;MVS tenta gerar uma reconstrução muito mais densa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SfM
 ↓
Sparse Point Cloud
 ↓
MVS
 ↓
Dense Point Cloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma maneira útil de pensar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SfM = entender câmeras + estrutura inicial

MVS = recuperar geometria densa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  32. Fotogrametria
&lt;/h2&gt;

&lt;p&gt;Um pipeline de fotogrametria pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Photos
 ↓
Feature Extraction
 ↓
Feature Matching
 ↓
Camera Calibration
 ↓
SfM
 ↓
Sparse Reconstruction
 ↓
MVS
 ↓
Dense Point Cloud
 ↓
Surface Reconstruction
 ↓
Mesh
 ↓
Texture
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ferramentas conhecidas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COLMAP
OpenMVG
OpenMVS
AliceVision / Meshroom
Open3D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  33. Point Clouds
&lt;/h2&gt;

&lt;p&gt;Uma Point Cloud é um conjunto de pontos 3D.&lt;/p&gt;

&lt;p&gt;O mínimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X
Y
Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas um ponto pode carregar muito mais informação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X
Y
Z
R
G
B
normal
intensity
confidence
timestamp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P1 = (1.2, 0.4, 2.1)
P2 = (1.3, 0.5, 2.0)
P3 = (1.4, 0.5, 2.2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  34. Point Cloud Registration
&lt;/h2&gt;

&lt;p&gt;Se temos duas nuvens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cloud A
Cloud B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;precisamos encontrar a transformação que alinha uma com a outra.&lt;/p&gt;

&lt;p&gt;Um algoritmo clássico é o ICP:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iterative Closest Point&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Initial Alignment
      ↓
Nearest Neighbors
      ↓
Estimate Transform
      ↓
Apply Transform
      ↓
Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A transformação normalmente pertence ao grupo de movimentos rígidos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;T ∈ SE(3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  35. LiDAR
&lt;/h2&gt;

&lt;p&gt;LiDAR significa Light Detection and Ranging.&lt;/p&gt;

&lt;p&gt;O princípio básico é medir o tempo que a luz leva para ir até uma superfície e retornar.&lt;/p&gt;

&lt;p&gt;Uma aproximação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d = cΔt / 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d  = distância
c  = velocidade da luz
Δt = tempo de voo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O sensor pode gerar uma representação 3D do ambiente.&lt;/p&gt;




&lt;h2&gt;
  
  
  36. LiDAR + Camera
&lt;/h2&gt;

&lt;p&gt;Câmera e LiDAR têm características diferentes.&lt;/p&gt;

&lt;p&gt;A câmera oferece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;color
texture
semantic information
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O LiDAR oferece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;depth
geometry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com calibração entre os dois sensores, podemos projetar pontos do LiDAR na imagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LiDAR Point
     ↓
Extrinsic Transform
     ↓
Camera Coordinate System
     ↓
Pixel Projection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite, por exemplo, associar cor RGB a pontos 3D.&lt;/p&gt;




&lt;h2&gt;
  
  
  37. SLAM
&lt;/h2&gt;

&lt;p&gt;SLAM significa:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Simultaneous Localization and Mapping&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O sistema precisa resolver duas coisas ao mesmo tempo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Onde estou?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Como é o ambiente?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pipeline simplificado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sensor
  ↓
Feature / Point Extraction
  ↓
Motion Estimation
  ↓
Pose
  ↓
Map Update
  ↓
Loop Closure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;robótica;&lt;/li&gt;
&lt;li&gt;AR;&lt;/li&gt;
&lt;li&gt;VR;&lt;/li&gt;
&lt;li&gt;drones;&lt;/li&gt;
&lt;li&gt;navegação;&lt;/li&gt;
&lt;li&gt;mapeamento.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  38. Visual SLAM
&lt;/h2&gt;

&lt;p&gt;No Visual SLAM, câmeras são usadas para estimar movimento e construir o mapa.&lt;/p&gt;

&lt;p&gt;Alguns sistemas conhecidos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ORB-SLAM
ORB-SLAM2
ORB-SLAM3
VINS
OpenVSLAM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A qualidade depende bastante de fatores como textura, iluminação, movimento e características da câmera.&lt;/p&gt;




&lt;h2&gt;
  
  
  39. Visual-Inertial SLAM
&lt;/h2&gt;

&lt;p&gt;Podemos combinar câmera e IMU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera
+
IMU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A IMU normalmente fornece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;accelerometer
gyroscope
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os sensores podem ser combinados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera ─────┐
            ├──&amp;gt; Sensor Fusion ──&amp;gt; Pose
IMU ────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso ajuda principalmente em movimentos rápidos e cenários onde a imagem sozinha é insuficiente.&lt;/p&gt;




&lt;h2&gt;
  
  
  40. Mesh Reconstruction
&lt;/h2&gt;

&lt;p&gt;Point cloud não é necessariamente uma superfície.&lt;/p&gt;

&lt;p&gt;Uma mesh possui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vertices
edges
faces
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Normalmente utilizamos triângulos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Triangle Mesh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Point Cloud
 ↓
Surface Reconstruction
 ↓
Mesh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  41. Poisson Surface Reconstruction
&lt;/h2&gt;

&lt;p&gt;Poisson Surface Reconstruction é um método bastante conhecido para transformar pontos orientados em uma superfície.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Point Cloud
+
Normals
 ↓
Poisson Reconstruction
 ↓
Surface
 ↓
Triangle Mesh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A qualidade das normais e da densidade da nuvem influencia bastante o resultado.&lt;/p&gt;




&lt;h2&gt;
  
  
  42. TSDF
&lt;/h2&gt;

&lt;p&gt;TSDF significa Truncated Signed Distance Function.&lt;/p&gt;

&lt;p&gt;A ideia é integrar várias observações de profundidade em um volume.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Depth Frame 1
Depth Frame 2
Depth Frame 3
...
Depth Frame N
        ↓
    TSDF Volume
        ↓
Surface Extraction
        ↓
Mesh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa técnica aparece em vários sistemas de reconstrução RGB-D.&lt;/p&gt;




&lt;h2&gt;
  
  
  43. NeRF
&lt;/h2&gt;

&lt;p&gt;NeRF significa Neural Radiance Fields.&lt;/p&gt;

&lt;p&gt;Em vez de representar uma cena apenas com pontos ou polígonos, o sistema aprende uma representação neural.&lt;/p&gt;

&lt;p&gt;De forma simplificada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(x, y, z, direction)
          ↓
    Neural Network
          ↓
 density + color
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois podemos renderizar a cena a partir de diferentes posições de câmera.&lt;/p&gt;

&lt;p&gt;A ideia geral:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera Ray
    ↓
Sample Points
    ↓
Neural Field
    ↓
Volume Rendering
    ↓
Pixel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  44. Gaussian Splatting
&lt;/h2&gt;

&lt;p&gt;3D Gaussian Splatting segue outra abordagem para representar uma cena.&lt;/p&gt;

&lt;p&gt;Em vez de uma mesh tradicional, a cena é composta por gaussianas 3D.&lt;/p&gt;

&lt;p&gt;Uma gaussiana pode carregar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;position
scale
rotation
opacity
color
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scene
 ↓
3D Gaussians
 ↓
Rasterization
 ↓
Rendered Image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É uma técnica especialmente interessante para visualização e reconstrução de cenas.&lt;/p&gt;




&lt;h2&gt;
  
  
  45. 3D Object Detection
&lt;/h2&gt;

&lt;p&gt;Detection também pode acontecer diretamente no espaço 3D.&lt;/p&gt;

&lt;p&gt;Entrada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Point Cloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3D Bounding Box
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma bounding box 3D pode conter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x
y
z
width
height
depth
rotation
class
confidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso aparece bastante em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;veículos autônomos;&lt;/li&gt;
&lt;li&gt;robótica;&lt;/li&gt;
&lt;li&gt;logística;&lt;/li&gt;
&lt;li&gt;ambientes industriais.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  46. Face Detection
&lt;/h2&gt;

&lt;p&gt;Face Detection responde:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Onde existem rostos?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Normalmente produz bounding boxes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
 ↓
Face Detector
 ↓
Bounding Boxes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso é diferente de reconhecimento facial.&lt;/p&gt;




&lt;h2&gt;
  
  
  47. Face Recognition
&lt;/h2&gt;

&lt;p&gt;Recognition tenta gerar uma representação que permita comparar rostos.&lt;/p&gt;

&lt;p&gt;Pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Face Detection
 ↓
Face Alignment
 ↓
Face Embedding
 ↓
Similarity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O rosto vira um vetor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0.13, -0.44, 0.82, ...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E podemos comparar embeddings usando medidas de distância ou similaridade.&lt;/p&gt;




&lt;h2&gt;
  
  
  48. Pose Estimation
&lt;/h2&gt;

&lt;p&gt;Pose Estimation tenta localizar partes do corpo.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;head
shoulder
elbow
wrist
hip
knee
ankle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma saída 2D pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(x, y, confidence)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em 3D:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(x, y, z)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite aplicações de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;análise esportiva;&lt;/li&gt;
&lt;li&gt;realidade aumentada;&lt;/li&gt;
&lt;li&gt;interação humano-computador;&lt;/li&gt;
&lt;li&gt;animação;&lt;/li&gt;
&lt;li&gt;robótica.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  49. Hand Tracking
&lt;/h2&gt;

&lt;p&gt;Mãos podem ser representadas por landmarks.&lt;/p&gt;

&lt;p&gt;Um modelo pode retornar dezenas de pontos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;landmark
    ├── x
    ├── y
    ├── z
    └── confidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com esses pontos podemos construir reconhecimento de gestos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera
 ↓
Hand Detection
 ↓
Landmarks
 ↓
Gesture Classification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  50. Vision Transformers
&lt;/h2&gt;

&lt;p&gt;Transformers mudaram primeiro o NLP e depois passaram a dominar uma parte importante da visão computacional.&lt;/p&gt;

&lt;p&gt;No caso do Vision Transformer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
 ↓
Patch Extraction
 ↓
Patch Embeddings
 ↓
Transformer
 ↓
Visual Representation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma imagem pode ser dividida em patches.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;224 × 224
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;com patches de:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;16 × 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;resulta em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;14 × 14 = 196 patches
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses patches podem ser tratados como uma sequência de tokens visuais.&lt;/p&gt;




&lt;h2&gt;
  
  
  51. Self-Attention
&lt;/h2&gt;

&lt;p&gt;O mecanismo de atenção permite que diferentes partes da imagem sejam relacionadas entre si.&lt;/p&gt;

&lt;p&gt;A operação básica é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Attention(Q, K, V)
=
softmax(QKᵀ / √d)V
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso ajuda o modelo a capturar relações de longo alcance.&lt;/p&gt;

&lt;p&gt;Em comparação com convoluções, a atenção oferece uma maneira diferente de modelar dependências espaciais.&lt;/p&gt;




&lt;h2&gt;
  
  
  52. CNN vs Vision Transformer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;CNN&lt;/th&gt;
&lt;th&gt;Vision Transformer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Operação principal&lt;/td&gt;
&lt;td&gt;Convolução&lt;/td&gt;
&lt;td&gt;Attention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Viés espacial&lt;/td&gt;
&lt;td&gt;Forte&lt;/td&gt;
&lt;td&gt;Mais flexível&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relações locais&lt;/td&gt;
&lt;td&gt;Muito boas&lt;/td&gt;
&lt;td&gt;Aprendidas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relações globais&lt;/td&gt;
&lt;td&gt;Mais limitadas&lt;/td&gt;
&lt;td&gt;Muito fortes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalabilidade&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;td&gt;Muito alta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uso atual&lt;/td&gt;
&lt;td&gt;Muito relevante&lt;/td&gt;
&lt;td&gt;Muito relevante&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Não existe uma regra simples de que um substituiu completamente o outro. Ambos continuam sendo usados.&lt;/p&gt;




&lt;h2&gt;
  
  
  53. Vision-Language Models
&lt;/h2&gt;

&lt;p&gt;Vision-Language Models conectam visão e linguagem.&lt;/p&gt;

&lt;p&gt;Um modelo pode receber:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
+
Question
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e produzir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
 ↓
Description
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia é criar uma representação compartilhada ou conectada entre conteúdo visual e linguagem.&lt;/p&gt;

&lt;p&gt;Isso abre espaço para sistemas que conseguem conversar sobre imagens.&lt;/p&gt;




&lt;h2&gt;
  
  
  54. Multimodal AI
&lt;/h2&gt;

&lt;p&gt;Multimodal vai além de imagem + texto.&lt;/p&gt;

&lt;p&gt;Um sistema pode trabalhar com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
Video
Audio
Text
3D
Sensors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conceitualmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image Encoder ───┐
Video Encoder ───┤
Audio Encoder ───┼──&amp;gt; Multimodal Representation
Text Encoder ────┤
3D Encoder ──────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse tipo de arquitetura é particularmente interessante quando o problema não pode ser resolvido olhando apenas para um tipo de dado.&lt;/p&gt;




&lt;h2&gt;
  
  
  55. Vision + LLM
&lt;/h2&gt;

&lt;p&gt;Uma arquitetura cada vez mais comum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera
 ↓
Vision Encoder
 ↓
Visual Features
 ↓
LLM
 ↓
Reasoning
 ↓
Action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera
 ↓
Detection
 ↓
Scene Understanding
 ↓
Vision-Language Model
 ↓
LLM
 ↓
"Existe um obstáculo aproximadamente 2 metros à frente."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui a visão deixa de ser apenas uma etapa de classificação e passa a fazer parte de um sistema de raciocínio.&lt;/p&gt;




&lt;h2&gt;
  
  
  56. Embeddings visuais
&lt;/h2&gt;

&lt;p&gt;Embeddings são uma das peças importantes dos sistemas modernos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image
 ↓
Encoder
 ↓
Vector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois podemos usar o vetor para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;busca;&lt;/li&gt;
&lt;li&gt;clustering;&lt;/li&gt;
&lt;li&gt;classificação;&lt;/li&gt;
&lt;li&gt;recomendação;&lt;/li&gt;
&lt;li&gt;retrieval;&lt;/li&gt;
&lt;li&gt;comparação;&lt;/li&gt;
&lt;li&gt;RAG multimodal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query Image
      ↓
Embedding
      ↓
Vector Database
      ↓
Similar Content
      ↓
LLM / Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  57. RAG multimodal
&lt;/h2&gt;

&lt;p&gt;RAG tradicional costuma trabalhar com texto.&lt;/p&gt;

&lt;p&gt;Em uma arquitetura multimodal, podemos recuperar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;documents
images
tables
diagrams
photos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Question
      ↓
Query Embedding
      ↓
Vector Search
      ↓
Relevant Images + Documents
      ↓
Multimodal Model
      ↓
Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pode ser usado para manuais técnicos, documentação, inspeções, plantas, contratos e outros conteúdos.&lt;/p&gt;




&lt;h2&gt;
  
  
  58. Sensor Fusion
&lt;/h2&gt;

&lt;p&gt;Sistemas avançados raramente precisam depender de um único sensor.&lt;/p&gt;

&lt;p&gt;Podemos combinar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera
LiDAR
Radar
IMU
GPS
Depth Sensor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A arquitetura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera ───┐
LiDAR ────┤
Radar ────┼──&amp;gt; Sensor Fusion
IMU ──────┤
GPS ──────┘
                ↓
            World Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada sensor tem pontos fortes e limitações.&lt;/p&gt;

&lt;p&gt;A fusão tenta obter uma representação mais confiável do ambiente.&lt;/p&gt;




&lt;h2&gt;
  
  
  59. Computer Vision em veículos autônomos
&lt;/h2&gt;

&lt;p&gt;Um perception stack pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cameras
LiDAR
Radar
IMU
   ↓
Sensor Fusion
   ↓
Object Detection
   ↓
Tracking
   ↓
Depth / 3D Perception
   ↓
Localization
   ↓
Scene Understanding
   ↓
Planning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A visão é apenas uma parte do sistema inteiro.&lt;/p&gt;




&lt;h2&gt;
  
  
  60. Computer Vision em robótica
&lt;/h2&gt;

&lt;p&gt;Um robô precisa perceber o ambiente antes de tomar decisões.&lt;/p&gt;

&lt;p&gt;Um pipeline possível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sensors
 ↓
Perception
 ↓
Localization
 ↓
Mapping
 ↓
Planning
 ↓
Control
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A percepção pode envolver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Detection
Segmentation
Depth
SLAM
3D Reconstruction
Pose Estimation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  61. Augmented Reality
&lt;/h2&gt;

&lt;p&gt;AR depende bastante de entender a relação entre câmera e mundo.&lt;/p&gt;

&lt;p&gt;Um pipeline típico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera
 ↓
Tracking
 ↓
SLAM
 ↓
Plane Detection
 ↓
World Tracking
 ↓
Virtual Object Placement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sem uma estimativa razoável da pose da câmera, objetos virtuais não conseguem permanecer corretamente posicionados no ambiente.&lt;/p&gt;




&lt;h2&gt;
  
  
  62. 3D Scanning
&lt;/h2&gt;

&lt;p&gt;Um scanner 3D é um ótimo exemplo de como várias áreas se juntam.&lt;/p&gt;

&lt;p&gt;Podemos ter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera
+
LiDAR
+
IMU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e um pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Capture
 ↓
Frame Selection
 ↓
Image Quality
 ↓
Feature Extraction
 ↓
Feature Matching
 ↓
Camera Pose
 ↓
Depth
 ↓
Point Cloud
 ↓
Registration
 ↓
Dense Reconstruction
 ↓
Mesh
 ↓
Texture
 ↓
3D Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui aparecem praticamente todos os conceitos discutidos anteriormente.&lt;/p&gt;




&lt;h2&gt;
  
  
  63. Captura de imagens para reconstrução
&lt;/h2&gt;

&lt;p&gt;Mais imagens não significa necessariamente uma reconstrução melhor.&lt;/p&gt;

&lt;p&gt;Alguns fatores importantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sharpness
exposure
overlap
texture
viewpoint diversity
motion blur
lighting
camera calibration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se uma imagem estiver muito borrada, os features podem ser ruins.&lt;/p&gt;

&lt;p&gt;Se houver pouca sobreposição entre duas imagens, o matching pode falhar.&lt;/p&gt;

&lt;p&gt;Se todas as imagens forem praticamente iguais, também pode faltar informação geométrica.&lt;/p&gt;




&lt;h2&gt;
  
  
  64. Frame Selection
&lt;/h2&gt;

&lt;p&gt;Em uma aplicação de captura contínua, não é necessário guardar todos os frames.&lt;/p&gt;

&lt;p&gt;Podemos avaliar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blur score
feature count
motion
image quality
overlap
pose change
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Quality &amp;lt; threshold
    → discard

Feature count &amp;lt; threshold
    → discard

Pose change muito pequeno
    → skip

Motion muito alto
    → wait
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso reduz processamento, armazenamento e tráfego de rede.&lt;/p&gt;




&lt;h2&gt;
  
  
  65. Edge AI
&lt;/h2&gt;

&lt;p&gt;Nem todo processamento precisa acontecer no servidor.&lt;/p&gt;

&lt;p&gt;Podemos dividir o pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mobile
 ├── Capture
 ├── Preprocessing
 ├── Detection
 ├── Tracking
 └── Quality Control

Server
 ├── SfM
 ├── MVS
 ├── Reconstruction
 └── Heavy Inference
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa arquitetura pode reduzir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;latency
bandwidth
server load
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e em determinados cenários também pode ajudar com privacidade.&lt;/p&gt;




&lt;h2&gt;
  
  
  66. CPU vs GPU
&lt;/h2&gt;

&lt;p&gt;Computer Vision moderno pode ser bastante pesado.&lt;/p&gt;

&lt;p&gt;CPU é muito útil para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I/O;&lt;/li&gt;
&lt;li&gt;lógica;&lt;/li&gt;
&lt;li&gt;pré-processamento;&lt;/li&gt;
&lt;li&gt;serialização;&lt;/li&gt;
&lt;li&gt;pós-processamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GPU é especialmente boa para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;convoluções;&lt;/li&gt;
&lt;li&gt;Transformers;&lt;/li&gt;
&lt;li&gt;operações matriciais;&lt;/li&gt;
&lt;li&gt;treinamento;&lt;/li&gt;
&lt;li&gt;inferência paralela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um pipeline pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU
 ↓
Data Preparation
 ↓
GPU
 ↓
Inference
 ↓
CPU
 ↓
Post-processing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  67. Frameworks
&lt;/h2&gt;

&lt;p&gt;Um stack bastante comum:&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Python
NumPy
OpenCV
PyTorch
scikit-image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Computer Vision
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenCV
MediaPipe
Open3D
PCL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3D / Photogrammetry
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COLMAP
OpenMVG
OpenMVS
Meshroom
Open3D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deep Learning
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PyTorch
TensorFlow
ONNX
TensorRT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mobile
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ARKit
Vision
Core ML
TensorFlow Lite
ONNX Runtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  68. OpenCV
&lt;/h2&gt;

&lt;p&gt;OpenCV continua sendo uma das bibliotecas mais importantes da área.&lt;/p&gt;

&lt;p&gt;Ela oferece ferramentas para:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;image processing
feature detection
camera calibration
stereo vision
optical flow
video processing
geometric transformations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mesmo quando o modelo de IA é desenvolvido em PyTorch, OpenCV frequentemente aparece em outras partes do pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  69. Open3D
&lt;/h2&gt;

&lt;p&gt;Open3D é especialmente útil para aplicações 3D.&lt;/p&gt;

&lt;p&gt;Pode trabalhar com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Point Clouds
Meshes
RGB-D
Registration
Visualization
Surface Reconstruction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um pipeline típico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RGB-D
 ↓
Point Cloud
 ↓
Registration
 ↓
Fusion
 ↓
Mesh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  70. COLMAP
&lt;/h2&gt;

&lt;p&gt;COLMAP é uma das ferramentas mais conhecidas para reconstrução 3D a partir de imagens.&lt;/p&gt;

&lt;p&gt;Um pipeline típico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Images
 ↓
Feature Extraction
 ↓
Feature Matching
 ↓
SfM / Mapper
 ↓
Sparse Reconstruction
 ↓
Dense Reconstruction
 ↓
Point Cloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É uma ferramenta importante para quem trabalha com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;photogrammetry
SfM
MVS
3D reconstruction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  71. Avaliação de modelos
&lt;/h2&gt;

&lt;p&gt;Um modelo não deve ser avaliado apenas olhando alguns resultados.&lt;/p&gt;

&lt;p&gt;É necessário usar métricas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Classification
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Accuracy
Precision
Recall
F1
Top-k Accuracy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Detection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IoU
Precision
Recall
mAP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Segmentation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IoU
Dice
Pixel Accuracy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tracking
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MOTA
MOTP
IDF1
HOTA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  72. Confusion Matrix
&lt;/h2&gt;

&lt;p&gt;Para classificação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Predicted
              Cat       Dog

Actual Cat     TP        FN

Actual Dog     FP        TP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir disso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Precision = TP / (TP + FP)

Recall = TP / (TP + FN)

F1 = 2 × Precision × Recall
     ------------------------
     Precision + Recall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  73. IoU
&lt;/h2&gt;

&lt;p&gt;IoU é utilizado principalmente em detection e segmentation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IoU = Intersection / Union
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo conceitual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prediction
┌───────────────┐
│               │
│    ┌──────────┼────┐
│    │          │    │
└────┼──────────┘    │
     └───────────────┘
      Ground Truth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quanto maior a interseção relativa, melhor a sobreposição.&lt;/p&gt;




&lt;h2&gt;
  
  
  74. mAP
&lt;/h2&gt;

&lt;p&gt;Mean Average Precision é uma métrica muito usada em object detection.&lt;/p&gt;

&lt;p&gt;Ela envolve a relação entre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Precision
Recall
IoU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É comum encontrar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mAP@50
mAP@50:95
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É importante observar exatamente qual métrica está sendo reportada antes de comparar dois modelos.&lt;/p&gt;




&lt;h2&gt;
  
  
  75. Latência e FPS
&lt;/h2&gt;

&lt;p&gt;Em aplicações reais, accuracy não é tudo.&lt;/p&gt;

&lt;p&gt;Também precisamos medir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Latency
FPS
Memory
GPU utilization
Power consumption
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um modelo muito preciso pode não servir para uma aplicação que exige tempo real.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;30 FPS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;significa aproximadamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;33 ms por frame
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então todo o pipeline precisa caber nesse orçamento de tempo.&lt;/p&gt;




&lt;h2&gt;
  
  
  76. Quantization
&lt;/h2&gt;

&lt;p&gt;Modelos podem ser quantizados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FP32
 ↓
FP16
 ↓
INT8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pode reduzir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;memory
latency
power consumption
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mas pode haver perda de precisão dependendo do modelo e da estratégia utilizada.&lt;/p&gt;




&lt;h2&gt;
  
  
  77. Outras otimizações
&lt;/h2&gt;

&lt;p&gt;Algumas técnicas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pruning
Knowledge Distillation
Quantization
Operator Fusion
ONNX
TensorRT
Compilation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um pipeline de deployment pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Training Model
      ↓
Export
      ↓
Optimization
      ↓
Quantization
      ↓
Compilation
      ↓
Deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  78. Model Deployment
&lt;/h2&gt;

&lt;p&gt;O modelo pode rodar em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cloud
Server
Desktop
Edge Device
Mobile
Embedded Hardware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um exemplo híbrido:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mobile Camera
      ↓
On-device Model
      ↓
Local Filtering
      ↓
API
      ↓
Backend
      ↓
Heavy Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A arquitetura depende de latência, custo, hardware, conectividade e privacidade.&lt;/p&gt;




&lt;h2&gt;
  
  
  79. Dados
&lt;/h2&gt;

&lt;p&gt;Um dos maiores erros ao começar em Machine Learning é assumir que o modelo é a parte mais importante.&lt;/p&gt;

&lt;p&gt;Na prática, a qualidade dos dados tem enorme impacto.&lt;/p&gt;

&lt;p&gt;Problemas comuns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dataset pequeno
labels ruins
classes desbalanceadas
lighting diferente
camera diferente
resolution diferente
domain shift
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um modelo excelente treinado com dados ruins continuará produzindo resultados ruins.&lt;/p&gt;




&lt;h2&gt;
  
  
  80. Data Augmentation
&lt;/h2&gt;

&lt;p&gt;Durante o treinamento podemos variar os dados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rotation
crop
flip
scale
brightness
contrast
noise
blur
perspective
color jitter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original
   ↓
Augmentation
   ↓
Training Samples
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia é tornar o modelo menos dependente de condições específicas do dataset.&lt;/p&gt;




&lt;h2&gt;
  
  
  81. Domain Shift
&lt;/h2&gt;

&lt;p&gt;Um modelo treinado em um ambiente pode se comportar de maneira completamente diferente em outro.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Training:
studio lighting

Production:
outdoor lighting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Training:
high-end camera

Production:
mobile camera
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse problema é conhecido como domain shift.&lt;/p&gt;

&lt;p&gt;É uma das razões pelas quais modelos que parecem excelentes em benchmarks podem precisar de ajustes quando chegam à produção.&lt;/p&gt;




&lt;h2&gt;
  
  
  82. Perception Stack
&lt;/h2&gt;

&lt;p&gt;Podemos juntar várias dessas ideias em uma arquitetura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    SENSORS
                       │
       ┌───────────────┼───────────────┐
       ▼               ▼               ▼
    Camera            LiDAR           IMU
       │               │               │
       └───────────────┼───────────────┘
                       ▼
                 Sensor Fusion
                       │
                       ▼
                Object Detection
                       │
                       ▼
                    Tracking
                       │
                       ▼
                 Depth / 3D
                       │
                       ▼
                  Localization
                       │
                       ▼
               Scene Understanding
                       │
                       ▼
                   World Model
                       │
                       ▼
                    Decision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa arquitetura aparece, com variações, em robótica, veículos autônomos, AR e sistemas de mapeamento.&lt;/p&gt;




&lt;h2&gt;
  
  
  83. Spatial Intelligence
&lt;/h2&gt;

&lt;p&gt;Existe uma evolução interessante quando passamos de reconhecimento para entendimento espacial.&lt;/p&gt;

&lt;p&gt;Primeiro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Existe uma cadeira."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"A cadeira está a 2 metros."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"A cadeira está à esquerda e está orientada nessa direção."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E finalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Existe espaço suficiente para passar ao lado da cadeira."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O sistema deixa de apenas classificar objetos e começa a construir uma representação do ambiente.&lt;/p&gt;

&lt;p&gt;Isso aproxima Computer Vision de conceitos como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3D perception
spatial reasoning
world models
robotics
multimodal AI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  84. Um pipeline completo de visão + 3D + IA
&lt;/h2&gt;

&lt;p&gt;Uma arquitetura mais ambiciosa poderia ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    WORLD
                      │
                      ▼
                 ┌─────────┐
                 │ Sensors │
                 └────┬────┘
                      │
          ┌───────────┼───────────┐
          ▼           ▼           ▼
       Camera       LiDAR        IMU
          │           │           │
          └───────────┼───────────┘
                      ▼
                Preprocessing
                      │
                      ▼
              Computer Vision
                      │
        ┌─────────────┼─────────────┐
        ▼             ▼             ▼
    Detection     Segmentation    Tracking
        │             │             │
        └─────────────┼─────────────┘
                      ▼
                  Geometry
                      │
        ┌─────────────┼─────────────┐
        ▼             ▼             ▼
      Depth          SfM           SLAM
        │             │             │
        └─────────────┼─────────────┘
                      ▼
                   3D World
                      │
        ┌─────────────┼─────────────┐
        ▼             ▼             ▼
   Point Cloud       Mesh       Neural Field
        │             │             │
        └─────────────┼─────────────┘
                      ▼
              Scene Understanding
                      │
                      ▼
             Vision-Language Model
                      │
                      ▼
                     LLM
                      │
                      ▼
                  Reasoning
                      │
                      ▼
                    Action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  85. Como estudar Computer Vision
&lt;/h2&gt;

&lt;p&gt;Para um desenvolvedor, uma sequência possível seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Python
 ↓
NumPy
 ↓
OpenCV
 ↓
Image Processing
 ↓
CNN
 ↓
Classification
 ↓
Object Detection
 ↓
Segmentation
 ↓
Video Processing
 ↓
Tracking
 ↓
Camera Geometry
 ↓
Calibration
 ↓
Stereo
 ↓
Depth
 ↓
Feature Matching
 ↓
SfM
 ↓
MVS
 ↓
Point Clouds
 ↓
Registration
 ↓
SLAM
 ↓
Mesh Reconstruction
 ↓
Vision Transformers
 ↓
Vision-Language Models
 ↓
Multimodal AI
 ↓
Vision + LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não é necessário dominar tudo para começar a construir aplicações. Mas esse mapa ajuda a entender onde cada tecnologia se encaixa.&lt;/p&gt;




&lt;h2&gt;
  
  
  86. Stack para começar
&lt;/h2&gt;

&lt;p&gt;Um stack prático para estudar e prototipar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Language
    Python

Numerical Computing
    NumPy

Image Processing
    OpenCV

Deep Learning
    PyTorch

Object Detection
    YOLO / DETR

Segmentation
    SAM / segmentation models

3D
    Open3D

Photogrammetry
    COLMAP

Point Clouds
    Open3D / PCL

Optimization
    SciPy / Ceres

Model Runtime
    ONNX Runtime / TensorRT

Backend
    FastAPI

Mobile
    Swift / Kotlin / React Native

Multimodal
    VLM + LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  87. O ponto principal
&lt;/h2&gt;

&lt;p&gt;O mais importante para quem desenvolve sistemas de Computer Vision é não enxergar essas tecnologias como ferramentas isoladas.&lt;/p&gt;

&lt;p&gt;Um projeto real pode começar com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e terminar com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3D Model
+
Scene Understanding
+
LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No meio existem dezenas de etapas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Capture
 ↓
Preprocessing
 ↓
Detection
 ↓
Segmentation
 ↓
Tracking
 ↓
Calibration
 ↓
Depth
 ↓
Pose Estimation
 ↓
SfM
 ↓
MVS
 ↓
Point Cloud
 ↓
Registration
 ↓
Mesh
 ↓
Vision Model
 ↓
VLM
 ↓
LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada etapa resolve um problema diferente.&lt;/p&gt;

&lt;p&gt;E é justamente a combinação delas que permite construir sistemas realmente sofisticados.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Computer Vision não é apenas reconhecimento de imagens.&lt;/p&gt;

&lt;p&gt;É a combinação de várias áreas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Computer Vision
+
Deep Learning
+
Geometry
+
Computer Graphics
+
3D Reconstruction
+
Robotics
+
Generative AI
+
Multimodal AI
+
LLMs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma forma de enxergar a evolução é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pixels
  ↓
Features
  ↓
Objects
  ↓
Semantics
  ↓
Motion
  ↓
Depth
  ↓
Geometry
  ↓
3D
  ↓
Scene Understanding
  ↓
Multimodal Reasoning
  ↓
Action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma câmera produz pixels.&lt;/p&gt;

&lt;p&gt;Um detector encontra objetos.&lt;/p&gt;

&lt;p&gt;Um modelo de segmentação separa regiões.&lt;/p&gt;

&lt;p&gt;Um sistema geométrico recupera profundidade e pose.&lt;/p&gt;

&lt;p&gt;SfM e MVS conseguem reconstruir uma cena.&lt;/p&gt;

&lt;p&gt;LiDAR fornece medições espaciais.&lt;/p&gt;

&lt;p&gt;SLAM conecta percepção e localização.&lt;/p&gt;

&lt;p&gt;Modelos multimodais conectam visão e linguagem.&lt;/p&gt;

&lt;p&gt;E um LLM pode usar todas essas informações para raciocinar sobre o que está acontecendo.&lt;/p&gt;

&lt;p&gt;É aí que Computer Vision começa a deixar de ser apenas "reconhecimento de imagem" e passa a funcionar como uma camada de percepção de sistemas inteligentes.&lt;/p&gt;




&lt;h3&gt;
  
  
  Referências e tecnologias para explorar
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Computer Vision
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenCV
PyTorch
scikit-image
MediaPipe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Detection
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YOLO
Faster R-CNN
DETR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Segmentation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;U-Net
Mask R-CNN
SAM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Geometry
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera Calibration
Stereo Vision
Epipolar Geometry
SfM
MVS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Photogrammetry
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COLMAP
OpenMVG
OpenMVS
Meshroom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3D
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open3D
PCL
SLAM
NeRF
Gaussian Splatting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Modern AI
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vision Transformers
Vision-Language Models
Multimodal LLMs
Visual Embeddings
RAG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;O caminho mais interessante, na minha visão, não está em escolher entre Computer Vision, 3D ou LLM.&lt;/p&gt;

&lt;p&gt;Está em conectar essas áreas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Perception
    +
Geometry
    +
3D
    +
Deep Learning
    +
Language
    =
Intelligent Systems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando essas camadas começam a trabalhar juntas, a aplicação deixa de apenas "ver" e passa a construir uma representação cada vez mais rica do mundo.&lt;/p&gt;

</description>
      <category>computervision</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>Database-per-tenant {Explicando Padrões de arquitetura de banco de dados multilocatários}</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Fri, 03 Oct 2025 01:43:45 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/database-per-tenant-explicando-padroes-de-arquitetura-de-banco-de-dados-multilocatarios-2kpj</link>
      <guid>https://dev.to/alexandrejusten/database-per-tenant-explicando-padroes-de-arquitetura-de-banco-de-dados-multilocatarios-2kpj</guid>
      <description>&lt;h2&gt;
  
  
  Arquiteturas de Banco de Dados para Multi-Tenancy
&lt;/h2&gt;

&lt;p&gt;=================================================&lt;/p&gt;

&lt;p&gt;Quando comecei a desenvolver a versão web de um sistema que já rodava localmente, me deparei com uma decisão estratégica: &lt;strong&gt;como estruturar o banco de dados para suportar vários clientes (multi-tenancy)&lt;/strong&gt;. Essa escolha não é apenas técnica; ela impacta escalabilidade, segurança, custos e até a forma como a equipe vai trabalhar no dia a dia.&lt;/p&gt;

&lt;p&gt;Grosso modo, existem três modelos principais: desde o mais simples, onde todos compartilham as mesmas tabelas, até o mais isolado, com um banco dedicado para cada cliente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Padrão 1 – Banco Único e Tabelas Compartilhadas
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE customers (
  id INT PRIMARY KEY,
  tenant_id INT NOT NULL,
  name VARCHAR(255),
  email VARCHAR(255),
  INDEX(tenant_id)
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Nesse modelo, todos os clientes dividem as mesmas tabelas. O que diferencia os dados é uma coluna &lt;code&gt;tenant_id&lt;/code&gt;. É o desenho mais direto e geralmente o primeiro que vem à mente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Mais barato e simples de operar.&lt;/li&gt;
&lt;li&gt;  Backups, monitoramento e atualizações em um único ponto.&lt;/li&gt;
&lt;li&gt;  Mudanças de schema refletem em todos os clientes de uma vez.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Qualquer descuido em queries pode vazar dados entre clientes.&lt;/li&gt;
&lt;li&gt;  Um cliente pesado pode afetar todos os outros.&lt;/li&gt;
&lt;li&gt;  Não dá muita flexibilidade de customização.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Padrão 2 – Banco Único, Schemas Separados
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE SCHEMA tenant1;
CREATE TABLE tenant1.customers (...);

CREATE SCHEMA tenant2;
CREATE TABLE tenant2.customers (...);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Aqui ainda temos um banco só, mas cada cliente fica em um schema separado. É algo que bancos como &lt;strong&gt;PostgreSQL&lt;/strong&gt; e &lt;strong&gt;SQL Server&lt;/strong&gt; oferecem nativamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Mais isolamento do que o modelo anterior.&lt;/li&gt;
&lt;li&gt;  Possibilita pequenas customizações por cliente.&lt;/li&gt;
&lt;li&gt;  Custos ainda controlados (um único banco físico).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  As migrações precisam ser replicadas em cada schema.&lt;/li&gt;
&lt;li&gt;  Com muitos clientes, o banco pode atingir limites de objetos.&lt;/li&gt;
&lt;li&gt;  Gerenciar backups/restores é mais trabalhoso.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Padrão 3 – Um Banco por Cliente
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE DATABASE tenant1;
CREATE DATABASE tenant2;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Esse é o modelo mais isolado: cada cliente tem sua própria base de dados, totalmente separada das demais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Isolamento total (ideal para compliance e segurança).&lt;/li&gt;
&lt;li&gt;  Escalabilidade independente por cliente.&lt;/li&gt;
&lt;li&gt;  Facilidade em atender exigências regulatórias.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Maior custo de operação e infraestrutura.&lt;/li&gt;
&lt;li&gt;  Migrações de schema são mais trabalhosas.&lt;/li&gt;
&lt;li&gt;  Exige automação para gerenciar conexões e atualizações.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparativo Rápido
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critério&lt;/th&gt;
&lt;th&gt;Compartilhar Banco + Esquema&lt;/th&gt;
&lt;th&gt;Compartilhar Banco + Schemas&lt;/th&gt;
&lt;th&gt;Banco por Tenant&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Suporte em SGDBs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Todos&lt;/td&gt;
&lt;td&gt;PostgreSQL, SQL Server, etc.&lt;/td&gt;
&lt;td&gt;Todos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Conformidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Difícil&lt;/td&gt;
&lt;td&gt;Possível com esforço extra&lt;/td&gt;
&lt;td&gt;Mais simples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baixa&lt;/td&gt;
&lt;td&gt;Média/Alta&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customização&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Moderada&lt;/td&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Banco inteiro&lt;/td&gt;
&lt;td&gt;Banco inteiro&lt;/td&gt;
&lt;td&gt;Por cliente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Dicas para Migrações de Schema
&lt;/h2&gt;

&lt;p&gt;Não importa o modelo que você escolha, mudar a estrutura do banco será sempre uma dor de cabeça se não houver disciplina.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Versione seus scripts&lt;/strong&gt; no Git com numeração sequencial.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Automatize&lt;/strong&gt; com CI/CD, rodando testes antes de aplicar.&lt;/li&gt;
&lt;li&gt;  Escreva scripts &lt;strong&gt;idempotentes&lt;/strong&gt; (seguros para rodar mais de uma vez).&lt;/li&gt;
&lt;li&gt;  Aplique mudanças &lt;strong&gt;primeiro em staging&lt;/strong&gt; e depois em subset de clientes.&lt;/li&gt;
&lt;li&gt;  Mantenha &lt;strong&gt;compatibilidade retroativa&lt;/strong&gt; sempre que possível.&lt;/li&gt;
&lt;li&gt;  Use um catálogo centralizado para acompanhar versões de cada tenant.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Não existe receita única. O melhor modelo depende do seu estágio e das exigências do seu negócio.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Quer começar simples e barato? → &lt;strong&gt;Banco + Tabelas Compartilhadas&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Precisa de isolamento e compliance? → &lt;strong&gt;Banco por Cliente&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Busca um equilíbrio? → &lt;strong&gt;Banco único com Schemas separados&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O mais importante é escolher algo que funcione bem &lt;em&gt;hoje&lt;/em&gt;, mas com clareza de como migrar no futuro conforme sua base de clientes crescer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Tianzhou 18 de março de 2025 – &lt;a href="https://www.bytebase.com/blog/multi-tenant-database-architecture-patterns-explained/" rel="noopener noreferrer"&gt;Multi-Tenant Database Architecture Patterns Explained&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  turso – &lt;a href="https://turso.tech/multi-tenancy" rel="noopener noreferrer"&gt;Database Multi-Tenancy Made Easy&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>saas</category>
    </item>
    <item>
      <title>GitHub em 1 Clique: De Público para Privado em Segundos!🔒</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Sat, 01 Feb 2025 02:26:12 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/github-em-1-clique-de-publico-para-privado-em-segundos-knl</link>
      <guid>https://dev.to/alexandrejusten/github-em-1-clique-de-publico-para-privado-em-segundos-knl</guid>
      <description>&lt;p&gt;Você já quis alterar rapidamente um repositório público para privado no GitHub sem precisar navegar pelas configurações? Este script em Node.js permite fazer isso diretamente pelo terminal, em apenas um clique!&lt;/p&gt;

&lt;p&gt;Para contextualizar: fui contratado como professor de desenvolvimento de sistemas e, ao montar meus planos de aula, percebi que tinha muitos códigos e algoritmos no meu GitHub que seriam úteis durante as aulas. Como alguns alunos já estão me procurando nas redes sociais, percebi que deveria tornar meus repositórios importantes privados.&lt;/p&gt;

&lt;p&gt;Quando comecei essa tarefa, achei que seria fácil, mas depois de 10 repositórios, ainda faltavam 53, kkkkk. Então, achei mais prudente resolver isso com um script simples, e foi isso que fiz.&lt;/p&gt;

&lt;p&gt;Primeiro passo: Obter sua API token.&lt;/p&gt;

&lt;p&gt;Acesse o link: &lt;a href="https://github.com/settings/tokens" rel="noopener noreferrer"&gt;https://github.com/settings/tokens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode gerar um token, que será muito importante para termos acesso e modificar a visibilidade do repositório.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jb82uvu9c282a78lrzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jb82uvu9c282a78lrzw.png" alt="Image description" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você deve marcar a opção "repo".&lt;/p&gt;

&lt;p&gt;Pronto! Agora que você tem a chave, vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const axios = require('axios');
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

async function ask(query) {
  return new Promise(resolve =&amp;gt; rl.question(query, resolve));
}

async function getRepositories(username, token) {
  try {
    const response = await axios.get(`https://api.github.com/users/${username}/repos`, {
      headers: { Authorization: `Bearer ${token}` }
    });

    return response.data.map(repo =&amp;gt; repo.name);
  } catch (error) {
    console.error('Erro ao buscar repositórios');
    return [];
  }
}

async function visibility(username, token, repoName) {
  try {
    await axios.patch(`https://api.github.com/repos/${username}/${repoName}`, 
      { private: true }, 
      { headers: { Authorization: `Bearer ${token}` } }
    );
    console.log(`O repositório ${repoName} foi privado`);
  } catch (error) {
    console.error('Erro ao alterar visibilidade');
  }
}

async function main() {
  const username = await ask('Nome de usuário do GitHub: ');
  const token = await ask('Digite sua token: ');

  const repos = await getRepositories(username, token);

  if (repos.length === 0) {
    console.log('Nenhum repositório encontrado');
    rl.close();
    return;
  }

  repos.forEach((repo, index) =&amp;gt; console.log(`${index + 1}. ${repo}`));

  const choice = await ask('\nDigite o número do repositório que deseja tornar privado: ');
  const selectedRepo = repos[parseInt(choice) - 1];

  if (selectedRepo) {
    await visibility(username, token, selectedRepo);
  } else {
    console.log('Escolha inválida.');
  }

  rl.close();
}

main();

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resumo do Fluxo do Código&lt;br&gt;
O usuário fornece seu nome de usuário e token do GitHub.&lt;br&gt;
O script faz uma requisição para listar os repositórios do usuário.&lt;br&gt;
O script exibe os repositórios disponíveis e pede ao usuário para escolher um.&lt;br&gt;
O script altera a visibilidade do repositório escolhido, tornando-o privado.&lt;br&gt;
O script exibe uma mensagem de confirmação ou erro dependendo do resultado.&lt;br&gt;
Esse código usa axios para fazer as requisições HTTP e readline para interação com o usuário, criando uma solução simples, mas eficaz, para alterar rapidamente a visibilidade de múltiplos repositórios no GitHub.&lt;/p&gt;

&lt;p&gt;Se esse código foi útil para você, deixe um comentário ou curta! Muito obrigado por ler até aqui.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>javascript</category>
      <category>development</category>
    </item>
    <item>
      <title>Transforme Seu Servidor Local em um Site Público com Ngrok</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Thu, 31 Oct 2024 02:20:43 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/transforme-seu-servidor-local-em-um-site-publico-com-ngrok-30do</link>
      <guid>https://dev.to/alexandrejusten/transforme-seu-servidor-local-em-um-site-publico-com-ngrok-30do</guid>
      <description>&lt;p&gt;Quando desenvolvemos uma aplicação web localmente e queremos compartilhá-la para testes ou demonstrações, encontramos uma barreira comum: a aplicação só está acessível em nossa rede local. É aqui que entra o ngrok!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Que é Tunelamento?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O tunelamento permite expor um servidor local para a internet através de um canal seguro. Isso é especialmente útil em ambientes de desenvolvimento, onde você deseja compartilhar seu servidor com clientes ou testá-lo em outros dispositivos sem ter que fazer o deploy completo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por Que Usar o Ngrok?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O ngrok é uma das ferramentas mais populares para tunelamento, e por boas razões:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rápido e Fácil de Usar: Com apenas uma linha de comando, você pode criar um túnel para o seu servidor local.&lt;/li&gt;
&lt;li&gt;Segurança: Cria uma conexão segura (HTTPS) automaticamente.&lt;/li&gt;
&lt;li&gt;Flexível: Funciona com HTTP, HTTPS, TCP e até WebSockets.&lt;/li&gt;
&lt;li&gt;Insights e Depuração: Permite monitorar e depurar requisições recebidas em tempo real.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Como Usar o Ngrok?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Baixe e Instale o Ngrok:&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acesse ngrok.com e baixe a versão adequada para o seu sistema.&lt;/p&gt;

&lt;p&gt;Após o download, descompacte o arquivo e coloque o executável em uma pasta de fácil acesso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Autenticação (opcional, mas recomendado):&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crie uma conta no ngrok e copie seu token de autenticação.&lt;br&gt;
No terminal, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok authtoken SEU_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjw82o3v6d7s7j4nkcen6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjw82o3v6d7s7j4nkcen6.png" alt="Image description" width="403" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Iniciando o Túnel:&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o servidor da sua aplicação rodando (por exemplo, na porta 3000), inicie o túnel com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdlwbs70wf3foel9slmn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdlwbs70wf3foel9slmn.png" alt="Image description" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este comando cria um túnel HTTP e HTTPS para a porta 3000 do seu localhost. Você verá um endereço público no formato &lt;a href="https://xxxx.ngrok.io" rel="noopener noreferrer"&gt;https://xxxx.ngrok.io&lt;/a&gt; que pode ser acessado de qualquer lugar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Visualize e Depure o Tráfego:&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acesse &lt;a href="http://localhost:4040" rel="noopener noreferrer"&gt;http://localhost:4040&lt;/a&gt; para ver informações detalhadas sobre cada requisição recebida, incluindo cabeçalhos, payload e status de resposta. Essa visualização é ótima para depurar APIs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Encerrando o Túnel:&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para parar o ngrok, basta fechar o terminal ou pressionar Ctrl+C.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Exemplos de Uso do Ngrok&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Testes de Webhooks: Ideal para desenvolver e testar webhooks de serviços externos como Stripe, PayPal e GitHub, sem precisar fazer o deploy do código.&lt;/li&gt;
&lt;li&gt;Demonstrar Aplicações em Tempo Real: Compartilhe seu progresso com colegas ou clientes em uma aplicação em execução localmente.&lt;/li&gt;
&lt;li&gt;Desenvolvimento de APIs: Teste e depure endpoints localmente antes de enviá-los para produção.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O ngrok é uma ferramenta indispensável para quem desenvolve aplicações web e precisa de acesso rápido, seguro e fácil a um servidor local a partir da internet. Com ele, o tunelamento se torna simples, ampliando as possibilidades de desenvolvimento e teste.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ngrok</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🐍Como Importar Dados do Excel para SQLite com Python em Poucas Linhas</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Wed, 30 Oct 2024 22:13:11 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/como-importar-dados-do-excel-para-sqlite-com-python-em-poucas-linhas-o7b</link>
      <guid>https://dev.to/alexandrejusten/como-importar-dados-do-excel-para-sqlite-com-python-em-poucas-linhas-o7b</guid>
      <description>&lt;p&gt;Neste post, vou ensinar como transferir dados de uma planilha Excel diretamente para um banco de dados SQLite usando apenas algumas linhas de código em Python. Muito útil para quem precisa centralizar dados em um banco de dados, especialmente para uso em aplicações que fazem consultas frequentes, como dashboards ou ferramentas de análise!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Bibliotecas:&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import pandas as pd
import sqlite3

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Carregar o Arquivo Excel:&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arquivo_excel = './teste.xlsx'
df = pd.read_excel(arquivo_excel)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Conectar ao Banco de Dados SQLite:&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;conexao = sqlite3.connect('database.db')

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Exportar os Dados para o SQLite:&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df.to_sql('tabela_excel', conexao, if_exists='replace', index=False)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Fechar a Conexão e Confirmação:&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;conexao.close()
print("Dados importados com sucesso!")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma em poucas linhas de código temos a nossa tabela xlsx exportada para um banco SQLite!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmphub82vfjhqmnxryuq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmphub82vfjhqmnxryuq.png" alt="Image description" width="379" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28bqe9mj7w7v5k9uuqkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28bqe9mj7w7v5k9uuqkh.png" alt="Image description" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>python</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Análise de Sulco de Pneus com Inteligência Artificial em Python!</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Wed, 30 Oct 2024 21:16:09 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/analise-de-sulco-de-pneus-com-inteligencia-artificial-em-python-3kmi</link>
      <guid>https://dev.to/alexandrejusten/analise-de-sulco-de-pneus-com-inteligencia-artificial-em-python-3kmi</guid>
      <description>&lt;p&gt;A análise de sulcos de pneus é uma tarefa crucial para identificar o desgaste e garantir a segurança, especialmente em veículos que percorrem longas distâncias. Com o uso de Inteligência Artificial (IA) e Python, podemos automatizar esse processo de maneira rápida e precisa. Aqui, mostramos como um modelo de rede neural convolucional (CNN), baseado na arquitetura VGG16, classifica pneus em "novos" ou "usados", enquanto o OpenCV ajuda a analisar as imagens para medir a profundidade dos sulcos.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tecnologias Usadas&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Python:&lt;br&gt;
Linguagem de programação popular para IA e Machine Learning, especialmente por suas bibliotecas avançadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenCV: &lt;br&gt;
Usado para processar as imagens, detectar contornos e medir a área dos sulcos dos pneus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TensorFlow e Keras: &lt;br&gt;
Bibliotecas de aprendizado profundo. Utilizamos o Keras para trabalhar com o modelo VGG16, uma CNN pré-treinada para reconhecimento de imagens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Matplotlib: &lt;br&gt;
Biblioteca para visualização de dados e criação de gráficos, tornando os resultados da classificação mais interpretáveis.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Código:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;1. Carregar e Pré-processar as Imagens:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
 As imagens dos pneus são carregadas e redimensionadas para um formato padrão (150x150 pixels) necessário para a entrada do modelo. Esse redimensionamento mantém a proporção e normaliza os valores dos pixels entre 0 e 1 para facilitar o processamento pelo modelo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import cv2
import numpy as np
from tensorflow.keras.applications.vgg16 import preprocess_input

def process_image(image_path, target_size=(150, 150)):
    image = cv2.imread(image_path)
    if image is None:
        print(f"Erro ao carregar a imagem: {image_path}. Verifique o caminho e a integridade do arquivo.")
        return None, None

    image_resized = cv2.resize(image, target_size, interpolation=cv2.INTER_AREA)
    image_array = np.array(image_resized) / 255.0  
    image_array = np.expand_dims(image_array, axis=0)
    image_preprocessed = preprocess_input(image_array)

    return image_resized, image_preprocessed

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;2. Classificação com o Modelo Treinado:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Carregamos um modelo de rede neural convolucional pré-treinado, que foi ajustado para classificar pneus como "novos" ou "usados". Esse modelo fornece uma pontuação de confiança que indica a probabilidade de um pneu ser novo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from tensorflow.keras.models import load_model

model = load_model('pneu_classificador.keras')
prediction = model.predict(image_preprocessed)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;3. Análise dos Contornos para Profundidade de Sulco:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
A detecção da profundidade do sulco é realizada com técnicas de visão computacional. A imagem em escala de cinza passa por um filtro de borrão e pela detecção de bordas com Canny, o que ajuda a identificar contornos dos sulcos. Em seguida, calculamos a área total dos contornos, o que nos permite estimar o desgaste.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def detect_tread_depth(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    edges = cv2.Canny(blurred, 30, 100)
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    total_area = sum(cv2.contourArea(c) for c in contours if cv2.contourArea(c) &amp;gt; 100)
    return total_area

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;4. Visualização e Análise de Resultados:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Após a classificação e análise de cada pneu, os resultados são exibidos com Matplotlib. Comparamos a pontuação de confiança da classificação e a área dos sulcos detectada em cada imagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import matplotlib.pyplot as plt

confidence_scores = []
total_area_green_values = []
predicted_classes = []

for image_file in os.listdir(ver_dir):
    image_path = os.path.join(ver_dir, image_file)
    image_resized, image_preprocessed = process_image(image_path)
    if image_preprocessed is not None:
        prediction = model.predict(image_preprocessed)
        confidence_score = prediction[0][0]
        total_area_green = detect_tread_depth(image_resized)

        predicted_class = "novo" if total_area_green &amp;gt; 500 else "usado"
        confidence_scores.append(confidence_score)
        total_area_green_values.append(total_area_green)
        predicted_classes.append(predicted_class)

        plt.imshow(cv2.cvtColor(image_resized, cv2.COLOR_BGR2RGB))
        plt.title(f"Pneu {predicted_class} (Área: {total_area_green:.2f}, Confiança: {confidence_score:.2f})")
        plt.axis('off')
        plt.show()

fig, axs = plt.subplots(2, 1, figsize=(10, 10))

axs[0].bar(os.listdir(ver_dir), confidence_scores, color='skyblue')
axs[0].set_title('Confiança na Classificação')
axs[0].set_ylim(0, 1)
axs[0].tick_params(axis='x', rotation=45)

axs[1].bar(os.listdir(ver_dir), total_area_green_values, color='lightgreen')
axs[1].set_title('Área Verde Detectada')
axs[1].tick_params(axis='x', rotation=45)

plt.tight_layout()
plt.show()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5k65vwl2aaapusvu0gi9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5k65vwl2aaapusvu0gi9.png" alt="Image description" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft92xh1ag4p96h39zpzjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft92xh1ag4p96h39zpzjr.png" alt="Image description" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9ydk4s1mqvgiy8hwb2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9ydk4s1mqvgiy8hwb2e.png" alt="Image description" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse meu projeto demonstra como é possível automatizar a análise do desgaste de pneus utilizando IA e visão computacional, resultando em uma classificação precisa e rápida. A arquitetura VGG16 e o uso de OpenCV são fundamentais para combinar a precisão do modelo de rede neural com a análise visual dos sulcos. Esse sistema pode ser expandido para monitoramento contínuo em frotas de veículos, ajudando a reduzir acidentes e otimizar o gerenciamento de pneus.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Criando um component &lt;Select/&gt; com opção de Search e Paginação para ReactNative-NativeBase</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Fri, 16 Feb 2024 14:00:27 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/criando-um-component-com-opcao-de-search-e-paginacao-para-reactnative-nativebase-4e6c</link>
      <guid>https://dev.to/alexandrejusten/criando-um-component-com-opcao-de-search-e-paginacao-para-reactnative-nativebase-4e6c</guid>
      <description>&lt;p&gt;Se você trabalha com React Native utilizando o NativeBase e muitas outras bibliotecas, e está precisando de um componente  que lhe dê a opção de pesquisa e paginação, provavelmente está decepcionado! Pois nativamente você não tem essa opção. No entanto, criei esse componente e gostaria de compartilhar com vocês. Então, vamos lá.&lt;/p&gt;

&lt;p&gt;Nativamente o component  do NativeBase vai ser assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxovjkvt7tvi3ccloe6lr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxovjkvt7tvi3ccloe6lr.png" alt="Image description" width="720" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um componente  simples que pode servir para muitos casos, mas não para todos! O meu componente se comporta de forma diferente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu94tga2x9eiktkn62att.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu94tga2x9eiktkn62att.png" alt="Image description" width="389" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos observar que ele conta com a opção de pesquisa e também, ao chegar perto do final da lista, ele já faz a paginação, carregando um indicador de carregamento e, posteriormente, adicionando os itens da próxima página na minha lista. Por que não trazer todos os dados sem paginação? Basicamente, porque podemos ter centenas de milhares de dados e isso causaria problemas com a memória.&lt;br&gt;
Esse componente foi desenvolvido para ser utilizado em vários locais da minha aplicação, então ele não é específico para uma API ou um objeto só. Por isso, você pode utilizá-lo adaptando mínimos detalhes para que ele funcione na sua aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from 'react';
import { Box, Modal, Button, VStack, Text, View } from 'native-base';
import SearchComponent from './search-fields.utils';
import { FlatList } from 'native-base';
import { HStack } from 'native-base';
import { TouchableOpacity } from 'react-native';
import { ActivityIndicator } from 'react-native';
import Icon from 'react-native-vector-icons/FontAwesome5';
import { useTheme } from 'native-base';

interface Props {
    apiUrl: any;
    searchName: string;
    valueName: string;
    placeholder?: string;
    isRequired?: boolean;
    value?: any;
    onChange: (value: any) =&amp;gt; void;
}

function SelectPaginate(props: Props) {
    const { colors } = useTheme();
    const [modalVisible, setModalVisible] = React.useState(false);
    const [selectValue, setSelectValue] = useState('');
    const [data, setData] = useState&amp;lt;any[]&amp;gt;([]);
    const [loading, setLoading] = useState(false);
    const [page, setPage] = useState(1);
    const [searchQuery, setSearchQuery] = useState&amp;lt;string&amp;gt;('');
    const [value, setValue] = useState();
    const perPage = 10;

    const onPress = (value: any) =&amp;gt; {
        setSelectValue(value?.[props.valueName]);
        setModalVisible(false);
        props.onChange(value);
    };

    const handleSearch = value =&amp;gt; {
        setSearchQuery(value);
    };

    useEffect(() =&amp;gt; {
        if (props.value !== undefined &amp;amp;&amp;amp; props.value !== null) {
            setSelectValue(props.value?.[props.valueName]);
        }
    }, [props.value]);

    useEffect(() =&amp;gt; {
        if (data.length === 0) {
            load()
        } else {
            null;
        }
    }, [data]);

    useEffect(() =&amp;gt; {
        setPage(1)
        setData([]);
    }, [searchQuery]);

    function areArraysEqual(arr1, arr2) {
        if (arr1.length !== arr2.length) {
            return false;
        }

        for (let i = 0; i &amp;lt; arr1.length; i++) {
            if (arr1[i] !== arr2[i]) {
                return false;
            }
        }

        return true;
    }

    async function loadApi() {
        if (loading) return;

        setLoading(true);
        try {
            const response = await axios.get(`${props.apiUrl}`, {
                params: {
                    page: page - 1,
                    size: perPage,
                    sort: 'id,DESC',
                    cacheBuster: new Date().getTime(),
                },
            });
            if (!areArraysEqual(data, response.data)) {
                setData([...data, ...response.data]);
                setPage(page+1);
            } else {
                return;
            }
        } catch (error) {
            console.log(error);
            return null;
        } finally {
            setLoading(false);
        }
    }

    async function loadApiSearch() {

        try {
            const response = await axios.get(`${props.apiUrl}`, {
                params: {
                    page: 0,
                    size: perPage,
                    sort: 'id,DESC',
                    [props.searchName]: searchQuery,
                    cacheBuster: new Date().getTime(),
                },
            });

            if (!areArraysEqual(data, response.data)) {
                setData([...data, ...response.data]);
                setPage(page+1);
            } else {
                return ;
            }
        } catch (error) {
            console.log(error);
            return null;
        } finally {
            setLoading(false);
        }
    }

    async function load(){
        if (uniqueData.length &amp;lt; 10 &amp;amp;&amp;amp; uniqueData.length &amp;gt;0) {
            return;
        }
            if (searchQuery === '' || searchQuery === undefined || searchQuery === null) {

                loadApi();

            } else {
                setLoading(true);
                loadApiSearch();
            }

    }

    function FooterList({ Load }) {
        if (!Load) return null;
        return (
            &amp;lt;View&amp;gt;
                &amp;lt;ActivityIndicator size={25} color="#121212" /&amp;gt;
            &amp;lt;/View&amp;gt;
        );
    }
    function ListItem({ data }) {
        return (
            &amp;lt;Box pl={['0', '4']} pr={['0', '5']} py="2"&amp;gt;
                &amp;lt;TouchableOpacity
                    onPress={() =&amp;gt; {
                        onPress(data);
                    }}&amp;gt;
                    &amp;lt;HStack space={[2, 3]} justifyContent="space-between"&amp;gt;
                        &amp;lt;VStack&amp;gt;
                            &amp;lt;Text
                                _dark={{
                                    color: 'warmGray.50',
                                }}
                                color="coolGray.800"
                                fontSize={15}
                                mt={2}&amp;gt;
                                {data?.[props.valueName]}
                            &amp;lt;/Text&amp;gt;
                        &amp;lt;/VStack&amp;gt;
                    &amp;lt;/HStack&amp;gt;
                &amp;lt;/TouchableOpacity&amp;gt;
            &amp;lt;/Box&amp;gt;
        );
    }
    function TextComponent() {
        if (selectValue === null || selectValue === '') {
            return &amp;lt;Text style={{ color: 'grey' }}&amp;gt;{props.placeholder}&amp;lt;/Text&amp;gt;;
        } else {
            return &amp;lt;Text style={{ color: 'white' }}&amp;gt;{selectValue}&amp;lt;/Text&amp;gt;;
        }
    }
    const uniqueData = Array.from(new Set(data.map(item =&amp;gt; item.id)))
    .map(id =&amp;gt; data.find(item =&amp;gt; item.id === id));
    return (
        &amp;lt;&amp;gt;
            &amp;lt;Modal isOpen={modalVisible} onClose={() =&amp;gt; setModalVisible(false)} avoidKeyboard justifyContent="flex-end" bottom="0" size="lg"&amp;gt;
                &amp;lt;Modal.Content&amp;gt;
                    &amp;lt;Modal.CloseButton /&amp;gt;
                    &amp;lt;Modal.Header&amp;gt;
                        &amp;lt;SearchComponent onSearch={handleSearch} placeholder={props.placeholder} colorText={'grey'} /&amp;gt;
                    &amp;lt;/Modal.Header&amp;gt;
                    &amp;lt;FlatList
                        height="500"
                        data={uniqueData}
                        renderItem={({ item }) =&amp;gt; &amp;lt;ListItem data={item} /&amp;gt;}
                        keyExtractor={item =&amp;gt; item.id}
                        onEndReached={load}
                        onEndReachedThreshold={0.1}
                        ListFooterComponent={&amp;lt;FooterList Load={loading} /&amp;gt;}
                        ml={2}
                    /&amp;gt;
                &amp;lt;/Modal.Content&amp;gt;
            &amp;lt;/Modal&amp;gt;
            &amp;lt;VStack space={8} alignItems="center" &amp;gt;
                &amp;lt;Button
                    onPress={() =&amp;gt; {
                        setModalVisible(!modalVisible);
                    }}
                    style={{ borderWidth: 1, borderColor: colors.white50, width: '100%'}} h={12} &amp;gt;
                    &amp;lt;TextComponent /&amp;gt;
                    &amp;lt;Icon size={18} name={'chevron-down'} style={{ textAlign: 'right', marginLeft: '94%', marginTop: '-6%', color: 'gray' }} /&amp;gt;
                &amp;lt;/Button&amp;gt;
            &amp;lt;/VStack&amp;gt;
        &amp;lt;/&amp;gt;
    );
}

export default SelectPaginate;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também vai precisar do componente de pesquisa, que é importado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from 'react';
import {  Input,  Box } from 'native-base';

function SearchComponent({ onSearch, placeholder ,colorText ='white'}) {
    const [value, setValue] = useState("");

    useEffect(() =&amp;gt; {
      const timer = setTimeout(() =&amp;gt; {
        onSearch(value);
      }, 500);

      return () =&amp;gt; {
        clearTimeout(timer);
      };
    }, [value, onSearch]);

    const handleChange = (text) =&amp;gt; {
      setValue(text);
    };

  return (
    &amp;lt;Box alignItems="center"&amp;gt;
      &amp;lt;Input
      color={colorText}
      value={value}
      onChangeText={handleChange}
      placeholder={placeholder}
      w="40"
    /&amp;gt;
    &amp;lt;/Box&amp;gt;
  );
}

export default SearchComponent;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembre-se de adaptar esses componentes para a sua aplicação, como a requisição para a API e o objeto. Tente entender a interface criada para passar os valores corretos. Em caso de dúvidas, basta comentar neste post que eu ajudo você.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>selectcomponen</category>
      <category>searchreact</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Trabalhando com 2 pc's no setup,Dicas!🖥️</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Tue, 23 Jan 2024 14:31:36 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/trabalhando-com-2-pcs-no-setupdicas-1e</link>
      <guid>https://dev.to/alexandrejusten/trabalhando-com-2-pcs-no-setupdicas-1e</guid>
      <description>&lt;p&gt;Bom, se você trabalha com dois computadores no seu setup e não possui periféricos extras, às vezes isso pode se tornar um problema, até mesmo uma dor de cabeça! Atualmente, no meu ambiente de trabalho, tenho um desktop e um notebook, cada um com sua função específica. Muitas vezes, eu me via enrolado nos emaranhados de cabos para conseguir trabalhar, precisando desconectar o mouse e o teclado de um USB para conectá-los em outro. Isso incluía também o fone de ouvido... acredite, não era uma situação muito agradável.&lt;/p&gt;

&lt;p&gt;Atualmente, tenho alguns periféricos que me ajudam a resolver esse problema, e vou compartilhar essa dica com você.&lt;/p&gt;

&lt;p&gt;A primeira solução que posso oferecer são equipamentos sem fio, como fones, teclados e mouses. No entanto, no Brasil, periféricos sem fio de qualidade costumam ser caros, e nem sempre oferecem o melhor tempo de resposta. Além disso, a questão da bateria pode causar inconvenientes inesperados, como acabar durante uma reunião ou partida, o que não seria nada agradável, não é mesmo? (risos)&lt;/p&gt;

&lt;p&gt;Recentemente, tenho utilizado dois principais switches: HDMI e USB.&lt;/p&gt;

&lt;p&gt;Como funcionam? Basicamente, o switch HDMI possui duas entradas e uma saída, sendo perfeito para alternar entre as telas do meu monitor principal. Com apenas um clique, a imagem passa do meu notebook para o meu PC e vice-versa. Recomendo o Baseus bidirectional HDMI, que além do design perfeito, já está comigo há dois anos e não tenho do que reclamar.&lt;/p&gt;

&lt;p&gt;Quanto ao switch USB, utilizo o Ugreen Hub KVM Switch USB 3.0, que possui até quatro entradas. Da mesma forma que o HDMI, basta um clique para mudar esses quatro periféricos de entrada para o outro PC. Eles custam cerca de R$114 o switch HDMI e R$249 o USB, mas eu garanto que será um bom investimento.&lt;/p&gt;

&lt;p&gt;Agora, resolvemos o problema do HDMI e alguns periféricos como mouse, teclado, câmera... mas e a saída de áudio? Ainda será necessário ficar trocando? A resposta é: depende! Você pode investir em uma interface de áudio USB, como a Behringer UM2. Embora atualmente tenha um custo elevado, proporcionará uma melhor qualidade de áudio. Conectada ao switch USB, basta um clique para direcionar seu microfone e fone de ouvido para o computador selecionado.&lt;/p&gt;

&lt;p&gt;Basicamente, é isso! Essa foi a solução que encontrei para resolver meu problema no setup, e espero que também ajude você.&lt;/p&gt;

</description>
      <category>setup</category>
      <category>working</category>
      <category>tips</category>
      <category>community</category>
    </item>
    <item>
      <title>Gerando Arquivo XLSX(excel) no React Native! json to XLSX</title>
      <dc:creator>Alexandre Justen Filho</dc:creator>
      <pubDate>Mon, 22 Jan 2024 18:17:11 +0000</pubDate>
      <link>https://dev.to/alexandrejusten/gerando-arquivo-xlsxexcel-no-react-native-json-to-xlsx-4hh6</link>
      <guid>https://dev.to/alexandrejusten/gerando-arquivo-xlsxexcel-no-react-native-json-to-xlsx-4hh6</guid>
      <description>&lt;p&gt;Bom, provavelmente, se você chegou a este post, está precisando salvar um arquivo xlsx (Excel) através do seu aplicativo móvel! Nos últimos dias, enfrentei o mesmo problema e tentei, por diversas vezes, o caminho errado. Segue aqui como você deve proceder.&lt;/p&gt;

&lt;p&gt;O primeiro passo é fazer com que sua API retorne um JSON! No meu caso, eu tinha uma API que me retornava diretamente um xlsx, e isso não é um problema quando estamos trabalhando na web, devido ao DOM dos nossos navegadores. No entanto, não é esse o assunto que iremos abordar.&lt;/p&gt;

&lt;p&gt;Nossa API deve ter um retorno como:&lt;br&gt;
&lt;code&gt;[{ "id": '1', "dado": 'primeiro dado' }, { "id": '2', "dado": 'segundo dado' }];&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Um JSON bem simples, não importa o número de objetos, nem mesmo as propriedades, basta estar organizado.&lt;/p&gt;

&lt;p&gt;Precisaremos instalar duas bibliotecas: react-native-fs e xlsx.&lt;/p&gt;

&lt;p&gt;NPM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i xlsx react-native-fs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir desse momento, vou considerar que o seu response está salvo em 'data', contendo o JSON solicitado:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const data = [{ "id": '1', "dado": 'primeiro dado' }, { "id": '2', "dado": 'segundo dado' }];&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Será necessário adicionar as permissões em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android/app/src/main/AndroidManifest.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione os seguintes códigos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; &amp;lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Função para criar o arquivo xlsx e salvá-lo no seu dispositivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const exportDataToExcel = () =&amp;gt; {

const data = [{ "id": '1', "dado": 'primeiro dado' }, { "id": '2', "dado": 'segundo dado' }];

            // criando o xlsx
            let sample_data_to_export = data;

            let wb = XLSX.utils.book_new();
            let ws = XLSX.utils.json_to_sheet(sample_data_to_export)
            XLSX.utils.book_append_sheet(wb, ws, "Users")
            const wbout = XLSX.write(wb, { type: 'binary', bookType: "xlsx" });

            //salvando o arquivo
            const fileName = 'arquivo.xlsx';
            const downloadDir = RNFS.DownloadDirectoryPath;
            const filePath = `${downloadDir}/${fileName}`;

            try {
                RNFS.writeFile(filePath,  wbout, 'ascii')
                console.log("sucesso,arquivo baixado em", filePath);
            } catch (error) {
                console.log('Erro ao baixar o arquivo:', error);

            }

        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, agora basta chamar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exportDataToExcel();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembre-se! Caso seu emulador não tenha o Excel, você pode transferir o arquivo para o PC usando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;adb pull /sdcard/arquivo.xlsx %USERPROFILE%\Desktop\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será parecido com isto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5vbr4g154l8zw1473v7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5vbr4g154l8zw1473v7.png" alt="Image description" width="256" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>xlsx</category>
      <category>mobile</category>
      <category>json</category>
    </item>
  </channel>
</rss>
