el cambio en 18 meses
La pregunta ya no es si un modelo local puede mirar un tablero. Puede. La pregunta es qué hacer con lo que ve. Y ahí, en junio de 2026, sigue habiendo una frontera limpia: la visión ha mejorado mucho, pero el razonamiento sobre reglas sigue sin pertenecerle.
En 2024 la pila típica eran tres modelos en cadena: un detector (YOLOv8), un clasificador (ResNet) y un modelo de lenguaje que recibía las etiquetas. En 2026 esa cadena se ha colapsado. Los VLM abiertos — Qwen3-VL, InternVL3, Gemma 3, Molmo, Pixtral — absorben detección, OCR y razonamiento visual en un solo modelo que cabe en una tarjeta de 12 GB si se quantiza a 4 bits.
Para delimitar y seguir objetos, el panorama no ha cambiado tanto: SAM 2.1 (Meta, octubre 2024) sigue siendo el estado del arte en segmentación. SAM 3, pese a los rumores, no se ha publicado. El stack abierto más maduro es Grounded SAM 2: Grounding DINO 1.5/1.6 detecta por texto, SAM 2.1 segmenta, y entre ambos producen un track por objeto con identidad estable. DINO-X (IDEA Research) compite en detección pura con vocabulario abierto y es la mejor opción cuando se quiere velocidad sin pasar por SAM.
catálogo abierto, 2026
Para detección rápida —¿hay un dado en pantalla y cuántos pips tiene?— YOLO12 y RF-DETR siguen siendo la elección pragmática: corren a 60–120 fps en una RTX 3060. Para voz local: whisper-large-v3-turbo en STT, Piper o XTTS-v2 en TTS. Lo que sigue en el catálogo:
| tipo | modelo | peso | vram | licencia |
|---|---|---|---|---|
| VLM | Qwen3-VL-30B-A3B | 30B / 3B act. | ~24 GB | Apache 2.0 |
| VLM | Qwen3-VL-8B | 8B | ~12 GB | Apache 2.0 |
| VLM | InternVL3-78B | 78B | ~48 GB | MIT |
| VLM | InternVL3-8B | 8B | ~12 GB | MIT |
| VLM | Gemma 3-27B Vision | 27B | ~24 GB | Gemma Terms |
| VLM | Molmo 72B | 72B | ~48 GB | Apache 2.0 |
| VLM | Pixtral 12B | 12B | ~14 GB | Apache 2.0 |
| DET | Grounding DINO 1.6 | 340M | ~2 GB | Apache 2.0 |
| DET | DINO-X | — | ~3 GB | Apache 2.0 |
| DET | YOLO12-L | 26M | ~1 GB | AGPL-3.0 |
| DET | RF-DETR-base | 29M | ~1 GB | Apache 2.0 |
| EMB | DINOv2-ViT-L/14 | 300M | ~2 GB | Apache 2.0 |
| EMB | CLIP ViT-L/14 (open_clip) | 300M | ~2 GB | MIT |
| SEG | SAM 2.1 large | 224M | ~5 GB | Apache 2.0 |
| STT | whisper-large-v3-turbo | 809M | ~2 GB | MIT |
| TTS | XTTS-v2 | ~400M | ~2 GB | CPML-NC |
| TTS | Piper (ES) | ~60M | <1 GB | MIT |
la pila para un rival local
El error más caro es pedirle al VLM que arbitre. Que diga "el blitzer se mueve aquí y hace este placaje, y es legal porque…" es una invitación a la alucinación. Los modelos actuales razonan bien sobre qué ven; razonan mal sobre qué reglas aplican a un estado discreto y cambiante.
La pila que funciona tiene cuatro capas separadas, cada una con su modelo. Pasa el ratón por encima de cada una para ver qué hace:
Para un wargame con reglas abiertas —las familias Grimdark Future y Age of Fantasy de One Page Rules son el caso fácil; una baraja casera con valores numéricos, el difícil— la capa de visión solo necesita producir estado discreto. Un JSON que el árbitro de código aplica sobre las reglas reales.
lo que ya está pintado, se queda pintado
El instinto es resolver la identificación con un marcador fiducial: ArUco, AprilTag, un QR pegado a la base. Funciona — pero convierte la miniatura en un token. Pintaste esa elfa durante tres meses, le diste nombre, y ahora el sistema la ve como AR_018. Has canjeado el alma del hobby por 100% de accuracy.
La técnica que respeta la miniatura es DINOv2 (Meta, 2023). Es un modelo de visión que produce un vector de 768 números para cualquier imagen, entrenado sin supervisión sobre 142 millones de fotos. La propiedad útil: dos fotos de la misma miniatura producen vectores casi idénticos aunque cambie el ángulo, la luz o el fondo. No necesita entrenamiento por miniatura. Para tu colección de 30-40 figuras basta con un día fotografiándolas todas desde arriba.
Encima va un clasificador few-shot ligero — un ResNet18 con la cabeza de 40 salidas, entrenado en una tarde con 5-10 fotos por miniatura usando los embeddings de DINOv2 como entrada. Total: 200-400 fotos, una tarde, y el modelo identifica cualquier miniatura de tu colección con la elfa intacta, la armadura intacta, el dolor de las tres capas de highlight intacto.
El VLM actual — Qwen3-VL, Gemma 3 — ya hace esto implícitamente cuando le pasas una miniatura y le preguntas quién es. El problema nunca fue la capacidad: fue pedirle además que razonara reglas. Si le pides solo "describe esta miniatura y dame un identificador" y eso va al árbitro, tienes el flujo entero. La ironía es que llevamos dos años discutiendo si los VLM alucinan, y el alucinaban porque les pedíamos algo que no era lo suyo.
¿Y los ArUco? Donde sí tienen sentido: en las esquinas del tablero, no en las piezas. Sirven para corregir la pose de la cámara (¿está torcida? ¿se ha movido?), para definir zonas de despliegue y para medir distancias en pulgadas sobre la cuadrícula. Identifican el escenario, no a los actores. Cuatro fiduciales en las esquinas, nada más: el resto del tablero queda libre para que DINOv2 haga su trabajo sin estorbos.
lo que todavía falla
Tres problemas siguen abiertos a junio de 2026:
Oclusión. Cuando dos miniaturas se montan una sobre otra, ni SAM 2.1 ni Grounding DINO las separan bien sin un re-prompt manual. Solución pragmática: zonas de exclusión entre bases o instrucción "no apilar".
Dados en movimiento. Un D6 rodando es un problema de varios frames y motion blur. La solución es un clasificador CNN pequeño (ResNet18) entrenado con 200 fotos de tus propios dados — más rápido, más robusto, más pequeño que cualquier VLM.
Cambios de luz. La calibración de exposición entre una partida al mediodía y otra por la noche cambia el threshold del detector. Una sesión de cinco minutos al inicio re-equilibra.
Hay un cuarto problema que no es técnico: el VLM sigue alucinando cuando se le pide razonar reglas en vez de narrar. Mientras esa frontera no esté clara, el árbitro simbólico no es opcional: es el único punto donde la partida puede ser justa.
consola en vivo
Lo que está pasando en el panel de arriba, registrado a 30 fps. Cada interacción con el tablero se loguea como si el pipeline estuviera corriendo de verdad: