Visão computacional: detecção em tempo real com YOLOv8 e Streamlit

Rocketseat

Rocketseat

2 min de leitura
https://prod-files-secure.s3.us-west-2.amazonaws.com/08f749ff-d06d-49a8-a488-9846e081b224/e3477aa9-4b02-4274-8b38-5bdf682ad563/saida.webp?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466SUZ5SZR2%2F20260315%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260315T122342Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEPD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJHMEUCIEjlFjVRTTI5W2yVknFmMXNlZAx1BBmIN29Zypy2VAMcAiEAr8n2PN9jMkTR%2BQiGrm3BLZ00OqFP4ary17su540AbfUqiAQIuf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDF6BIM6pN5uYUCZiBircA65ldkzTtDjfZqz8kN4zSB7bactowpKRuHfj74B04cc2Td6wDQD%2FaM%2B0g%2BWSQD93egE8fLtp8iESYRBp%2BkvoooqQfQLKAwy7D8tzcLoATDCnixtI77wILxtDEXYnXBQG7ebsLaeh0S%2BLDJazwBBruO6hgVm64%2FLetW6rgptTnwMzvie9BsJtboEstEZ4ToyTvsx5OX08wy4DnvSD1og7bAB121T%2BafCwC0ktkB8yY%2FpGtlQiSZakZTBAKs%2BSoAdpOyI31scoRW20iJiqcduKptptNFccI7WRLDd0tVSIY2le1GEiZkDskAwMxuC4vMzLk69FcVZ6la5TrJeVIN4x4kus9uL5HNjhF8E4QxsjSBqrqUmX6f4FglFm8qonxUeYMyLcFS49NytWDGTV%2BKsqkNOVhHlqpYt1EUEnDOANQdmDDRq74reQ%2F2dQhmM6N3PDPB9CmRhbsS0GQ3Z3nGIK5YXy6SxAuXIuIQEgq14XcrUAchF4rbOIBI9SmAMjE3Ctx9HPTvyPhVhSIO85dWm8WWouKSum2%2F799Oxb0zslIda0McmfzTgTHmbRg0KH2fNhhH9VWuv0Alluc4FXR8t35iwM4kngOfM0uLoDF9waEC4fwjecT2DqsaB1r55jMJPD2c0GOqUBhjxkHG11AdElxhIMB3TpNrBiXNUu%2FHy%2BFFwL5pw%2BbIyivoDshsMHLIAKmhY9SbpNIW%2FSxy7vR4y1WqP5s9R6olsD%2FtupmSpy2gjicNUDAuPK1e0udgYY%2BVS7LFb0GRXqA6%2FWpoEhS%2F78z5BvNoSlnsalXKlbFo99ztdXVXxYP8qnFHiHtyyz5vKASPOFTDVeWOeEAhez%2B5qjMjpXzBeTc1yJFCdu&X-Amz-Signature=652acc73df8a62ccee0bbdc511faf7f325b02163935f198bec922ba2fbc293d2&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject
Fala, dev! Quando falamos de Visão Computacional em tempo real, o maior inimigo não é a precisão do modelo, mas sim a latência e a experiência do usuário (UX). Construir um pipeline de detecção de objetos que processa frames da webcam exige uma arquitetura que não desperdice recursos e uma interface que apresente dados de forma limpa.
Hoje, vamos fugir do básico. Vamos entender como construir uma aplicação de Visão Computacional de elite usando YOLOv8, otimizando o tamanho do processamento para garantir FPS alto e renderizando tudo em um dashboard responsivo e elegante.

A Stack de processamento

Para garantir inferência de baixa latência e uma UI ágil, nossa fundação será:
  • YOLOv8 (Ultralytics): O estado da arte em velocidade. Usaremos a versão Nano, que é extremamente leve e eficiente para CPUs.
  • OpenCV: O motor para captura e redimensionamento inteligente de frames.
  • Streamlit: A camada de apresentação, permitindo criar interfaces web reativas para dados usando apenas Python.
  • Google Antigravity: Nossa IDE e ambiente de execução. Ela elimina a barreira entre o código local e o deploy, oferecendo um ambiente pré-configurado com aceleração de hardware que garante que o processamento do YOLO não "engasgue" o navegador.

Pré-requisitos e instalação

Antes de mergulharmos no código, precisamos garantir que seu ambiente esteja isolado e com as ferramentas corretas.

