Mettre à niveau vers la version 1.7.0
La version 1.7.0 continue de charger les anciens checkpoints YOLO9 avec les mêmes boîtes flottantes. Elle modifie l'entraînement de la famille YOLO9, les noms que le code voit à l'intérieur du réseau, et quelques contrats de validation et de prédiction.
De 1.6.0 à 1.7.0
-
Les checkpoints YOLO9, YOLO9-E2E et YOLO9-P2 enregistrés par la version 1.7.0 utilisent de nouveaux noms de tenseurs et ne se chargent pas en 1.6.x : la version 1.6.x charge ceux de YOLO9 et YOLO9-P2 avec un avertissement de clés manquantes et ne prédit aucune boîte, et lève une erreur d'incohérence
model_familypour ceux de YOLO9-E2E. Mettez à niveau chaque environnement qui les lit. Les checkpoints flottants, quantifiés et d'entraînement écrits par les versions précédentes se chargent en 1.7.0, et les exports ONNX ne sont pas affectés. -
Le code qui accède à
model.modeld'un modèle de la famille YOLO9 voit les noms de modules de MultimediaTechLab/YOLO, sans alias.DDetectdevientYOLO9Head(anchor_convs/class_convs),RepConvNdevientRepConv,RepNBottleneckdevientBottleneck,DFLdevientAnchor2Vec(anchor2vec),ncdevientnum_classes, et les sous-couches des blocs deviennentconv1/conv2/bottleneck. Dans YOLO9-E2E,YOLO9E2EDetectdevientYOLO9E2EHeadetone2one_cv2/one2one_cv3deviennentone_to_one_anchor_convs/one_to_one_class_convs.LibreYOLO9Model.fuse(),RepConvN.fuse_convs(),Conv.forward_without_bn(),Concatetyolo9.utils.decode_boxessont supprimés. Le changelog liste chaque renommage. -
Les noms de nœuds ONNX suivent les nouveaux noms de modules dans la tête, le backbone et le neck, par exemple
/head/anchor_convs.0/.... Mettez à jour les outils qui s'appuient sur les noms de nœuds, comme les configurations de nœuds de fin Hailo. Les entrées, les sorties et les noms de sortie du modèle ne changent pas. -
Un fine-tuning YOLO9 à partir de poids sans tenseurs PGI, ce qui inclut les
LibreYOLO9{t,s,m,c}.ptpubliés, n'entraîne que la tête principale, comme en 1.5.0 ; la version 1.6.0 attachait une branche PGI initialisée aléatoirement avecaux_weight=0.25. Les poids qui contiennent des tenseurs PGI, et les runs à partir de zéro, s'entraînent toujours avec PGI. Passezaux_weight=0.25pour attacher malgré tout une nouvelle branche, ouaux_weight=0pour la désactiver de force. -
Lorsque PGI est attaché, YOLO9-m et YOLO9-c construisent la branche auxiliaire de MultimediaTechLab : 12.8M (m) et 25.7M (c) de paramètres réservés à l'entraînement avec 80 classes, contre 7.5M et 10.2M auparavant, si bien que l'entraînement PGI de ces tailles demande plus de mémoire et de temps par pas. Un checkpoint d'entraînement m/c de la version 1.6.0 reprend et fait son fine-tuning avec la branche sur laquelle il a été entraîné. L'inférence et YOLO9-t/s ne changent pas.
-
YOLO9, YOLO9-E2E et YOLO9-P2 écrêtent la norme L2 du gradient à 10, et leur assignateur d'entraînement évalue les ancres en fp32, si bien que les positifs choisis sous AMP fp16 peuvent différer. Passez
clip_max_norm=0pour retrouver l'écrêtage de la version 1.6.0 ; un run démarré en 1.6.0 et repris en 1.7.0 écrête aussi, sauf si vous le passez. L'assignation en fp32 n'a aucun interrupteur. -
Un
perspectivenon nul déforme par déplacement des coins dans chaque famille qui utilise la transformation affine partagée (YOLO9 et ses variantes E2E et P2, YOLOX, YOLOv7, YOLO-NAS, PP-YOLOE, RTMDet, PicoDet, RT-DETR et RT-DETRv2), y compris les runs repris depuis un checkpoint 1.6.0 qui le définissait. Les valeurs de0.002et plus donnent la même déformation maximale, et les valeurs négatives lèventValueError. Aucun réglage ne reproduit la déformation de la version 1.6.0 ; la valeur par défautperspective=0ne change pas. -
Le pipeline mosaic de YOLO9 tire le ratio de mixup selon Beta(1, 1) au lieu de Beta(32, 32), sans réglage pour l'ancienne valeur. L'entraînement YOLOv7 par défaut change, car YOLOv7 active mixup par défaut. YOLO9, YOLO9-E2E, YOLO9-P2, RT-DETR et RT-DETRv2 ne changent que lorsque mixup est activé.
-
libreyolo trainsansname=écrit les runs EC, D-FINE, SegFormer et LingBot-Vision dansruns/train/ec_exp,dfine_exp,segformer_expetlingbotvision_expau lieu deruns/train/exp, les sondes V-JEPA 2 dansruns/train/train, et les runs YOLO9-P2 dansruns/train/yolo9_exp. Passezname=exppour l'ancien chemin, ouname=yolo9_p2_exppour YOLO9-P2. -
libreyolo traindémarre D-FINE, SegFormer et LingBot-Vision à partir de leurs propres recettes. Pour D-FINE, cela donne 132 époques,lr0=2e-4,weight_decay=1e-4, 2 époques de warmup et aucune augmentation mosaic, mixup, HSV ou affine. Pour envoyer les valeurs que la version 1.6.0 envoyait, passezepochs=300 optimizer=sgd lr0=0.01 weight_decay=5e-4 warmup_epochs=5 mosaic=1.0 mixup=1.0 hsv_prob=1.0 degrees=10 translate=0.1 shear=2.0. -
libreyolo.validation.ConfusionMatrixindexematrix[predicted, true](c'était[actual, predicted]), compte les détections àconf_thres=0.25(c'était 0.15), prendnames=ettask=uniquement en arguments nommés, et sonmatrixne peut plus être réassigné. Transposez le code qui indexait l'ancienne matrice, et passezconf_thres=0.15pour retrouver les anciens comptes.plots=Trueécrit les comptes dansconfusion_matrix.pnget le graphique normalisé dansconfusion_matrix_normalized.png. -
predict(agnostic_nms=True)supprime les boîtes qui se chevauchent entre classes au lieu d'émettre un avertissement. Les tâches sans boîtes lèventValueError,LibreEnsembleet HRNet lèventNotImplementedError, et le niveau SAM rejette le mot-clé avecTypeError; retirez l'argument de ces appels. -
Un
interpolationde classifieur inconnu lèveValueError, y compris les modes torchvisionLANCZOS,BOX,HAMMINGetNEAREST_EXACT. Utilisezbilinear,bicubic,nearestoubilinear_no_antialias. -
Relancez la validation avant de comparer avec les chiffres de la version 1.6.0 pour
val(single_cls=True)sur un modèle entraîné sur plusieurs classes, les datasets de segmentation qui mélangent des lignes avec boîtes seules et avec polygones, et RTMDet-Ins, qui conserve jusqu'àmax_det=300masques par image par défaut ; passezmax_det=100pour le réglage de MMDetection. -
Sans
libreyolo[rfdetr], les appels CLI avec un nom de modèle RF-DETR ou DINOv2 se terminent avec le code d'erreur JSONmodel_load_failedau lieu demodel_not_found, et le message nommepip install libreyolo[rfdetr].
Consultez le changelog pour la version complète.
De 1.5.0 à 1.6.0
-
Mettez à niveau les environnements limités à une version d'ONNX Runtime inférieure à 1.18 vers
onnxruntime>=1.18.0avant d'installer l'extra ONNX. -
SAM 3D Body accepte l'ensemble vérifié de ressources du snapshot. Installez
libreyolo[hf], obtenez l'accès restreint et utilisez l'acquisition automatique, ou fournissez le répertoire de snapshot inchangé et la ressource MHR épinglée sur un système de fichiers local de confiance. -
Relancez la validation après les corrections de redimensionnement RF-DETR hors pose et de normalisation des classificateurs. Revérifiez les seuils de confiance déployés avant de comparer les résultats à ceux de la version 1.5.0 ; aucune option ne restaure l'ancien prétraitement.
-
D-FINE, DEIM, RT-DETRv4 et la détection YOLO-NAS activent FP16 AMP par défaut. Passez
amp=Falsepour conserver FP32. -
Pour retrouver les anciens choix de fine-tuning YOLO9, définissez
aux_weight=0,max_labels=100etwarmup_momentum=0.937. Définissezletterbox_pad="topleft"lorsqu'une nouvelle conversion marquée center doit reproduire l'ancienne géométrie. Les anciens checkpoints à une seule tête reprennent avec leur graphe d'origine. Les nouveaux entraînements YOLO9 consomment davantage de mémoire GPU, réduisez doncbatchsi une taille de batch utilisée en 1.5.0 dépasse la mémoire disponible. -
RF-DETR et DINOv2 créent des répertoires d'exécution incrémentés portant le nom de la famille. Mettez à jour les consommateurs des chemins d'artefacts, ou définissez
output_dir="runs/train", exist_ok=Truepour conserver l'ancien emplacement et son comportement de réutilisation. -
Gardez
mixup + cutmix <= 1pour la classification ; les combinaisons invalides lèvent désormais une erreur pendant la configuration. -
QAT désactive EMA, SyncBatchNorm et le moyennage des checkpoints. Utilisez les checkpoints best/last de QAT sans dépendre de ces états.
-
Les chargeurs personnalisés avec des hooks de mutation du dataset doivent utiliser
persistent_workers=Falseou recréer les workers après la mutation. Les copies persistantes incompatibles de plusieurs workers lèvent désormais une erreur. -
Les tableaux d'images NumPy sont lus en BGR, l'ordre d'OpenCV. Passez
color_format="rgb"là où vous transmettez un tableau RGB commenp.asarray(pil_image); la sortie decv2.imread()et les images vidéo ne demandent aucun changement. -
Un tableau NumPy ou un tenseur 4D est un batch :
predict()renvoie une liste avec unResultspar image au lieu de n'utiliser que la première image. -
train(resume=True)ettrain(resume="path/to/last.pt")restaurent les arguments d'entraînement enregistrés de l'exécution et continuent d'écrire dans son répertoire d'exécution ; les arguments que vous passez explicitement l'emportent. Reprendre des poids publiés, ou une exécution qui a déjà atteint sesepochs, lèveValueError. -
Lorsque la validation est activée, la dernière époque est toujours validée, si bien que les exécutions plus courtes que
eval_intervalrapportent désormais des métriques et écriventbest.pt.val=Falsedésactive la validation, dernière époque comprise. La validation pendant l'entraînement écrit dans<run>/valau lieu deruns/val/. -
Les échecs de la commande CLI
trainindiquent leur type d'erreur, si bien que les erreurs de configuration se terminent avec le code 2 au lieu du code 1 avecio_error.
Consultez le changelog pour la version complète et l'importation de poids pour la conversion de checkpoints.
De 1.4.0 à 1.5.0
Cette page concerne la mise à niveau de LibreYOLO lui-même. Si vous cherchez à charger un checkpoint issu d'un projet amont, consultez plutôt la page importer des poids existants.
L'entrée complète de cette version figure dans le journal des modifications. La suite présente uniquement ce qui demande une intervention de votre part.
Modifications de code obligatoires
allow_experimental=True n'existe plus
Le mécanisme d'acceptation a disparu, ainsi que le mécanisme
ddp_aware(experimental_key=...) sur lequel il reposait. L'entraînement et
l'exportation d'EC, RTMDet, PicoDet et FOMO exigeaient auparavant cet argument.
Tout script qui entraîne l'une de ces familles est donc concerné.
# 1.4.0model.train(data="data.yaml", epochs=100, allow_experimental=True) # 1.5.0 : supprimez l'argumentmodel.train(data="data.yaml", epochs=100)Il n'existe aucune couche de compatibilité pour la dépréciation. Un appel qui
transmet encore cet argument reçoit un avertissement
Unknown training config keys (ignored), et l'argument n'a aucun effet.
BaseModel.EXPERIMENTAL_WEIGHT_FILENAMES a été supprimé avec lui. Le hook
get_download_notice() subsiste et reste redéfini par MiDaS, SegFormer et
YOLO9-P2.
Les niveaux de prise en charge sont toujours publiés, mais ne constituent plus un argument. Consultez les niveaux de stabilité.
Le niveau d'exportation "experimental" n'existe plus
from libreyolo.export.support import Tier # 1.4.0 : Literal["validated", "experimental", "blocked"]# 1.5.0 : Literal["validated", "available", "blocked"]Le code qui bifurque en fonction de la chaîne du niveau doit lire
"available" là où il lisait "experimental". BaseExporter n'émet plus de
RuntimeWarning pour ces formats. L'état de chaque format figure dans la
matrice d'exportation.
pretrained=False avec resume est désormais refusé
Cette combinaison produisait auparavant un comportement incohérent. Elle déclenche maintenant :
ValueError: pretrained=False cannot be combined with resume.Choisissez l'un ou l'autre. pretrained=False démarre à partir d'une nouvelle
initialisation déterministe, qui fonctionne dans la version 1.5.0 pour toutes
les familles entraînables au lieu de trois seulement. resume reprend une
exécution interrompue depuis son checkpoint. Les deux options sont documentées
dans la section entraînement.
--imgsz de la CLI est une chaîne et non un entier
Le changement est plus limité qu'il n'y paraît. Ces deux formes restent inchangées :
libreyolo predict --model yolo9-t --source img.jpg --imgsz 640 # toujours validemodel.predict("img.jpg", imgsz=640) # toujours valideSeul le code qui appelle directement depuis Python les fonctions de commande de
la CLI doit changer. En effet, predict, train et val ont
élargi --imgsz de int à str afin d'accepter les tailles rectangulaires :
from libreyolo.cli.commands.predict import predict_cmd predict_cmd(..., imgsz=640) # 1.4.0predict_cmd(..., imgsz="640") # 1.5.0, et "480x640" fonctionne désormais aussiLa valeur par défaut de train est désormais la chaîne "640".
export --imgsz était déjà une chaîne et profile ne change pas.
Nombres qui changent
Trois modifications influent sur les métriques avec les réglages par défaut. Si vous suivez les résultats entre les versions, lisez cette section avant de comparer une exécution 1.5.0 à une exécution 1.4.0.
faster-coco-eval devient le backend par défaut des métriques COCO
val() et la validation effectuée à chaque époque pendant l'entraînement
calculent désormais les métriques COCO avec le backend C++ faster-coco-eval au
lieu de pycocotools.
Ce choix repose sur des mesures de parité effectuées sur les 100 partitions de test RF100-VL : 1 381 des 1 400 valeurs de métriques étaient identiques au bit près, l'écart maximal atteignait 2,22e-16, les écarts des métriques principales étaient exactement nuls, pour une vitesse globale 15,6 fois supérieure et 56 fois supérieure sur les datasets riches en détections. Vos nombres ne devraient pas changer. Ils sont néanmoins produits par une autre implémentation, raison pour laquelle ce point figure dans cette liste.
pycocotools reste la solution de repli automatique lorsque faster-coco-eval n'est pas installé. Pour l'imposer :
libreyolo val --model yolo9-t --data coco.yaml --no-faster-coco-evalmodel.val(data="coco.yaml", faster_coco_eval=False)LIBREYOLO_FASTER_COCO_EVAL=0 produit le même effet globalement. Le backend
réellement utilisé est journalisé au niveau INFO, exposé dans
model.last_eval_backend après val() et inclus sous eval_backend dans la
charge utile JSON de la CLI. Installez le parcours rapide avec
pip install libreyolo[fast-eval].
Les checkpoints YOLOX entraînés avant la version 1.5.0 nécessitent de redéfinir eps
C'est le piège de cette version. Lisez cette section si vous avez affiné YOLOX.
YOLOX définit BatchNorm avec eps=1e-3 et momentum=0.03. Jusqu'à la version
1.5.0, ces valeurs étaient appliquées sous forme de correction après coup, qui
ne survivait pas à la reconstruction de la tête effectuée par train() lorsque
le nc de votre dataset différait de celui du checkpoint. Un tel fine-tuning
s'entraînait et signalait sa validation interne avec la valeur eps=1e-5 par
défaut de torch, puis se rechargeait pour l'inférence avec 1e-3 : les mêmes
tenseurs soumis à une normalisation différente.
Les tailles à convolution ordinaire changent à peine. La taille depthwise n
change fortement, car sa running_var par canal est suffisamment faible pour
qu'eps domine. Sur la partition ball de RF100-VL, le même checkpoint nano
atteint une mAP50-95 de 0,566 lorsqu'il est évalué avec l'eps de son
entraînement, contre 0,151 après un rechargement standard.
Un checkpoint entraîné avant la version 1.5.0 possède la sémantique eps=1e-5. Pour obtenir des nombres fidèles, évaluez-le en redéfinissant l'eps BN à 1e-5 :
import torchfrom libreyolo import LibreYOLO model = LibreYOLO("my-yolox-finetune.pt")for module in model.model.modules(): if isinstance(module, torch.nn.BatchNorm2d): module.eps = 1e-5 model.val(data="data.yaml")Vous pouvez aussi intégrer une fois
sqrt((var + 1e-3) / (var + 1e-5)) aux poids BN, puis enregistrer le
résultat. Les checkpoints entraînés avec la version 1.5.0 ou une version
ultérieure ne nécessitent aucune de ces opérations.
L'entraînement multi-échelle de D-FINE emploie la recette amont propre à chaque taille
base_size_repeat était fixé à 3 pour toutes les tailles. Il est désormais
résolu par taille, conformément à la spécification amont : n s'entraîne à
taille fixe sans multi-échelle, s vaut 20, m 6, l 4 et x 3.
Seule la taille x correspondait auparavant. Les tailles n, s, m et l voient donc
une distribution d'échelles différente et convergent vers d'autres métriques.
Pour rétablir l'ancien comportement, définissez-le explicitement :
from libreyolo.training.config import DFINEConfig config = DFINEConfig(base_size_repeat=3)DEIM conserve la valeur 3 codée en dur. Les détails de la famille figurent sur la page D-FINE.
À connaître, sans intervention nécessaire
- Les résultats avec un
imgszrectangulaire ont changé parce qu'ils étaient auparavant incorrects. Les coordonnées des boîtes, le redimensionnement des masques RTMDet, le changement d'échelle de YOLO-NAS et celui des vérités terrain du validateur utilisent maintenant la hauteur et la largeur propres à chaque axe, et non une valeur scalaire unique. Avec unimgszcarré, rien ne change au bit près. L'inférence ou la validation rectangulaire était mal mise à l'échelle dans la version 1.4.0. YOLO-NAS refuse désormais unimgszrectangulaire au lieu de produire silencieusement une sortie incorrecte. - Les dictionnaires de métriques contiennent de nouvelles clés. Il s'agit
de
max_det,ar_max_detetAR_max_detprovenant de l'évaluateur COCO, ainsi que demetrics/lossetmetrics/loss/cepour FOMO. Les valeurs avec les réglages par défaut ne changent pas, mais tout code qui parcourt les clés des métriques, y compris les systèmes de journalisation personnalisés et les en-têtes CSV, voit de nouvelles colonnes. - Les exécutions YOLO9 déterministes qui reconstruisent une tête commencent depuis une initialisation différente, car la graine est désormais appliquée avant la reconstruction plutôt qu'après. Un fine-tuning déterministe réalisé avec la version 1.4.0 sur un nombre de classes différent ne peut pas être reproduit bit à bit avec la version 1.5.0.
libreyolo[hub-kernels]sur CUDA active désormais réellement le kernel MS-deform-attn natif. La version 1.4.0 le plaçait derrière une condition que RF-DETR n'empruntait jamais, de sorte que le kernel ne s'exécutait pas. Les prédictions de RF-DETR et des autres familles à attention déformable peuvent changer dans les limites de tolérance des nombres flottants. Les installations standard ne sont pas concernées etLIBREYOLO_HUB_KERNELS=0le désactive.libreyolo predictignore les options non prises en charge au lieu de déclencher une erreur. La CLI filtre les arguments nommés selon la signature__call__du modèle. Une option que la famille n'accepte pas est ainsi ignorée au lieu de déclencher uneTypeError. Un nom d'option inconnu est toujours rejeté avecNo such option.- Les sources en direct modifient la forme de la sortie JSON. Les webcams, les flux RTSP et la capture d'écran activent implicitement le streaming, qui émet un enregistrement par image plutôt qu'un seul pour l'appel. Ces sources sont nouvelles dans la version 1.5.0. Aucun script 1.4.0 n'est donc concerné.
- Réexporter
rfdetr-poseouyolonas-posevers ONNX produit des noms de sorties différents. La version 1.4.0 interprétait à tort leurs têtes de pose à plusieurs tenseurs comme de la segmentation, au moyen d'une heuristique fondée sur le nombre de sorties. Les fichiers.onnxexistants sur le disque ne changent pas. - Dans une installation sans torch, les résultats contiennent des tableaux
numpy plutôt que des
torch.Tensor..boxes.datarenvoie donc un autre type et le départage des égalités par la NMS peut différer de torchvision. Lorsque torch est installé, le comportement reste identique octet par octet. Consultez l'installation légère. - Les objets de configuration sont davantage validés à leur construction.
TrainConfigpossède désormais une méthode__post_init__dont il était auparavant dépourvu. Une configuration déjà non valide déclenche donc une erreur immédiatement au lieu d'échouer tard pendant une exécution. La sérialisation deValidationConfigcontient une nouvelle cléedge_thresholds, qui empêche un aller-retour strictValidationConfig(**dump)depuis un export de la version 1.4.0. - Les noms de fichiers de poids des familles dotées d'un suffixe de tâche sont
résolus différemment.
segformer-b0se résout désormais enLibreSegformerb0-sem.pt. Cette correction élimine les erreurs 404 de téléchargement automatique, mais rompt tout script qui avait codé en dur l'ancien nom sans suffixe. - Le marqueur pytest
experimental_backends'appelle désormaisextended_backend. Ce point ne vous concerne que si vous exécutez la suite de tests avec-m.
Checkpoints et datasets
Les checkpoints écrits par la version 1.4.0 se chargent sans modification. Le
schéma contient désormais imgsz_h et
imgsz_w pour les modèles rectangulaires, et écrit toujours la valeur scalaire
imgsz = max(h, w) pour les anciens lecteurs. Les exportations
ExecuTorch et MNN nécessitent
maintenant un fichier annexe, respectivement <program>.pte.json et
<model>.mnn.json, tandis que les exportations HRNet contiennent
pose_input: "person_crop". Les formats de datasets ne changent pas.