Commit Graph

71 Commits

Author SHA1 Message Date
Poulpe
c55700677e auto-iter 2026-05-13: offload_to_cpu=false (.84 24GB VRAM, no CPU offload needed) auto-iter-20260513-1639 2026-05-13 16:39:51 +00:00
Poulpe
ba92d68492 chore: iter-7 veille + log (2026-05-13) 2026-05-13 10:42:37 +00:00
Poulpe
c7c4431e72 auto-iter 2026-05-13: inference min_frames=32 + timeout 3h (was 2h)
- min_frames_for_inference: 32 (RoPE/attention needs ≥32 frames)
- inference_timeout_s: 10800 (GX029818 timed out at 7200s with 493 frames)

Authored-by: Poulpe <claude@nowyouknow.fr>
auto-iter-20260513-1036
2026-05-13 10:36:28 +00:00
Poulpe
1f1502e67c auto-iter 2026-05-12: log iter-5 + veille + merge PR#10 fix streaming params 2026-05-12 22:49:59 +00:00
Ubuntu
81752163d2 Merge branch 'fix/05-inference-yaml-params' into feature/auto-pipeline auto-iter-20260512-2246 2026-05-12 22:46:30 +00:00
Poulpe
c06dd774ac auto-iter 2026-05-12: log iter-4 + veille 2026-05-12 16:43:05 +00:00
Poulpe
3a6b058f0d fix: 05_inference.py lit thresholds.yaml[inference] au lieu de windowed hardcodé
- Ajoute _load_inference_cfg() qui lit config/thresholds.yaml
- Mode/conf/keyframe_interval/max_frame_num depuis config (streaming par défaut)
- Valide par GX049839_v2: streaming+conf=1.5+kf=1 → 146M pts vs 0 pts en windowed sans conf_threshold
- Ajoute --offload_to_cpu (stable sur RTX 3090 .84)
2026-05-12 16:38:33 +00:00
Poulpe
8880c28af9 auto-iter 2026-05-12: keyframe_interval 6→1 (streaming, validé GX049839_v2 146M pts) auto-iter-20260512-1637 2026-05-12 16:37:06 +00:00
Poulpe
df45fd155d auto-iter 2026-05-12: bottom_visible_pct_min 30→25 (GX019817 29% récupérable) auto-iter-20260512-1034 2026-05-12 10:34:19 +00:00
Poulpe
f0154d7ea5 auto-iter 2026-05-12: log iter-2 + veille auto-iter-20260512-0440-log 2026-05-12 04:40:56 +00:00
Poulpe
8b826b0827 auto-iter 2026-05-12: fix duplicate frame_extract key in thresholds.yaml auto-iter-20260512-0439 2026-05-12 04:39:03 +00:00
Poulpe
4f54d58cd3 auto-iter 2026-05-11: iteration-log + veille iter-1 2026-05-11 22:34:42 +00:00
Poulpe
06d4aa5d4d auto-iter 2026-05-11: bottom_visible_pct seuil 50→30 (avg=37.5%) auto-iter-20260511-2233 2026-05-11 22:33:12 +00:00
Poulpe
e09ef7886b feat(pipeline): stage 04b port trim_above_water from dispatcher 2026-05-11 14:08:30 +00:00
Ubuntu
82f71fcc96 feat: frame QC scoring + viser per-AUV button
Stage 04 frame extract:
- New lib_frame_qc.py: per-frame Laplacian/contrast/blue-dominance scoring
- Classes: bottom_visible / water_no_bottom / turbid_water / out_of_water
- Sample 1/5 frames after extraction, write qc.json per segment
- Record metrics (frames_total, frames_bottom_visible, bottom_visible_pct)
- Mark job degraded when bottom_visible_pct < 50%

