optictriage 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- optictriage-0.1.0/.aidevops.json +39 -0
- optictriage-0.1.0/.beads/.gitignore +40 -0
- optictriage-0.1.0/.beads/config.yaml +4 -0
- optictriage-0.1.0/.beads/issues.jsonl +0 -0
- optictriage-0.1.0/.beads/metadata.json +4 -0
- optictriage-0.1.0/.gitattributes +2 -0
- optictriage-0.1.0/.github/workflows/release.yml +84 -0
- optictriage-0.1.0/.gitignore +17 -0
- optictriage-0.1.0/AGENTS.md +50 -0
- optictriage-0.1.0/CHANGELOG.md +15 -0
- optictriage-0.1.0/CLAUDE.md +50 -0
- optictriage-0.1.0/LICENSE +21 -0
- optictriage-0.1.0/PKG-INFO +81 -0
- optictriage-0.1.0/README.md +55 -0
- optictriage-0.1.0/TODO.md +100 -0
- optictriage-0.1.0/USER_GUIDE.md +38 -0
- optictriage-0.1.0/bin/exiftool.exe +0 -0
- optictriage-0.1.0/bin/exiftool_linux +0 -0
- optictriage-0.1.0/bin/exiftool_mac +0 -0
- optictriage-0.1.0/docs/G-Product Requirements Document.md +147 -0
- optictriage-0.1.0/docs/Q-Product Requirements Document.md +116 -0
- optictriage-0.1.0/docs/research-papers/A Practical Guide to Photogrammetry Pre-Processing for Archaeologists_ From Raw Images to Georeferenced Models.md +98 -0
- optictriage-0.1.0/docs/research-papers/Drone Data for Photogrammetry Integration.md +316 -0
- optictriage-0.1.0/docs/research-papers/From CPU Fallback to GPU Acceleration_ A Scalable Optimization Blueprint for the OpticTriage Photogrammetry Pre-Processor.md +74 -0
- optictriage-0.1.0/docs/research-papers/From Drone Metadata to 3D Reconstruction_ A Practical Guide to UAV Telemetry Processing, Geospatial QC, and SfM Export for OpticTriage.md +92 -0
- optictriage-0.1.0/docs/research-papers/From Field to Reconstruction_ A Diagnostic Framework for Automated Photogrammetry Pre-Processing in Archaeological Science.md +134 -0
- optictriage-0.1.0/docs/research-papers/OpticTriage_ OpenCV Optimization Research.md +274 -0
- optictriage-0.1.0/docs/research-papers/Photogrammetry Pre-processing Research for Archaeology v2.md +321 -0
- optictriage-0.1.0/docs/research-papers/Photogrammetry Pre-processing Research for Archaeology.md +363 -0
- optictriage-0.1.0/docs/research-papers/Photogrammetry Pre-processing Tool Research.md +316 -0
- optictriage-0.1.0/docs/research-prompts/01_photogrammetry_input_requirements.txt +12 -0
- optictriage-0.1.0/docs/research-prompts/02_coded_photogrammetry_targets.txt +12 -0
- optictriage-0.1.0/docs/research-prompts/03_image_quality_metrics.txt +12 -0
- optictriage-0.1.0/docs/research-prompts/04_exif_metadata_standards.txt +12 -0
- optictriage-0.1.0/docs/research-prompts/05_colour_calibration_targets.txt +12 -0
- optictriage-0.1.0/docs/research-prompts/06_opendronemap_input_format.txt +12 -0
- optictriage-0.1.0/docs/research-prompts/07_supp_drone_survey_flight_planning.txt +13 -0
- optictriage-0.1.0/docs/research-prompts/08_gpu_acceleration_opencv_pipelines.txt +61 -0
- optictriage-0.1.0/docs/research-prompts/09_drone_telemetry_rtk_colmap_integration.txt +24 -0
- optictriage-0.1.0/docs/scope.md +159 -0
- optictriage-0.1.0/migrations/AGENTS.md +5 -0
- optictriage-0.1.0/optictriage.spec +58 -0
- optictriage-0.1.0/pyproject.toml +36 -0
- optictriage-0.1.0/schemas/AGENTS.md +5 -0
- optictriage-0.1.0/seeds/AGENTS.md +5 -0
- optictriage-0.1.0/src/optictriage/__init__.py +0 -0
- optictriage-0.1.0/src/optictriage/__main__.py +11 -0
- optictriage-0.1.0/src/optictriage/app.py +56 -0
- optictriage-0.1.0/src/optictriage/database.py +56 -0
- optictriage-0.1.0/src/optictriage/database_migration.py +47 -0
- optictriage-0.1.0/src/optictriage/exporters/colmap.py +119 -0
- optictriage-0.1.0/src/optictriage/exporters/csv_manifest.py +48 -0
- optictriage-0.1.0/src/optictriage/exporters/gps_overlap.py +152 -0
- optictriage-0.1.0/src/optictriage/exporters/metashape.py +70 -0
- optictriage-0.1.0/src/optictriage/exporters/odm.py +100 -0
- optictriage-0.1.0/src/optictriage/exporters/rtk_validator.py +47 -0
- optictriage-0.1.0/src/optictriage/metadata/dji_fix.py +77 -0
- optictriage-0.1.0/src/optictriage/metadata/exif_reader.py +84 -0
- optictriage-0.1.0/src/optictriage/metadata/exif_writer.py +63 -0
- optictriage-0.1.0/src/optictriage/metadata/validators.py +45 -0
- optictriage-0.1.0/src/optictriage/models.py +126 -0
- optictriage-0.1.0/src/optictriage/pipeline.py +54 -0
- optictriage-0.1.0/src/optictriage/stages/base.py +39 -0
- optictriage-0.1.0/src/optictriage/stages/color_stage.py +156 -0
- optictriage-0.1.0/src/optictriage/stages/exif_stage.py +152 -0
- optictriage-0.1.0/src/optictriage/stages/export_stage.py +167 -0
- optictriage-0.1.0/src/optictriage/stages/gpx_stage.py +96 -0
- optictriage-0.1.0/src/optictriage/stages/import_stage.py +169 -0
- optictriage-0.1.0/src/optictriage/stages/quality_stage.py +171 -0
- optictriage-0.1.0/src/optictriage/stages/target_stage.py +113 -0
- optictriage-0.1.0/src/optictriage/ui/blur_histogram.py +97 -0
- optictriage-0.1.0/src/optictriage/ui/dashboard.py +102 -0
- optictriage-0.1.0/src/optictriage/ui/export_panel.py +117 -0
- optictriage-0.1.0/src/optictriage/ui/import_panel.py +144 -0
- optictriage-0.1.0/src/optictriage/ui/main_window.py +99 -0
- optictriage-0.1.0/src/optictriage/ui/metadata_panel.py +89 -0
- optictriage-0.1.0/src/optictriage/ui/target_overlay.py +74 -0
- optictriage-0.1.0/src/optictriage/vision/blur.py +54 -0
- optictriage-0.1.0/src/optictriage/vision/colorchecker.py +148 -0
- optictriage-0.1.0/src/optictriage/vision/exposure.py +30 -0
- optictriage-0.1.0/src/optictriage/vision/glare.py +43 -0
- optictriage-0.1.0/src/optictriage/vision/gpu_accel.py +50 -0
- optictriage-0.1.0/src/optictriage/vision/preprocessing.py +72 -0
- optictriage-0.1.0/src/optictriage/vision/raw_preview.py +62 -0
- optictriage-0.1.0/src/optictriage/vision/targets.py +75 -0
- optictriage-0.1.0/src/optictriage/workers.py +56 -0
- optictriage-0.1.0/tests/__init__.py +0 -0
- optictriage-0.1.0/tests/profile_pipeline.py +71 -0
- optictriage-0.1.0/tests/test_colmap.py +39 -0
- optictriage-0.1.0/tests/test_color_normalization.py +121 -0
- optictriage-0.1.0/tests/test_e2e_pipeline.py +210 -0
- optictriage-0.1.0/tests/test_gpx.py +88 -0
- optictriage-0.1.0/tests/test_multiprocessing.py +37 -0
- optictriage-0.1.0/tests/test_phash.py +56 -0
- optictriage-0.1.0/tests/test_pipeline.py +130 -0
- optictriage-0.1.0/tests/test_segmentation.py +86 -0
- optictriage-0.1.0/todo/PLANS.md +129 -0
- optictriage-0.1.0/todo/tasks/.gitkeep +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "3.20.59",
|
|
3
|
+
"initialized": "2026-06-13T23:35:44Z",
|
|
4
|
+
"init_scope": "minimal",
|
|
5
|
+
"agent_source": false,
|
|
6
|
+
"features": {
|
|
7
|
+
"planning": true,
|
|
8
|
+
"git_workflow": true,
|
|
9
|
+
"code_quality": true,
|
|
10
|
+
"time_tracking": true,
|
|
11
|
+
"database": true,
|
|
12
|
+
"beads": true,
|
|
13
|
+
"sops": false,
|
|
14
|
+
"security": true
|
|
15
|
+
},
|
|
16
|
+
"time_tracking": {
|
|
17
|
+
"enabled": true,
|
|
18
|
+
"prompt_on_commit": true,
|
|
19
|
+
"auto_record_branch_start": true
|
|
20
|
+
},
|
|
21
|
+
"database": {
|
|
22
|
+
"enabled": true,
|
|
23
|
+
"schema_path": "schemas",
|
|
24
|
+
"migrations_path": "migrations",
|
|
25
|
+
"seeds_path": "seeds",
|
|
26
|
+
"auto_generate_migration": true
|
|
27
|
+
},
|
|
28
|
+
"beads": {
|
|
29
|
+
"enabled": true,
|
|
30
|
+
"sync_on_commit": false,
|
|
31
|
+
"auto_ready_check": true
|
|
32
|
+
},
|
|
33
|
+
"sops": {
|
|
34
|
+
"enabled": false,
|
|
35
|
+
"backend": "age",
|
|
36
|
+
"patterns": ["*.secret.yaml", "*.secret.json", "configs/*.enc.json", "configs/*.enc.yaml"]
|
|
37
|
+
},
|
|
38
|
+
"plugins": []
|
|
39
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Database
|
|
2
|
+
*.db
|
|
3
|
+
*.db-journal
|
|
4
|
+
*.db-shm
|
|
5
|
+
*.db-wal
|
|
6
|
+
|
|
7
|
+
# Lock files
|
|
8
|
+
*.lock
|
|
9
|
+
|
|
10
|
+
# Temporary
|
|
11
|
+
last-touched
|
|
12
|
+
*.tmp
|
|
13
|
+
|
|
14
|
+
# Local history backups
|
|
15
|
+
.br_history/
|
|
16
|
+
|
|
17
|
+
# Sync state (local-only, per-machine)
|
|
18
|
+
.sync.lock
|
|
19
|
+
sync_base.jsonl
|
|
20
|
+
|
|
21
|
+
# Merge artifacts (temporary files from 3-way merge)
|
|
22
|
+
beads.base.jsonl
|
|
23
|
+
beads.base.meta.json
|
|
24
|
+
beads.left.jsonl
|
|
25
|
+
beads.left.meta.json
|
|
26
|
+
beads.right.jsonl
|
|
27
|
+
beads.right.meta.json
|
|
28
|
+
|
|
29
|
+
# Daemon runtime files
|
|
30
|
+
daemon.lock
|
|
31
|
+
daemon.log
|
|
32
|
+
daemon.pid
|
|
33
|
+
bd.sock
|
|
34
|
+
sync-state.json
|
|
35
|
+
|
|
36
|
+
# Worktree redirect file
|
|
37
|
+
redirect
|
|
38
|
+
|
|
39
|
+
# bv (beads viewer) lock file
|
|
40
|
+
.bv.lock
|
|
File without changes
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build-executables:
|
|
10
|
+
name: Build OS Installers
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
15
|
+
permissions:
|
|
16
|
+
contents: write
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout Repository
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Set up Python
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: '3.11'
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: |
|
|
29
|
+
python -m pip install --upgrade pip
|
|
30
|
+
pip install -e .[dev] pyinstaller
|
|
31
|
+
|
|
32
|
+
- name: Build with PyInstaller
|
|
33
|
+
run: pyinstaller optictriage.spec
|
|
34
|
+
|
|
35
|
+
- name: Compress Linux/macOS
|
|
36
|
+
if: runner.os != 'Windows'
|
|
37
|
+
run: |
|
|
38
|
+
cd dist
|
|
39
|
+
tar -czvf ../optictriage-${{ runner.os }}.tar.gz optictriage
|
|
40
|
+
shell: bash
|
|
41
|
+
|
|
42
|
+
- name: Compress Windows
|
|
43
|
+
if: runner.os == 'Windows'
|
|
44
|
+
run: |
|
|
45
|
+
Compress-Archive -Path dist/optictriage -DestinationPath optictriage-Windows.zip
|
|
46
|
+
shell: powershell
|
|
47
|
+
|
|
48
|
+
- name: Upload Release Asset
|
|
49
|
+
uses: softprops/action-gh-release@v2
|
|
50
|
+
with:
|
|
51
|
+
files: |
|
|
52
|
+
optictriage-*.tar.gz
|
|
53
|
+
optictriage-*.zip
|
|
54
|
+
env:
|
|
55
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
56
|
+
|
|
57
|
+
publish-pypi:
|
|
58
|
+
name: Publish to PyPI
|
|
59
|
+
needs: build-executables
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
environment:
|
|
62
|
+
name: pypi
|
|
63
|
+
url: https://pypi.org/p/optictriage
|
|
64
|
+
permissions:
|
|
65
|
+
id-token: write
|
|
66
|
+
contents: read
|
|
67
|
+
|
|
68
|
+
steps:
|
|
69
|
+
- name: Checkout Repository
|
|
70
|
+
uses: actions/checkout@v4
|
|
71
|
+
|
|
72
|
+
- name: Set up Python
|
|
73
|
+
uses: actions/setup-python@v5
|
|
74
|
+
with:
|
|
75
|
+
python-version: '3.11'
|
|
76
|
+
|
|
77
|
+
- name: Install build tool
|
|
78
|
+
run: python -m pip install build
|
|
79
|
+
|
|
80
|
+
- name: Build Source Distribution and Wheel
|
|
81
|
+
run: python -m build
|
|
82
|
+
|
|
83
|
+
- name: Publish to PyPI
|
|
84
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<!-- gitnexus:start -->
|
|
2
|
+
# OpticTriage — Session Startup
|
|
3
|
+
|
|
4
|
+
> **Pre-read at session start:** Before any other work, review the Implementation Plan
|
|
5
|
+
> at `docs/Implementation docs/01_Implementation_Plan_Synthesis.md` to understand
|
|
6
|
+
> the current phase, completed milestones, and immediate next tasks.
|
|
7
|
+
> This ensures every session is aligned with the project roadmap.
|
|
8
|
+
|
|
9
|
+
# GitNexus — Code Intelligence
|
|
10
|
+
|
|
11
|
+
This project is indexed by GitNexus as **optictriage** (132 symbols, 131 relationships, 0 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
|
|
12
|
+
|
|
13
|
+
> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first.
|
|
14
|
+
|
|
15
|
+
## Always Do
|
|
16
|
+
|
|
17
|
+
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `gitnexus_impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
|
|
18
|
+
- **MUST run `gitnexus_detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows.
|
|
19
|
+
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
|
|
20
|
+
- When exploring unfamiliar code, use `gitnexus_query({query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
|
|
21
|
+
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `gitnexus_context({name: "symbolName"})`.
|
|
22
|
+
|
|
23
|
+
## Never Do
|
|
24
|
+
|
|
25
|
+
- NEVER edit a function, class, or method without first running `gitnexus_impact` on it.
|
|
26
|
+
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
|
|
27
|
+
- NEVER rename symbols with find-and-replace — use `gitnexus_rename` which understands the call graph.
|
|
28
|
+
- NEVER commit changes without running `gitnexus_detect_changes()` to check affected scope.
|
|
29
|
+
|
|
30
|
+
## Resources
|
|
31
|
+
|
|
32
|
+
| Resource | Use for |
|
|
33
|
+
|----------|---------|
|
|
34
|
+
| `gitnexus://repo/optictriage/context` | Codebase overview, check index freshness |
|
|
35
|
+
| `gitnexus://repo/optictriage/clusters` | All functional areas |
|
|
36
|
+
| `gitnexus://repo/optictriage/processes` | All execution flows |
|
|
37
|
+
| `gitnexus://repo/optictriage/process/{name}` | Step-by-step execution trace |
|
|
38
|
+
|
|
39
|
+
## CLI
|
|
40
|
+
|
|
41
|
+
| Task | Read this skill file |
|
|
42
|
+
|------|---------------------|
|
|
43
|
+
| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` |
|
|
44
|
+
| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` |
|
|
45
|
+
| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` |
|
|
46
|
+
| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` |
|
|
47
|
+
| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` |
|
|
48
|
+
| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` |
|
|
49
|
+
|
|
50
|
+
<!-- gitnexus:end -->
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.1.0] - 2026-06-15
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Core Engine:** Built a multiprocessing-enabled framework for evaluating image quality across CPU-bound operations.
|
|
9
|
+
- **Color Normalization:** Non-destructive color correction module using cv2.mcc ColorCheckers and CIE 2000 ΔE metrics.
|
|
10
|
+
- **Quality Analysis:** Exposure clipping detection (shadows and highlights) and HSI-based veiling glare scoring.
|
|
11
|
+
- **Blur Detection:** Laplacian variance grid analysis to detect out-of-focus imagery.
|
|
12
|
+
- **Near-Duplicates:** Sequential perceptual hashing (dhash) with dynamic temporal ordering to flag hovering drone duplicate frames.
|
|
13
|
+
- **Targets:** Automatic identification of ArUco and ChArUco markers, exporting subpixel coordinate detections.
|
|
14
|
+
- **Exporters:** Seamless CSV manifest generation, COLMAP database seeding (`database.db`), WebODM `gcp_list.txt` formatting, and Metashape `run_metashape.py` Python automation scripts.
|
|
15
|
+
- **Testing:** Comprehensive end-to-end `pytest` suite simulating drone flights, synthetic metadata injections, and full pipeline permutations.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<!-- gitnexus:start -->
|
|
2
|
+
# OpticTriage — Session Startup
|
|
3
|
+
|
|
4
|
+
> **Pre-read at session start:** Before any other work, review the Implementation Plan
|
|
5
|
+
> at `docs/Implementation docs/01_Implementation_Plan_Synthesis.md` to understand
|
|
6
|
+
> the current phase, completed milestones, and immediate next tasks.
|
|
7
|
+
> This ensures every session is aligned with the project roadmap.
|
|
8
|
+
|
|
9
|
+
# GitNexus — Code Intelligence
|
|
10
|
+
|
|
11
|
+
This project is indexed by GitNexus as **optictriage** (132 symbols, 131 relationships, 0 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
|
|
12
|
+
|
|
13
|
+
> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first.
|
|
14
|
+
|
|
15
|
+
## Always Do
|
|
16
|
+
|
|
17
|
+
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `gitnexus_impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
|
|
18
|
+
- **MUST run `gitnexus_detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows.
|
|
19
|
+
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
|
|
20
|
+
- When exploring unfamiliar code, use `gitnexus_query({query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
|
|
21
|
+
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `gitnexus_context({name: "symbolName"})`.
|
|
22
|
+
|
|
23
|
+
## Never Do
|
|
24
|
+
|
|
25
|
+
- NEVER edit a function, class, or method without first running `gitnexus_impact` on it.
|
|
26
|
+
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
|
|
27
|
+
- NEVER rename symbols with find-and-replace — use `gitnexus_rename` which understands the call graph.
|
|
28
|
+
- NEVER commit changes without running `gitnexus_detect_changes()` to check affected scope.
|
|
29
|
+
|
|
30
|
+
## Resources
|
|
31
|
+
|
|
32
|
+
| Resource | Use for |
|
|
33
|
+
|----------|---------|
|
|
34
|
+
| `gitnexus://repo/optictriage/context` | Codebase overview, check index freshness |
|
|
35
|
+
| `gitnexus://repo/optictriage/clusters` | All functional areas |
|
|
36
|
+
| `gitnexus://repo/optictriage/processes` | All execution flows |
|
|
37
|
+
| `gitnexus://repo/optictriage/process/{name}` | Step-by-step execution trace |
|
|
38
|
+
|
|
39
|
+
## CLI
|
|
40
|
+
|
|
41
|
+
| Task | Read this skill file |
|
|
42
|
+
|------|---------------------|
|
|
43
|
+
| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` |
|
|
44
|
+
| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` |
|
|
45
|
+
| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` |
|
|
46
|
+
| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` |
|
|
47
|
+
| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` |
|
|
48
|
+
| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` |
|
|
49
|
+
|
|
50
|
+
<!-- gitnexus:end -->
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 OpticTriage
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: optictriage
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A lightweight, non-destructive diagnostic utility that pre-processes batches of field photographs before they enter SfM pipelines.
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Requires-Dist: gpxpy>=1.6.0
|
|
8
|
+
Requires-Dist: imagehash>=4.3.1
|
|
9
|
+
Requires-Dist: matplotlib>=3.7.0
|
|
10
|
+
Requires-Dist: numpy>=1.24.0
|
|
11
|
+
Requires-Dist: opencv-python>=4.8.0
|
|
12
|
+
Requires-Dist: pandas>=2.0.0
|
|
13
|
+
Requires-Dist: psutil>=5.9.0
|
|
14
|
+
Requires-Dist: pyexiv2>=2.14.0
|
|
15
|
+
Requires-Dist: pyproj>=3.6.0
|
|
16
|
+
Requires-Dist: pyqt6>=6.5.0
|
|
17
|
+
Requires-Dist: pyturbojpeg>=1.7.0
|
|
18
|
+
Requires-Dist: rawpy>=0.19.0
|
|
19
|
+
Requires-Dist: scipy>=1.11.0
|
|
20
|
+
Requires-Dist: shapely>=2.0.0
|
|
21
|
+
Requires-Dist: sqlalchemy>=2.0.0
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest-qt>=4.2.0; extra == 'dev'
|
|
24
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
|
|
27
|
+
# OpticTriage
|
|
28
|
+
|
|
29
|
+
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.
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
|
|
33
|
+
### Dependencies
|
|
34
|
+
OpticTriage relies on several system binaries which must be installed:
|
|
35
|
+
- **ExifTool**: Required for writing corrected telemetry back into DJI files.
|
|
36
|
+
- **libexiv2**: C++ library underneath pyexiv2 for fast EXIF extraction.
|
|
37
|
+
- **libjpeg-turbo**: Required for PyTurboJPEG to extract embedded raw previews quickly.
|
|
38
|
+
|
|
39
|
+
Ensure these are accessible in your system `PATH`.
|
|
40
|
+
If using the bundled version (via PyInstaller), the appropriate ExifTool binary is included in the `bin/` directory.
|
|
41
|
+
|
|
42
|
+
### Quick Start
|
|
43
|
+
```bash
|
|
44
|
+
# Clone the repository
|
|
45
|
+
git clone https://github.com/your-org/optictriage.git
|
|
46
|
+
cd optictriage
|
|
47
|
+
|
|
48
|
+
# Install dependencies (uv recommended)
|
|
49
|
+
uv pip install -e .
|
|
50
|
+
|
|
51
|
+
# Run the app
|
|
52
|
+
python src/optictriage/app.py
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Workflow Tutorial
|
|
56
|
+
1. **Import Stage**: Select your raw image directory and an output destination. OpticTriage utilizes SHA-256 chunked hashing to instantly flag duplicate files.
|
|
57
|
+
2. **Metadata & RTK**: Scans DJI/Autel XMP payloads. Automatically corrects the `GPSAltitude` EXIF 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).
|
|
58
|
+
3. **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.
|
|
59
|
+
4. **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.
|
|
60
|
+
5. **Export & Finalize**: Copies images non-destructively to `passed/` and `flagged/` folders. It generates a Python script to instantly spin up Agisoft Metashape, prepares `image_groups.txt` and `cameras.json` for ODM, and scaffolds `database.db` with an exact 64-byte OPENCV parameter blob for COLMAP.
|
|
61
|
+
|
|
62
|
+
## GPU Acceleration
|
|
63
|
+
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:
|
|
64
|
+
- **Tier 1 (Compute Heavy)**: Grayscale/LAB conversion, Laplacian filters, and CLAHE.
|
|
65
|
+
- **Tier 2 (Filtering)**: Bilateral Edge-Preserving noise reduction.
|
|
66
|
+
|
|
67
|
+
*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.*
|
|
68
|
+
|
|
69
|
+
## Hardware Guidance
|
|
70
|
+
|
|
71
|
+
**Minimum:**
|
|
72
|
+
- CPU: Intel Core i7 / AMD Ryzen 7
|
|
73
|
+
- RAM: 32 GB
|
|
74
|
+
- GPU: Nvidia RTX 3060
|
|
75
|
+
- Storage: 1TB NVMe Gen3
|
|
76
|
+
|
|
77
|
+
**Recommended:**
|
|
78
|
+
- CPU: Intel Core i9 / AMD Ryzen 9
|
|
79
|
+
- RAM: 64 GB
|
|
80
|
+
- GPU: Nvidia RTX 4080 (Desktop or 150W+ Laptop Chassis. *Note: Thin laptop chassis variants running at 80W TGP will drastically underperform on CUDA pipelines*).
|
|
81
|
+
- Storage: 2TB NVMe Gen4
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# OpticTriage
|
|
2
|
+
|
|
3
|
+
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.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### Dependencies
|
|
8
|
+
OpticTriage relies on several system binaries which must be installed:
|
|
9
|
+
- **ExifTool**: Required for writing corrected telemetry back into DJI files.
|
|
10
|
+
- **libexiv2**: C++ library underneath pyexiv2 for fast EXIF extraction.
|
|
11
|
+
- **libjpeg-turbo**: Required for PyTurboJPEG to extract embedded raw previews quickly.
|
|
12
|
+
|
|
13
|
+
Ensure these are accessible in your system `PATH`.
|
|
14
|
+
If using the bundled version (via PyInstaller), the appropriate ExifTool binary is included in the `bin/` directory.
|
|
15
|
+
|
|
16
|
+
### Quick Start
|
|
17
|
+
```bash
|
|
18
|
+
# Clone the repository
|
|
19
|
+
git clone https://github.com/your-org/optictriage.git
|
|
20
|
+
cd optictriage
|
|
21
|
+
|
|
22
|
+
# Install dependencies (uv recommended)
|
|
23
|
+
uv pip install -e .
|
|
24
|
+
|
|
25
|
+
# Run the app
|
|
26
|
+
python src/optictriage/app.py
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Workflow Tutorial
|
|
30
|
+
1. **Import Stage**: Select your raw image directory and an output destination. OpticTriage utilizes SHA-256 chunked hashing to instantly flag duplicate files.
|
|
31
|
+
2. **Metadata & RTK**: Scans DJI/Autel XMP payloads. Automatically corrects the `GPSAltitude` EXIF 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).
|
|
32
|
+
3. **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.
|
|
33
|
+
4. **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.
|
|
34
|
+
5. **Export & Finalize**: Copies images non-destructively to `passed/` and `flagged/` folders. It generates a Python script to instantly spin up Agisoft Metashape, prepares `image_groups.txt` and `cameras.json` for ODM, and scaffolds `database.db` with an exact 64-byte OPENCV parameter blob for COLMAP.
|
|
35
|
+
|
|
36
|
+
## GPU Acceleration
|
|
37
|
+
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:
|
|
38
|
+
- **Tier 1 (Compute Heavy)**: Grayscale/LAB conversion, Laplacian filters, and CLAHE.
|
|
39
|
+
- **Tier 2 (Filtering)**: Bilateral Edge-Preserving noise reduction.
|
|
40
|
+
|
|
41
|
+
*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.*
|
|
42
|
+
|
|
43
|
+
## Hardware Guidance
|
|
44
|
+
|
|
45
|
+
**Minimum:**
|
|
46
|
+
- CPU: Intel Core i7 / AMD Ryzen 7
|
|
47
|
+
- RAM: 32 GB
|
|
48
|
+
- GPU: Nvidia RTX 3060
|
|
49
|
+
- Storage: 1TB NVMe Gen3
|
|
50
|
+
|
|
51
|
+
**Recommended:**
|
|
52
|
+
- CPU: Intel Core i9 / AMD Ryzen 9
|
|
53
|
+
- RAM: 64 GB
|
|
54
|
+
- GPU: Nvidia RTX 4080 (Desktop or 150W+ Laptop Chassis. *Note: Thin laptop chassis variants running at 80W TGP will drastically underperform on CUDA pipelines*).
|
|
55
|
+
- Storage: 2TB NVMe Gen4
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
mode: subagent
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
6
|
+
<!-- SPDX-FileCopyrightText: 2025-2026 Marcus Quinn -->
|
|
7
|
+
# TODO
|
|
8
|
+
|
|
9
|
+
Project task tracking with time estimates, dependencies, and TOON-enhanced parsing.
|
|
10
|
+
|
|
11
|
+
Compatible with [todo-md](https://github.com/todo-md/todo-md), [todomd](https://github.com/todomd/todo.md), [taskell](https://github.com/smallhadroncollider/taskell), and [Beads](https://github.com/steveyegge/beads).
|
|
12
|
+
|
|
13
|
+
## Format
|
|
14
|
+
|
|
15
|
+
**Human-readable:**
|
|
16
|
+
|
|
17
|
+
<!-- GH#17804: Format examples wrapped in HTML comment to prevent parsers
|
|
18
|
+
from extracting them as real tasks during upgrade-planning migrations.
|
|
19
|
+
- [ ] t001 Task description @owner #tag ~30m risk:low logged:2025-01-15
|
|
20
|
+
- [ ] t002 Dependent task blocked-by:t001 ~15m risk:med
|
|
21
|
+
- [ ] t001.1 Subtask of t001 ~10m
|
|
22
|
+
- [x] t003 Completed task ~30m actual:25m logged:2025-01-10 completed:2025-01-15
|
|
23
|
+
- [-] Declined task
|
|
24
|
+
-->
|
|
25
|
+
|
|
26
|
+
Format: `- [ ] tNNN Description @owner #tag ~estimate risk:level logged:date`
|
|
27
|
+
|
|
28
|
+
**Task IDs:**
|
|
29
|
+
- `t001` - Top-level task
|
|
30
|
+
- `t001.1` - Subtask of t001
|
|
31
|
+
- `t001.1.1` - Sub-subtask
|
|
32
|
+
|
|
33
|
+
**Dependencies:**
|
|
34
|
+
- `blocked-by:t001` - This task waits for t001
|
|
35
|
+
- `blocked-by:t001,t002` - Waits for multiple tasks
|
|
36
|
+
- `blocks:t003` - This task blocks t003
|
|
37
|
+
|
|
38
|
+
**Time fields:**
|
|
39
|
+
- `~estimate` - AI-assisted execution time (~15m trivial, ~30m small, ~1h medium, ~2h large, ~4h major — see `reference/planning-detail.md`)
|
|
40
|
+
- `actual:` - Actual active time spent (from session-time-helper.sh)
|
|
41
|
+
- `logged:` - When task was added
|
|
42
|
+
- `started:` - When branch was created
|
|
43
|
+
- `completed:` - When task was marked done
|
|
44
|
+
|
|
45
|
+
**Risk (human oversight needed):**
|
|
46
|
+
- `risk:low` - Autonomous: fire-and-forget, review PR after
|
|
47
|
+
- `risk:med` - Supervised: check in mid-task, review before merge
|
|
48
|
+
- `risk:high` - Engaged: stay present, test thoroughly, potential regressions
|
|
49
|
+
|
|
50
|
+
<!--TOON:meta{version,format,updated}:
|
|
51
|
+
1.1,todo-md+toon,{{DATE}}
|
|
52
|
+
-->
|
|
53
|
+
|
|
54
|
+
## Ready
|
|
55
|
+
|
|
56
|
+
<!-- Tasks with no open blockers - run /ready to refresh -->
|
|
57
|
+
|
|
58
|
+
<!--TOON:ready[0]{id,desc,owner,tags,est,risk,logged,status}:
|
|
59
|
+
-->
|
|
60
|
+
|
|
61
|
+
## Backlog
|
|
62
|
+
|
|
63
|
+
<!--TOON:backlog[0]{id,desc,owner,tags,est,risk,logged,status}:
|
|
64
|
+
-->
|
|
65
|
+
|
|
66
|
+
## In Progress
|
|
67
|
+
|
|
68
|
+
<!--TOON:in_progress[0]{id,desc,owner,tags,est,risk,logged,started,status}:
|
|
69
|
+
-->
|
|
70
|
+
|
|
71
|
+
## In Review
|
|
72
|
+
|
|
73
|
+
<!-- Tasks with open PRs awaiting merge -->
|
|
74
|
+
|
|
75
|
+
<!--TOON:in_review[0]{id,desc,owner,tags,est,pr_url,started,pr_created,status}:
|
|
76
|
+
-->
|
|
77
|
+
|
|
78
|
+
## Done
|
|
79
|
+
|
|
80
|
+
<!--TOON:done[0]{id,desc,owner,tags,est,actual,logged,started,completed,status}:
|
|
81
|
+
-->
|
|
82
|
+
|
|
83
|
+
## Declined
|
|
84
|
+
|
|
85
|
+
<!-- Tasks that were considered but decided against -->
|
|
86
|
+
|
|
87
|
+
<!--TOON:declined[0]{id,desc,reason,logged,status}:
|
|
88
|
+
-->
|
|
89
|
+
|
|
90
|
+
<!--TOON:dependencies-->
|
|
91
|
+
<!-- Format: child_id|relation|parent_id -->
|
|
92
|
+
<!--/TOON:dependencies-->
|
|
93
|
+
|
|
94
|
+
<!--TOON:subtasks-->
|
|
95
|
+
<!-- Format: parent_id|child_ids (comma-separated) -->
|
|
96
|
+
<!--/TOON:subtasks-->
|
|
97
|
+
|
|
98
|
+
<!--TOON:summary{total,ready,pending,in_progress,in_review,done,declined,total_est,total_actual}:
|
|
99
|
+
0,0,0,0,0,0,0,,
|
|
100
|
+
-->
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# OpticTriage User Guide
|
|
2
|
+
|
|
3
|
+
OpticTriage is a lightweight, non-destructive diagnostic utility designed to pre-process large batches of field photographs (e.g., from drone surveys) before they enter computationally expensive Structure-from-Motion (SfM) pipelines like COLMAP, WebODM, or Agisoft Metashape.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Quality Screening:** Automatically detect and flag blurred, overexposed, or glare-affected images using adjustable thresholds.
|
|
8
|
+
- **Near-Duplicate Detection:** Prevents unnecessary SfM processing by flagging sequential near-duplicate frames caused by hovering drones.
|
|
9
|
+
- **Color Normalization:** Non-destructively apply ColorChecker matrix transformations based on keyframe observations.
|
|
10
|
+
- **Target Detection:** Export high-precision subpixel coordinates for ArUco and ChArUco markers in the field.
|
|
11
|
+
- **Direct SfM Exports:** Generate pre-seeded `database.db` for COLMAP, `gcp_list.txt` for WebODM, and Python scripts for one-click Agisoft Metashape ingestion.
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
### Standalone Executable
|
|
16
|
+
You can download the pre-compiled standalone executable for your operating system (Windows, macOS, Linux) from the GitHub Releases page. No Python installation is required.
|
|
17
|
+
|
|
18
|
+
### Python Package (PyPI)
|
|
19
|
+
If you prefer to run OpticTriage in your own Python environment:
|
|
20
|
+
```bash
|
|
21
|
+
pip install optictriage
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
|
|
26
|
+
1. **Import:** Select a folder containing your raw or JPEG drone photographs. Choose an output destination.
|
|
27
|
+
2. **Settings:** Adjust quality thresholds in the UI (Blur, Exposure, Glare). Toggle specific SfM exporters (WebODM, COLMAP, Metashape).
|
|
28
|
+
3. **Execute:** Run the pipeline. OpticTriage will use multiprocessing to rapidly analyze imagery and extract telemetry/EXIF data.
|
|
29
|
+
4. **Review:** Once complete, check the export directory.
|
|
30
|
+
- Good images are soft-linked or copied into the `passed/` directory.
|
|
31
|
+
- Poor quality images are isolated in the `flagged/` directory.
|
|
32
|
+
- You will find a master `optictriage_manifest.csv` and specific subdirectories containing files ready for direct import into your chosen photogrammetry software.
|
|
33
|
+
|
|
34
|
+
## Integrations
|
|
35
|
+
|
|
36
|
+
- **COLMAP:** OpticTriage outputs an initialized `colmap/database.db` file. The database is pre-seeded with all cameras, EXIF focal length priors, and passed images. You can immediately launch COLMAP and proceed to Feature Extraction without importing files manually.
|
|
37
|
+
- **WebODM:** OpticTriage outputs an `odm/gcp_list.txt` file containing the precise subpixel coordinate matches for any detected ArUco/ChArUco targets.
|
|
38
|
+
- **Metashape:** Run the `metashape/run_metashape.py` file from within the Agisoft Metashape application via `Tools -> Run Script` to automatically create a chunk, import photos, set the coordinate system (WGS84), and bind GCP markers.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|