A lightweight, non-destructive diagnostic utility that pre-processes batches of field photographs before they enter SfM pipelines.
Project description
OpticTriage
OpticTriage is an advanced pre-processing and quality control pipeline for large-scale drone photogrammetry datasets. It filters out blurry, glary, or poorly-overlapped images, extracts EXIF/RTK telemetry, detects ArUco/ChArUco/ColorChecker targets, and exports instantly ready structures for Metashape, OpenDroneMap, and COLMAP.
Installation
Dependencies
OpticTriage relies on several system binaries which must be installed:
- ExifTool: Required for writing corrected telemetry back into DJI files.
- libexiv2: C++ library underneath pyexiv2 for fast EXIF extraction.
- libjpeg-turbo: Required for PyTurboJPEG to extract embedded raw previews quickly.
Ensure these are accessible in your system PATH.
If using the bundled version (via PyInstaller), the appropriate ExifTool binary is included in the bin/ directory.
Quick Start
# Clone the repository
git clone https://github.com/your-org/optictriage.git
cd optictriage
# Install dependencies (uv recommended)
uv pip install -e .
# Run the app
python src/optictriage/app.py
Workflow Tutorial
- Import Stage: Select your raw image directory and an output destination. OpticTriage utilizes SHA-256 chunked hashing to instantly flag duplicate files.
- Metadata & RTK: Scans DJI/Autel XMP payloads. Automatically corrects the
GPSAltitudeEXIF tag by utilizing RelativeAltitude + Base Station Elevation, directly rewriting the source file to prevent vertical bowing in SfM reconstructions. Flags any images with lost RTK Fixed states (Float/Single Point). - Quality Stage: Assesses focus/blur via a Gridded Laplacian (top 5% sharpest patches), exposure clipping, and glare estimation via true HSI color conversion. Images falling below your thresholds are flagged.
- Target Detection: Runs a computer vision pipeline (LAB CLAHE equalisation, Bilateral Filtering) to locate ArUco, ChArUco, and ColorChecker targets. Corners are refined to subpixel precision (
cornerSubPix) and serialized. - Export & Finalize: Copies images non-destructively to
passed/andflagged/folders. It generates a Python script to instantly spin up Agisoft Metashape, preparesimage_groups.txtandcameras.jsonfor ODM, and scaffoldsdatabase.dbwith an exact 64-byte OPENCV parameter blob for COLMAP.
GPU Acceleration
OpticTriage will probe your system on launch. If an Nvidia GPU with CUDA is detected (via OpenCV), it will engage a two-tier GPU path:
- Tier 1 (Compute Heavy): Grayscale/LAB conversion, Laplacian filters, and CLAHE.
- Tier 2 (Filtering): Bilateral Edge-Preserving noise reduction.
Note: The first GPU call permanently reserves approximately 100MB of VRAM for the CUDA context. Please terminate OpticTriage before launching downstream pipelines like Metashape or COLMAP to fully release this VRAM back to your solver.
Hardware Guidance
Minimum:
- CPU: Intel Core i7 / AMD Ryzen 7
- RAM: 32 GB
- GPU: Nvidia RTX 3060
- Storage: 1TB NVMe Gen3
Recommended:
- CPU: Intel Core i9 / AMD Ryzen 9
- RAM: 64 GB
- GPU: Nvidia RTX 4080 (Desktop or 150W+ Laptop Chassis. Note: Thin laptop chassis variants running at 80W TGP will drastically underperform on CUDA pipelines).
- Storage: 2TB NVMe Gen4
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file optictriage-0.1.0.tar.gz.
File metadata
- Download URL: optictriage-0.1.0.tar.gz
- Upload date:
- Size: 296.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df641c188ca415a57f608ed61797b6b89cd3f9ab7532ad0f66a58971b69623d2
|
|
| MD5 |
4590a47423f04ba17a92af9ce385893c
|
|
| BLAKE2b-256 |
9d5734371ce46b9c939d0c06bd1ecbf94e9c546435b42320277f1e762134a534
|
Provenance
The following attestation bundles were made for optictriage-0.1.0.tar.gz:
Publisher:
release.yml on mabo-du/optictriage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
optictriage-0.1.0.tar.gz -
Subject digest:
df641c188ca415a57f608ed61797b6b89cd3f9ab7532ad0f66a58971b69623d2 - Sigstore transparency entry: 1820512507
- Sigstore integration time:
-
Permalink:
mabo-du/optictriage@969511190595117ddbd922d006dd1fff5a8a4cfb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mabo-du
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@969511190595117ddbd922d006dd1fff5a8a4cfb -
Trigger Event:
push
-
Statement type:
File details
Details for the file optictriage-0.1.0-py3-none-any.whl.
File metadata
- Download URL: optictriage-0.1.0-py3-none-any.whl
- Upload date:
- Size: 58.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e39eac013bdb1e769a9604db97cefcc765a68f4889d0aabeac448fb4ec71eead
|
|
| MD5 |
d739e562650f1740a44cc516d30773ed
|
|
| BLAKE2b-256 |
b07a77cb3909c38da250069e6acee6c6bccb6204558e0eb9a884aeff89d10dcd
|
Provenance
The following attestation bundles were made for optictriage-0.1.0-py3-none-any.whl:
Publisher:
release.yml on mabo-du/optictriage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
optictriage-0.1.0-py3-none-any.whl -
Subject digest:
e39eac013bdb1e769a9604db97cefcc765a68f4889d0aabeac448fb4ec71eead - Sigstore transparency entry: 1820512605
- Sigstore integration time:
-
Permalink:
mabo-du/optictriage@969511190595117ddbd922d006dd1fff5a8a4cfb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mabo-du
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@969511190595117ddbd922d006dd1fff5a8a4cfb -
Trigger Event:
push
-
Statement type: