InsightAT v0.2.4 Release Notes
Overview
v0.2.4 brings major performance improvements for large-scale SfM (3000+ images), a new seed-evaluation framework for robust initial-pair selection, and a critical retriangulation bug fix.
18 files changed, 1957 insertions(+), 74 deletions(-)
Performance
BA Outlier Rejection — up to 8× faster
The angle-based outlier rejection stage (reject_outliers_angle_multiview) has been heavily optimized (previously 4141ms on large scenes):
- Eliminated
std::acos: Compare dot products against precomputed cos thresholds —angle ∈ [θ_min, θ_max] ⇔ dot ∈ [cos(θ_max), cos(θ_min)] - Early termination: Break inner loop as soon as a valid pair is found
- Split j-loop into
[0,i) ∪ (i,k)to remove thej==ibranch from the hot path - SoA zero-copy views (
obs_image_id_view,track_xyz_data) bypass function-call + assert overhead for ~2M hot-path calls - Removed
image_flatCSR array: Image index fetched on the fly — saves 8B×total_obs memory + one full fill pass - OMP chunk 64→256 for reduced scheduling overhead
Full-Scan Retriangulation — up to 6× faster
The full-scan retriangulation pass has been parallelized (previously 811ms):
- OMP parallel Phase 1 (
schedule(dynamic, 4096)): 3.4M tracks filtered in parallel with per-thread diagnostic counters (no atomics) - Quick pre-check: Count valid+restorable registered views with early termination at nv=2 — avoids expensive rebuild+undistort for tracks with insufficient views
- Serial Phase 2: Only the few tracks that pass all gates (safe shared-state operations)
New Feature: Seed Evaluation Framework
isat_seed_eval— New CLI tool for evaluating and comparing initial-pair (seed) strategiesseed_eval_common— Shared strategy/scoring infrastructure with unit tests- Pipeline integration: Seed evaluation is now a first-class step in
isat_sfm, with configurable strategy selection - Stable resection: Improvements to the resection module for more robust initial-pair selection
- Init gate controls: Seed-evaluated init gates are propagated into the final
isat_incremental_sfmrun - Scripts: Batch evaluation (
run_seed_eval_batch.py) and visualization (visualize_seed_eval.py) helpers - Design doc:
doc/dev-notes/2026-05-17-seed-eval-cli-design.md
Bug Fix
Retriangulation Epoch Gate for Non-Triangulated Tracks
mark_track_tri_attempted() + the epoch gate prevented retrying failed triangulations within the same global pose epoch, even when new image registrations added observations between full-scans. Non-triangulated tracks must be retried every full-scan to catch newly-triangulable tracks.
- Removed epoch gate for non-tri tracks
- Removed
mark_track_tri_attempted()calls in both quick pre-check and triangulation-failure paths - Epoch gate retained for already-triangulated tracks (correct behavior)
Tools Affected
| Tool | Impact |
|---|---|
isat_incremental_sfm |
Perf ↑, bug fix |
isat_sfm |
Perf ↑, new seed-eval integration |
isat_seed_eval |
New |
InsightAT v0.2.4 发布说明
概述
v0.2.4 带来了大规模 SfM(3000+ 图像)场景下的重大性能提升、全新的初始像对评估(Seed Evaluation)框架,以及一个关键的 retriangulation 错误修复。
18 个文件变更,+1957 / −74
性能优化
BA 角度外点剔除 — 最高 8 倍 加速
角度外点剔除阶段 reject_outliers_angle_multiview 经过大幅优化(此前在大场景中耗时 4141ms):
- 消除
std::acos:使用预计算的 cos 阈值直接比较点积 —角度 ∈ [θ_min, θ_max] ⇔ 点积 ∈ [cos(θ_max), cos(θ_min)] - 提前终止:找到有效配对后立即退出内层循环
- 拆分 j 循环 为
[0,i) ∪ (i,k),消除热路径中的j==i分支 - SoA 零拷贝视图(
obs_image_id_view、track_xyz_data)绕过函数调用 + assert 开销(约 200 万次热路径调用) - 移除
image_flatCSR 数组:图像索引实时获取 — 节省 8B×总观测数 内存 + 一次完整填充 - OMP chunk 64→256 减少调度开销
Full-Scan Retriangulation — 最高 6 倍 加速
full-scan retriangulation 阶段已并行化(此前耗时 811ms):
- OMP 并行 Phase 1(
schedule(dynamic, 4096)):340 万条 track 并行过滤,使用每线程诊断计数器(无原子操作) - 快速预检查:统计有效+可恢复的已注册视图,在 nv=2 时提前终止 — 避免对视图不足的 track 执行昂贵的重建+畸变校正
- 串行 Phase 2:只有通过所有关卡的小部分 track 进入此阶段(安全的共享状态操作)
新功能:Seed Evaluation 框架
isat_seed_eval— 新的 CLI 工具,用于评估和比较初始像对(seed)策略seed_eval_common— 共享的策略/评分基础设施,附带单元测试- 管线集成:Seed Evaluation 现在作为
isat_sfm的一级步骤,支持可配置的策略选择 - 稳定化 Resection:改进 resection 模块,使初始像对选择更鲁棒
- Init Gate 控制:seed evaluation 选出的最优 init gate 会传递到最终的
isat_incremental_sfm运行 - 辅助脚本:批量评估(
run_seed_eval_batch.py)和可视化(visualize_seed_eval.py) - 设计文档:
doc/dev-notes/2026-05-17-seed-eval-cli-design.md
Bug 修复
Non-Triangulated Track 的 Epoch Gate
mark_track_tri_attempted() + epoch gate 阻止了在同一全局 pose epoch 内重试失败的三角化,即使两次 full-scan 之间新增了图像注册(带来了新的观测)。未三角化的 track 必须在每次 full-scan 中重试,才能捕获到新增的可三角化机会。
- 移除了 non-tri track 的 epoch gate
- 移除了快速预检查和三角化失败路径中的
mark_track_tri_attempted()调用 - 已三角化的 track 保留 epoch gate(正确行为)
受影响的工具
| 工具 | 影响 |
|---|---|
isat_incremental_sfm |
性能提升 ↑,bug 修复 |
isat_sfm |
性能提升 ↑,新增 seed-eval 集成 |
isat_seed_eval |
新增 |