← Volver al blog
fedemartinm fedemartinm

Apuntes para escanear un objeto con una cámara 360

Bitácora de investigación · Hyuga.ai · Artículo 3


En el segundo artículo corrimos el pipeline completo sobre espacios abiertos: split fisheye, rig de dos cámaras, COLMAP. Esta semana cambiamos el objetivo: escanear un objeto aislado. Escaneamos una PC vintage de los 90, monitor CRT y gabinete beige, puesta en el centro de la escena para reconstruirla con el mayor detalle posible. Después de varias corridas, lo que separó un splat limpio de uno con costuras fueron las poses de cámara.


El setup

Capturamos con una DJI Osmo 360, con un softbox sobre el objeto para suavizar las sombras del monitor y el gabinete. Grabamos en equirectangular con ISO y parámetros fijos. De ahí seguimos el pipeline de siempre: cortar el video en tramos iguales y quedarnos con el frame más nítido de cada tramo. Empezamos con 200 segmentos y llegamos a 500.

Entrenamos COLMAP con las dos cámaras del rig aunque la PC solo aparecía en la delantera (pano_camera0). La lente de atrás no ve el objeto, pero le da a COLMAP más entorno para ubicar cada pose. Brush entrena solo con la cámara delantera.

Usamos Brush porque corre en una máquina normal, sin hardware específico. Sirve Lichtfeld o cualquier otro entrenador; lo de este artículo no depende de eso.


La estabilización de la Osmo rompía los frames

En los primeros frames extraídos había una costura rara que no cerraba entre una imagen y la siguiente. Después de dar vueltas, el problema era la estabilización de la cámara.

Con la estabilización activada, la Osmo rota la imagen entre sus dos lentes físicas para compensar el movimiento. Un mismo lente físico deja de caer siempre en la misma imagen fisheye. Ese yaw y pitch que la cámara mete por su cuenta rompía los frames, que era justo lo que habíamos cuidado en la captura.

La desactivamos y cada lente físico quedó fijo a su cámara: uno a pano_camera0, el otro a pano_camera1. El costo fue que sin estabilización la cámara tampoco hace el flip vertical, así que ese flip lo hicimos nosotros en el preprocesamiento. Un paso más y los frames volvieron a cerrar.

Si escaneás un objeto tratando de mantenerlo siempre en el mismo lente, desactivá la estabilización.
Frames fisheye con costura rota por la estabilización de la Osmo 360

Con la estabilización activada, un mismo lente físico deja de caer siempre en la misma imagen fisheye y la costura entre frames no cierra.


El error de las poses movió la aguja

Corrimos COLMAP varias veces cambiando resolución de matching, método de emparejamiento y cantidad de segmentos. Dos de esas corridas dejaron claro qué era lo que importaba.

Secuencial (pc-2-2)Exhaustive (pc-2-3)
Vistas500500
Reproj pano0 (media)1.134 px1.096 px
Reproj pano0 (mediana)1.178 px1.102 px
Zona espiral (seg 29–47)1.288 px0.995 px

No comparamos la cantidad de puntos 3D entre las dos corridas: se procesaron a distinta resolución de matching, así que el conteo de puntos no es equivalente. La métrica comparable es el error de reproyección.

La corrida de la derecha produjo el mejor splat, sin costuras ni ese paralaje donde el objeto parece moverse de forma incoherente entre vistas. El dato relevante está en la última fila. La zona espiral, la parte más difícil de la captura donde rodeábamos la PC, bajó de 1.288 a 0.995 px de error, un 29% menos. Era justo donde antes aparecían las costuras. Al bajar el error de las poses, las costuras desaparecieron.

Lo verificamos desde el otro lado. Densificamos una escena con RomaV2, que agrega una gran cantidad de puntos manteniendo las mismas poses. La mejora visual fue mínima. Las poses no cambiaron, así que el problema de fondo seguía presente, ahora tapado con más puntos.

