Proyecto de Computer Vision — Bootcamp IA & Data Engineering · Factoría F5 Madrid · 2026
Sistema de inteligencia artificial que analiza vídeos publicitarios para detectar cuánto tiempo aparece cada logo de marca en pantalla, generando informes con tiempo total y porcentaje de aparición por marca.
Usuario
│
▼
Frontend (React + Tailwind CSS + Recharts)
│ POST /detect/video · GET /videos/{id}/report
▼
Backend (FastAPI)
├── inference/detector.py ← YOLO11s desde Hugging Face
├── db/crud.py ← PostgreSQL via SQLAlchemy
└── storage/file_manager.py ← crops en disco
│
▼
PostgreSQL
| Campo | Detalle |
|---|---|
| Arquitectura | YOLO11s — 9.4M parámetros |
| Dataset | Logo Detection Clean v3 (Roboflow) — 22.088 imágenes |
| Marcas detectadas | 15 (Nike, Adidas, Coca-Cola, Starbucks, Puma...) |
| mAP@50 | 0.891 |
| mAP@50-95 | 0.722 |
| Precisión | 0.806 |
| Recall | 0.916 |
| Pesos | Marco13423/logo-detection-yolo11s |
| Capa | Tecnología |
|---|---|
| Modelo IA | YOLO11s (Ultralytics) |
| Backend | FastAPI + SQLAlchemy |
| Base de datos | PostgreSQL |
| Frontend | React + Tailwind CSS + Recharts + Vite |
| Gestión dependencias | uv (backend) · npm (frontend) |
| Contenedores | Docker + docker-compose |
| Modelo hosting | Hugging Face Hub |
| Hosting API | Render |
| Hosting Frontend | Vercel |
Proyecto11_ComputerVision_Equipo3/
├── docker-compose.yml ← levanta PostgreSQL con un comando
├── .env.example ← variables de entorno documentadas
├── KANBAN.md ← tablero de tareas del proyecto
├── data/
│ ├── raw/ ← imágenes sin procesar (excluido de git)
│ └── processed/ ← dataset anotado en formato YOLO (excluido de git)
├── training/
│ ├── download_dataset.py ← descarga Logo Detection Clean v3 desde Roboflow
│ ├── verify_dataset.py ← verifica integridad del dataset
│ ├── train.py ← entrenamiento YOLO11s (perfiles: fast/medium/full)
│ └── upload_model.py ← sube los pesos a Hugging Face
├── models/ ← pesos best.pt (excluido de git, se descarga de HF)
│ └── modelo.md ← documentación y métricas del modelo
├── services/
│ ├── backend/ ← API FastAPI
│ │ └── app/
│ │ ├── main.py ← punto de entrada de la API
│ │ ├── inference/ ← wrapper YOLO11s: load_model, predict_image
│ │ ├── api/ ← endpoints: /detect/image, /videos/{id}/report
│ │ ├── db/ ← conexión PostgreSQL, crud, init_db
│ │ ├── models/ ← tablas SQLAlchemy: Brand, Video, Detection
│ │ └── storage/ ← file_manager: guarda y lee crops
│ └── frontend/ ← interfaz React
│ ├── src/
│ │ ├── components/ ← UploadZone, BrandCard, BrandChart...
│ │ ├── pages/ ← UploadPage, ReportPage, HistoryPage
│ │ └── services/api.js ← todas las llamadas a la API
│ └── package.json
└── docs/
├── contrato_datos.md ← formato JSON acordado entre modelo y API
├── esquema_bd.md ← diseño de las tablas PostgreSQL
└── modelo.md ← métricas del modelo entrenado
- Python 3.10+
- uv instalado
- Docker Desktop
- Node.js 18+
git clone https://github.com/Bootcamp-IA-P6/Proyecto11_ComputerVision_Equipo3.git
cd Proyecto11_ComputerVision_Equipo3cp .env.example .env
# Editar .env con tus valores realesVariables necesarias en .env:
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/computer_vision_db
HF_TOKEN=tu_token_de_huggingface
ROBOFLOW_API_KEY=tu_api_key_de_roboflow
docker-compose up -d postgres_dbcd services/backend
uv sync
uv run python app/db/init_db.py # crea las tablas
uv run uvicorn app.main:app --reload
# → http://localhost:8000
# → http://localhost:8000/docs (documentación automática)El modelo se descarga automáticamente desde Hugging Face en el primer arranque.
cd services/frontend
npm install
npm run dev
# → http://localhost:5173| Método | Endpoint | Descripción |
|---|---|---|
| GET | / |
Estado de la API |
| GET | /health |
Health check |
| POST | /detect/image |
Detecta logos en una imagen |
| POST | /detect/video |
Procesa un vídeo completo frame a frame |
| GET | /videos/{id}/report |
Informe completo de un vídeo procesado |
# Detectar logos en una imagen
curl -X POST http://localhost:8000/detect/image \
-F "file=@imagen_con_logo.jpg"
# Respuesta
{
"filename": "imagen_con_logo.jpg",
"total": 1,
"detections": [
{
"brand_name": "Nike",
"confidence": 0.891,
"bounding_box": [100, 50, 300, 400],
"frame_width": 1920,
"frame_height": 1080
}
]
}brands videos detections
────────── ────────────────────── ──────────────────────────
brand_id (PK) video_id (PK) detection_id (PK)
brand_name video_name video_id (FK → videos)
duration_seconds brand_id (FK → brands)
processed_at start_time
end_time
confidence
bounding_box (JSONB)
crop_path
cd training
uv sync
# Descargar dataset (Logo Detection Clean v3)
uv run python download_dataset.py
# Verificar integridad del dataset
uv run python verify_dataset.py
# Entrenar — perfil rápido (15 épocas, 30% dataset)
uv run python train.py --profile fast
# Entrenar — perfil medio (20 épocas, 100% dataset) — por defecto
uv run python train.py
# Entrenar — perfil completo (50 épocas)
uv run python train.py --profile full
# Subir pesos a Hugging Face
uv run python upload_model.py| Marca | mAP@50 | Precisión | Recall |
|---|---|---|---|
| Under Armour | 0.978 | 0.935 | 0.944 |
| Apple Inc | 0.960 | 0.945 | 0.973 |
| Starbucks | 0.959 | 0.868 | 0.991 |
| The North Face | 0.944 | 0.930 | 1.000 |
| Hard Rock Cafe | 0.937 | 0.753 | 0.988 |
| Mercedes-Benz | 0.941 | 0.880 | 0.978 |
| NFL | 0.924 | 0.853 | 0.948 |
| Toyota | 0.890 | 0.841 | 0.862 |
| Puma | 0.881 | 0.766 | 0.887 |
| Adidas | 0.868 | 0.631 | 0.947 |
| Coca-Cola | 0.865 | 0.823 | 0.872 |
| Chanel | 0.834 | 0.768 | 0.797 |
| Pepsi | 0.818 | 0.737 | 0.727 |
| Emirates | 0.794 | 0.632 | 0.921 |
| Nike | 0.765 | 0.721 | 0.904 |
| Miembro | Rol principal |
|---|---|
| Andres | Dataset, entrenamiento YOLO11s, frontend React, pipeline HF |
| Maryori | Modelo YOLOv8s (referencia), EDA, inferencia detector.py |
| IsaRodAm | Backend FastAPI, base de datos, persistencia, contrato de datos |
- Estructura de repositorio y entornos uv independientes
- PostgreSQL dockerizado con tablas brands, videos, detections
- Pipeline de entrenamiento YOLO11s con 3 perfiles
- Modelo YOLO11s en Hugging Face (mAP@50: 0.891)
- Endpoint POST /detect/image funcionando
- Persistencia de detecciones en BD (crud.py + file_manager.py)
- Frontend React con drag & drop, informe y gráficos
- Endpoint POST /detect/video (procesado frame a frame)
- Cálculo de tiempos y porcentajes por marca
- Despliegue en Render + Vercel
- Flujo completo verificado en producción
Este proyecto se desarrolla con fines exclusivamente académicos en el marco del Bootcamp de IA y Data Engineering de Factoría F5. Los logos, marcas registradas e imágenes utilizadas pertenecen a sus respectivos propietarios.