Contexte
Sans export training-ready, le pipeline ML continu ne peut pas
réutiliser les annotations validées. Toute version d'un modèle doit
pouvoir être ré-entraînée à partir d'un dataset figé et
reproductible.
Référence : docs/architecture/ANNOTATION_DATA_MODEL_AUDIT.md — gaps G3 + G11.
Objectif
- Endpoint d'export
POST /api/v1/datasets/export qui produit un
dataset training-ready dans plusieurs formats (GeoJSON, COCO,
QuPath GeoJSON)
- Table
dataset_snapshots qui fige filter_criteria + contenu
- FK
ml_models.training_dataset_id → dataset_snapshots.id pour tracer
quelle version d'un modèle vient de quel dataset
Approche technique proposée
Migration 011_dataset_snapshots.py
CREATE TABLE dataset_snapshots (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id VARCHAR(100) NOT NULL,
name VARCHAR(200) NOT NULL,
version VARCHAR(50) NOT NULL,
filter_criteria JSONB NOT NULL,
sample_count INTEGER NOT NULL,
label_distribution JSONB NOT NULL,
storage_uri TEXT NOT NULL,
storage_format VARCHAR(20) NOT NULL,
created_by VARCHAR(200),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (tenant_id, name, version)
);
ALTER TABLE ml_models
ADD COLUMN training_dataset_id UUID REFERENCES dataset_snapshots(id);
Endpoint d'export
@router.post("/datasets/export", response_model=DatasetSnapshotOut)
async def export_dataset(
name: str,
version: str,
filter_criteria: AnnotationFilter,
format: Literal["geojson", "coco", "qupath_geojson"] = "geojson",
current_user: CurrentUser = Depends(require_role("ADMIN_TECHNIQUE")),
):
"""Fige un export training-ready + crée un dataset_snapshot."""
...
Formats supportés
| Format |
Cas d'usage |
Sortie |
geojson |
FeatureCollection lisible QGIS / dev |
.geojson (1 fichier) |
coco |
Compatible Detectron2, MMDetection, torchvision |
annotations.json + manifest |
qupath_geojson |
Import dans QuPath (power users) |
.geojson avec metadata QuPath |
Stockage
Acceptance criteria (fonctionnel)
Review checklist (conditions de validation pour le reviewer PR)
Code
Reproductibilité
Stockage
Sécurité & tenant
Documentation
Dépendances
Hors-scope
- Génération de splits train/val/test (laissé au consommateur)
- DICOM-SR export (envisageable plus tard)
- Versioning des exports avec diff (issue séparée)
Références
docs/architecture/ANNOTATION_DATA_MODEL_AUDIT.md §3 (G3, G11)
- COCO format spec
- QuPath GeoJSON import doc
Contexte
Sans export training-ready, le pipeline ML continu ne peut pas
réutiliser les annotations validées. Toute version d'un modèle doit
pouvoir être ré-entraînée à partir d'un dataset figé et
reproductible.
Objectif
POST /api/v1/datasets/exportqui produit undataset training-ready dans plusieurs formats (GeoJSON, COCO,
QuPath GeoJSON)
dataset_snapshotsqui figefilter_criteria+ contenuml_models.training_dataset_id → dataset_snapshots.idpour tracerquelle version d'un modèle vient de quel dataset
Approche technique proposée
Migration
011_dataset_snapshots.pyEndpoint d'export
Formats supportés
geojson.geojson(1 fichier)cocoannotations.json+ manifestqupath_geojson.geojsonavec metadata QuPathStockage
/var/varuna/datasets/<tenant>/<snapshot_id>/Acceptance criteria (fonctionnel)
011_*créée et testéeDatasetSnapshotcrééPOST /api/v1/datasets/exportopérationnelservices/ml/exporters/(geojson, coco, qupath_geojson)GET /api/v1/datasets(liste) +GET /api/v1/datasets/{id}(détail)GET /api/v1/datasets/{id}/download(récupère le fichier figé)ml_models.training_dataset_idajouté + FK validéedocs/architecture/DATASET_SNAPSHOTS.mdReview checklist (conditions de validation pour le reviewer PR)
Code
services/ml/exporters/Reproductibilité
filter_criteriare-exécutable : POST avec même filter à T+1 produit un snapshot différent si annotations ont changéStockage
STORAGE_ENCRYPTION_KEYconfiguréeSécurité & tenant
require_role("ADMIN_TECHNIQUE")ouMEDECINselon politique (à acter en review)Documentation
docs/architecture/ANNOTATION_DATA_MODEL_AUDIT.md: G3 + G11 marquésRESOLVEDDépendances
Hors-scope
Références
docs/architecture/ANNOTATION_DATA_MODEL_AUDIT.md§3 (G3, G11)