Per-AUV viser view:
- scripts/viser_auv.py loads all PLYs of an AUV, color per file
- POST /pipeline/missions/{id}/auvs/{auv}/view rsyncs ply -> worker
- launches viser on hashed port 9300+, returns URL
- _pipeline.html exposes AUV list, JS handler opens viser tab
2026-05-11 11:05:37 +00:00
Ubuntu
1a4fffd2c1 feat: pipeline monitor + orchestrator stats dashboard 2026-05-11 10:55:44 +00:00
Ubuntu
e597407ee5 feat(pipeline): jalon 1-3 — ingest, USBL parse, filter
Stages 01-03 opérationnels sur 20260505-Lepradet:
- 01_ingest: manifest auto, 3 AUVs vidéo, 3 AUVs bags, mapping AUV2xx↔AUV0xx
- 02_usbl_parse: MCAP (format incompatible firmware) → fallback serial CSV, 213 pts bruts
- 03_usbl_filter: MAD-3σ + moving-avg + Kalman optionnel, dégradé gracieux si null lat/lon
- orchestrator/db.py: SQLite schema missions/jobs/metrics idempotent
- config/: thresholds.yaml + default_params.yaml versionnés
- qa/checks.py: vérifications pass/fail/degraded par étape

Note: MCAP bags corrompus ou format non-standard firmware — lat/lon absent.
Statut degraded (pas crash). Nécessite investigation format MCAP spécifique.
2026-05-11 10:25:27 +00:00
Ubuntu
18b3e0e8e9 fix: dispatcher passe frames_dir (job dir) pas parent a pre_decimate 2026-04-25 16:32:26 +00:00
Ubuntu
4db7b13bb0 feat: hook post-job cosma-nav + style dashboard + docker-compose update 2026-04-25 16:25:19 +00:00
Ubuntu
ffcb254fa8 fix: closes #10 — bouton QC pointe vers /nav?job=<id> 2026-04-25 16:25:03 +00:00
0deddf0009 docs: create CLAUDE.md with Infrastructure section 2026-04-24 15:56:23 +00:00
Ubuntu
19a48abf9d feat: section évolutions récentes + pipeline workflow sur le dashboard 2026-04-24 09:28:13 +00:00
Ubuntu
8810d61540 fix: supprimer base href /cosma-qc/ — chemins absolus pour accès direct et via Caddy 2026-04-24 08:53:52 +00:00
Floppyrj45
76bba217dc feat: stitch.py --poses trajectory_world.h5 — T_init depuis poses monde, remplace RANSAC 2026-04-24 10:27:55 +02:00
Flag
df83454de6 fix: SCP utilise glob frame_*.jpg au lieu de -r (évite création sous-dossiers) 2026-04-24 08:22:02 +00:00
Flag
67643d05ff feat: dispatcher passe --save_poses à demo.py — génère lingbot_poses.npz (Plan 2) 2026-04-24 08:07:55 +00:00
Flag
4eb9f22813 feat: migration vers cosma-vm (.83) — dispatcher+dashboard, OpenVPN, docs infra mis à jour 2026-04-24 00:16:21 +00:00
Flag
c765e8cc40 fix: COPY docs/_build/html dans image Docker 2026-04-23 23:59:43 +00:00
Flag
7ed24b66b7 fix: race condition exit_file z620 — rm sync avant bg ffmpeg 2026-04-23 23:23:28 +00:00
Flag
352af149fd fix: viser_ply filtrage outliers statistiques — supprime gros pâtés bruités 2026-04-23 23:10:11 +00:00
Flag
fb38ff2192 feat: lien PLY téléchargement direct depuis dashboard (port 8300 worker) 2026-04-23 22:14:39 +00:00
Flag
325e5feb5f fix: SQLite busy_timeout + z620 SSH via worker relay
- db(): timeout=30 + PRAGMA busy_timeout=5000 pour éviter locked sous charge parallèle
- _ssh_via(): helper routant SSH z620 via worker (.82→worker→z620)
- _extract_on_remote_host(): toutes les commandes z620 passent via worker
- resume probe: ffprobe z620 également via worker
- reset jobs 11/17/18/20 en queued pour relancer
2026-04-23 22:03:37 +00:00
Flag
91b25f0aae feat: docs Sphinx pipeline + lien dashboard header 2026-04-23 21:17:49 +00:00
Flag
1bbb6c8e6d fix: stitch tourne sur le même worker que ses PLY (evite 404 cross-worker) 2026-04-23 21:09:59 +00:00
Flag
a505ec1bcd feat: resume extraction — markers par vidéo, pas de rm au départ, reprise au crash 2026-04-23 21:07:09 +00:00
Flag
42ba218f09 fix: extraction frames sur host distant (z620) sans SCP du MP4 entier 2026-04-23 21:02:05 +00:00
Flag
9e9eff6cc1 fix: bouton PLY — viewer-btn JS handler au lieu HTMX (evite JSON dans la page) 2026-04-23 20:52:25 +00:00
Flag
7f8c1d0d07 fix: segment_label end-time recalculé depuis video_duration_s (exiftool=0 à lingest) 2026-04-23 20:42:56 +00:00
Flag
71d82018b1 feat: dashboard — plongée label, serial visible, GLB link, is_file thumbnail fix 2026-04-23 20:33:46 +00:00
Flag
1b467c5f03 fix: cleanup stale demo.py + resolve_worker_video_source frames_dir + SSH keys repaired 2026-04-23 19:53:03 +00:00
Flag
194c94b872 dashboard — thumb 48x27, step live, spin busy, live thumbnail refresh
- dispatcher: col step ajoutee (migration). set a chaque phase:
  scp N/M, ffmpeg N/M, trimming hors-eau, reconstruct demo.py
