ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AutoCompass:不依赖SfM重建,用公共地图和弱标签实现视觉定位

AutoCompass:不依赖SfM重建,用公共地图和弱标签实现视觉定位 1. 背景与痛点为什么视觉定位还离不开 SfM 重建做视觉定位Visual Localization的同学应该都有体会传统方案通常依赖SfMStructure from Motion运动恢复结构先对场景做三维重建生成稀疏点云然后再将当前相机图像与 3D 点云进行 2D-3D 匹配最终解算出相机位姿。这套流程在学术界已经非常成熟但在工程落地时痛点也非常明显建图成本高SfM 需要采集大量图像序列并且要做特征提取、匹配、三角化、捆绑调整Bundle Adjustment。一个中型街景区域重建耗时可能以小时甚至天为单位。更新周期长城市环境变化很快店铺门面、建筑装修、临时围挡都会导致地图失效。点云一旦过期定位精度就会断崖式下降。存储与隐私问题稠密或稀疏点云动辄几百 MB同时点云中隐含着拍摄位置、路径等信息一旦泄露容易引发隐私合规风险。跨季节跨视角泛化差点云是从特定时间、特定相机轨迹生成的当查询图像的光照、视角、季节与建图数据差异较大时2D-3D 匹配效果会明显退化。与之对比公共地图Public Maps已经覆盖了全球绝大多数城市包含道路拓扑、建筑轮廓、卫星影像、POI 等丰富信息且由地图厂商持续维护更新。那能不能直接“绕开 SfM”在公共地图上做视觉定位AutoCompass 这篇工作给出的答案是可以但关键不是直接拿公共地图做稠密匹配而是利用弱标签Weak Labels学习图像与地图元素之间的语义关联用分类 回归的方式输出位置与朝向。下面我会从原理、数据、代码、实验、排错五个维度完整拆解这套思路方便正在做视觉定位、AR 导航、自动驾驶或地理信息相关项目的开发者直接参考。2. 核心概念AutoCompass、公共地图与弱标签2.1 AutoCompass 是什么AutoCompass 是一个基于公共地图的视觉定位系统它的核心目标是在无 SfM 重建、无显式 3D 模型的前提下仅利用公共地图如卫星图、建筑足迹作为先验训练一个模型估计相机的全局位置和水平朝向heading/compass direction。系统名称中的 “Compass” 源自它的一项关键能力预测相机的绝对水平朝向。在 AR 导航、车辆定位、机器人巡检等场景中知道“相机朝哪个方向”与知道“相机在哪里”同样重要。2.2 视觉定位与传统方法的区别为了更好地理解 AutoCompass 的贡献我们可以把视觉定位方法分成三代方法类型代表思路依赖条件典型问题传统几何法SfM 2D-3D 匹配需要目标区域三维点云建图成本高、更新慢直接位姿回归PoseNet 系列需要大量带真值位姿的训练数据精度上限有限泛化差地图关联法AutoCompass 类型构建图像与地图元素的语义对应公共地图 弱标签标签噪声需特殊设计AutoCompass 属于第三代它并不预测稠密 3D 坐标而是将任务拆解为建筑实例分类与角度回归/分类两项子任务。只要模型能够识别图像中看到的是哪个建筑、朝向大概多少度再结合 GPS 先验就能得到厘米到米级的位置估计。2.3 Weak Labels 弱标签在本文中的含义在监督学习中标签可以是强标签精确到像素的语义分割 mask、精确位姿矩阵或弱标签图像级分类、粗略 GPS 坐标、时间戳等。AutoCompass 使用的“弱标签”包含以下几个来源GPS 坐标每张训练图像都带有一个全球定位坐标误差通常在数米到十几米。相机内参包括焦距、主点、传感器尺寸等。内参决定了相机光心在世界坐标中的朝向投影关系。建筑足迹Building Footprints公共地图上每个建筑的多边形轮廓通常来自 OpenStreetMap 或 Google Maps。轨迹与时间信息连续帧图像之间隐含的运动约束例如车辆行驶方向与道路方向一致行人在某个建筑前停留等。这些标签没有一个能独立给出“图像中哪个像素对应哪个建筑点”的强监督但组合在一起就能训练出一个相当可靠的定位模型。这正是“弱监督学习”在视觉定位任务上一个非常经典的工程化落地思路。3. 系统原理拆解AutoCompass 是怎么工作的3.1 总体架构AutoCompass 的系统流程可以拆解为三个模块地图关联模块Map Association Module将 GPS 先验与公共地图数据对齐为每一张训练图像生成一组候选建筑并把候选建筑与图像对应起来。图像编码模块Image Encoder使用卷积神经网络将输入图像编码为高维特征用于建筑身份分类和角度预测。多帧聚合模块Temporal Aggregation针对视频序列输入通过滑动窗口融合多帧预测结果提高单帧噪声下的鲁棒性。下面用一个简化的流程图来表示整体思路训练阶段: 卫星图/建筑足迹 GPS标签 ── 候选建筑生成 输入图像 ── CNN特征 ── 建筑分类 角度分类 分类目标: 当前看到哪一个建筑? 朝向多少度? 推理阶段: 输入视频帧 ── 单帧预测 ── 多帧聚合 ── (位置, 朝向)3.2 地图关联模块是怎么生成弱标签的如果说 AutoCompass 的“骨架”是 CNN 分类网络那么“灵魂”就是地图关联模块因为它决定了模型学什么、以及标签以什么形式存在。具体来说给定一张训练图像和它的 GPS 坐标系统会以 GPS 坐标为中心取一个半径 R例如 15 米。在这个圆内从公共地图中筛选出所有建筑足迹。计算图像拍摄点与每个建筑多边形之间的几何关系例如相机是否有大概率正对该建筑、该建筑是否处于图像视野中央、建筑在图像中的可见面积是否足够大。对每个建筑分配一个 one-hot 标签图像中实际拍摄到的目标建筑作为正类其他候选建筑作为负类。这样训练问题就成了“图像里看到的是这些建筑中的哪一个”的多分类问题。3.3 朝向估计角度分类而非角度回归朝向compass heading是一个连续量理论上可以用回归任务直接预测。但 AutoCompass 的做法是把它离散化成若干个角度区间转换成分类任务。例如把 360° 划分成 64 个区间每个区间 5.625°。这种做法的好处是分类任务比回归任务更容易优化尤其当数据集中存在角度标注误差时。离散化后模型学习的是一个“稳定区间”对弱标签的噪声更具鲁棒性。推理阶段再取分类概率分布的期望或者跨 Bins 做加权平均恢复出连续角度值。3.4 多帧聚合是怎么提升精度的单帧图像存在遮挡、运动模糊、光照变化等噪声推理时直接使用单帧预测结果往往不够稳定。AutoCompass 采用滑动窗口聚合策略按时间顺序取连续 N 帧对每帧的建筑分类概率向量和角度概率向量求加权平均再取 argmax。假设窗口大小为 5那么第 t 帧的聚合结果可以直接输出为P_building(t) mean(P_building(t-2), ..., P_building(t2)) P_heading(t) mean(P_heading(t-2), ..., P_heading(t2))这种方式等价于在预测层面做时序平滑不需要额外训练时序网络如 LSTM计算量增加很小但精度提升很明显。4. 环境准备与数据说明4.1 依赖环境AutoCompass 论文源码是 PyTorch 风格的项目。如果你想自己复现实验建议按以下环境准备# Python 环境 Python 3.8 PyTorch 1.10 torchvision 0.11 numpy 1.21 opencv-python 4.5 pyproj 3.0 # 用于坐标投影转换 geopandas 0.10 # 用于读取建筑足迹矢量数据 shapely 1.8 # 用于建筑多边形几何计算以上版本是比较常见的组合。实际使用时请以你自己的环境为准如果使用 GPU 训练还需要匹配 CUDA 版本的 PyTorch这里不再赘述安装细节。4.2 公共地图数据从哪来这里需要区分两种地图数据来源OpenStreetMapOSM开源、可自由下载建筑轮廓数据。通过 Geofabrik 或者 Overpass API 可以获取指定城市或区域的建筑矢量文件。Google Maps / Bing Maps 卫星影像提供高分辨率卫星图通常通过瓦片服务Tile Service获取。AutoCompass 在实验中使用了 Google Maps 的卫星视图和建筑足迹数据作为地图表示。你完全可以根据自己的区域改用其他数据源只要保证建筑轮廓多边形 每个建筑的地理坐标可以对应到查询图像的 GPS 先验范围。4.3 数据组织格式建议的目录结构如下dataset/ ├── images/ │ ├── seq_001/ │ │ ├── frame_0001.jpg │ │ ├── frame_0002.jpg │ │ └── ... │ └── seq_002/ ├── gps/ │ └── seq_001_gps.csv ├── footprints/ │ └── city_buildings.geojson └── intrinsics/ └── camera_intrinsics.json每张图像对应的 GPS 可以用 CSV 保存frame_id,lat,lng,alt,seq_id frame_0001,39.904211,116.407395,52.3,seq_001 frame_0002,39.904215,116.407421,52.3,seq_0014.4 如果需要自行采集数据如果你没有现成的城市数据集可以参考以下方式准备一套小规模实验数据使用手机或行车记录仪在某个街区拍摄一段连续的行走视频帧率建议 10fps 以上。使用手机 GPS logger 记录同步的轨迹点。将视频抽帧并按时间戳与 GPS 轨迹插值对齐。从 OSM 下载该区域的建筑 footprint。这套自采集数据在精度上肯定不如论文中的专业设备但用于理解整套流程和调试代码是完全足够的。5. 实战从公共地图到弱标签训练这一部分我们从零开始按工程化的流程演示核心代码。为了保持代码的可读性这里采用“思路示意 最小实现”的方式重点在于讲清楚每一步在做什么以及数据长什么样。5.1 加载建筑足迹并做坐标投影建筑足迹数据通常是经纬度坐标而相机位姿计算一般需要平面坐标如 UTM 投影。所以第一步是转换坐标。# 文件路径: utils/geo_utils.py import pyproj import geopandas as gpd # 定义一个从 WGS84 经纬度到 UTM 投影的转换器 def create_transformer(lat_ref, lon_ref): # 根据参考点估算 UTM 带号 utm_zone int((lon_ref 180) / 6) 1 crs_wgs pyproj.CRS.from_epsg(4326) # WGS84 crs_utm pyproj.CRS.from_epsg(32600 utm_zone) transformer pyproj.Transformer.from_crs(crs_wgs, crs_utm, always_xyTrue) return transformer def load_footprints(geojson_path, lat_ref, lon_ref): gdf gpd.read_file(geojson_path) transformer create_transformer(lat_ref, lon_ref) # 只保留建筑多边形 gdf gdf[gdf.geometry.type Polygon] # 将几何对象转换到 UTM 坐标 gdf gdf.to_crs(transformer.crs) return gdf, transformer这里有一个容易被忽略的点UTM 带号选择。如果你的实验区域跨了两个 UTM 带建议直接使用适合本地城市的投影坐标系否则距离计算会出错。5.2 生成候选建筑弱标签接下来针对每一帧图像根据其 GPS 坐标筛选候选建筑并生成对应的分类标签。# 文件路径: data/weak_label_generator.py import numpy as np import shapely.geometry as geometry def generate_weak_labels(gps_xy, footprints_gdf, radius15.0): 根据 GPS 平面坐标在半径 radius 内寻找候选建筑。 返回: 候选建筑 ID 列表、距离、当前最可能的正样本建筑 ID。 point geometry.Point(gps_xy) candidates [] for idx, row in footprints_gdf.iterrows(): dist point.distance(row.geometry) if dist radius: candidates.append((idx, dist)) # 弱标签规则示例距离最近的建筑作为正样本 if len(candidates) 0: return [], None candidates.sort(keylambda x: x[1]) # 这里简单取最近的建筑作为正样本 # 更严格的做法还需要判断相机朝向与建筑多边形的关系 positive_id candidates[0][0] return candidates, positive_id需要说明的是论文中并非简单取最近建筑作为正样本而是会结合相机朝向、建筑在图像中的投影面积来决定哪些建筑是“可见”的。当我们生成的训练标签出现明显噪声时可以采用后文第 7 节介绍的方法进行过滤。5.3 构建建筑分类 角度分类模型模型结构可以采用双分支设计主干网络ResNet18 或 ResNet50提取图像特征。分支 A建筑分类头输出维度 候选建筑总数。分支 B角度分类头输出维度 角度区间数例如 64。以下是一个简化的 PyTorch 实现# 文件路径: models/autocompass_model.py import torch import torch.nn as nn import torchvision.models as models class AutoCompassModel(nn.Module): def __init__(self, num_buildings1000, num_angle_bins64): super().__init__() # 使用 ResNet18 作为骨干网络 backbone models.resnet18(pretrainedTrue) self.features nn.Sequential( backbone.conv1, backbone.bn1, backbone.relu, backbone.maxpool, backbone.layer1, backbone.layer2, backbone.layer3, backbone.layer4, ) self.pool nn.AdaptiveAvgPool2d((1, 1)) # 建筑分类头 self.building_head nn.Sequential( nn.Linear(512, 256), nn.ReLU(), nn.Dropout(0.3), nn.Linear(256, num_buildings) ) # 角度分类头 self.heading_head nn.Sequential( nn.Linear(512, 256), nn.ReLU(), nn.Dropout(0.3), nn.Linear(256, num_angle_bins) ) def forward(self, x): feat self.features(x) feat self.pool(feat).flatten(1) building_logits self.building_head(feat) heading_logits self.heading_head(feat) return building_logits, heading_logits这里pretrainedTrue表示使用 ImageNet 预训练权重。在实际项目中建议先用大量街景图像做领域预训练再在目标城市上微调。城市建筑风格差异很大直接使用 ImageNet 权重会导致特征分布偏移。5.4 定义角度分类的标签编码角度分类核心是要把连续朝向映射到离散 bin。编码和解码分别如下# 文件路径: utils/heading_utils.py import numpy as np def heading_to_label(heading_deg, num_bins64): 将连续角度转换为分类 label。 角度范围: [0, 360) bin_size 360.0 / num_bins label int(np.clip(heading_deg // bin_size, 0, num_bins - 1)) return label def label_to_heading(label, num_bins64): 将分类 label或其 soft 概率分布反解为角度。 这里使用 bin 中心作为估计值。 bin_size 360.0 / num_bins return (label 0.5) * bin_size推理阶段如果你希望输出连续角度更推荐用 softmax 概率分布做加权期望def heading_from_distribution(probs): bins np.arange(probs.shape[0]) heading np.sum(probs * bins) * (360.0 / probs.shape[0]) return heading % 3605.5 训练循环训练时建筑分类使用 CrossEntropyLoss角度分类也使用 CrossEntropyLoss两者按权重相加。下面是一个训练一step的示意代码# 文件路径: train.py (核心片段) import torch import torch.nn.functional as F def train_step(model, batch, optimizer): images batch[image] # [B, 3, H, W] building_labels batch[building] # [B] heading_labels batch[heading] # [B] optimizer.zero_grad() building_logits, heading_logits model(images) loss_building F.cross_entropy(building_logits, building_labels) loss_heading F.cross_entropy(heading_logits, heading_labels) loss loss_building 0.5 * loss_heading loss.backward() optimizer.step() return { loss: loss.item(), loss_building: loss_building.item(), loss_heading: loss_heading.item(), }这里给角度损失降权是因为角度标签本身噪声更大权重太高会让模型过多拟合错误朝向。实际训练中这个超参数建议做一次简单扫参比如在 0.3 到 1.0 之间尝试。5.6 推理与多帧聚合# 文件路径: inference.py (核心片段) import numpy as np def infer_video(model, frame_list, window_size5): frame_list: 按时间顺序排列的帧张量形状 [(C, H, W), ...] 返回: 每帧聚合后的建筑 ID 与朝向 model.eval() all_building_probs [] all_heading_probs [] with torch.no_grad(): for frame in frame_list: img frame.unsqueeze(0) # [1, C, H, W] b_logits, h_logits model(img) b_probs torch.softmax(b_logits, dim1).squeeze(0).numpy() h_probs torch.softmax(h_logits, dim1).squeeze(0).numpy() all_building_probs.append(b_probs) all_heading_probs.append(h_probs) results [] for t in range(len(frame_list)): lo max(0, t - window_size // 2) hi min(len(frame_list), t window_size // 2 1) b_agg np.mean(all_building_probs[lo:hi], axis0) h_agg np.mean(all_heading_probs[lo:hi], axis0) building_id int(np.argmax(b_agg)) heading heading_from_distribution(h_agg) results.append({building_id: building_id, heading_deg: heading}) return results5.7 位置解算现在我们已经预测了“看到了哪个建筑”以及“朝向多少度”。最后一步是利用 GPS 先验与建筑多边形解算出相机粗略位置# 文件路径: utils/position_utils.py def estimate_position(gps_xy, building_polygon, heading_deg, offset_meter3.0): 从预测出的建筑与朝向估计相机位置。 这里做简化处理将 gps_xy 向 heading 方向做小距离偏移。 更精确的方式是把 GPS 先验投影到建筑边缘附近。 heading_rad np.deg2rad(heading_deg) dx offset_meter * np.cos(heading_rad) dy offset_meter * np.sin(heading_rad) estimated_xy (gps_xy[0] dx, gps_xy[1] dy) return estimated_xy如果建筑是多边形更合理的做法是把 GPS 先验点垂足投影到建筑边缘再把相机放在边缘外侧一个固定距离处。这样可以显著减小位置误差尤其当 GPS 漂移较严重时。6. 实验评估指标与结果分析6.1 常用的评估指标视觉定位系统评估需要同时关注位置与朝向AutoCompass 论文中主要使用了以下指标指标含义Position Error估计位置与真值位置之间的欧式距离单位米Heading Error估计朝向与真值朝向之间的角度误差单位度Recall2m / Recall5m位置误差小于 2m / 5m 的样本占比Median Error所有样本误差的中位数抗离群点能力强在使用这些指标时要注意误差统计方式是逐帧统计还是按轨迹段统计。逐帧统计会放大单帧异常按轨迹段平滑后统计更符合实际应用感受。6.2 各模块对精度的贡献从论文消融实验的设计思路来看有几点值得注意去掉多帧聚合单帧预测的中位误差明显上升这说明时序信息在定位中非常重要。去掉角度分类分支建筑识别准确率可能变化不大但最终位置误差会增加因为位置解算需要依赖朝向信息把 GPS 先验投影到正确方向。弱标签噪声过滤当训练数据中的 GPS 漂移较大时如果不做过滤模型识别准确率下降。这提醒我们弱标签质量直接决定了模型上限。我这里不写具体实验数值因为不同城市、不同数据采集设备的条件下结果差异较大。建议大家在自己的数据集上跑一遍消融重点关注“多帧窗口大小”和“候选建筑半径”这两个超参数。6.3 实际应用中的效果预期在公共地图建筑轮廓质量较高的城区借助 5-10m 精度的 GPS 先验AutoCompass 类方案通常可以达到米级定位精度和几度到十几度的朝向精度。相比纯 GPS位置精度有显著提升相比 SfM 方案省去了建图环节尤其在“一次性到达一个新城市”的场景下优势非常明显。但也要泼一盆冷水如果区域建筑轮廓缺失严重、街道两侧是大片空地或公园、GPS 信号受高架桥遮挡效果会明显退化。这类区域建议将 AutoCompass 作为辅助定位源与惯导、视觉里程计融合使用。7. 常见问题与排查思路7.1 训练损失下降但定位精度不稳定问题现象常见原因解决思路损失很低但位置误差大建筑分类过拟合到 GPS 附近的地图噪声增大候选建筑半径增加角度分类权重同一个建筑预测出多个不同朝向建筑在图像中占比较小角度信息弱提高训练图像分辨率增加多帧聚合窗口某些帧准确率突然下降GPS 跳变导致弱标签错误对 GPS 轨迹做卡尔曼滤波或滑动平均其中最常见的就是“过拟合 GPS 先验”。模型可能学到的是“在这个 GPS 附近就输出这个建筑”而没有真正学习图像特征。验证方法是在训练集中随机平移 GPS 坐标 5-10 米看模型输出是否明显变化。如果变化不大说明模型没有充分利用图像信息需要调整训练策略。7.2 候选建筑没有匹配项当半径 R 内没有任何建筑时默认做法是让模型输出一个“空类”或背景类。训练阶段可以为这类样本单独分配一个背景标签。推理阶段如果预测为背景可以认为当前区域没有可用的建筑先验此时不要强行输出位置而是返回低置信度结果交由上层融合逻辑处理。7.3 多帧聚合窗口大小怎么选窗口太大会导致轨迹“变钝”在车辆转弯时朝向滞后明显窗口太小又无法有效抑制单帧噪声。经验值是行人行走场景窗口 3-5 帧车辆行驶场景窗口 7-10 帧无人机高速运动窗口 3 帧以内核心原则是“窗口时长远小于轨迹动力学变化的特征时间”。例如车辆在 10fps 下 5 帧窗口对应 0.5 秒大多数转弯操作在 1-2 秒以上所以 5-7 帧是较安全的。7.4 角度分类在正北方向上误差大很多角度表示方法在 0°/360° 边界处存在不连续问题。例如 358°和 2° 在数值上相差 356°但实际只差 4°。解决方式有两种训练时把角度标签通过sin和cos编码为二维向量用回归或分类预测二维向量再反解角度。推理阶段对角度分布做平滑时使用循环均值circular mean代替普通均值。循环均值实现如下import numpy as np def circular_mean(angles_deg): rad np.deg2rad(angles_deg) x np.mean(np.cos(rad)) y np.mean(np.sin(rad)) return np.rad2deg(np.arctan2(y, x)) % 3607.5 公共地图建筑数据有偏移不同地图源之间可能存在系统性偏移例如 GCJ-02 与 WGS-84 坐标系的偏移。在数据预处理阶段需要确认 GPS 采集设备使用的坐标系与地图数据的坐标系是否一致。如果不一致必须先做坐标转换否则后续所有距离计算都会存在固定偏差且很难通过模型学习消除。8. 最佳实践与工程建议8.1 训练数据清洗虽然 AutoCompass 声称是弱标签学习但“弱”不代表“脏”。建议在训练前做以下几类过滤剔除 GPS 水平精度因子HDOP过高的样本。剔除相机朝向与 GPS 轨迹方向夹角异常的帧这类帧多半被遮挡或抖动严重。剔除建筑轮廓面积过小的样本小多边形通常是地图标注噪声。对同一场景的重复帧做去重防止模型对高频场景过拟合。8.2 多源地图融合单一地图源可能存在某个城市覆盖不全的问题。工程上可以将 OSM 和商业地图的建筑数据做融合以 OSM 为基础用商业卫星影像对轮廓做校正或者把两套建筑 footprint 都输入模型让模型自行选择更可信的一组特征。融合方式不建议直接在坐标层面做算术平均因为不同数据源可能在不同街区精度不同。更稳妥的做法是按区域训练多个分支由高层的路由网络根据 GPS 位置选择使用哪个分支。8.3 与现有定位系统互补AutoCompass 不适合单独作为高精度定位方案更推荐作为语义地图匹配层与以下系统融合IMU 航迹推算解决短时间 GPS 丢失问题。轮速里程计提供相对位移约束。视觉特征点追踪提供连续帧之间的相对位姿约束。GNSS RTK在高精度 GPS 可用时AutoCompass 可作为校验层。融合算法可以用扩展卡尔曼滤波EKF也可以简单地做一个加权平均权重根据信号质量实时调整。8.4 部署与量化如果要把模型部署到手机或嵌入式设备建议以下步骤将 ResNet18 替换为 MobileNetV3 或 EfficientNet-Lite。把角度分支的 64 分类改为 16 或者 32 分类精度损失通常很小。使用 INT8 量化在验证集上对比量化前后误差确认误差增加在可接受范围内。计算图固定后用 ONNX Runtime 或 TensorRT 做推理加速。8.5 日志与监控上线后需要监控三类指标建筑分类置信度分布如果长期偏低说明地图数据过期了。角度预测与 GPS 轨迹方向差两者偏差大说明正在进行车辆变道或地图坐标偏移。多帧聚合后输出的位置跳变幅度跳变过大说明当前区域建筑匹配不稳定需要调整候选半径。这些监控指标可以做成在线统计按城市、按时间段聚合便于及时发现地图更新滞后或采集设备异常。8.6 安全与合规边界使用公共地图数据时需要注意遵守地图服务商的服务条款尤其是涉及商业用途和下载频率限制时。采集图像时应确保不包含人脸、车牌等敏感信息如果包含在入训前做检测与脱敏。涉及坐标系转换时使用公开合法的转换接口不在境外服务器上保存敏感地理数据。9. 总结与下一步学习方向AutoCompass 的价值在于提供了一条“不建三维模型也能做视觉定位”的可行路径。它的核心思想并不复杂把视觉定位转化为“基于 GPS 先验的建筑识别 朝向分类”再用多帧聚合消除单帧噪声。这种做法非常契合当下城市级 AR、最后一公里导航、低成本自动驾驶数据闭环等需求。如果你准备在自己的项目里实践建议按下面顺序推进先拿一个建筑轮廓完整的小街区做端到端 demo验证整套流程是否跑通。再扩大数据规模重点加一些 GPS 漂移大、光照剧烈的样本。对比不同候选半径和角度 bin 数量的效果记录一组适合本地街区的超参数。最后接入业务系统的位姿融合模块。接下来可以继续学习的方向包括多任务学习在同一条训练链路里同时输出车道线、可通行区域形成更大的地图语义网络。Transformer 时序模型将多帧聚合从“预测层平均”升级为“特征层注意力融合”。矢量地图端到端直接从拓扑路网数据学习更细粒度的道路级定位而不局限于建筑级。视觉定位领域这两年变化很快但“几何先验 弱监督学习”的大方向会持续相当长一段时间。AutoCompass 这类工作用工程化的简单手段解决了一个实际落地难题值得在动手做定位项目之前先理解一遍。如果这篇文章对你有帮助可以收藏备用也欢迎在评论区一起讨论不同城市数据下的踩坑经验。
返回列表