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.
Files changed (98) hide show
  1. optictriage-0.1.0/.aidevops.json +39 -0
  2. optictriage-0.1.0/.beads/.gitignore +40 -0
  3. optictriage-0.1.0/.beads/config.yaml +4 -0
  4. optictriage-0.1.0/.beads/issues.jsonl +0 -0
  5. optictriage-0.1.0/.beads/metadata.json +4 -0
  6. optictriage-0.1.0/.gitattributes +2 -0
  7. optictriage-0.1.0/.github/workflows/release.yml +84 -0
  8. optictriage-0.1.0/.gitignore +17 -0
  9. optictriage-0.1.0/AGENTS.md +50 -0
  10. optictriage-0.1.0/CHANGELOG.md +15 -0
  11. optictriage-0.1.0/CLAUDE.md +50 -0
  12. optictriage-0.1.0/LICENSE +21 -0
  13. optictriage-0.1.0/PKG-INFO +81 -0
  14. optictriage-0.1.0/README.md +55 -0
  15. optictriage-0.1.0/TODO.md +100 -0
  16. optictriage-0.1.0/USER_GUIDE.md +38 -0
  17. optictriage-0.1.0/bin/exiftool.exe +0 -0
  18. optictriage-0.1.0/bin/exiftool_linux +0 -0
  19. optictriage-0.1.0/bin/exiftool_mac +0 -0
  20. optictriage-0.1.0/docs/G-Product Requirements Document.md +147 -0
  21. optictriage-0.1.0/docs/Q-Product Requirements Document.md +116 -0
  22. 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
  23. optictriage-0.1.0/docs/research-papers/Drone Data for Photogrammetry Integration.md +316 -0
  24. 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
  25. 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
  26. 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
  27. optictriage-0.1.0/docs/research-papers/OpticTriage_ OpenCV Optimization Research.md +274 -0
  28. optictriage-0.1.0/docs/research-papers/Photogrammetry Pre-processing Research for Archaeology v2.md +321 -0
  29. optictriage-0.1.0/docs/research-papers/Photogrammetry Pre-processing Research for Archaeology.md +363 -0
  30. optictriage-0.1.0/docs/research-papers/Photogrammetry Pre-processing Tool Research.md +316 -0
  31. optictriage-0.1.0/docs/research-prompts/01_photogrammetry_input_requirements.txt +12 -0
  32. optictriage-0.1.0/docs/research-prompts/02_coded_photogrammetry_targets.txt +12 -0
  33. optictriage-0.1.0/docs/research-prompts/03_image_quality_metrics.txt +12 -0
  34. optictriage-0.1.0/docs/research-prompts/04_exif_metadata_standards.txt +12 -0
  35. optictriage-0.1.0/docs/research-prompts/05_colour_calibration_targets.txt +12 -0
  36. optictriage-0.1.0/docs/research-prompts/06_opendronemap_input_format.txt +12 -0
  37. optictriage-0.1.0/docs/research-prompts/07_supp_drone_survey_flight_planning.txt +13 -0
  38. optictriage-0.1.0/docs/research-prompts/08_gpu_acceleration_opencv_pipelines.txt +61 -0
  39. optictriage-0.1.0/docs/research-prompts/09_drone_telemetry_rtk_colmap_integration.txt +24 -0
  40. optictriage-0.1.0/docs/scope.md +159 -0
  41. optictriage-0.1.0/migrations/AGENTS.md +5 -0
  42. optictriage-0.1.0/optictriage.spec +58 -0
  43. optictriage-0.1.0/pyproject.toml +36 -0
  44. optictriage-0.1.0/schemas/AGENTS.md +5 -0
  45. optictriage-0.1.0/seeds/AGENTS.md +5 -0
  46. optictriage-0.1.0/src/optictriage/__init__.py +0 -0
  47. optictriage-0.1.0/src/optictriage/__main__.py +11 -0
  48. optictriage-0.1.0/src/optictriage/app.py +56 -0
  49. optictriage-0.1.0/src/optictriage/database.py +56 -0
  50. optictriage-0.1.0/src/optictriage/database_migration.py +47 -0
  51. optictriage-0.1.0/src/optictriage/exporters/colmap.py +119 -0
  52. optictriage-0.1.0/src/optictriage/exporters/csv_manifest.py +48 -0
  53. optictriage-0.1.0/src/optictriage/exporters/gps_overlap.py +152 -0
  54. optictriage-0.1.0/src/optictriage/exporters/metashape.py +70 -0
  55. optictriage-0.1.0/src/optictriage/exporters/odm.py +100 -0
  56. optictriage-0.1.0/src/optictriage/exporters/rtk_validator.py +47 -0
  57. optictriage-0.1.0/src/optictriage/metadata/dji_fix.py +77 -0
  58. optictriage-0.1.0/src/optictriage/metadata/exif_reader.py +84 -0
  59. optictriage-0.1.0/src/optictriage/metadata/exif_writer.py +63 -0
  60. optictriage-0.1.0/src/optictriage/metadata/validators.py +45 -0
  61. optictriage-0.1.0/src/optictriage/models.py +126 -0
  62. optictriage-0.1.0/src/optictriage/pipeline.py +54 -0
  63. optictriage-0.1.0/src/optictriage/stages/base.py +39 -0
  64. optictriage-0.1.0/src/optictriage/stages/color_stage.py +156 -0
  65. optictriage-0.1.0/src/optictriage/stages/exif_stage.py +152 -0
  66. optictriage-0.1.0/src/optictriage/stages/export_stage.py +167 -0
  67. optictriage-0.1.0/src/optictriage/stages/gpx_stage.py +96 -0
  68. optictriage-0.1.0/src/optictriage/stages/import_stage.py +169 -0
  69. optictriage-0.1.0/src/optictriage/stages/quality_stage.py +171 -0
  70. optictriage-0.1.0/src/optictriage/stages/target_stage.py +113 -0
  71. optictriage-0.1.0/src/optictriage/ui/blur_histogram.py +97 -0
  72. optictriage-0.1.0/src/optictriage/ui/dashboard.py +102 -0
  73. optictriage-0.1.0/src/optictriage/ui/export_panel.py +117 -0
  74. optictriage-0.1.0/src/optictriage/ui/import_panel.py +144 -0
  75. optictriage-0.1.0/src/optictriage/ui/main_window.py +99 -0
  76. optictriage-0.1.0/src/optictriage/ui/metadata_panel.py +89 -0
  77. optictriage-0.1.0/src/optictriage/ui/target_overlay.py +74 -0
  78. optictriage-0.1.0/src/optictriage/vision/blur.py +54 -0
  79. optictriage-0.1.0/src/optictriage/vision/colorchecker.py +148 -0
  80. optictriage-0.1.0/src/optictriage/vision/exposure.py +30 -0
  81. optictriage-0.1.0/src/optictriage/vision/glare.py +43 -0
  82. optictriage-0.1.0/src/optictriage/vision/gpu_accel.py +50 -0
  83. optictriage-0.1.0/src/optictriage/vision/preprocessing.py +72 -0
  84. optictriage-0.1.0/src/optictriage/vision/raw_preview.py +62 -0
  85. optictriage-0.1.0/src/optictriage/vision/targets.py +75 -0
  86. optictriage-0.1.0/src/optictriage/workers.py +56 -0
  87. optictriage-0.1.0/tests/__init__.py +0 -0
  88. optictriage-0.1.0/tests/profile_pipeline.py +71 -0
  89. optictriage-0.1.0/tests/test_colmap.py +39 -0
  90. optictriage-0.1.0/tests/test_color_normalization.py +121 -0
  91. optictriage-0.1.0/tests/test_e2e_pipeline.py +210 -0
  92. optictriage-0.1.0/tests/test_gpx.py +88 -0
  93. optictriage-0.1.0/tests/test_multiprocessing.py +37 -0
  94. optictriage-0.1.0/tests/test_phash.py +56 -0
  95. optictriage-0.1.0/tests/test_pipeline.py +130 -0
  96. optictriage-0.1.0/tests/test_segmentation.py +86 -0
  97. optictriage-0.1.0/todo/PLANS.md +129 -0
  98. 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
@@ -0,0 +1,4 @@
1
+ # Beads Project Configuration
2
+ # issue_prefix: optictriage
3
+ # default_priority: 2
4
+ # default_type: task
File without changes
@@ -0,0 +1,4 @@
1
+ {
2
+ "database": "beads.db",
3
+ "jsonl_export": "issues.jsonl"
4
+ }
@@ -0,0 +1,2 @@
1
+ # Opt out of AI model training
2
+ * ai-training=false
@@ -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,17 @@
1
+ .gitnexus
2
+ build/
3
+ dist/
4
+ *.egg-info/
5
+ __pycache__/
6
+ *.pyc
7
+ .pytest_cache/
8
+ .venv/
9
+ venv/
10
+ optictriage.db
11
+ test.db
12
+ .agents/
13
+ .claude/
14
+ .windsurf/
15
+ .ctx/
16
+ docs/Implementation docs/
17
+ *.log
@@ -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