- _refresh_thumbnail() scp la DERNIERE frame extraite toutes les ~15s
  pendant ffmpeg pour que le preview colle a la progression live
- template: cache-bust thumbnail via ?t=mtime, step affiche sous
  progress bar, thumb revenue a 48x27
- CSS: .badge.busy -> animation spin (rotation infinie) au lieu de
  juste une couleur, .step-text italique mute
2026-04-22 23:00:11 +00:00
Flag
f13d27b997 dashboard — vrai tableau + probe viser_url alive + CSS propre
1. _jobs_table.html: remplace la liste <li>flex par un vrai <table> avec
   colonnes explicites: status · preview · #id · AUV+GP · label · duree
   video · frames · hors-eau · progression · temps · actions. Stitches
   restent en <ul> compacte.

2. main.py _build_acquisitions: probe TCP le viser_url avec cache 8s
   avant de le passer au template. Si port mort -> d[viser_url]=None ->
   pas de bouton affiche. Fini les liens qui mennent a rien.

3. style.css: purge des regles flex conflictuelles, rewrite propre pour
   table.jobs-table, badges, prog-bar, btn-viser direct link.
2026-04-22 22:43:14 +00:00
Flag
960ebc0393 dashboard — preview thumbnail par job
dispatcher scp frame_*.jpg (premiere apres trim head) vers
/var/lib/cosma-qc/thumbnails/job_N.jpg a la fin de do_extract.

Endpoint GET /jobs/{id}/thumbnail serve via FileResponse. Template:
<img class=thumb src=jobs/N/thumbnail> si has_thumbnail. 48x27 px,
object-fit cover.

Backfill manuel des jobs deja done (9, 12, 13, 16, 19) via scp direct.
2026-04-22 22:06:43 +00:00
Flag
e90d775dfd dispatcher — load balance 2 GPU (lower-load d abord) + fps=2 + debug pick_worker
pick_worker trie les candidats par:
  1. nombre de jobs deja assignes sur le worker (moins d abord)
  2. VRAM free (plus d abord)
  3. hostname (tiebreaker sans comparer les dicts)

Avant: le worker avec le plus de VRAM gagnait toujours (ex: .84 24GB vs
.87 12GB) donc tous les jobs empilaient sur .84 pendant que .87 idle.

fps=3 -> fps=2 via COSMA_QC_FPS dans dispatcher.env (cf user: 1 kt +
reconstruction SfM -> 2 fps pas stride 6).

Logs pick_worker ajoutes pour debug quand no candidate.
2026-04-22 22:02:20 +00:00
Flag
033abc41c5 dispatcher — window_size adaptatif + skip video courtes <8min
window_size selon len effectif (frame_count / stride):
  <= 320 -> 16/2   (petit overhead)
  <= 3000 -> 32/8
  > 3000 -> 64/16  (moins de windows sur longues sequences)

