← ポータルに戻る

写真1枚から無名の島を特定する — 三角形の形とGPUで8000万通りを絞り込む

yassa9「Geolocating a random island using geometry and CUDA programming」 / 日本語要約: Ayumu(Hacker News より)
💡 リゾートらしき衛星写真1枚から、地名も座標も無い島を特定するOSINTチャレンジ。使ったのはAIではなく、写っている3つの陸地が作る三角形の「形」を指紋にして、世界中の陸地データベースから同じ形の三角形をGPUで総当たりする、という古典的な幾何学だった。

陸地3つの「形」を指紋にする

写真には主役のリゾート島(P0)と、その奥に2つの陸地(P1・P2)が写っていた。緯度経度は写真からは分からないが、3点が作る三角形の角度と辺の長さの比は、写真のどの方向から撮っても(回転・拡大縮小に対して)変わらない。著者はGUIツールでピクセル座標を取り、この形をP0基準の角度θ₀=arccos(d₁·d₂/|d₁||d₂|)(P0から見たP1方向とP2方向のなす角、2Dベクトルの内積で計算)などの指紋として記録した。目測ゆえの誤差を吸収するため、一致判定には±20%の許容幅を持たせている。

段階的に候補を削っていく

  1. 緯度フィルタ: 写真の植生からリゾート島は熱帯と推定、緯度±30度以内の陸地ポリゴン141,131件に絞る。
  2. 密度・クラスタリング: 半径5km以内に陸地中心が10個以上ある過密地帯(大陸沿岸など)を除外し、20km以内に3点以上まとまっている候補だけを残す。この時点で組み合わせ数は80,690,777通りまで膨らむ。
  3. GPU(CUDA)での並列判定: 8000万通りの三角形候補を1スレッド1組み合わせでGPUに割り当て、各スレッドが3点を陸地面積でソートしてP0を仮決めし、上記の角度指紋と照合する。158,784件が条件を満たし、重複除去で8,915個のユニークな三角形に減った。
  4. 開放水面チェック: P0-P1を結ぶ辺沿いの矩形に余計な陸地が写っていないか(写真通り海が開けているか)を検査→948候補。
  5. 珊瑚礁らしい形か: Polsby-Popperのコンパクト性スコア(面積と周長から輪の丸さを測る指標)が0.5を超えるかで珊瑚礁っぽい輪郭だけ残す→213候補。
  6. 楕円形・NDVI・標高の絞り込み: アスペクト比1.05〜2.2かつ充填率0.589以上、Sentinel-2衛星データの正規化植生指数(NDVI)が0.6以上、標高がP0で50m以下・視線方向50度圏内で100〜500mという地形条件を重ねて26候補まで削る。

最終的にたどり着いた場所

残った候補を目視で照合し、ミクロネシア連邦のOanリゾート(北緯7.363444度・東経151.755750度)と特定。カメラの向きも三角形の向きから北西(θ=324.97度)と逆算できた。

アユムのメモ: AIに画像を見せて「どこ?」と聞く方法が主流になりつつある中で、この記事は真逆をやっている。写真から取り出せる情報を「3点が作る三角形の形」という1個の幾何学的指紋にまで絞り込み、それを世界中の陸地データと照合する。指紋を絞る段階(角度・面積比)と、候補を削る段階(緯度・密度・開放水面・珊瑚礁の丸さ・植生・標高)がきれいに分業していて、GPUは「同じ形の三角形を大量に見つける」という一番単純な力仕事だけを担っている。8000万通りという数字の大きさより、絞り込みの各段階でどの物理量を条件にしたかの設計の方が面白い。