lardon3d/docs/architecture/photo_quality_triage.md
2026-08-28 11:57:42 +02:00

4.2 KiB

Photo Quality Triage / Acquisition Selection

PASS / FROZEN. This non-destructive recommendation step runs after acquisition discovery/minimal association and before materialization or features. It consumes existing campaign groups and never treats path, basename, SHA-256, Task ID, or group ID as Capture, Asset, or image identity.

Metrics v1 validates JPEG structure with constant memory and a 64 MiB byte-work ceiling covering every byte consumed or skipped, including marker payloads and entropy data. Exceeding that parser-resource ceiling is a decode error; it is an operational protection, not a JPEG image-size or scientific dataset limit. A structurally valid proxy above the operational 8192-pixel maximum-dimension decode ceiling returns UNAVAILABLE + SUSPECT, not a decode error or REJECT, then accepted input uses OpenCV JPEG 1/2, 1/4, or 1/8 grayscale reduction so the retained raster is at most 1024 pixels on its longest edge. This ceiling only makes a proxy metric unavailable; it is not a campaign/source-count or scientific dataset-size limit. The implementation records raw/normalized Laplacian sharpness, black/white clipping, raw/normalized contrast, low-texture fraction, and stable reason codes. Confirmed RAW+JPEG uses JPEG; RAW-only returns METRIC_UNAVAILABLE_REQUIRES_JPEG_PROXY without RAW development.

Recommendations are GOOD, SUSPECT, or REJECT. Default selection includes only GOOD. Human NONE/INCLUDE/EXCLUDE override is separate and never rewrites measured metrics.

La table de décision exacte Metrics v1 est :

Mesure/politique Valeur exacte Effet
Netteté normalisée, très faible < 0.00018 REJECT, raison SHARPNESS_VERY_LOW
Netteté normalisée, faible < 0.00045 SUSPECT, raison SHARPNESS_LOW
Échantillon noir / blanc <= 5 / >= 250 Définit les fractions de clipping
Clipping blanc suspect / sévère > 0.08 / > 0.20 SUSPECT / REJECT
Clipping noir suspect / sévère > 0.15 / > 0.35 SUSPECT / REJECT
Contraste normalisé faible < 0.025 SUSPECT
Magnitude Sobel de basse texture < 0.035 Classe un pixel comme basse texture
Fraction de basse texture > 0.985 SUSPECT
Aucun signal sévère ou suspect GOOD
Au moins un signal suspect, aucun sévère SUSPECT
Au moins un signal sévère REJECT
Plus grand axe JPEG proxy 8192 maximum Au-delà : UNAVAILABLE + SUSPECT
Plus grand axe retenu pour analyse 1024 maximum Borne opérationnelle mémoire Metrics v1

Les cutoffs de clipping conservent le prototype autorisé scan3d/tri_photos.py (pourcentages 8/20 et 15/35 convertis en fractions). L'ensemble de la politique est une calibration d'ingénierie déterministe validée par fixtures synthétiques et observations réelles Sony A6000 et Samsung S21 ; ce n'est pas une science universelle de validité d'image. Modifier une valeur ou la correspondance GOOD/SUSPECT/REJECT exige une nouvelle version de politique/metrics et invalide les fingerprints ou caches qui incluent cette politique ; des lignes v1 existantes ne doivent jamais être réinterprétées silencieusement. La recommandation et l'override restent révisables et non destructifs.

Project DB v21 additively stores an immutable typed request and results keyed by the canonical campaign-plan group_id in 1..N. next_group_id is that same one-based identity: it starts at 1, advances from completed group k to k+1, and equals N+1 at completion. Only the executor's private group_index = group_id - 1 is zero-based. Result plus cursor is atomic and precedes generic Task checkpoint progress. The Governor estimate charges actual retained Task context capacity plus a 20 MiB one-group analysis allowance covering the 1024x1024 grayscale raster, CV_32F normalized/Laplacian/ gradient buffers, masks, and allocator margin. Decode and analysis buffers belong to one group and are promptly released. Recovery temporarily uses the existing bounded maximum codec and source arrays before Queue admission, then releases them; they do not live through the admitted execution. Execution reuses Task/Queue/Resource Governor and sequence_break; no parallel runtime is introduced.