Skip auto si video_duration_s < COSMA_QC_MIN_VIDEO_S (default 480s = 8min):
  segments trop courts ne contiennent pas de plongee exploitable.
  Reco user: videos < 8 min sont inutiles pour la reconstruction.
2026-04-22 21:34:51 +00:00
Flag
9dd6a82d08 dashboard + dispatcher — UX props, trim head+tail, cols, link direct
dashboard:
- job_id, AUV GP1/GP2 (serial en tooltip), segment_label, duree reelle,
  nb frames, nb hors-eau trimes
- lien viser plain <a href> (plus de POST ni popup). Affiche uniquement
  si job.done ET viser_url persistee (demo.py kept alive)
- CSS minimal: flex row, separateurs, skipped en italic mute

dispatcher:
- trim head ET tail (AUV hors-eau en debut + fin de session)
- migration DB: trimmed_head, trimmed_tail, video_duration_s
- do_extract persiste total_duration_s + trimmed counts via set_status
- run_one: RuntimeError(skipped_short) preserve le status=skipped
- min_frames underwater pour skip les segments trop courts
- ram_budget 0.45 -> 0.35 (OOM rc=137 avec 8237 frames sur 62GB RAM)
2026-04-22 21:28:06 +00:00
Flag
311824f036 dispatcher — trim auto prefix hors-eau avant reconstruct
Les sessions record commencent systematiquement avec l AUV sur le pont
ou en surface. Les frames hors-eau polluent le model et bloquent l alignment
ICP du stitch.

trim_above_water_prefix detecte underwater par absorption du canal rouge
(mean_R < mean_G-5 ET mean_R < mean_B-5) et exige un streak consecutif
de 10 frames underwater pour lock le start. Tout ce qui precede est
supprime avant demo.py.

Opencv charge les frames en REDUCED_COLOR_4 pour acceleration.
Execute dans le venv lingbot-map cote worker (cv2 dispo).
2026-04-22 20:31:30 +00:00
Flag
e8955aa406 dispatcher — status=skipped exclus du stitch per_auv
Les segments auto-ingested peuvent contenir des vidéos non-exploitables
(GoPro sur le pont, hors-eau, bruyantes). Marquer le job skipped empeche
linclusion dans le stitch per_auv: total/done comptent hors-skipped, et
input_job_ids filtre status=done seulement.

Exemple: job 10 AUV209/10:58-11:05 = pull marron + gilet sauvetage sur
le pont pendant preparation, reconstruction 3D inutile pour le puzzle.
2026-04-22 20:19:46 +00:00
Flag
fa996f62d6 dashboard — bouton live (viser natif demo.py) + PLY (fallback viser_ply)
live button:
- POST /jobs/{id}/live
- Probe le port natif (worker viser_port_base + job_id) via nc
- 200 + viser_url si demo.py encore alive (necessite le patch keep-alive)
- 410 + fallback message si ferme

PLY button:
- POST /jobs/{id}/view (existant)
- Lance viser_ply.py standalone sur port VIEWER_PORT_BASE+id

Permet de choisir entre viser natif (PointCloudViewer de lingbot-map avec
camera frustums, filtre confiance interactif, animation) et viewer basic
XYZ+RGB uniquement.
2026-04-22 19:48:43 +00:00
Flag
2bc24b2cc4 dispatcher — keep demo.py alive apres PLY + auto-clear error
1. Ne plus kill demo.py apres PLY saved: son viser/PointCloudViewer natif
   (camera frustums, per-frame confidence filtering, animation) donne une
   visu bcp plus propre que viser_ply.py standalone (XYZ+RGB seul).
   Cout: ~6GB VRAM par job done garde alive jusquau prochain pick_worker
   qui peut kill si besoin.

2. set_status clear auto le champ error quand status transitionne vers
   extracting/running/done/queued: sinon les dashboards montrent les
   erreurs historiques sur les jobs en cours de retry.
2026-04-22 19:41:00 +00:00