Earth Search
A library for efficient indexing & similarity search of satellite images.
Earth Search is built on top of Faiss (Facebook AI Similarity Search) with a number of feature extractors for indexing and querying satellite image embeddings.
Installation:
pip install earthsearch
Supported Features:
Images for chipping:
- Any geospatial image format, e.g., TIF, NITF, etc.
Images for indexing:
- Any image format, e.g., TIF, PNG, JPEG, etc.
- If you have a directory of chips, you can index them
Models:
- ResNet-18:
resnet18 - ResNet-34:
resnet34 - ResNet-50:
resnet50 - ResNet-101:
resnet101 - ResNet-152:
resnet152 - DINOv2 ViT-S/14 distilled:
dinov2_vits14 - DINOv2 ViT-S/14 distilled with Registers:
dinov2_vits14_reg - DINOv2 ViT-B/14 distilled:
dinov2_vitb14 - DINOv2 ViT-B/14 distilled with Registers:
dinov2_vitb14_reg - DINOv2 ViT-L/14 distilled:
dinov2_vitl14 - DINOv2 ViT-L/14 distilled with Registers:
dinov2_vitl14_reg - DINOv2 ViT-g/14:
dinov2_vitg14 - DINOv2 ViT-g/14 with Registers:
dinov2_vitg14_reg
Faiss Indices:
- L2
Planned Features:
Models/Algorithms:
- SIFT (Scale-Invariant Feature Transform)
- ORB (Oriented FAST and Rotated BRIEF)
- Hashing algorithms
Faiss Indices:
- IndexIVFFlat
- IndexHNSWFlat
- IndexLSH
- IndexBinaryFlat
- IndexBinaryIVF
Usage:
chip takes a directory of satellite imagery scenes and creates a directory of chips for indexing.
If you already have a directory of chips, you can skip this step and run index and search.
Package import usage:
from earthsearch.chip import chip
from earthsearch.index import index
from earthsearch.search import search
from earthsearch.core import show_search_results
image_dir = "directory/path/to/satellite/image/scenes"
chip_dir = "directory/path/to/write/image/chips"
window_size = 512
stride = 0.0
valid_exts = ["tif"]
index_path = "path/to/save/index/to.bin"
indexed_images_path = "path/to/write/indexed/image/paths/to.txt"
index_type = "L2"
model_type = "dinov2_vits14_reg"
device = "cuda" # or "mps", "cpu
batch_size = 32
query_image = "path/to/query/for/top_k/similar/images",
top_k = 10
chip(image_dir, chip_dir, window_size, stride, valid_exts, multiprocess=True)
index(chip_dir, index_path, indexed_images_path, index_type, model_type, device, batch_size, overwrite_index=False)
results = search(query_image, index_path, indexed_images_path, index_type, top_k, model_type, device)
for idx, result in enumerate(results):
print(f"{idx + 1}: {result["path"]} - Distance: {result["distance"]}")
show_search_results(query_image, results, max_display=top_k)
CLI usage:
earthsearch {chip,index,search} ...
usage: earthsearch chip [-h] --image_dir IMAGE_DIR --chip_dir CHIP_DIR
[--window_size WINDOW_SIZE] [--stride STRIDE]
[--valid_exts [VALID_EXTS ...]] [--multiprocess]
options:
-h, --help show this help message and exit
--image_dir IMAGE_DIR
Directory path to images
--chip_dir CHIP_DIR Directory path to write chips to
--window_size WINDOW_SIZE
Size of sliding window, e.g., 512
--stride STRIDE Amount of overlap in x, y direction, e.g., 0.2
--valid_exts [VALID_EXTS ...]
Image extensions to filter for
--multiprocess Use multiprocessing vs multithreading
usage: earthsearch index [-h] --image_dir IMAGE_DIR --index_path INDEX_PATH
--indexed_images_path INDEXED_IMAGES_PATH --index_type INDEX_TYPE
--model_type MODEL_TYPE [--device DEVICE] [--batch_size BATCH_SIZE]
[--overwrite_index]
options:
-h, --help show this help message and exit
--image_dir IMAGE_DIR
Path to directory of images to index
--index_path INDEX_PATH
Path to save index
--indexed_images_path INDEXED_IMAGES_PATH
Path to save file containing indexed image paths
--index_type INDEX_TYPE
Type of index to use (currently only using L2)
--model_type MODEL_TYPE
Type of model to use
--device DEVICE Device to use for feature extraction (cuda, mps, cpu)
--batch_size BATCH_SIZE
Number of images per batch
--overwrite_index Overwrite existing index of same index_path
(.venv) ✝ ~/repos/earthsearch main
usage: earthsearch search [-h] --query_image QUERY_IMAGE --index_path INDEX_PATH
--indexed_images_path INDEXED_IMAGES_PATH --index_type INDEX_TYPE
--top_k TOP_K --model_type MODEL_TYPE [--device DEVICE]
options:
-h, --help show this help message and exit
--query_image QUERY_IMAGE
Path to directory of images to index
--index_path INDEX_PATH
Path to saved index
--indexed_images_path INDEXED_IMAGES_PATH
Path to file containing indexed image paths
--index_type INDEX_TYPE
Type of index to use (currently only using L2)
--top_k TOP_K top k-Nearest Neighbors to return
--model_type MODEL_TYPE
Type of model to use
--device DEVICE Device to use for feature extraction (cuda, mps, cpu)
Metadata
Release files for earthsearch 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| earthsearch-0.1.5.tar.gz | 12.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| earthsearch-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.1 kB
Release files / earthsearch-0.1.5.tar.gz
| Download URL | earthsearch-0.1.5.tar.gz |
|---|---|
| Size | 12.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a74cad823a43d5ae9da7d09ceec9594bfdfd34bd15c08c87e84412dccc472bd2
|
|
BLAKE2b-256 checksum How to use checksums |
8b552e7b818bac2f8a68b317dd021867582eb56dba7d293d9db3bbd04270c64a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.2
|
Release files / earthsearch-0.1.5-py3-none-any.whl
| Download URL | earthsearch-0.1.5-py3-none-any.whl |
|---|---|
| Size | 13.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1e324bc2d1ad6eb1d1825ff79bc127c32bdf33d7d0b1b6944c4d759b546d4173
|
|
BLAKE2b-256 checksum How to use checksums |
ff1718218018a54a309f110408362ce14466b532bad887f1c5415bb251b21242
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.2
|