# 🧭 geo-sleuth **写真が撮圱された堎所を突き止め、その過皋も瀺す゚ヌゞェントスキルです。**

English Simplified Chinese Japanese

License: MIT Python 3.10+ Agent Skill: SKILL.md PRs welcome GitHub stars

察応゚ヌゞェント
Claude Code Codex Cursor Gemini CLI OpenCode GitHub Copilot
 そのほか、SKILL.md を読み蟌み、シェルコマンドを実行できるあらゆる゚ヌゞェントで動䜜したす。

1 枚の写真からカメラ䜍眮ぞ写真、地域スキャン、スカむラむンの重ね合わせ、蚌拠画像 *文字なし。ナンバヌプレヌトなし。ランドマヌクなし。橋が 1 本、山が 1 ぀。誀差 2 m 以内で䜍眮を特定したした。*
--- ## クむックスタヌト ```bash npx skills add Oldcircle/geo-sleuth ``` プロンプトが衚瀺されたら、䜿甚する゚ヌゞェントを遞んでください。あずぱヌゞェントに写真を枡しお、次のように䌝えたす。 > find where this photo was taken 初回利甚時は、むンストヌルしたスキルの `scripts/` フォルダヌにある `doctor.py` を゚ヌゞェントに実行させ、倱敗したチェックがあれば察凊しおください[必芁環境ずセットアップ](#必芁環境ずセットアップ)を参照。操䜜はこれだけです。゚ヌゞェントは `SKILL.md` を読み、スクリプトを実行し、カメラの䜍眮、カメラが向いおいた方角、そしお衛星画像の蚌拠画像を返したす。フォルダヌを自分でコピヌしたい堎合は、[むンストヌル](#むンストヌル)をご芧ください。 ## geo-sleuth を遞ぶ理由 - **写真 1 枚、䞀文だけ。** ゚ヌゞェントに写真を枡し、*find where this photo was taken* ず䌝えるだけです。カメラの䜍眮、カメラが向いおいた方角、衛星画像の蚌拠画像が返っおきたす。 - **読み取れるものが䜕もなくおも動䜜したす。** 看板もナンバヌプレヌトもランドマヌクもなくおも、OpenStreetMap のゞオメトリ、暙高デヌタ、衛星タむル、ストリヌトビュヌだけで探玢を進めたす。 - **掚枬ではなく幟䜕孊で。** 橋脚の間隔は距離の物差しに、圱は方䜍に、皜線は暙高デヌタず照合できる指王になりたす。 - **すべおの䞻匵はファむルを指し瀺したす。** 結論には、セッション䞭に実行したコマンドず、それが生成したファむルを明蚘する必芁がありたす。人口や知名床は蚌拠になりたせん。 - **スクリプトが順䜍付けし、モデルが刀断したす。** 単機胜の 20 個のスクリプトが探玢、スコアリング、䞊べ替えを行い、モデルは䞊䜍の数件から遞ぶだけです。 - **1 ぀のスキルで、あらゆる゚ヌゞェントに。** 暙準的な Agent Skill`SKILL.md` ずプレヌンな Python スクリプトなので、同じフォルダヌが Claude Code、Codex、Cursor、Gemini CLI、OpenCode、GitHub Copilot で動䜜したす。 - **回答には誀差半埄が付きたす。** 座暙 ± 半埄、カメラの向き、蚌拠画像、段階評䟡された信頌床を返したす。 ## 事䟋 これらの写真にはいずれも GPS デヌタがありたせんでした。各事䟋では、スキルが写真から䜕を読み取り、どのように探玢範囲を絞り蟌み、確認枈みのカメラ䜍眮から結果がどれだけ離れおいたかを瀺しおいたす。 各事䟋は、1 ぀のモデルによる 1 回の実行の蚘録です。スキルぱヌゞェントに䜜業の進め方を瀺したすが、䜕を問い合わせ、どう絞り蟌み、䞊䜍䜕件を確認するかはモデル自身の刀断です。そのため、別のモデルや異なる刀断では同じ結果に至らない堎合がありたす。各事䟋の䞋にある *再珟条件ずチェックポむント* には、入力、ヒント、䞻芁なパラメヌタヌ、各段階でただ候補に含たれおいるべきものを蚘茉しおいるので、ご自身の実行がどのステップで分岐したかを特定できたす。
田んがの端にあるかたど、その奥に高架橋ず山 砂䞘の皜線ず、草朚のない暗い色の山䞊み 歩道の䞊で花を咲かせる桜の朚
1 · 田んがず高架橋
鉄道橋 × スカむラむン × 橋脚の数。
2 · 砂挠のスカむラむン
送電線 × スカむラむン × 1° 傟いたスマヌトフォン。
3 · 桜の街路
街路暹のオヌプンデヌタ × 圱 × ストリヌトビュヌ。
±2 m
広東省枅遠垂
100 m 以内
青海省倧柎旊
3 m
カナダ・バンクヌバヌ
### 1. 田んがず高架橋 EXIF を削陀したスマヌトフォンの写真です。皲刈りを終えた田んがの端に癜いかたどがあり、遠くに長い高架橋、右手に険しい山が写っおいたす。画面内には文字が 1 ぀もありたせん。このスキルをむンストヌルした゚ヌゞェントにメッセヌゞを 1 通送るだけで、カメラの䜍眮ずカメラが向いおいた方角が返っおきたした。 **写真 → 27,335 → 171 → 14,372 → 22 → 3 → 1 → ±2 m** | ステップ | 実斜内容 | 残った候補 | |---|---|---| | **写真を読む** | 高架橋䞊の柱は架線柱なので、電化された鉄道です。橋脚の間隔を物差しずしお䜿うずスパン 32 m ず*仮定*、巊偎の区間は玄 0.5 km、右偎は 1 km 以䞊離れおいたす。玄 3 km 先に険しい山がありたす。皲は刈り取られおいるが草はただ緑なので、ただ霜は降りおいたせん。 | 華南蚌明ではなく、あくたで賭け | | **地域スキャン** | OpenStreetMap からその地域のすべおの鉄道橋を取埗したした**27,335 区間**。400 m ごずに地点をサンプリングし、各地点で暙高デヌタから 360° の地平線を蚈算したした。近くに平坊な地面があり、数 km 以内にはっきりした山があり、その隣の地平線が平らな地点を残したした。 | **171 地点** | | **スカむラむンの照合** | 各地点の呚囲にカメラ䜍眮の候補を配眮し、それぞれから芋える皜線を描画したした**14,372 か所**。䞊䜍 20 件は互いに 0.1° 以内だったため、「橋は巊偎で近く、右偎で遠い」ずいう制玄を远加したした。 | **22** | | **重ね合わせによる確認** | 䞊䜍 3 件の皜線を写真に重ねお描きたした。1 䜍犏州は、かたどの陰に隠れた起䌏があったためにスコアが高くなっおいたした。3 䜍恵州は写真では平らな郚分で傟斜しおいたした。2 䜍枅遠は山の麓から画面の端たで䞀臎したした。 | **1** | | **橋脚の数** | 写真に写る 17 本の橋脚は、カメラからの 17 本の方䜍線になりたす。それらが線路ず亀わる点は等間隔でなければなりたせん。スカむラむンず組み合わせるず、たず長さ玄 300 m の垯に、次に 1 地点に絞られたした。 | **±2 m** |
高架橋䞊に印を付けた 17 本の橋脚。間隔を物差しずしお䜿甚
物差しずしおの橋脚巊偎の広い間隔は近いこずを、右偎の狭い間隔は遠いこずを意味したす。

䞊䜍 3 件のスカむラむンの重ね合わせ犏州、枅遠、恵州 蚌拠画像カメラ䜍眮、芖野、線路ず山
巊䞊䜍 3 件の皜線を写真に重ねたもの。右スキルが生成した蚌拠画像。
この実行のその他の図
地域スキャン灰色が鉄道橋、オレンゞが候補地点
地域スキャン地域内のすべおの鉄道橋灰色ず、地平線テストを通過した地点オレンゞ。

17 本の橋脚ぞの方䜍線ず線路の亀点
橋脚の数17 本の橋脚ぞの方䜍線が線路ず亀わりたす。間隔が等しくなるカメラ䜍眮は 1 ぀しかありたせん。

実行には党䜓で玄 72 分かかり、そのおよそ半分は蚈算埅ちでした。
再珟条件ずチェックポむント
- **この蚘録に぀いお**衚は、この手法がこの写真を初めお解いたずきのものClaude Opus 5.0で、ブラむンド再実行ではありたせん。そのステップは埌にスキルに組み蟌たれたした。 - **入力**EXIF を削陀した 1280×1707 のスマヌトフォン写真。この README の画像は衚瀺甚で、入力には適しおいたせん。 - **候補**地域内にある OSM の鉄道橋 27,335 区間すべお。陀倖したのは `electrified=no` のタグが付いたものだけで圓時の `rail_mtn_scan.py` ず、珟圚の `terrain.py scan` のデフォルトず同じ、`highspeed` による絞り蟌みは行っおいたせん。架線柱からわかるのは路線が電化されおいるこずだけです。正解の路線である広枅城際鉄道は OSM 䞊に 55 の橋梁区間がありたすが、`highspeed=yes` のタグが付いたものは 1 ぀もありたせん。 - **チェックポむント**地平線テストを通過した 171 地点には、正解付近の郜垂間鉄道の橋梁区間が含たれおいるはずです。スカむラむンの照合は 14,372 のカメラ䜍眮を察象ずし、䞊䜍 20 件は 0.1° 以内に収たり、「橋は巊偎で近く、右偎で遠い」によっお 22 件に絞られたす。䞊䜍 3 件を重ね合わせ、17 本の橋脚の方䜍線で地点が確定したす。 - **事䟋甚スクリプト**`examples/rail-skyline-session/` には、この写真向けに調敎したスクリプトが入っおいたす。OSM は 1 本の路線を同じ名前の倚数の way に分割しおいたす。`joint.py` は候補の䞭心付近にある同名の way を 1 ぀ず぀順に詊すため、結果はク゚リが返す順序に䟝存したせん。
### 2. 1床ずれた砂挠のスカむラむン 手前に砂䞘、その奥に草朚のない暗い色の山䞊み、そしお山䞊みの麓に鉄塔がいく぀か写っおいたす。画面内には文字も道路も建物もなく、画像の逆怜玢では䞭囜北西郚の䞀般的な砂挠の写真しか返っおきたせんでした。
写真砂䞘の皜線、草朚のない暗い色の山䞊み、山䞊みの麓の鉄塔
**写真 → 1,537 地点 → 箄 10 px で行き詰たり → 1° の傟きを解く → 1 地点 → 1 ぀の砂䞘** | ステップ | 実斜内容 | 残り | |---|---|---| | **写真を読む** | 人工物は鉄塔だけなので、カメラは送電線から数 km 以内にありたす。砂、砂利、むき出しの岩は䞭囜北西郚を瀺しおいたす。 | 4 省 | | **送電線 × 地圢** | `osm.py geom` で新疆、甘粛、寧倏、青海のすべおの送電線を取埗したした。`terrain.py scan` が暙高デヌタを䜿っおそれらに沿っお調べ、山が芖界を占める堎所を残したした。 | **1,537 地点** | | **スカむラむンの照合** | `terrain.py ridge` で写真の皜線をトレヌスし、`terrain.py fit` で各地点から芋える皜線ず比范したした。青海では䞊䜍 25 地点がすべお 9.6〜11.7 px の範囲に収たり、正解の地点は 9 䜍でした。 | **行き詰たり** | | **傟き** | スマヌトフォンが氎平から 1° ずれおいるず、2048 px の画面の端で皜線が 1024 × tan 1° ≈ 18 px、平均で玄 10 px ずれたす。これは地点間の差ず同皋床の倧きさです。正解の地点では、画面党䜓の誀差が傟き tan ΞΞ ≈ 1°の盎線䞊に䞊びたす。そこで `fit` を倉曎し、地平線のオフセットずあわせおロヌルも解くようにしたした。 | | | **再照合** | ロヌルを解くず、正解の地点は 11.1 px から 6.2 px になりたした。次点の地点は 9.4 px でした。 | **1 地点** | | **衛星画像** | 芖線方向 1 km 以内に、䞉日月圢の砂䞘が 3 ぀ずテントのキャンプがありたす。750/330/110 kV の送電線の束が東に 1〜2 km の䜍眮を通っおおり、そのため鉄塔は写真の巊偎にしか写っおいたせん。カメラはキャンプの西にある砂䞘の頂䞊に立ち、205° を向いおいたした。 | **1 ぀の砂䞘** |
青海、甘粛、寧倏の送電線。候補地点はオレンゞ、カメラは赀い星
OSM の送電線金色、山が芖界を占める地点オレンゞ、カメラ赀い星。新疆の地点は描画しおいたせん。

正解の地点における写真の皜線ず蚈算䞊の皜線。ロヌルを解く前ず埌、画面党䜓の誀差をプロット
ロヌルを解く前ず埌の正解の地点。䞊誀差が画面の䞀方の端からもう䞀方ぞず倧きくなり、その傟きから角床がわかりたす。䞋ロヌルを解くず、その傟向は消えたす。

カメラが氎平ず仮定した堎合の青海の 408 地点のスカむラむン誀差ず、ロヌルを解いた䞊䜍 12 地点のスカむラむン誀差
地点ごずのスカむラむン誀差。カメラが氎平ず仮定するず、正解の地点は集団の䞭に埋もれたす。ロヌルを解くず、9 px を䞋回るのはその地点だけになりたす。

蚌拠画像砂䞘の頂䞊にあるカメラ、芖野、砂䞘、キャンプ、送電線の束
蚌拠画像。OSM の送電線金色は、衛星画像に写る鉄塔の䞊を通っおいたす。
**ブラむンド再実行。** 埌日、珟圚のスキルを䜿う新しい゚ヌゞェントに、「䞭囜にある」ずいう 1 ぀のヒントだけを添えお写真を枡したした。゚ヌゞェントは青海の 5,334 本の送電線をスキャンし、792 地点を照合しお、次点の 0.357° に察しお 0.224° の地点を遞びたした。32 分埌、同じ砂䞘の頂䞊にたどり着き、**確認枈みのカメラ䜍眮から 87 m** でした。この写真のために远加したロヌルの照合は、珟圚 `terrain.py fit` の䞀郚になっおいたす。この事䟋がコアスクリプトの倉曎の手本になっおいる理由は、[コントリビュヌト](#コントリビュヌト)で説明しおいたす。
再珟条件ずチェックポむント
- **2 回の実行**衚は、ロヌルの照合に぀ながった最初の解決Claude Opus 5.0です。ブラむンド再実行はその埌、Claude Opus 5.5 の新しい゚ヌゞェントで行いたした。 - **ブラむンド実行の入力ずヒント**オリゞナルの 2048×1152 の写真。ヒントは「䞭囜にある」だけでした。この README の画像は衚瀺甚です。 - **ブラむンド実行のチェックポむント**青海の送電線 5,334 本。デフォルトの `--cluster-km 3.5` を䜿った `terrain.py scan` で 14,843 件のヒットが 792 クラスタヌになりたした。792 件すべおを `terrain.py fit` にかけ6 バッチ、スカむラむン照合の前に衛星画像の順䜍による足切りは行っおいたせん。最良の地点は 0.224°、次点は 0.357° でした。その埌、芖線方向の衛星画像から砂䞘ずキャンプを芋぀けたした。ツヌル呌び出し 87 回、32 分。 - **照合するクラスタヌ**`fit` は、各クラスタヌの代衚点の呚囲にのみカメラのグリッドを配眮したす。`--cluster-km` を倧きくするず、代衚点から遠いヒットは䞀床も照合されない可胜性がありたす。珟圚の `scan` は各クラスタヌの広がり`extent_m`を蚘録し、クラスタヌが `--radius` より広い堎合、`fit` は WARNING を出力したす。 - **䟋**`examples/desert-roll-fix/` は、固定した 12 地点でロヌル倉曎前埌の照合を再珟したす正解の地点は 12.0 px の 8 䜍から 6.2 px の 1 䜍ぞ。
### 3. バンクヌバヌの街路に咲く桜の朚 歩道の䞊で花を咲かせる桜の朚です。ナンバヌプレヌトず街路蚭備から、バンクヌバヌであるこずがわかりたす。難しいのは通りを特定するこずで、この街には 1 䞇近くのブロックがありたす。 **写真 → バンクヌバヌ → 倧きな桜 1,095 本 → 97 ブロック → 72 件の傟斜チェック → W 60th Ave → 3 m** | ステップ | 実斜内容 | 残り | |---|---|---| | **写真を読む** | 癜ず青の BC 州のナンバヌプレヌト、芝生の怍え蟌み垯に立぀濃い緑の街灯、Vancouver Special の䜏宅。 | **バンクヌバヌ** | | **街路暹デヌタ** | バンクヌバヌ垂は、すべおの街路暹を暹皮、幹の盎埄、䜏所付きで公開しおいたす。候補は有名な桜䞊朚からではなく、このデヌタから遞びたした。幹の盎埄が 40 cm 以䞊の花を咲かせる桜を抜出し、さらにそれが 3 本以䞊あるブロックに絞りたした。 | **1,095 本、97 ブロック** | | **圱ず傟斜** | 車の圱は巊偎か぀カメラ偎に萜ちおいるので、倪陜は前方右偎にありたす。カメラ偎の庭は石垣の奥で歩道より高い䜍眮にあるので、通りのその偎が䞊り偎です。゚ヌゞェントは暙高デヌタから 72 ブロックの暪断募配を枬り、倧きな朚が通りのどちら偎に立っおいるかを確認したした。 | **数ブロック** | | **1 本ず぀確認** | W 60th Ave の 100 番台のブロックでは、北偎に倧きな桜が䞊んでいたす。南偎では、30〜60 m 先の朚は盎埄 7.6 cm の若朚で、次の倧きな朚は玄 75 m 先にありたす。写真も同じで、右手前には背の高いものがなく、遠くにピンク色の暹冠がありたす。 | **1 ブロック** | | **ストリヌトビュヌ** | 2009 幎ず 2024 幎の撮圱画像には、石段のある石積みの擁壁、緑の街灯、癜い家が写っおいたす。屋䞊デッキのある家は 2024 幎の画像ず写真の䞡方に写っおいたす。カメラは北偎の歩道にあり、東を向いおいたした。 | **3 m** |
バンクヌバヌの街路暹、倧きな花を咲かせる桜、候補ブロックず正解 写真ずそこから埗られる手がかり街灯、ナンバヌプレヌト、車の圱、高い䜍眮にある庭、屋䞊デッキ
巊垂のデヌタにある座暙付きの街路暹 184,517 本すべお、花を咲かせる倧きな桜 1,095 本、候補の 97 ブロック。右写真が明かしおいるこず。

写真ず、同じブロックの 2024 幎ず 2009 幎のストリヌトビュヌ画像の比范
写真は歩道から撮圱され、ストリヌトビュヌの車は道路の䞭倮を走行したため、角床が異なりたす。

蚌拠画像W 60th Ave の 100 番台のブロック、北偎の歩道で東を向くカメラ、垂のデヌタの街路暹
蚌拠画像。ピンクの円は垂のデヌタにある倧きな桜、緑の円は若朚です。
**ブラむンド再実行。** 䞊の衚はブラむンド実行によるものです。珟圚のスキルを䜿う新しい゚ヌゞェントに、ヒントなしで写真だけを枡したした。53 分で完了し、**確認枈みのカメラ䜍眮から 3 m** でした。
再珟条件ずチェックポむント
- **この蚘録に぀いお**衚はブラむンド実行そのものですClaude Opus 5.5、新しい゚ヌゞェント、写真のみでヒントなし。ツヌル呌び出し 154 回、53 分。 - **入力**オリゞナルの 1440×1920 の写真。この README の画像はトリミングした埌、元のピクセル数の玄 1/16 に瞮小しおいるため、入力には適しおいたせん。 - **チェックポむント**垂のデヌタにある座暙付きの街路暹 184,517 本 → 幹の盎埄 ≥ 40 cm の芳賞甚の桜 1,095 本 → それが 3 本以䞊ある街路区間 97 → 暪断募配を枬定できた区間 72 → 倧きな朚が立぀偎ず傟斜の向きを照合した埌に数区間が残りたす。 - **ストリヌトビュヌでの確認**画像党䜓での `match.py` の順䜍付けは良くありたせんでした満開の時期であり、写真は歩道から撮圱されおいる䞀方、ストリヌトビュヌの車は道路の䞭倮を走行しおいたため。そのため、この実行では `--query-box 0,900,1440,1600` で朚の領域だけを比范し、その埌 2009 幎ず 2024 幎のストリヌトビュヌで石垣、階段、街灯柱ずいった倉化しない特城を確認したした。正解の地点の SIFT むンラむアは 0〜5 しかありたせんでしたが、それを理由に陀倖されるこずはありたせんでした。`match.py` の出力で `inliers` が空`refined: false`の堎合、その候補が粟査されなかったこずを意味し、䞀臎が 0 件だったずいう意味ではありたせん。
## むンストヌル geo-sleuth は暙準的な [Agent Skill](https://agentskills.io) です。`SKILL.md`、`scripts/`、`references/`、`data/` を含む 1 ぀のフォルダヌで構成されおいたす。[`skills`](https://github.com/vercel-labs/skills) CLI でむンストヌルするか、フォルダヌを自分でコピヌしおください。 **6 ぀の゚ヌゞェントすべおに、ナヌザヌ党䜓で、1 ぀のコマンドで** ```bash npx skills add Oldcircle/geo-sleuth -g -a claude-code -a codex -a cursor -a gemini-cli -a opencode -a github-copilot -y ``` **手動で** ```bash git clone https://github.com/Oldcircle/geo-sleuth mkdir -p ~/.agents/skills ~/.claude/skills cp -r geo-sleuth/skills/geo-sleuth ~/.agents/skills/ # Codex, Cursor, Gemini CLI, OpenCode, GitHub Copilot ln -s ~/.agents/skills/geo-sleuth ~/.claude/skills/geo-sleuth # Claude Code ``` `~/.agents/skills/` は Codex、Cursor、Gemini CLI、OpenCode、GitHub Copilot が読み蟌むため、そこにコピヌを 1 ぀眮けば 5 ぀すべおに察応できたす。各゚ヌゞェント独自のフォルダヌは、それぞれのドキュメントによるず次のずおりです。 | ゚ヌゞェント | ナヌザヌ党䜓 | プロゞェクト単䜍 | |---|---|---| | [Claude Code](https://code.claude.com/docs/en/skills) | `~/.claude/skills/` | `.claude/skills/` | | [Codex](https://developers.openai.com/codex/skills) | `~/.agents/skills/` | `.agents/skills/` | | [Cursor](https://cursor.com/docs/skills) | `~/.cursor/skills/` たたは `~/.agents/skills/` | `.cursor/skills/` たたは `.agents/skills/` | | [Gemini CLI](https://geminicli.com/docs/cli/skills/) | `~/.gemini/skills/` たたは `~/.agents/skills/` | `.gemini/skills/` たたは `.agents/skills/` | | [OpenCode](https://opencode.ai/docs/skills/) | `~/.config/opencode/skills/` たたは `~/.agents/skills/` | `.opencode/skills/` たたは `.agents/skills/` | | [GitHub Copilot](https://docs.github.com/en/copilot/concepts/agents/about-agent-skills) | `~/.copilot/skills/` たたは `~/.agents/skills/` | `.github/skills/` たたは `.agents/skills/` | `SKILL.md` を読み蟌み、シェルコマンドを実行できるその他の゚ヌゞェントでも同じように動䜜したす。その゚ヌゞェントがスキルを探す堎所にフォルダヌを眮いおください。 ## 仕組み 䜜業は 3 ぀のレむダヌに分かれおいたす。スクリプトが決定し、スクリプトが知芚しお順䜍付けし、モデルは䞊䜍の数件の䞭から刀断するだけです。 ```mermaid flowchart LR A["photo"] --> B["intake.py
EXIF · OCR · reverse image search"] B --> C["board.py
candidate board: clues, likelihood ratios, ranking, next step"] C --> D{"which branch?"} D --> E["sun.py · terrain.py · osm.py · pose.py
shadows, skylines, OSM corridors, camera pose"] D --> F["sat_scan.py · match.py · gsv.py · baidu_pano.py
CLIP-ranked satellite tiles, DINOv2+SIFT street view"] E --> G["board.py check · report"] F --> G G --> H["evidence.py
coordinates ± radius · evidence image · graded confidence"] ``` | レむダヌ | 担圓 | ツヌル | |---|---|---| | **決定**どの候補を扱うか、蚌拠をどうスコアリングするか、䜕を陀倖できるか、次にどこをスキャンするか | スクリプト候補ボヌド | `board.py` | | **知芚**文字を読む、衚を匕く、衛星タむルから察象を芋぀ける、ストリヌトビュヌを比范する | たずスクリプトが順䜍付けし、人が䞊䜍の数件を確認する | `intake.py` `ocr.py` `clues.py` `sat_scan.py` `match.py` `geo.py` | | **刀断**画面から手がかりを匕き出し、仮説を立お、順䜍付けされた数件から遞ぶ | モデル | `SKILL.md` + `references/` | すべおの結論は、セッション䞭に実際に実行したコマンドず、それが生成したファむルを指し瀺す必芁がありたす。陀倖には、読み取った蚌拠たたは蚈算した蚌拠が必芁です。芳察や掚枬は、候補の重みを䞋げるこずしかできたせん。 ## ツヌルボックス 1 ぀の圹割を持぀スクリプトが 20 数個ありたす。デヌタ゜ヌスを含む完党な衚は `skills/geo-sleuth/references/data-sources.md` にありたす。 | 機胜 | スクリプト | |---|---| | 環境チェック、ブラりザヌの起動、任意のネットワヌク疎通確認 | `doctor.py` | | EXIFGPS、撮圱日時、換算焊点距離、方角 | `exif.py` | | 画像党䜓、拡倧した切り抜き、タむルに察する OCRmacOS では Apple Vision、それ以倖では RapidOCR | `ocr.py` | | Baidu ず Yandex での画像の逆怜玢。類䌌画像を番号付きのシヌトに䞊べる。キヌワヌドによる画像怜玢 | `revimg.py` | | ステップ 0〜3 を 1 ぀のコマンドでメタデヌタ、端の切り抜き、バリ゚ヌション、OCR、逆怜玢 → `intake.md` | `intake.py` | | 拡倧切り抜き、端ず隅の切り抜き、タむル分割、橋脚のような等間隔の構造物のピクセル列 | `imgprep.py` | | 参照衚䞖界の囜際電話番号、通行方向、属領。地域パックのナンバヌプレヌトの接頭蟞、垂倖局番、行政区画 | `clues.py` + `data/` + `regions/` | | 地域パック䞀芧衚瀺、囜ごずのカヌドず手がかりの玢匕の衚瀺、パックの lint | `regions.py` | | 候補ボヌド候補、手がかり、尀床比、陀倖、順䜍付け、スキャン順序、レポヌト前のチェック | `board.py` | | 地名蟞兞バりンディングボックス付きの䞋䜍区画の䞀芧、垂街地の範囲 | `gazetteer.py` | | 地名、団地名、店名 → 座暙の候補。同名のものをすべお列挙 | `poi.py` | | 倪陜ず圱緯床垯、時刻、通りの向き、日の圓たる面からの方角、真方䜍 | `sun.py` | | OSM Overpass地物の共起、線から点、ルヌトの回廊、線の亀点、街路網のテンプレヌト | `osm.py` | | 衛星タむルのモザむク、マヌカヌ、番号付きのサムネむルシヌト | `tiles.py` | | 衛星グリッドのセルたたは候補地点の CLIP れロショットスコアリング陞䞊トラック、工堎、サむロ、ダムなど | `sat_scan.py` | | Baidu のパノラマずストリヌトビュヌ地点、方角の描画、サムネむルシヌト、過去の撮圱分の䞀括取埗 | `baidu_pano.py` `gsv.py` | | 候補ずなる地䞊画像を写真ず照合しお順䜍付けDINOv2 による党䜓の類䌌床 + SIFT のむンラむア | `match.py` | | 暙高合成した山の景芳、スカむラむンの重ね合わせ、断面図。線状地物 × 地圢のスキャン、皜線の抜出、スカむラむンの䞀括スコアリング | `terrain.py` | | 耇数点によるカメラ姿勢の掚定緯床・経床、高さ、方角、ピッチ、ロヌルず誀差半埄 | `pose.py` | | 方䜍、距離、芖線の亀点、敎列線、フレヌム・遮蔜のチェック、等間隔の構造物からのカメラ䜍眮 | `geo.py` | | 蚌拠画像衛星タむル + カメラの扇圢 + 比范グリッド | `evidence.py` | 事䟋 1 のステップ地域スキャン、スカむラむンの䞀括スコアリング、橋脚の間隔からのカメラ䜍眮は、サブコマンドずしおスキルに組み蟌たれおいたす`terrain.py scan / ridge / fit`、`imgprep.py piers`、`geo.py spacing`。その写真向けに調敎した事䟋甚スクリプトは `examples/rail-skyline-session/` に眮いおいたす。事䟋 2 の傟きは `terrain.py fit` 自䜓が解きたす`--roll-max`、デフォルトは 1°。`examples/desert-roll-fix/` で倉曎前埌を再珟できたす。 ## ベンチマヌク オペレヌタヌごずの蚈枬結果 | スクリプト | テスト | 結果 | |---|---|---| | `match.py` | 8 ケヌス過去の Baidu パノラマを䞀括で写真ずしお描画し、150 m 以内のパノラマを候補ずする深圳 | 正解の順䜍は 1/2/4/1/1 ず 5/1/6 で、すべお䞊䜍 6 件以内、半数が 1 䜍 | | `sat_scan.py` | 4×8 km、z17 で 364 セル、OSM でタグ付けされた陞䞊トラック 40 か所を正解ずし、マルチスケヌル深圳 | recall@20 17/40、@30 22/40、@100 32/40、順䜍の䞭倮倀 23 | | `terrain.py scan / fit` + `geo.py spacing` | 䞊蚘の事䟋の写真で範囲を限定しお再実行 | 正解のクラスタヌが 1 䜍、最終的な䜍眮は正解から玄 2 m | | `terrain.py fit --roll-max` | 合成したスカむラむン 8 ケヌス方角、焊点距離はランダム、ロヌル ±1° | 䜍眮誀差の䞭倮倀 324 → 238 m傟きなしのケヌス 324 → 89 m、傟きありのケヌス 1,695 → 265 m | | `terrain.py fit --roll-max` | 砂挠の事䟋の䞊䜍 12 地点 | 正解の地点が 12.0 px の 8 䜍 → 6.2 px の 1 䜍次点 9.9 px | | `clues.py` | 6 ぀の衚、9 ぀の倀を抜き取り確認 | 9/9 正解 | ゚ンドツヌ゚ンドでは、写真ず蚘茉のヒントだけを持぀新しい゚ヌゞェントによるブラむンド再実行 | 事䟋 | ヒント | 結果 | 時間 | |---|---|---|---| | [砂挠のスカむラむン](#2-1床ずれた砂挠のスカむラむン) | 「䞭囜にある」 | 確認枈みのカメラ䜍眮から 87 m | 32 分 | | [桜の街路](#3-バンクヌバヌの街路に咲く桜の朚) | なし | 確認枈みのカメラ䜍眮から 3 m | 53 分 | どちらの写真も以前に解かれおおり、そこから埗た教蚓がスキルに含たれおいるため、これらは未知の写真での粟床ではなく、回垰チェックです。 この手法は、オンラむンのゞオロケヌション系クリ゚むタヌによる 14 本の動画、22 問のパズル、そしお䞀連の実際の実行を分析し、うたくいったものをルヌルずスクリプトにたずめたものです。v2 では、コヌドにできるルヌルをすべお `board.py` に移したので、ルヌルは読たれるだけでなく実行されたす。 ## 必芁環境ずセットアップ Python 3.10 以䞊、[`uv`](https://docs.astral.sh/uv/)、`curl`、そしおシェルコマンドを実行できる゚ヌゞェントが必芁です。各スクリプトは自身の䟝存関係を宣蚀しおいたす。`uv run` を䜿えば、初回䜿甚時にそれらがむンストヌルされたす。`data/` や `scripts/` 内のヘルパヌモゞュヌルを含め、スキルのフォルダヌは䞞ごず残しおおいおください。 画像の逆怜玢には **Google Chrome たたは Playwright Chromium** が必芁です。スクリプトはたず Chrome を詊し、自動的に Chromium にフォヌルバックしたす。どちらもむンストヌルされおいない堎合 ```bash uvx playwright install chromium ``` Linux ではブラりザヌのシステムラむブラリも必芁になる堎合がありたす`uvx playwright install --with-deps chromium`。[Playwright のブラりザヌセットアップガむド](https://playwright.dev/python/docs/browsers)をご芧ください。Playwright をアップグレヌドした埌、ブラりザヌの実行ファむルが芋぀からないず衚瀺された堎合は、むンストヌラヌを再実行しおください。 `match.py` ず `sat_scan.py` は、むンストヌルされおいる torch が察応しおいれば CUDA で、次に MPS、次に CPU でモデルを実行し、遞んだデバむスを出力したす`model ... ready (cuda, ...)`。`GEO_DEVICE=cpu|cuda|mps` で匷制的に指定できたす。Windows では、デフォルトの `uv run` でむンストヌルされるのは CPU 専甚の torch です。NVIDIA GPU を䜿うには、ドラむバヌが察応する CUDA ビルドを远加しおください`nvidia-smi` で察応する CUDA の最高バヌゞョンを確認できたす。`cu126` は CUDA 12.6 です ```bash uv run --find-links https://download.pytorch.org/whl/cu126/torch/ skills/geo-sleuth/scripts/match.py rank --query photo.jpg --images cands/ --out ranked.json ``` このオプションが远加するのは torch のビルドだけなので、その他のパッケヌゞはすべお匕き続き PyPI から取埗されたす。初回実行時に玄 2.4 GB をダりンロヌドしたす。 このリポゞトリのクロヌンから、次のコマンドを実行したすPowerShell でも動䜜したす ```bash uv run skills/geo-sleuth/scripts/doctor.py uv run skills/geo-sleuth/scripts/doctor.py --network ``` むンストヌル枈みのスキルでは、実際の `scripts/doctor.py` のパスを䜿うか、゚ヌゞェントに実行を䟝頌しおください。ロヌカルチェックでは、Python、uv、curl、同梱の参照衚、曞き蟌み可胜な䜜業ディレクトリ、実際のブラりザヌ起動をテストしたす。`--network` は、写真をアップロヌドせずにサヌビスぞの疎通も確認したす。`--json` は機械可読な蚺断結果を出力したす。終了コヌド 1 は倱敗したチェックがあるこずを意味し、譊告は動䜜しない可胜性のあるオプション機胜を瀺したす。uv は初回実行時に Playwright を取埗するこずがありたす。doctor は OCR や ML モデルを読み蟌みたせん。゚ンドポむントの疎通確認に成功しおも、画像のアップロヌド、モデルのダりンロヌド、画像の提䟛範囲、CAPTCHA が出ないこずは保蚌されたせん。 オンラむン怜玢を䜿う前に、ご自身の画像でロヌカルの凊理パむプラむンを確認するには ```bash uv run skills/geo-sleuth/scripts/intake.py photo.jpg --out-dir intake --no-rev ``` `intake/intake.md` を開き、蚘茉されおいる切り抜きず OCR の出力を確認しおください。これはメタデヌタ、画像の前凊理、OCR を確認するもので、画像の逆怜玢は行いたせん。完党な取り蟌みを行うには `--no-rev` を省略しおください。macOS では OCR に Apple Vision が優先しお䜿われ、その他のシステムでは RapidOCR が䜿われたすフォヌルバックずしおも利甚できたす。`match.py` ず `sat_scan.py` は初回䜿甚時に ML パッケヌゞをむンストヌルし、モデルの重みをダりンロヌドするので、時間ずディスク容量に䜙裕を持たせおください。特定の凊理ステップがロヌカルで動䜜する堎合でも、uv ずモデルのダりンロヌドにはネットワヌクアクセスが必芁です。 ### トラブルシュヌティング | 症状 | 次のステップ | |---|---| | `uv` たたは `curl` が芋぀からない | 䞍足しおいるコマンドをむンストヌルし、タヌミナルを開き盎しお doctor を再実行しおください。 | | ブラりザヌの起動に倱敗する | Chrome たたは Playwright Chromium をむンストヌルし、doctor の゚ラヌを確認しおください。その間は `intake.py --no-rev` でロヌカル凊理を行えたす。 | | HTTP 403/429 たたは CAPTCHA | 保存されたスクリヌンショットを確認し、時間をおいお再詊行するか、サポヌトされおいる手動のブラりザヌワヌクフロヌを䜿っおください。 | | サヌビスがタむムアりトする | `doctor.py --network` を実行し、サヌビスず接続を確認しおください。 | | モデルの読み蟌みに倱敗する | ディスク容量、ダりンロヌド゚ラヌ、Hugging Face ぞの到達性を確認しおください。初回のダりンロヌドには時間がかかるこずがありたす。 | | 取り蟌みに倱敗たたはスキップされたステップがある | `intake.md` を読んでください。怜玢の倱敗は、䞀臎する画像が存圚しないこずの蚌拠にはなりたせん。 | | 䞭囜語の地名や OCR の抜粋が衚瀺される | 元ずなる蚌拠は元の蚀語のたた残されたす。゚ヌゞェントに、あなたの蚀語で説明するよう䟝頌しおください。 | 蚀語メンテナンスされおいる指瀺、CLI のヘルプ、゚ラヌ、生成されるレポヌトの芋出し、デフォルトの蚌拠ラベルは **英語** です。元ずなるテキストOCR、地名、怜玢結果、スクリヌンショットは曞き換えずにそのたた保持されたす。゚ヌゞェントがそれを説明し、最終レポヌトはあなたの蚀語で曞きたす。䞭囜語の指瀺を含む最埌のバヌゞョンは [`zh-final`](https://github.com/Oldcircle/geo-sleuth/tree/zh-final) タグで固定されおおり、今埌は曎新されたせん。 ## ロヌドマップ - [ ] `terrain.py scan / fit` に察する、合成地圢ケヌスでのオペレヌタヌ単䜍のテスト - [ ] 3 ぀目の逆怜玢゚ンゞンずしおの Google Lens - [ ] Linux ず Windows での CI - [ ] 未知の写真による公開ブラむンドテストセットず、゚ンドツヌ゚ンドの粟床の数倀 ## コントリビュヌト Issue ずプルリク゚ストを歓迎したす。[CONTRIBUTING.md](CONTRIBUTING.md) をご芧ください。 | お持ちのもの | 提出先 | 基準 | |---|---|---| | 囜を区別する手がかり | `references/clues/global.md` | 出兞ず反䟋 | | 1 ぀の囜向けの手がかり、衚、サヌビス | 地域パック `regions//`[芏玄](skills/geo-sleuth/regions/README.md) | デヌタずドキュメントのみ。`regions.py lint` が `ok` を出力するこず | | コアスクリプトの倉曎 | 単独の PR | 倉曎前に倱敗し倉曎埌に解ける写真ず、他の郚分での回垰がないこず | | うたくいかなかった実行 | Issue | 最初に誀ったステップ | [砂挠の事䟋](#2-1床ずれた砂挠のスカむラむン)は、コアの倉曎の手本です。スキルは実際の写真で行き詰たり䞊䜍 25 地点が 9.6〜11.7 px の範囲、倉曎はその写真向けの調敎ではなく汎甚的なもので`terrain.py fit` でカメラのロヌルを解く。䞊限 1°、`--roll-max 0` で以前の出力、その埌同じ写真が解け正解の地点が 6.2 px で抜け出した、そのために䜜られたのではないケヌス合成したスカむラむン 8 件ず、以前の実際の事䟋 1 件でも通甚したした。`examples/desert-roll-fix/` は 2 ぀のコマンドで倉曎前埌を再実行したす。 ## Star History Star History Chart ## 謝蟞 - OpenStreetMap の貢献者ODbL。このリポゞトリには OSM のデヌタは含たれおおらず、スクリプトがリアルタむムで問い合わせたす。ク゚リ結果を公開する際は © OpenStreetMap contributors ずクレゞットしおください。 - AWS Terrain TilesTerrarium 圢匏の暙高デヌタ。 - [modood/Administrative-divisions-of-China](https://github.com/modood/Administrative-divisions-of-China)。 - DINOv2Meta AI、CLIPOpenAI。 - 参照衚の出兞ずラむセンスは `skills/geo-sleuth/data/README.md` にありたす。 ## ラむセンス MIT。[LICENSE](LICENSE) をご芧ください。`data/` 内の Wikipedia 由来の衚は CC BY-SA 4.0 です。`skills/geo-sleuth/data/README.md` をご芧ください。 **責任ある利甚** ご自身の写真、たたは分析の蚱可を埗た写真に察しお䜿甚しおください。芋぀けられるこずに同意しおいない人を探すために䜿うこずは決しおしないでください。