1. Requisitos de sistema

  • Python 3.8 ou superior.
  • Webcam: integrada ou USB (certifique-se de que outros aplicativos de vídeo estejam fechados).

2. Criando o ambiente virtual

No seu terminal, execute os comandos abaixo para isolar as dependências do projeto:
# Criação do ambiente python3 -m venv venv # Ativação (Linux/macOS) source venv/bin/activate # Ativação (Windows) .\venv\Scripts\activate

3. Instalando as bibliotecas

Com o ambiente ativo, instale os pacotes necessários:
pip install --upgrade pip pip install streamlit ultralytics opencv-python-headless

Otimização de performance e interface

O grande erro de iniciantes é tentar processar e exibir o vídeo na resolução nativa da webcam. Isso reduz drasticamente o FPS. Nossa estratégia foca em dois pilares:
  1. Redimensionamento nativo: reduzimos o frame para 640x360 via OpenCV antes da inferência. Menos pixels para a IA analisar significa muito mais velocidade.
  1. Layout por colunas: usamos o sistema de grades do Streamlit para limitar o tamanho visual da câmera, criando um painel lateral dedicado para métricas e controles.

Implementação Core: app.py

Aqui está a implementação do pipeline otimizado:
import streamlit as st import cv2 from ultralytics import YOLO import time # 1. Configuração da Interface st.set_page_config(page_title="AI Sentinel", layout="wide") st.markdown(""" <style> .stMetric { background-color: #161b22; border: 1px solid #30363d; padding: 10px; border-radius: 10px; } </style> """, unsafe_allow_html=True) @st.cache_resource def load_model(): return YOLO('yolov8n.pt') # Modelo Nano: apenas 6MB model = load_model() # 2. Estrutura de Colunas (Controlando o tamanho da imagem) st.title("🛡️ AI Sentinel: Real-Time Monitor") st.divider() col_cam, col_stats = st.columns([2, 1]) # Proporção 2:1 para o vídeo não dominar a tela with col_cam: frame_placeholder = st.empty() with col_stats: st.subheader("Métricas do Sistema") fps_metric = st.metric("Velocidade", "0 FPS") obj_metric = st.metric("Objetos", "0") st.divider() conf_level = st.slider("Confiança", 0.3, 1.0, 0.5) stop_btn = st.button("Interromper Sistema") # 3. Loop de Captura e Inferência cap = cv2.VideoCapture(0) prev_time = 0 while cap.isOpened() and not stop_btn: ret, frame = cap.read() if not ret: break # Otimização crucial: Diminuindo a imagem para ganhar FPS frame_small = cv2.resize(frame, (640, 360)) # Inferência YOLOv8 results = model(frame_small, stream=True, conf=conf_level, verbose=False) for r in results: # Plotando as detecções e convertendo para RGB annotated_frame = r.plot() annotated_frame = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB) # Cálculo de FPS curr_time = time.time() fps = 1 / (curr_time - prev_time) prev_time = curr_time # Renderização controlada pela largura da coluna frame_placeholder.image(annotated_frame, use_container_width=True) # Atualização da GUI fps_metric.metric("Velocidade", f"{fps:.1f} FPS") obj_metric.metric("Objetos", len(r.boxes)) cap.release()
 

O diferencial tecnológico

Repare nas otimizações que elevam esse projeto ao nível Sênior:
  • use_container_width=True: garante que a imagem se ajuste perfeitamente à coluna do Streamlit, impedindo que ela estoure o layout.
  • model(stream=True): utiliza geradores do Python para processar os resultados, economizando memória RAM e evitando gargalos em fluxos contínuos de vídeo.
  • Redimensionamento prévio: ao reduzir a imagem no OpenCV antes de entregá-la ao YOLO, reduzimos o custo computacional exponencialmente.

Construa um projeto real com Inteligência Artificial e descubra, na prática, o poder do Desenvolvimento Agêntico.

Seja você iniciante ou dev experiente, essa é sua oportunidade de evoluir construindo um projeto que acompanha a nova era do desenvolvimento.
Bora codar o seu futuro? 🚀

A hora de investir em você é AGORA!

Um único investimento. Tudo que você precisa para evoluir na carreira!

Artigos_

Explore conteúdos relacionados

Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.

Imagem contendo uma carta e um símbolo de check
NewsletterReceba conteúdos inéditos e novidades gratuitamente
Mês do programador na Rocketseat

Última chance! Code um projeto com IA aplicada em 3 aulas

Garanta seu lugar no NLW Operator.