← 返回全部文章
·约 13 分钟PPT

这张照片在哪拍的?AI 查到 2 米误差|开源技能 geo-sleuth

技能插件

配套媒体

本页对应的 PPT 与演示视频

geo-sleuth-recommend.mp4
PPT
geo-sleuth-recommend.pptx浏览器不能直接打开 PPT,下载后用 PowerPoint / WPS / Keynote 查看
下载没反应?点这里复制直链

侧边栏预览窗口(Electron webview)会拦截下载,把下面的链接复制到 Chrome / Edge 地址栏打开即可保存。

PPT../../geo-sleuth-recommend.pptx
视频../../geo-sleuth-recommend.mp4
本文目录
  1. 一、先看它到底做到了什么
  2. 二、逆推过程拆解:27335 → 171 → 22 → 1
  3. 第 0 步:读图,把能读的榨干
  4. 第 1 步:区域扫描,把整片区域的铁路桥全拉出来
  5. 第 2 步:天际线拟合,把 171 缩到 22
  6. 第 3 步:桥墩当尺子,锁定 2 米
  7. 三、为什么它比"让 AI 看图"靠谱
  8. 五、什么场景值得用
  9. 结语

这张照片在哪拍的?AI 查到 2 米误差|开源技能 geo-sleuth

朋友发来一张照片:田野边一个白色砖窑,背后一列高铁桥,远处一座山。没有路牌,没有车牌,没有文字,EXIF 也被剥了。他问:这在哪?

传统 OSINT 的答案是"猜"。而 GitHub 上一个叫 geo-sleuth 的 Agent Skill 把这件事做成了可复现的推演:从 27,335 段候选缩到 1 个点,误差半径 ±2 米。

它不是"让大模型看图说话",而是20 个专用脚本负责穷举与打分,大模型只在最后几个候选里做判断。今天已 789 星、MIT 开源,装一行命令就能用。


一、先看它到底做到了什么

作者在 README 里放了一张实拍图:照片里只有一座铁路桥、一座山,别的什么都没有。

geo-sleuth 官方封面与定位链路

结论是 ±2 米。整个过程分六步,每一步都有脚本留下的证据文件:

六步流水线与脚本分工

先看它的官方演示动图——从原始照片到相机位置、朝向和卫星证据图:

hero 演示动图抽帧一

hero 演示动图抽帧二

hero 演示动帧三

这就是它最反直觉的一点:照片里明明什么都"读不出来",它照样能找到位置。


二、逆推过程拆解:27335 → 171 → 22 → 1

作者把每一步的候选数都写了出来,这个漏斗本身就是最好的技术说明。

第 0 步:读图,把能读的榨干

原始照片

intake.py 一条命令跑完 Step 0–3:读 EXIF(GPS、拍摄时间、等效焦距、朝向)、整图 OCR + 放大裁剪 OCR、生成反图搜图的拼图版。

对这張图它读到的是:高架桥上的杆子是接触网杆 → 这是电气化铁路;按 32 米跨径估算,左段约 0.5 公里、右段超过 1 公里;3 公里外有陡山;稻子已收割但草还绿 → 华南,但这是下注不是证明。

注意最后半句——作者明确标注这是"猜测"而不是"证据"。这个区分是整个项目的核心设计。

第 1 步:区域扫描,把整片区域的铁路桥全拉出来

区域扫描候选

terrain.py scan 通过 OpenStreetMap Overpass 拉取区域内所有铁路桥:27,335 段,然后每 400 米采样一个点,用高程数据(Terrarium)算出该点的 360° 地平线轮廓。筛选条件是三合一:附近地面平坦 + 几公里内有明确山峰 + 山旁边地平线是平的。

结果:171 个候选点。

第 2 步:天际线拟合,把 171 缩到 22

天际线前三名对比

在每个候选点周围摆相机位(累计渲染 14,372 个机位),从每个机位渲染出"从那儿看过去山脊线长什么样",和照片里的山脊线比对。

前三名出来之后,作者手工加了一条约束:桥必须在画面左侧很近、右侧很远(这正好对应第 0 步"左段近、右段远"的跨径估算)。

于是:22 个候选。

叠回原图验证时非常打脸:第 1 名(福州)山脊有个包被烤炉挡住了所以得分高;第 3 名(惠州)照片里是平的它却下坡;第 2 名(清远)从山脚到画面边缘全对。

第 3 步:桥墩当尺子,锁定 2 米

桥墩标号当尺子

这是最漂亮的一步。imgprep.py piers 标出照片里的 17 个桥墩,每一个墩都是相机看到的一个方位角。

17 个桥墩射线交点

geo.py spacing 的逻辑是:这些射线打到铁路线上时,交点必须等间距——因为桥墩本来就是等间距的。

交点先把结果压到一个约 300 米长的带状区域,再和天际线一夹,只剩一个点。

最终:±2 米。

卫星证据图

输出不是一句"大概是那儿",而是:坐标 ± 误差半径、相机朝向、卫星证据图、分级置信度。


三、为什么它比"让 AI 看图"靠谱

这个项目最值得学的不是任何单个算法,而是它的举证责任分配。

传统 OSINT 与 geo-sleuth 对比


五、什么场景值得用

  • 旧照片考古:翻出十年前的老照片,没有 GPS,没有水印,只有田野和一座山
  • 核实网络图片:网图配错地点,越传越离谱
  • 旅行与写作:想知道照片里那座桥到底是什么桥
  • 安全与合规:照片溯源、防伪核验的基础能力(注意 OSM 数据 ODbL,发布查询结果时要署名 © OpenStreetMap contributors)

局限也要说清楚:官方 Roadmap 里还写着"要建一个公开的盲测集,给出端到端准确率数字"——也就是说,目前没有一个公开的准确率指标;高程与天际线拟合的合成地形运营商级测试也还在 To-do 列表里。所以"±2 米"是官方案例的结果,不是普适保证。


结语

AI 拍照定位这件事一直有点玄学:模型看图、编一个听起来合理的地方给你,你没法验证。

geo-sleuth 的价值在于它把"验证"这件事做成了硬约束——每一个结论都要摊开一个命令和一个文件,能算的绝不用嘴说。这套路子不只是拍照定位用得上,任何让 Agent 下判断的任务都该这么设计。

作者只在这张案例上花了几步就做到 ±2 米,而你现在只需要一条 npx 命令。

开源地址:github.com/Oldcircle/geo-sleuth(MIT,789⭐)