Skip to content

feat(notebook-python,#18403): 4.2j -- second wrapper SOTA LibreYOLO, parite YOLOv9-tiny + fenetre sans-NMS E2E - #18667

Merged
myia-ai-01 merged 3 commits into
mainfrom
feature/18403-vision-libreyolo
Oct 2, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
feature/18403-vision-libreyolo

Conversation

@jsboige

@jsboige jsboige commented Oct 1, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python -- lane myia-po-2027:CoursIA -- prev: MED/notebook-python #18649

feat(notebook-python,#18403): 4.2j -- second wrapper SOTA LibreYOLO, parite YOLOv9-tiny + fenetre sans-NMS E2E

Ce que livre ce carnet

Nouveau notebook 4.2j-Detection-SOTA-LibreYOLO.ipynb dans la série 04-Vision (EPIC détection #16057, issue #18403) : le wrapper concurrent libreyolo rejoint le comparatif, et la leçon « le wrapper est un choix d'ingénieur » devient une mesure à deux enseignes.

  • Terrain et protocole intacts : générateur 4.2c verbatim, mêmes graines (2000 train / 400 val / 817 GT vérifiés en sortie), convertisseur YOLO du 4.2g réutilisé (le split canonique de 1000 images est matérialisé sur disque — libreyolo n'a pas d'option fraction, un sous-ensemble explicite vaut mieux qu'un paramètre enfui), budget 1000 × 6 à imgsz=96, ap_voc maison aux seuils 0,5/0,45 — jamais le mAP auto-rapporté seul.
  • Deux modèles : LibreYOLO9t (YOLOv9-tiny, parité directe avec les lignes YOLO du 4.2g) et LibreYOLO9E2ET (YOLOv9-tiny End-to-End, sans NMS — la prédiction d'ensemble un-pour-un, idée centrale de DETR, au gabarit et à la génération identiques : un seul facteur varie).
  • Colonne licence, la nouveauté pédagogique : cellule dédiée qui lit licence et SHA de chaque checkpoint à la source (API Hugging Face) avant usage, et refuse (assert) tout checkpoint non permissif. Tableau final étendu : les lignes committées 4.2c/4.2f/4.2g + les deux nouvelles, avec licence code et licence checkpoint par ligne (BSD / AGPL / MIT).
  • GFLOPs mesurés à 96 px via torch.utils.flop_counter.FlopCounterMode (builtin PyTorch, zéro dépendance) — le paquet n'expose pas de compteur lui-même.
  • Trois exercices (C.1 : stubs pass-style, jamais d'erreur volontaire), exécution complète GPU locale (RTX 4060), outputs committés (C.2).
  • Périmètre : 3 fichiers — le carnet 4.2j (nouveau), le README de la série (ligne tableau + roadmap + mesure), et 4.2i-Detection-Ultralytics-Difficult-Scenes.ipynb (une ligne de navigation en markdown : le garde check-nav-chain exige une arête entrante vers la nouvelle queue de série ; édition markdown-only, aucune cellule code touchée, claim amendé en conséquence).

Écarts mesurés par rapport au scope proposé de l'issue (motifs écrits)

  1. Le second modèle n'est pas un DETR-family nano (l'issue suggérait RT-DETR/D-FINE/GTR-s). Mesuré au banc, pas préféré :
    • D-FINE nano : sélection de requêtes par topk sur la carte de l'encodeur → RuntimeError: selected index k out of range au premier pas, à imgsz=96 comme à imgsz=128 (la carte porte 3×3 positions ; le plancher réel avoisine 554 px, hors budget canonique). Logs reproduits lors du développement.
    • DETR classique (LibreDETRr50) : livré inférence-seule dans le paquet (NotImplementedError: DETR is shipped inference-only).
    • La fenêtre « détection sans NMS » reste ouverte par LibreYOLO9E2ET — même famille, même taille, seul le régime d'appariement diffère : un comparatif plus contrôlé que DETR r50 ne l'aurait été (un seul facteur varie au lieu de backbone + tout). La contrainte de résolution des DETR-family est documentée dans le carnet (§5) et la suite possible nommée (§9).
  2. GFLOPs : mesurés par FlopCounterMode (PyTorch builtin) au lieu de l'API du wrapper — celle-ci n'expose aucun compteur de FLOPs (info() détaillé vérifié : layers/params seulement).

Verdict SOTA (sota-not-workaround.md)

SOTA-OK — le vrai outil (libreyolo==1.6.0, épinglé) est installé et invoqué : fine-tuning réel des deux checkpoints, prédictions réelles, évaluation au protocole maison. Aucune sortie simulée.

Licences (vérifiées à la source dans le carnet, sortie cellule §4)

Checkpoint Licence SHA
LibreYOLO/LibreYOLO9t MIT 66ac39d1ac9b
LibreYOLO/LibreYOLO9E2ET MIT 113f33368d72

Code du paquet : MIT (LICENSE vérifié verbatim lors de l'étude du 29/09, body de l'issue).

Mesures (sorties committées du carnet)

  • fine-tuning : Y9T 156 s / E2E 119 s (budget 1000 × 6, imgsz=96)
  • params : Y9T 2 763 174 / E2E 2 596 278
  • mAP@0.5 maison (400 img / 817 GT) : Y9T 0.909 / 0.986 (VOC07/VOC10) · E2E 0.817 / 0.897
  • GFLOPs@96 (FlopCounterMode) : Y9T 0.17 · E2E 0.17
  • latence : Y9T 86.9 ms/img · E2E 92.2 ms/img — nettement au-dessus des 18-29 ms des jambes 4.2g committées à GFLOPs comparables : la latence d'un wrapper est dominée par sa chaîne périphérique (pré/post-traitement, verrouillage par image), pas par les FLOPs — interprété dans la cellule « Lecture du résultat ».
  • LOC du carnet (auto-mesuré en sortie) : 318 vs 267 au 4.2g — le delta est la cellule licence + la double mesure, pas le pilotage.

Validation

  • Papermill exécution complète : RC=0, 30/30 cellules, 6 min 25 s (kernel python3, GPU CUDA RTX 4060, torch 2.14.0+cu126, libreyolo 1.6.0)
  • grep -nE "raise NotImplementedError|assert False|1/0" : 0 occurrence
  • Execution_count renseigné sur les 14 cellules code, outputs présents, 0 erreur (C.2)
  • Figures : 3 sorties PNG (galerie terrain, courbes P/R, galerie meilleur modèle) — contrôle structurel (décodage, dimensions, variance) ; le contrôle visuel humain reste au reviewer (entrée image indisponible dans la session d'exécution)
  • README série : ligne du tableau + roadmap + mesure sur sa propre ligne ; la ligne des mesures historiques est byte-identique à main (vérifiée caractère par caractère — les compteurs anciens restent hors du diff), aucun total à la main (catalogue inchangé)
  • Gardes réparés au head 488fc397 : check-nav-chain ([orphan_entry] → arête 4.2i→4.2j, 0 finding nouveau, 2 résolus du baseline) et prose-counts --strict (0 compteur en prose ajoutée — la prose LOC renvoie à la colonne du tableau committé)
  • Catalogue : régénéré par CI (aucune modification manuelle)

See #18403 (contribution — l'issue reste ouverte tant que l'arbitrage fermeture n'est pas passé) · See #16057 (EPIC détection)

🤖 Generated with Claude Code

…arite YOLOv9-tiny + fenetre sans-NMS E2E

Nouveau carnet 4.2j-Detection-SOTA-LibreYOLO.ipynb (serie 04-Vision, EPIC #16057) :
- terrain et protocole 4.2c verbatim (2000/400/817 GT), convertisseur YOLO 4.2g reutilise
- LibreYOLO9t (parite YOLO) + LibreYOLO9E2ET (sans NMS, appariement un-pour-un) au budget 1000x6 imgsz=96
- mesures commitees : mAP VOC07/VOC10 0.909/0.986 vs 0.817/0.897, GFLOPs 0.17/0.17 (FlopCounterMode), latence 86.9/92.2 ms/img, 156s/119s fine-tune
- cellule licence lisant licence+SHA des checkpoints a la source (API HF) avec refus assertif des non-permissifs
- tableau final etendu (lignes 4.2c/4.2f/4.2g + 2 nouvelles, colonnes licence code/checkpoint)
- plancher de resolution DETR-family mesure et documente (topk 3x3 : crash a 96/128 px, DETR classique inference-only)
- 3 exercices C.1, execution Papermill complete RC=0 (30 cellules, 6 min 25 s GPU), outputs commites C.2
- README serie : ligne tableau + roadmap + paragraphe de mesure

See #18403 · See #16057

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge. consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) labels Oct 1, 2026
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 1, 2026
@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 27
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 9.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 6.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 7.9s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 7.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.9s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 4.0s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 34.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 7.4s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

jsboige and others added 2 commits October 1, 2026 12:54
…ors garde

- 4.2i cell[0] : lien vers 4.2j (orphan_entry du check-nav-chain imputable au
  diff -- la nouvelle queue gagne son arete entrante depuis le predecesseur)
- 4.2j cell[0] : lien retour 4.2i retire (le cycle i<->j produisait un
  independent_chain serie-niveau ; la chaine 4.2i->4.2j->4.2g->{4.2c,4.2f}
  est acyclique, 0 finding nouveau, 2 resolus)
- 4.2j cell[19] : prose LOC sans compteurs (chiffres exacts dans la colonne
  LOC du tableau commite) -- prose-counts --strict sur lignes ajoutees
- README : ligne de mesures historiques restauree byte-identique a main, la
  mesure 4.2j vit sur sa propre ligne sans compteur de cellules

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Le split de la ligne 55 avait colle la queue historique (4.2e + 4.2d, 822
caracteres) a la fin de la nouvelle ligne de mesure 4.2j -- les compteurs
des mesures anciennes devenaient des lignes ajoutees au diff et declenchaient
prose-counts --strict. La ligne restauree est verifiee byte-identique a
origin/main ; la mesure 4.2j vit seule sur sa ligne, sans compteur.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 1, 2026
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review [Hermes] — FULL READ du notebook 4.2j (30 cellules, vue structurelle + outputs)

Gates #17040 — vérifiés sur le notebook complet :

  • Lectures markdown placées immédiatement après leurs cellules de mesure (§6→[16], §7→[19]) ✓
  • Valeurs citées toutes recoupées aux outputs committés : VOC07 0.909/0.817, VOC10 0.986/0.897, 2.76/2.60 M params, fine-tuning 156 s/119 s, GFLOPs 0.17, LOC 318 — rien de fabriqué ✓
  • Exercices 1-3 non leakés (outputs « Exercice a completer ») ✓
  • Pas de prose de densité : chaque section sert le comparatif ✓
  • Grammaire de mesure : pertes 9.11→1.86 / 10.20→2.86, timestamps 10:48→10:52 cohérents avec les 6 min 25 s du README ✓

Points forts vérifiés :

  • Licences checkpoints vérifiées à la source (HF API, sha tronqués committés) — le vrai apport du carnet, colonne licence du tableau assumée
  • Protocole maison ap_voc vs mAP auto-rapporté du wrapper — l'exercice 3 confronte les deux, honnête
  • Comptage LOC self-référentiel (318) reproduit le pattern 4.2g

Caveat mineur (non bloquant) : le warning FlopCounterMode/triton est visible dans l'output — le 0.17 GFLOPs peut sous-compter les kernels triton ; le caveat étant committé tel quel, il reste honnête.

README conforme à la directive #17633 : ligne de corps complète (terrain, leçon, métriques) + ligne parcours — pas de mise à jour de totaux. Nav 4.2i (+1/-1) cohérente.

Grain présent ligne 1. Verdict : APPROVE.

@jsboige

jsboige commented Oct 1, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18667
head: 488fc39
complete: true
body: read
comments-reviewed: 8
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: bd978079e54b30978ef8c5a143f52c6867b5bc1a9ccdfb4a9e6ba9404c61e949
diff-files: 3
diff-additions: 1941
diff-deletions: 2
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge. variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants