Changelog¶
What changed between versions, kept by hand in the style of Keep a Changelog. A version is a tag, and a tag is what publishes the images, so the two never drift apart.
Unreleased¶
The first release, v0.1.0, is what this section becomes when it is tagged.
What it will carry:
Added¶
sfmkit, a Structure-from-Motion library in four layers (apps → render → data → core), enforced by import-linter rather than by good intentions. Ten stages, each a command,sfmkit rundoing them in order:calibrate,match,verify,reconstruct,localize,colmap,dense,evaluate,changes,figures. A stage the config says nothing about is walked past, so a project with no historical photograph and no COLMAP runs what it has.sfmkit new, a project laid out for you —data/scene/,configs/and a config that parses — with--photosto copy a directory of photographs in and list them. The layout a config is found by is written by the code that requires it rather than by the README.- A bundle adjustment of its own — Levenberg–Marquardt, an analytic
Jacobian, the points eliminated with the Schur complement — 58× faster than
the
scipy.optimize.least_squaresit replaced, and to a lower cost. - An old photograph placed in the model, its whole projection matrix solved for, focal length included, then refined in pixels under a Huber loss: 14 px of reprojection down to 2, and the same answer on every seed.
- A change map between that photograph and a modern one, once the two are aligned and their tones matched.
- Every result scored against COLMAP run from scratch on the same photographs: 0.30° mean rotation error over 14 cameras on Valencia, 0.60° on the old photograph.
sfmview, a web viewer of runs in ports and adapters: both models and the dense cloud in one frame, a photograph inside its camera's frustum, and a run drawn as it is being built, with a timeline to rewind it. It never imports sfmkit; a test fails if its environment so much as can.- The messages between them written down —
sfmcontracts/step.schema.json, an AsyncAPI document for the channels, OpenAPI from the viewer itself — and checked by both test suites. - Images for both packages, CPU and CUDA, and a compose file that runs the pipeline, the viewer and a broker together.
- A documentation site, a tutorial, and the measurements behind every number quoted, arguments included.