Cuando el splat sale con costuras o paralaje incoherente, el instinto es sumar densidad. Para este objeto la densidad no era el problema. Lo que corregía el resultado era bajar el error de las poses de cámara.
Comparación de splats de la PC según error de poses de cámara (Poses de bajo error (exhaustive)) Comparación de splats de la PC según error de poses de cámara (Poses ruidosas (secuencial))
Poses ruidosas (secuencial) Poses de bajo error (exhaustive)
Arrastrá el control para comparar el splat con poses de mayor error (secuencial, 1.288 px en zona espiral) vs menor error (exhaustive, 0.995 px).

Sequential o exhaustive

COLMAP puede emparejar imágenes en secuencia (cada foto con sus vecinas en el tiempo) o exhaustive (todas contra todas).

Las dos anduvieron. En algunos casos rindió mejor una, en otros la otra, según cómo estaba ordenada la captura y la cobertura. Lo que importó fue cuál dejaba el error de reproyección más bajo para el dataset. Para esta PC y esta captura, exhaustive ganó en la zona espiral que nos daba problemas. Lo tomamos como resultado de este dataset y no como regla.

Medí el error y elegí en base a eso.

Máscaras aunque no haya gente

En los artículos anteriores las máscaras servían para sacar personas. Acá no había personas y las máscaras igual fueron una de las mejores decisiones.

La idea es entrenar el splat solo en el objeto e ignorar el fondo. Entrenamos un YOLO para segmentar la silueta de la PC en las 500 imágenes. Con 100 anotaciones a mano y un fine-tune de unos 6 minutos, el modelo recortaba el objeto en todas las vistas con buena precisión.

El impacto en el entrenamiento fue grande:

Sin máscarasCon máscaras
PLY final379 MB (cortado)61 MB
Duración~9 h (sin terminar)~1h44m
RAMswap extremocontrolada
HD 3840inviableviable

Sin máscaras, Brush intentaba reconstruir también el fondo entero, con archivos enormes y corridas que a veces ni terminaban. Con máscaras, el entrenamiento se concentró en la PC.

Acotando el trabajo al objeto pudimos entrenar en HD real (3840×3840). Sin máscaras el HD era inviable por RAM. Con máscaras entró cómodo y el detalle del objeto subió.

Aunque la escena no tenga nada que ocultar, las máscaras le dicen al entrenador dónde poner el esfuerzo. Menos RAM, menos tiempo, más resolución donde importa.

Máscara de segmentación YOLO sobre la silueta de la PC vintage

Máscara de segmentación YOLO sobre la PC: el entrenador concentra el trabajo en el objeto e ignora el fondo.


El resultado

El mejor splat salió juntando todo esto: las poses con el error más bajo que conseguimos, imágenes en HD y máscaras para concentrar el trabajo en el objeto. La PC quedó nítida, sin costuras, con buen detalle en el CRT y el gabinete, y los splats enfocados en el objeto en vez de dispersos por el fondo.

Splat final de la PC vintage con CRT y gabinete, sin costuras

Resultado final: poses de bajo error, entrenamiento en HD y máscaras de objeto.


Lo que sigue

Lo que nos llevamos:

  • Cuando el splat tiene costuras o paralaje raro, mirá el error de las poses antes de sumar puntos.
  • Sequential y exhaustive sirven las dos. Quedate con la que te deje el error más bajo.
  • Si escaneás un objeto con una 360, desactivá la estabilización para que cada lente físico quede fijo a su cámara.
  • Usá máscaras aunque no haya gente. Bajan RAM y tiempo, y te habilitan más resolución en el objeto.

Preguntas abiertas:

  • ¿Hasta dónde se puede bajar el error de las poses antes de que deje de notarse en el splat?
  • ¿Cuándo conviene densificar y cuándo es tapar un problema de poses?
  • Entrenar todo en HD con exhaustive se nos murió por RAM. ¿Cómo se escala eso sin hardware dedicado?

Hyuga.ai — investigación en curso ¿Estás escaneando objetos o ambientes? Nos interesa comparar notas.

0 me gusta

Comentarios