Una alternativa no convencional a la búsqueda por imágenes
La experta en seguridad OSINT Sofia Santos publicó una fotografía aérea tomada por un dron en un complejo turístico costero, desafiando a los participantes a averiguar el nombre del complejo, las coordenadas de la isla y la orientación de la cámara. La imagen no contenía ningún dato GPS ni metadatos de la cámara (EXIF): solo mostraba palmeras, playa de arena blanca y tres masas de tierra lejanas sobre el mar.
La primera reacción de la mayoría de participantes fue recurrir a motores de búsqueda inversa de imágenes, intentando reconocer la playa o la estructura de los edificios. El desarrollador yassa9 eligió un enfoque completamente diferente: cerró el buscador, escribió un algoritmo propio y cargó en la memoria VRAM de su tarjeta gráfica los 882MB del dataset vectorial de líneas costeras globales.
Ante paisajes naturales altamente homogéneos, los modelos genéricos de reconocimiento visual fallan con frecuencia, produciendo una enorme cantidad de falsos positivos en playas tropicales. Reducir la búsqueda a una geometría determinista resultó ser la única vía para escapar de la trampa probabilística.
Figura: Imagen original del desafío OSINT publicado por Sofia Santos, mostrando tres islotes independientes. Fuente: Blog de yassa9
Transformando tres islotes en una huella geométrica
En la imagen se aprecian claramente tres masas de tierra: la pequeña isla P0 del complejo en primer plano, la isla plana P1 a la derecha y la isla P2 con relieves montañosos a la izquierda. Estos tres puntos físicos en un plano bidimensional forman un triángulo específico.
La proporción de las tres longitudes de los lados y los valores de los tres ángulos internos constituyen una firma geométrica infalsificable. Teniendo en cuenta la distorsión de perspectiva y la aberración de la lente, el algoritmo estableció un margen de tolerancia del ±20% para esta característica geométrica, convirtiéndola en una “huella geográfica” computable por máquinas.
El primer paso del procesamiento consistió en cargar el dataset vectorial de líneas costeras globales de OpenStreetMap, land-polygons-split-4326, cuyo tamaño sin comprimir es de 882MB. Para evitar una explosión en el volumen de cálculo, el pipeline aplicó una estrategia de compresión espacial por etapas:
Filtrando por características de vegetación tropical, se limitó la latitud de búsqueda entre ±30° del ecuador. La cantidad de polígonos terrestres supervivientes cayó drásticamente de millones a 141.131. Este filtro inicial descartó el 68% de los polígonos terrestres globales, delimitando el cálculo estrictamente a la franja tropical.
A continuación, un muestreo de densidad espacial a 5km redujo los nodos a 51.576 puntos, y una agrupación espacial a 20km dividió los nodos en 23.500 clusters de islas. Tras enumerar las combinaciones de tres puntos en cada cluster, se generaron 80.690.777 triángulos candidatos. Las 80,69 millones de combinaciones convirtieron una búsqueda intuitiva e incierta en un problema estándar de fuerza bruta computable.
Figura: Distribución de ubicaciones candidatas dentro del rango de tolerancia tras el filtrado geométrico y la aceleración CUDA. Fuente: Blog de yassa9
Ráfaga de cálculo en la GPU en solo 204 milisegundos
Recorrer 80,69 millones de combinaciones geométricas en una CPU convencional habría llevado decenas de minutos, lo que constituía el mayor cuello de botella de ingeniería. yassa9 escribió un kernel CUDA dedicado, asignando la verificación de cada triángulo candidato a un hilo de cálculo independiente en la GPU.
Ejecutado en una tarjeta gráfica comercial de gama de entrada, la NVIDIA RTX 3050 (con solo 5,2GB de VRAM ocupados), el kernel CUDA completó las 80,69 millones de comprobaciones de forma en tan solo 204,1 milisegundos. En un instante descartó el 99,8% de las combinaciones no válidas, conservando 158.784 triángulos candidatos.
Los procesadores de transmisión paralela de la GPU son idóneos para verificaciones geométricas independientes; el tiempo de ejecución del kernel de 0,2 segundos multiplicó por miles la eficiencia de búsqueda.
Una red de filtrado de datos en múltiples etapas
Aun habiendo reducido el volumen a 158.784 candidatos, la cifra seguía estando fuera del alcance de la revisión manual, por lo que fue necesario construir un pipeline de filtrado multidimensional por niveles. El algoritmo realizó primero una deduplicación espacial, uniendo triángulos adyacentes repetidos y reduciendo la cifra a 8.915 objetivos.
A continuación se aplicó un filtro de aguas abiertas mediante cajas delimitadoras (bounding boxes) para eliminar lagos interiores y archipiélagos densos, dejando 948 nodos. Para coincidir con la estructura de arrecife de coral observada en la foto, se introdujo el índice de compacidad de Polsby-Popper (relación entre perímetro costero y área), ajustando los candidatos a 213. El cálculo de compacidad descartó con éxito costas fragmentadas e irregulares, conservando islotes con claras características de atolón.
El posterior filtrado por tasa de relleno elíptico redujo los objetivos a 137. En este punto, el algoritmo se conectó a datos satelitales de teledetección para evaluar la vegetación mediante el índice NDVI con un umbral de 0,6. Este alto índice de vegetación eliminó de inmediato bancos de arena al descubierto y estructuras artificiales sin vegetación, dejando 66 candidatos.
La última barrera automatizada fue la consulta de datos de elevación Copernicus DEM de 30m. El algoritmo comparó el perfil montañoso de la isla P2 observado en la imagen, exigiendo que las ubicaciones candidatas tuvieran elevaciones de cierta altura, reduciendo el rango a solo 26 candidatos. La coincidencia de elevación a 30 metros de resolución eliminó multitud de arrecifes llanos, asestando el golpe final del pipeline automatizado.
Verificación humana y algoritmos de grado militar
Con el pipeline automatizado comprimiendo 80,69 millones de opciones a solo 26, la verificación final quedó en manos humanas. yassa9 revisó las imágenes satelitales en orden de prioridad algorítmica y logró localizar el objetivo exacto en el octavo candidato revisado.
La ubicación confirmada fue la isla de Oan, en los Estados Federados de Micronesia (coordenadas: 7°21’48.4”N 151°45’20.7”E). El complejo turístico de la foto era el Oan Island Resort, y la orientación de la cámara del dron en el momento del disparo apuntaba exactamente hacia el noroeste (324,97°).
En las discusiones de la comunidad Hacker News, numerosos ingenieros señalaron que esta solución recrea en esencia el principio de navegación TERCOM (Terrain Contour Matching) utilizado por los misiles de crucero. Asimismo, el Jet Propulsion Laboratory (JPL) de la NASA utilizó algoritmos similares de emparejamiento de características geométricas durante el aterrizaje del rover Perseverance en la misión Mars 2020, reduciendo la elipse de aterrizaje en un orden de magnitud.
Este experimento personal demostró una certeza de ingeniería: ya sea para ubicar una isla a decenas de kilómetros o realizar un aterrizaje de precisión en Marte, recurrir a restricciones geométricas deterministas para eliminar la ambigüedad visual es una estrategia técnica sumamente fiable.
La potencia de cálculo supera las barreras de la intuición
Desde los 882MB de datos costeros hasta los 204 milisegundos de procesamiento en la GPU, este experimento de localización de una isla remota demuestra la enorme eficacia de la ingeniería moderna para resolver problemas complejos.
El contorno de los tres islotes en la foto no era más que una serie de coordenadas geométricas escritas sobre la superficie terrestre. Una vez que las características físicas se traducen a estructuras de datos computables, el inmenso espacio desconocido se comprime rápidamente al ritmo del cálculo.
Cuando la fuerza bruta de la GPU se alía con restricciones geométricas estrictas, la búsqueda visual tradicional basada en la experiencia y la suerte queda completamente reconfigurada por los algoritmos de enumeración de las máquinas.
Enlaces de referencia:
- Blog de yassa9: Geolocating an Island Photo
- Discusión en Hacker News: Geolocating an Island Photo
- Desafío OSINT gralhix: Challenge #004