- uv: optional but highly recommend
- Git: optional
- CUDA Toolkit ~12.6: required for GPU inference
- UAV-VisLoc Dataset: required for demo script
Clone repository
# clone repository with submodules
git clone --recurse-submodules https://github.com/carseny/UAVCalibration.git && cd UAVCalibrationDownload UAV_VisLoc_example or other datasets and place them into ./datasets
Create virtual environment and install this repo with all requirements. Please change the index url to pytorch source of your cuda version. e.g. https://download.pytorch.org/whl/cpu for pytorch with CPU inference.
uv venv
uv pip install -e . --extra-index-url https://download.pytorch.org/whl/cu126(Optional) Write the pytorch source of your cuda version to pyproject.toml.
[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cu126"
explicit = true
[tool.uv.sources]
torch = [{ index = "pytorch" }]
torchvision = [{ index = "pytorch" }]Run demonstration scripts in ./scripts
uv run ./scripts/demo.pyCreate virtual environment and install this repo with all requirements. Please change the index url to pytorch source of your cuda version. e.g. https://download.pytorch.org/whl/cpu for pytorch with CPU inference.
python -m venv .venv
./.venv/scripts/activate
pip install -e . --extra-index-url https://download.pytorch.org/whl/cu126Run demonstration scripts in ./scripts
./.venv/scripts/activate
python ./scripts/demo.py./scripts/demo.py
Moving mouse pointer on one image and get corresponding point on the other.
Control keys:
- Esc: Exit
- A: Previous image
- W: 10th Previous image
- D: Next image
- S: 10th Next image
flowchart
raw_image --> raw_hw
focal_length --> cam_mat
raw_hw --> cam_mat
yaw --> rot_mat
pitch --> rot_mat
roll --> rot_mat
cam_mat --> rect_trans
rot_mat --> rect_trans
lonlat --> rect_crs_trans
height --> rect_crs_trans
cam_mat --> rect_crs_trans
rot_mat --> rect_crs_trans
rect_crs_trans --> get_sat{get_sat}
raw_hw --> get_sat
get_sat --> sat_image
get_sat --> sat_crs_trans
rect_trans --> rect_image
raw_image --> rect_image
rect_image --> match_trans
sat_image --> match_trans
sat_crs_trans --> crs_trans["crs_trans
(img_xy -> crs_coord)"]
match_trans --> crs_trans
-
- 数据包含日期时间、经纬度、高度以及三轴信息,以及拍摄区域的卫星图
- 俯仰、滚转几乎都是 0(即垂直俯视拍摄)
- 未提供镜头详细参数,无法计算出每个像素对应的精确位置
- 有issue反应经纬度似乎不准
-
- 数据包含针对同一个目标的卫星图和无人机拍摄的不同角度的图像,不包含详细的位置信息。
-
- 提出了一种基于视觉的无人机自定位方案,可以比对无人机拍摄图像与卫星图像中的特征来估计无人机的位置。
- 数据集没公开需要申请
- 经度 (λ): 角度值(-180° 到 +180°),以本初子午线为基准,向东为正(东经),向西为负(西经)。
- 纬度 (φ): 角度值(-90° 到 +90°),以赤道为基准,向北为正(北纬),向南为负(南纬)。
- 大地高 (h): 从 WGS84 椭球面沿法线方向向上的距离(单位:米)。高于椭球面为正,低于为负。
它与全球纬度和经度不同之处在于,它将地球分为 60 个区域,并将每个区域投影到平面上作为其坐标的基准。
可以获得局部地区最小失真的图像
- 这是一个 离散的、以像素为单位的坐标系 。
- 原点
(0, 0)通常位于 图像的左上角 。 i轴(列索引)向右(东)方向递增。j轴(行索引)向下(南)方向递增。- 坐标表示为
(column, row)或(x_pixel, y_pixel),例如(100, 200)表示第 200 行、第 100 列(注意行号通常从上到下增加)。
wiki Web 墨卡托是墨卡托投影的一种微小变体,主要用于基于 Web 的地图程序。
坐标为 (x,y,z)
- x,y: 与经度、纬度对应。单位是米,范围[-20037508.342789244, +20037508.342789244]
- z: 缩放等级,>= 0
Web 墨卡托投影在全局尺度上几乎与被裁剪到约 85°N 至 85°S 的墨卡托投影无法区分
大多数瓦片地图遵循某些谷歌地图的约定:
- 瓦片是 256x256 像素
- 在最外层的缩放级别 0,整个世界可以在一个地图瓦片中渲染。
- 每个缩放级别在两个维度上都翻倍,因此在放大时,单个瓦片会被替换为 4 个瓦片。这意味着大约有 22 个缩放级别足以满足大多数实际用途。
- 使用 Web 墨卡托投影,纬度限制在约 ±85 度。
目前有三种主要的编号方案在使用:
- Google Maps / OpenStreetMap: (0 到 2 zoom -1, 0 到 2 zoom -1) 对于范围 (-180, +85.0511) - (+180, −85.0511)
- 瓦片地图服务:(0 到 2 zoom -1,2 zoom -1 到 0) 对于范围 (-180, +85.0511) - (+180, −85.0511)。(即与前一个相同,但 Y 值翻转。)
- QuadTrees,由微软使用。
将三维相机坐标系中的点投影到二维图像平面。
设三维空间中的点为(x,y,z),二维图像平面上的点为(x',y'),则它们之间的映射关系可以表示为:
| 参数 | 符号 | 物理意义 | 单位 | 典型值示例 |
|---|---|---|---|---|
| x 轴焦距 | 相机 x 轴方向焦距长度 | 像素 | 3000 px | |
| y 轴焦距 | 相机 y 轴方向焦距长度 | 像素 | 3000 px | |
| 主点坐标 x | 光轴与图像平面的交点 x 坐标 | 像素 | 1920 px | |
| 主点坐标 y | 光轴与图像平面的交点 y 坐标 | 像素 | 1080 px | |
| 倾斜系数 | 图像坐标轴的倾斜程度 | - | 0 |
表示从相机光心到图像平面的距离(所以其实可以理解成像距)
非对称焦距 (
主光轴与图像平面交点的坐标,理想情况下位于图像中心
现代相机:多数$s≈0$(传感器与光轴垂直)
- 偏航角$\psi$(Yaw):围绕 Z 轴(上下)旋转的角度
- 俯仰角$\theta$(Pitch):围绕 Y 轴(左右)旋转的角度
- 翻滚角$\phi$(Roll):围绕 X 轴(前后)旋转的角度
根据参考资料,一般按照 Z-Y-X 顺序旋转,因此从飞行器坐标换算到世界坐标应该依次按 X-Y-Z 顺序应用旋转矩阵:
warpPerspective 使用的 3×3 单应矩阵(Homography Matrix) 表示两个平面之间的透视变换关系,其物理意义可分解如下(设矩阵为 H):
设源平面上的点为(x,y),目标平面上的点为(x′,y′),则它们之间的映射关系可以用齐次坐标表示为:
需要建立从无人机图像到卫星图像的精确(<10m)对应关系,从而获得无人机图像上目标的精确坐标信息。
在经过反投影矫正后,仍面临以下问题
- 无人机 6 DOF 数据不精确导致的偏移/尺度/旋转不对应
- 拍摄角度变化导致的视角、遮挡关系不对应
- 拍摄时间变化导致的风格不对应
- 常见的图像匹配任务专注于匹配图像内某一部分,而航拍图像与卫星图像视野极广
- 背景与动机
- 随着大规模地理标注数据集和机器学习技术的发展,跨视角地理定位成为研究热点
- 在自动驾驶、增强现实、环境监测等领域具有重要应用
- 本文贡献
- 全面梳理特征工程与深度学习两大类主流方法
- 总结数据集、评价指标与现有挑战
- 展望未来研究方向与应用前景
- 输入:未知坐标的地面视角图像
- 数据库:带有已知经纬度的航拍/卫星图像集合
- 输出:查询图像的最可能地理坐标
-
基于像素/几何的早期方法
- 像素级地理对齐(Geodetic alignment)
- 传感器模型+正射校正
-
基于手工特征的方法
- 特征提取+匹配:SIFT、SURF、词汇树等
- 同视图与跨视图匹配策略
-
基于深度学习的方法
- Siamese 网络与三元组损失
- Capsule 网络
- GAN 生成与合成式检索
- Transformer 与自注意力机制
- 视角差异与尺度变化
- 光照变化、遮挡与动态物体
- 数据规模大,检索效率瓶颈
- 常用数据集
- Pittsburgh 250k、CVUSA、CVACT 等
- 评价指标
- Top‑k 精度、召回率、定位误差
- 不同方法在各数据集上的性能比较
- 特征工程 vs. 深度学习的优缺点
- 融合多源、多模态信息
- 轻量化模型与在线检索加速
- 在智能交通、应急响应、增强现实等场景中的落地
CLIP使用了对比学习方法,在大量互联网上的图像-文本对进行训练,能够从语义上对 zero-shot 图像进行特征提取与匹配。
Pix2Map 针对驾驶场景,从车辆的第一视角图像中直接推断出对应街区的地图拓扑结构,以根据需要不断更新和扩展现有地图。。
Pix2Map 使用 ResNet 与 Transformer 模型分别将图像特征与地图特征进行编码到特征向量,使用类似 CLIP 的对比学习机制进行特征对齐,从而实现图像到地图的匹配。
优点:
- 使用向量相似度度量图像与地图之间的相似度,计算相对高效。
- 拥有类似 CLIP 的 zero-shot 学习能力,可以处理未见过的场景。
缺点:
- 需要大量的标注数据进行训练。
- 相对于传统方法来说,模型可解释性差、鲁棒性可能不足。
使用一个额外的风格预测网络,解决无人机图像在不同环境下(雨天、雾天等)识别准确性问题。
$ℒ(q,R)\text{InfoNCE} = -log \frac{exp(q ⋅ r+ / τ)}{ \sum_{i=0}^{N} exp(q ⋅ r_i / τ)}$
$q$ denotes an encoded street-view, the so-called query, and$R$ is a set of encoded satellite images called references. Only one positive$r_i$ , namely$r_+$ matches to$q$ . The InfoNCE loss uses the dot-product to calculate the similarity between query and reference images and is low when the query and the positive match are similar, and high when the negative$r_i$ are dissimilar to$q$ . As loss function for the similarity between the views the cross-entropy is calculated. The temperature parameter$τ$ is a hyperparameter that can either be learned [30] or set to a static value.
So far, InfoNCE loss has mostly been used in a non-symmetric fashion for unsupervised representation learning for images [28, 29]. A symmetric formulation showed to be useful in multi-modal pre-training [30] to bridge the gap between the modalities. Therefore we utilise this loss function in the same symmetric fashion to leverage the flow of information in both directions: satellite-view to street-view and vice versa. In the InfoNCE loss, a positive example is always contrasted with N-1 negative examples, where N denotes the batch size, thus delimiting many examples at once. But in cases where there are several positive examples, such as University-1652, this requires a custom sampler to prevent multiple positives for the same ground truth label in one batch. We provide an ablation study of the importance of symmetry in the InfoNCE loss and a comparison to the triplet loss in our supplementary material.
使用 Siamese 网络,用一个权重共享的 ConvNeXt 作为两个视图的单一编码器
认为图像不同环形分区具有不同语义,不同图片相同分区内语义一一对应。(个人感觉有点过于针对无人机环绕拍摄的数据集了)
提出 Local Pattern Network (LPN),在全局池化前分离不同环形区域并分别池化。
- 使用预训练的分类网络按 patch 进行特征向量提取
- 将特征向量所有维度取平均得到 thermal value 标量(似乎有点蠢)
- 通过 thermal value 将图像分割为不同区域
- 将每类的分类结果分别进行平均池化和对齐
- 图像配准(Image Registration)与全景拼接(Stitching) 将两张或多张图像对齐、融合为一个一致图像,以生成全景或做时序比较。
- 结构恢复与视觉定位(3D Reconstruction / Visual Localization / SLAM) 通过图像间对应关系恢复三维结构或估计相机姿态,用于自动导航、地图构建等。
- 视觉归巢(Visual Homing) 机器人仅凭视觉信息确定当前位置相对于“家”所在方向,基于匹配特征或 motion flow 估计归向矢量。
- 图像检索 / 目标识别 通过匹配图像特征实现物体识别、实例检索或匹配同一目标的不同拍摄图像。
- 区域/模板匹配(Area‑based 或 Template matching)
- 直接基于图像灰度/像素块相似度(如交叉相关或 SAD)滑动匹配。
- 适合小尺度、刚性、重叠多的图像,但对旋转、尺度、遮挡、光照变化不鲁棒。
-
基于特征的匹配(Feature‑based Matching)
-
特征检测(Feature Detection)
- 手工设计(handcrafted):Harris、DoG/LoG、MSER、FAST、Hessian-Affine 等经典算子。
- 学习型(learning-based):通过深度网络训练检测更加稳健的关键点或局部兴趣点。
-
特征描述(Feature Description)
- 手工描述子:如 SIFT(128‑维)、SURF、ORB(FAST+BRIEF)等,针对旋转、尺度变化设计的鲁棒描述子。
- 学习型描述子:如使用 CNN、Siamese 网络、Patch‑based 方法,或 end‑to‑end 联合学习 detector+descriptor。
-
特征匹配与几何筛除
- 利用 brute‑force 或 KNN、ratio test 等方法比较描述子;再通过 RANSAC 或几何模型估计剔除错误匹配。
-
-
深度学习端到端方法(Detector‑free 或 中端/末端学习匹配)
- Detector‑free 模型:直接从输入图像对中学习密集或半稠密对应关系(如 LoFTR、SuperGlue 等 Transformer 或 CNN‑based 方法)。
- 联合模块(end‑to‑end matcher):整合检测、描述、匹配、几何估计为统一可学习模块,用于姿态估计、单阶段重建等。
SIFT 是一种经典的图像局部特征提取算法,由 David Lowe 在 1999 年提出并在 2004 年完善。它能够在图像中检测并描述对尺度缩放、旋转、亮度变化甚至一定程度的视角变化和仿射变换保持稳定的关键特征点。
用于检测兴趣点和编码描述符。
- 使用生成的数据监督预训练
- 在无标注数据集上进一步自监督训练
-
网络 使用同一个卷积 (VGG Net) 编码兴趣点和描述符,并分别通过 PixelShuffle 和 Bi-Cubic 插值上采样到原始尺寸。
-
损失函数
- 兴趣点:交叉熵
- 描述符:使用余弦相似度,最小化相邻对应位置的距离、最大化其他距离,使用了加权项
$λ_d$ 帮助平衡由于负对应关系多于正对应关系而产生的不平衡
-
使用合成图像预训练
- 使用实时渲染的二维图形(灰度)以生成兴趣点数据
-
仿射适应
- 使用预训练模型在无标注数据集 (MS-COCO) (灰度)上生成伪标签
- 基于透视变化不变性,同一图像的同一位置应具有相同兴趣点和描述符。 先应用透视变换,再将结果变化回来,并取所有变换后伪标签的平均值作为下一次迭代的伪标签。(相当于数据增强了)
基于注意力图神经网络的特征点匹配中端,从两组给定特征点与描述符寻找匹配点。
- 需要使用特征点检测前端,与 SuperPoint 相性很好
- 监督训练
- 全程梯度可传导,可以端到端训练。但是只能训练描述符网络,冻结特征点检测部分
- 使用 self/cross attention 进行图像间信息提取
- 使用 sinkhorn 算法在余弦相似度上寻找最佳匹配,梯度可传导
仿照 SuperPoint + SuperGlue,但是抛弃特征点检测部分,在密集的粗粒度特征图像上进行特征点匹配,最后在细粒度上进行精校。
- 监督训练
- 使用 CNN 与 U-Net 结构提取图像特征
- 使用 self/cross attention 进行图像间信息提取,其中使用线性的注意力算法
SuperGlue 的跟进研究,主要优化了性能,精度提升较小
- Early Exit
- Point pruning: 随着 LightGlue 聚合上下文,它可以早期发现某些点是不可匹配的,并因此将它们从后续层中排除。其他非重复点在后期层中被排除。这减少了推理时间和搜索空间,最终快速找到好的匹配。
- 位置编码:SuperGlue 使用 MLP 编码绝对点位置,并在早期与描述子融合,模型在整个层中容易忘记这种位置信息。相反,LightGlue 依赖于一种相对编码,这种编码在不同图像之间更容易比较,并在每个自注意力单元中添加。这使得更容易利用位置信息并提高了深层层的准确性。
- 预测头:SuperGlue 通过使用 Sinkhorn 算法解决可微最优传输问题来预测分配。它包括许多行和列归一化的迭代,这在计算和内存方面都很昂贵。SuperGlue 添加了一个垃圾桶来拒绝不可匹配的点。我们发现垃圾桶将所有点的相似度得分纠缠在一起,从而导致次优的训练动态。LightGlue 将相似性和可匹配性分开,这些更易于预测。这也产生了更干净的梯度。
- 深度监督:由于 Sinkhorn 的计算成本高昂,SuperGlue 无法在每一层后进行预测,只能在最后一层进行监督。LightGlue 较轻的头部使其能够在每一层进行分配预测并进行监督,这加快了收敛速度,并允许在任何一层后退出推理,这是 LightGlue 效率提升的关键。
*LightGlue matches sparse features faster and better than existing approaches like SuperGlue. Its adaptive stopping mechanism gives a fine-grained control over the speed vs. accuracy trade-off. Our final, optimized model ⋆ delivers an accuracy closer to the dense matcher LoFTR at an 8× higher speed, here in typical outdoor conditions.*









