Context
Earth-observation archives contain evidence of how cities, infrastructure, vegetation, and land use evolve. The hard part is not collecting another image pair. It is finding the few relevant changes inside a very large archive without hand-writing a class taxonomy first.
Search Any Change is an end-to-end research prototype built within FOTBCD-CC. Its search index contains 420,175 before-and-after aerial patch pairs from the Rhône department, extracted from IGN imagery captured in 2017 and 2023. Each pair shows the same location at the two dates.
Rhône was excluded from the project’s training data. This search collection is separate from the 223,675 pairs used to build the full caption set: it applies the trained retrieval model to an unseen department. The interface gives an analyst three ways into that collection: a natural-language description, a clicked example on the map, or several selected examples.
Problem
Conventional change maps answer where pixels differ. Analysts usually ask something more specific: where did a quarry expand, where was a large building demolished, or which places changed like this example but not like that one?
Those queries do not fit a single fixed classifier. They require a representation that preserves visual change, a search index that responds interactively, and an interface that keeps the original imagery close enough to inspect every result.
Approach
The system has an offline preparation pipeline and an online search pipeline. I encode the imagery and build the index once; each search then encodes only the query and retrieves matching locations.
1. Prepare before-and-after patch pairs
I match the 2017 and 2023 IGN JP2 tiles by location and read aligned 512 × 512 pixel windows from both dates. Each pair covers the same 102.4 × 102.4 metre footprint. Windows at tile boundaries are shifted inward to retain full windows without adding artificial black borders.
The pipeline reads windows from the source tiles instead of writing hundreds of thousands of separate patch files. It records each pair’s source paths, pixel offsets, geographic bounds, and acquisition years so the exact imagery can be recovered later.
2. Encode each temporal pair
I load the retrieval checkpoint trained in FOTBCD-CC and process the pairs in GPU batches. Its shared DINOv3 encoder extracts features from both dates; the temporal fusion layers combine those features and their differences. The visual projection produces one normalized 512-dimensional vector per pair, representing the transition and its scene context.
This produces the 420,175 vectors for the Rhône search collection. No captions need to be generated for these pairs: the image–text relationship was learned during retrieval training.
I save the vectors in resumable NPZ shards alongside the patch metadata. Separating encoding from database import lets the GPU workload run independently of the search server.
3. Import the vectors and build the search index
Before importing, the loader validates vector dimensions, finite values, normalization, unique IDs, metadata lengths, and checkpoint signatures. It then inserts the vectors and their source metadata into Milvus in batches. Deterministic IDs and import progress tracking allow interrupted imports to resume.
The importer builds an HNSW index with cosine similarity on the embedding field for nearest-neighbour search, plus scalar indexes for checkpoint, tile, and year fields.
4. Turn a request into a query vector
The FastAPI service uses the same checkpoint as the indexed vectors and verifies their signatures before searching. The three query modes enter that shared vector space differently:
- Text: Qwen3-Embedding-0.6B and the trained text projection encode the description into a normalized 512-dimensional vector. Milvus retrieves nearby image-pair vectors.
- Map point: the service reads the before-and-after window around the clicked coordinates and encodes it with the visual branch. That vector retrieves similar transitions elsewhere.
- Multiple examples: the service retrieves the selected examples’ stored vectors and searches around their normalized average. It can rerank candidates by their weakest similarity to any selected example, favouring changes shared across the examples, or combine separate searches through reciprocal-rank fusion. An optional text query can further guide the ranking.
5. Return locations and inspect the evidence
The service returns ranked matches with similarity scores, coordinates, years, and source-window metadata. The Solara map client connects the ranked list to map markers and before-and-after previews, loading the original image windows for inspection.
An analyst can start with a description, inspect the returned changes, and select examples for a more focused search.
Technical decisions
The interface always returns coordinates, acquisition years, similarity scores, and links back to the source imagery. Search is treated as an inspection tool rather than a prediction oracle. The map, paired previews, and ranked list are synchronized so that a high score can be challenged immediately.
Experiments and limitations
What a text query retrieves
The query new red-roofed houses constructed beside agricultural fields combines a change event, roof appearance, and scene context. These are the three highest-ranked pairs from an exact cosine search over the 420,175 saved Rhône vectors, using the same retrieval checkpoint. Each row shows the earlier image on the left and the later image on the right.

Another query: trees removed along a road

These saved rankings illustrate the model’s results; they are not screenshots of the map interface or measurements of the approximate Milvus index’s accuracy.
The DINOv3/Qwen design connects temporal visual features with language, allowing an analyst to search for a described transition and inspect the before-and-after evidence behind each match. Searching Rhône without using its imagery for project training provides a concrete test of geographic transfer. The displayed results illustrate that use; they do not establish retrieval accuracy across the department.
Conclusion
Search Any Change brings the trained retrieval model into a complete search workflow: preparing temporal patches, encoding them, building a Milvus index, and serving queries through an interactive map. The same 420,175 indexed pairs can be searched with text, a map point, or several examples, with the original before-and-after imagery available to inspect each match.
Applying this pipeline to Rhône, a department excluded from project training, extends the work beyond the captioning collection. It lets an analyst explore changes in an unseen region and refine what they are looking for without training a classifier for each question. The retrieved locations provide evidence to review; their similarity scores remain search signals rather than verified change labels.