이미지 검색을 포기한 색다른 접근법
오픈소스 인텔리전스(OSINT) 보안 전문가 Sofia Santos가 드론으로 촬영한 해변 리조트 사진을 공개하며 리조트 이름, 섬의 좌표, 카메라 방향을 찾는 챌린지를 출제했다. 사진에는 GPS 위도나 경도, 기기 모델 정보 등 어떠한 EXIF 메타데이터도 포함되어 있지 않았으며, 화면에는 야자수와 하얀 모래사장, 그리고 멀리 보이는 섬 3개뿐이었다.
대부분의 도전자들은 먼저 역이미지 검색 엔진을 열어 모래사장이나 건물 구조를 모델로 식별하려 했다. 하지만 개발자 yassa9은 전혀 다른 해법을 선택했다. 검색창을 닫고 코드 알고리즘을 작성한 뒤, 전 세계 882MB 규모의 해안선 벡터 데이터를 그래픽 카드의 VRAM에 그대로 로드한 것이다.
유사한 자연 경관 앞에서 일반적인 이미지 인식 모델은 쉽게 오작동하며, 열대 해변의 시각적 특징은 수많은 오탐을 유발하기 쉽다. 탐색을 확정적인 기하학 문제로 차원을 축소하는 것만이 확률의 덫에서 벗어나는 유일한 길이었다.
그림: Sofia Santos가 공개한 OSINT 챌린지 원본 이미지. 화면에 독립된 섬 3개가 포함되어 있다. 출처: yassa9 블로그
3개 섬의 윤곽을 기하학적 지문으로 변환
사진 속 화면에는 3개의 육지가 명확히 보인다. 전경의 리조트 섬 P0, 우측의 평평한 섬 P1, 그리고 좌측의 산봉우리 윤곽이 있는 섬 P2다. 2차원 평면상의 이 3개 물리적 지점은 하나의 특정한 삼각형을 형성한다.
삼각형의 세 변의 길이 비율과 세 내각의 크기는 위조 불가능한 기하학적 특징이 된다. 원근 왜곡과 렌즈 변형을 고려하여 알고리즘은 이 기하학적 특징에 ±20%의 오차 범위를 설정하고, 컴퓨터가 탐색할 수 있는 ‘지리적 지문’으로 정의했다.
데이터 처리의 첫 단계는 OpenStreetMap의 전 세계 해안선 벡터 데이터셋 land-polygons-split-4326을 로드하는 것이었다. 원본 파일 크기는 882MB에 달했다. 계산량이 폭발하는 것을 막기 위해 필터링 파이프라인은 다단계 공간 압축 전략을 채택했다.
우선 열대 식생의 특징에 착안해 탐색 위도를 남북위 ±30° 이내로 제한했다. 이를 통해 남아있는 다각형 수는 수백만 개에서 141,131개로 급감했다. 이 단계의 필터링으로 전 세계 육지 다각형의 68%를 제거하고 연산 영역을 열대 지역 내부로 좁혔다.
이어 5km 밀도의 공간 샘플링을 실행해 노드 수를 51,576개로 압축하고, 20km 공간 클러스터링으로 23,500개의 섬 클러스터를 나누었다. 각 클러스터 내 노드들의 3점 조합을 모두 나열한 결과, 최종적으로 80,690,777개의 후보 삼각형이 생성되었다. 8069만 개의 후보 조합은 직관에 의존하던 수색을 표준적인 전수 연산 탐색 문제로 전환시켰다.
그림: 기하학적 필터링과 CUDA 커널 가속을 거쳐 오차 범위 내에 들어온 후보 위치 분포. 출처: yassa9 블로그
204밀리초 만에 끝난 GPU 전수 조사
일반 CPU에서 8069만 개의 기하학적 조합을 순회하려면 수십 분이 소요되어 엔지니어링 적용의 가장 큰 병목이 되었다. yassa9은 전용 CUDA 커널을 작성하여 각각의 후보 삼각형을 독립된 GPU 연산 스레드에 할당했다.
약 10만 원대의 보급형 그래픽 카드 NVIDIA RTX 3050(사용 VRAM 5.2GB)에서 실행한 결과, CUDA 커널이 8069만 회의 삼각형 모양 매칭을 모두 완료하는 데 걸린 시간은 단 204.1밀리초에 불과했다. 순식간에 99.8%의 무효한 조합을 걸러내고 최종 158,784개의 후보 삼각형만 남겼다.
GPU의 병렬 스트림 프로세서는 연관성이 없는 독립된 기하학 검증에 매우 적합하며, 0.2초의 커널 실행 시간은 탐색 효율을 수천 배 향상시켰다.
촘촘하게 좁혀가는 다단계 데이터 필터링
158,784개의 후보 목표 역시 수작업 검증의 한계를 훨씬 뛰어넘는 수치이므로, 다차원 데이터 필터링 파이프라인을 구축해 단계별로 걸러내야 했다. 알고리즘은 먼저 공간 중복 제거를 수행하여 중복 계산된 인접 삼각형을 병합하고, 생존 목표를 8,915개로 줄였다.
이어 개활 수역 검사를 실시하여 사각형 바운딩 박스로 내륙 호수와 조밀한 제도 영역을 제외하고 948개의 노드를 남겼다. 사진 속 산호초로 둘러싸인 특징과 일치시키기 위해 알고리즘은 Polsby-Popper 조밀도 지표를 도입해 해안선 둘레와 면적 비율을 계산하고, 후보 수를 213개까지 더 낮추었다. 조밀도 계산을 통해 모양이 매우 불규칙한 파쇄된 해안선을 성공적으로 제거하고 대형 환초 특징을 가진 섬을 남겼다.
이어진 타원 충전율 필터링으로 목표는 137개로 줄어들었다. 이 시점에 알고리즘은 원격 탐사 위성 데이터와 연동하여 NDVI 위성 식생 지수를 활용해 후보 지점의 녹지 검사(임계값 0.6)를 실시했다. 높은 식생 지수를 통해 노출된 모래사장과 식생이 없는 인공 구조물이 순식간에 걸러져 생존 후보는 66개로 줄었다.
자동화 파이프라인의 마지막 관문은 Copernicus DEM 30m 고도 데이터 조회였다. 알고리즘은 사진 속 P2 섬의 산봉우리 기복과 비교하여 후보 지점에 특정 높이의 산체가 존재할 것을 요구했고, 최종적으로 범위를 26개 후보점으로 압축했다. 30미터 해상도의 고도 매칭은 평평한 저고도 산호초를 대량으로 제거하며 자동화 파이프라인의 마지막 단계를 완료했다.
수작업 검증과 군사급 알고리즘의 만남
자동화 파이프라인이 8069만 개의 선택지를 26개로 압축한 후, 남은 검증은 사람이 직접 진행했다. yassa9은 필터링 우선순위에 따라 위성 이미지를 차례로 확인했고, 8번째 후보점을 대조하던 중 목표를 정확히 찾아냈다.
최종 확인된 위치는 미크로네시아 연방의 오안(Oan) 섬(좌표 7°21’48.4”N 151°45’20.7”E)이었다. 사진 속 리조트는 오안 리조트(Oan Island Resort)였으며, 드론 촬영 당시 카메라 시각은 북서쪽 324.97° 방향이었다.
Hacker News 커뮤니티 토론에서 많은 엔지니어들은 이 해법이 순항 미사일의 TERCOM(지형 순항 기하 대조) 항법 원리를 본질적으로 재현했다고 지적했다. 미국 NASA 제트추진연구소(JPL) 역시 마스 2020 퍼서비어런스(Perseverance) 탐사선의 화성 착륙 시 유사한 기하학적 특징 매칭 알고리즘을 사용해 착륙 타원 영역을 10분의 1 수준으로 줄인 바 있다.
이 개인 실험은 수십 킬로미터 떨어진 섬의 위치를 특정하든, 화성 표면에 정밀 착륙하든, 확정적인 기하학적 제약을 활용해 시각적 모호함을 제거하는 것이 매우 신뢰할 수 있는 기술적 접근법임을 입증했다.
연산력이 경험의 장벽을 허물다
882MB의 해안선 데이터부터 204밀리초의 GPU 연산에 이르기까지, 이름 없는 무인도를 찾는 이 실험은 현대 엔지니어링 문제 해결의 강력한 위력을 보여주었다.
사진 속 섬 3개의 윤곽은 본질적으로 지구 표면에 적힌 일련의 기하학적 경위도 코드다. 물리적 특징을 연산 가능한 데이터 구조로 변환하기만 하면, 광대한 미지의 공간은 연산 능력의 포효 속에서 순식간에 압축될 수 있다.
GPU 전수 탐색이 엄격한 기하학적 제약과 만날 때, 경험과 운에 의존하던 전통적인 인간의 눈 감각 인식 방식은 컴퓨터의 전수 조사 알고리즘에 의해 근본적으로 재구성되고 있다.
참고 링크:
- yassa9 블로그: Geolocating an Island Photo
- Hacker News 커뮤니티 토론: Geolocating an Island Photo
- gralhix OSINT 챌린지: Challenge #004