GOGOGOLLC
Volver al Blog
Computer VisionApr 22, 20269 min read

Por qué GoTrack usa un reranker FAISS sobre CLIP.

La detección de pickup no es un clasificador — es un problema de similitud. Indexamos frames en vivo contra un catálogo por tienda y dejamos que un reranker decida qué tomó realmente el comprador.

EG

Equipo GoTrack

Visión por computadora retail

Por qué GoTrack usa un reranker FAISS sobre CLIP.

Intentamos lanzar GoTrack con un clasificador. No funcionó. No porque el modelo fuera malo, sino porque el problema no es de clasificación — es de similitud. Las tiendas no tienen un solo rack de camisetas; tienen 80 SKUs compartiendo la misma silueta, y los compradores agarran lo que agarran. Un clasificador requiere que entrenes una cabeza por clase. Un reranker requiere que embebas el catálogo una sola vez.

De clasificador a recuperación

Dividimos el pipeline en dos etapas. La etapa uno corre CLIP sobre el frame en vivo y el catálogo por tienda, luego consulta FAISS por las top-K entradas más cercanas del catálogo. La etapa dos rerankea esas K con siete señales adicionales — pose, posición de la mano, dwell time, pickups previos en la sesión, ponderación por hora del día, estado de stock y nivel de zona del rack.

py
# Stage 1: vector recall
emb = clip.encode_image(frame)
candidates = faiss.search(emb, k=20)

# Stage 2: rerank with side-features
ranked = reranker.rerank(
    candidates,
    pose=pose_emb,
    hand=hand_position,
    dwell=dwell_seconds,
    history=session_history,
    tod=time_of_day,
    stock=stock_state,
    tier=zone_tier,
)
pickup = ranked[0]

Por qué dos etapas

Dos etapas nos permiten intercambiar velocidad y precisión de manera independiente. CLIP + FAISS es rápido y aproximado; el reranker es más lento pero está informado. Nunca corremos el reranker sobre más de 20 candidatos. Así llegamos a un swap de pickup-a-señalización por debajo de 300 ms en hardware de borde commodity.

Qué nos compran las siete señales

  • La pose desambigua dos SKUs visualmente similares cuando uno tiene un patrón de doblado distinto.
  • La posición de la mano elimina falsos positivos cuando un comprador pasa caminando sin tomar nada.
  • El dwell time penaliza los vistazos rápidos.
  • El historial de sesión refuerza la adyacencia — si acabas de tomar una talla S, probablemente tomarás otra S.
  • La hora del día reajusta contra la distribución histórica de pickups del rack.
  • El estado de stock degrada cualquier cosa agotada (no puedes tomar un fantasma).
  • El nivel de zona da un pequeño boost a artículos de mayor margen o marcados por campaña.

Por tienda, no por tenant

Los índices FAISS son por tienda, no por tenant. Dos tiendas de la misma cadena suelen tener distintos sets de SKUs, distintos layouts y distintos estados de stock. Construir un índice por tienda es barato (los embeddings de CLIP son diminutos) y reduce a la mitad nuestro ruido de recall.

Qué medimos

En el piloto de la boutique, el pipeline FAISS+reranker produjo un 22% de lift en pickups de SKU adyacente versus nuestra baseline clasificadora v1, y la tasa de falsos positivos (swaps de señalización sin pickup) bajó del 11% a menos del 2%. El sub-300 ms end-to-end se mantuvo cómodo en una sola cámara cenital por rack.

Un pickup es similitud a un vector que ya indexaste. Deja de clasificar; empieza a recuperar.

¿Lo quieres para tu negocio?

Cuéntanos qué flujo construirías primero. Te respondemos con un plan de 4 fases y los agentes que encajan.