Error in model prediction: negative dimensions are not allowed. Please check the model.
Search before asking
- [x] I have searched the X-AnyLabeling model_zoo and found no similar model requests.
Description
Bonjour ,
J'ai téléchargé yolo11s_seg ultralytic depuis github afin de l'installer sur x_anylabeling localement, J'ai suivie tout les étapes, j'ai téléchargé le fichier .ONNX, puis j'ai intégré dans le model son chemin précis puis j'ai modifié les classe de yolo11 seg par mes propre classe,
Apres j'ai injecté ce modèle dans le logiciel X_anylabeling dans ma machine.
Résultat = Malheureusement, je ne trouve pas le modèle que j'ai renommé et que je l'ai intégré avec les ensemble de modèle qui existe dans la liste des models, ICI le chemin ( C:\X-AnyLabeling\anylabeling\configs\auto_labeling ).
Si je garde le même nom du model je trouve comme résultat l'hors du téléchargement du model : => erreur in model prédiction : négative dimension are note allowed please chek the model.
Que je dois faire s'il vous plait ? Merci, Cordialement.
Use case
Je voulais utilisé ce modèle pour faire de la segmentation sémantique. ( autolabeling).
Additional
No response
Are you willing to submit a PR?
- [x] Yes I'd like to help by submitting a PR!
Bonjour @Ghazi53,
Thanks for reporting this issue and providing the details. The error "Error in model prediction: negative dimensions are not allowed" usually indicates an incompatibility or unexpected output format from the ONNX model itself when used within the application, or potentially a misconfiguration.
To help diagnose this, could you please provide the following information?
-
ONNX Model Input/Output Nodes:
- Please open your
yolo11s_seg.onnxfile using Netron. - Share screenshots or list the exact names and shapes of the input node(s) and output node(s) of the model. This helps us understand what the model expects and returns.
- Please open your
-
Complete Configuration File:
- Please paste the entire content of the YAML configuration file you created for this
yolo11s_segmodel. You can paste it here within a code block like this:# Paste your full YAML content here type: ... name: ... model_path: ... # ... and so on
- Please paste the entire content of the YAML configuration file you created for this
-
Update to Latest Code:
- While it likely won't fix this specific prediction error (which seems model/config related), please pull the latest code from the repository using
git pull. This ensures you have the most recent version of X-AnyLabeling, including any potential updates or fixes, and helps keep our debugging environments aligned.
- While it likely won't fix this specific prediction error (which seems model/config related), please pull the latest code from the repository using
Providing the ONNX details and the full configuration file will be essential for us to understand how the model is structured and configured, and hopefully identify the cause of the negative dimension error.
Thanks!
Rebonjour, Merci pour cette réponse , ci-joint deux capture d'écran pour les input output node.
Entire content of the YAMl :
type: yolo11_seg name: 2025_seg.yaml display_name: ID-YOLO11s-Seg model_path: C:/Work-Space/Dev/CLP/MODELS/bestG.onnx nms_threshold: 0.45 confidence_threshold: 0.25 classes:
- lesions
- pleurisie
- cicatrice
- autre
- sain
- Background
Merci. Cordialement.
@Ghazi53 Thanks for providing the configuration and the Netron screenshot!
The YAML configuration looks mostly okay, although the type: yolo11_seg might need adjustment later depending on the model structure.
Regarding the Netron screenshot: you've correctly identified the input node images. However, to get the detailed information we need, you must click directly on the node boxes within Netron.
Please do the following in Netron:
- Click on the input node (the
imagesbox pointed to). A panel will appear (usually on the right) showing its properties. We need thename,type(e.g., float32), andshape(e.g.,1x3x640x640) from that panel.
This information is crucial to understand how to process the model's input and output correctly and fix the "negative dimensions" error. Merci!
ah desolé, merci pour la clarification,
voila la bonne screen :
input node :
output node:
Merci et bonne journée
Please upload the whole right panel info. Thanks for your cooperation.
Hii
==>Node input the name, type (e.g., float32), and shape (e.g., 1x3x640x640) from that panel.
==>Node output the name, type (e.g., float32), and shape (e.g., 1x3x640x640) from that panel.
Thanks for your help
Bonjour @Ghazi53,
Merci pour la clarification et les captures d'écran.
D'après les informations des nœuds du modèle ONNX que vous avez fournies :
- L'entrée est 'images' avec la forme
[1, 3, 640, 640]. - La sortie 'output0' a la forme
[1, 116, 8400]. - La sortie 'output1' (pour les masques) a la forme
[1, 32, 160, 160].
Dans 'output0', la dimension 116 par prédiction se décompose généralement comme suit pour les modèles de segmentation YOLO : 4 (coordonnées de la boîte englobante : cx, cy, w, h) + Nombre de Classes + Nombre de Coefficients de Masque.
En utilisant les 32 coefficients de masque de 'output1', le nombre de classes que votre modèle ONNX attend est :
116 - 4 (bbox) - 32 (masques) = 80 classes.
Cependant, votre fichier de configuration YAML (2025_seg.yaml) ne liste que 6 classes (lesions, pleurisie, cicatrice, autre, sain, Background).
Il y a une incohérence entre le nombre de classes attendu par le modèle (80) et celui défini dans votre configuration (6). Veuillez vérifier et corriger la liste classes dans votre fichier YAML pour qu'elle corresponde aux 80 classes avec lesquelles le modèle a été entraîné.
De plus, nous vous recommandons fortement de mettre à jour le logiciel vers la dernière version ou la branche de code la plus récente.
Cordialement.
Rebonjour,
Alors c'est possible de faire comme ca ?
116 - 4 (bbox) - 106 (masques) = 6 classes.
Comme ca j'aurais le meme nombre de classe qui existe dans mon .yaml ? pour avoir une cohérence entre le nombre de classes attendu par le modèle (80) et celui défini dans ma configuration (6).
Merci
Rebonjour @Ghazi53,
Je comprends votre raisonnement pour essayer de faire correspondre les nombres, mais l'interprétation de la dimension de sortie (116) est déterminée par la structure même du modèle ONNX, en particulier par les deux sorties fournies.
Votre calcul 116 - 4 (bbox) - 106 (masques) = 6 classes suppose qu'il y a 106 coefficients de masque.
Cependant, comme nous l'avons vu précédemment avec la capture d'écran des nœuds du modèle, la deuxième sortie du modèle, output1, a la forme [1, 32, 160, 160]. Cette forme output1 définit le nombre de coefficients de masque utilisés par le modèle.
Cela indique clairement que le modèle utilise 32 coefficients de masque, et non 106.
Par conséquent, le calcul correct pour déterminer le nombre de classes à partir de output0 reste :
116 (total dans output0) - 4 (bbox) - 32 (masques définis par output1) = 80 classes.
Le modèle a été entraîné pour reconnaître 80 classes distinctes, et le logiciel s'attend à ce que la configuration (.yaml) corresponde exactement à cette structure de 80 classes pour interpréter correctement les résultats.
Vous ne pouvez pas modifier la manière dont le logiciel interprète la sortie fixe du modèle ; il est nécessaire de mettre à jour votre fichier YAML pour lister les 80 classes sur lesquelles le modèle a été entraîné, dans le bon ordre.
Veuillez vous assurer que votre liste classes: dans le fichier YAML contient exactement 80 entrées correspondant à l'entraînement de votre modèle.
Merci.
Merci pour votre reponse:
Moi je voulais pas utilisé le modèle pour prédire les 80 classe, je voulais que ce modèle sera fonctionnel avec mes propres 6 classe, pour mes propres données s'il vous plait.
Quel sont les étapes a suivre s'il vous plait. Merci.
Oui, c'est tout à fait possible ! Vous avez bien compris la situation : même si votre modèle prédit 80 classes, vous pouvez configurer X-AnyLabeling pour ne travailler qu'avec les 6 classes qui vous intéressent pour vos données spécifiques.
Le logiciel permet de filtrer les classes affichées et utilisées pour l'annotation après que le modèle a fait ses prédictions.
Pour faire cela, vous devez utiliser le champ filter_classes dans votre fichier de configuration YAML. Vous trouverez les détails et un exemple dans notre documentation sur la configuration des modèles personnalisés :
https://github.com/CVHub520/X-AnyLabeling/blob/main/docs/en/custom_model.md#b-model-configuration
Voici comment cela fonctionnerait dans votre cas (exemple conceptuel) :
type: yolo11_seg
name: MonModele80Classes # Ou le nom de votre modèle
# ... autres paramètres comme model_path, input_width, input_height, etc. ...
classes: # <- ICI, vous devez lister les 80 classes EXACTES sur lesquelles le modèle a été entraîné, dans le bon ordre.
- classe_1_du_modele
- classe_2_du_modele
# ... (toutes les 80 classes) ...
- lesions # Votre 1ère classe d'intérêt (doit être dans les 80 noms ci-dessus)
- pleurisie # Votre 2ème classe d'intérêt (doit être dans les 80 noms ci-dessus)
- cicatrice # Votre 3ème classe d'intérêt (doit être dans les 80 noms ci-dessus)
- autre # Votre 4ème classe d'intérêt (doit être dans les 80 noms ci-dessus)
- sain # Votre 5ème classe d'intérêt (doit être dans les 80 noms ci-dessus)
- Background # Votre 6ème classe d'intérêt (doit être dans les 80 noms ci-dessus)
# ... (le reste des 80 classes) ...
- classe_80_du_modele
filter_classes: # <- ICI, listez UNIQUEMENT les 6 classes que vous voulez utiliser pour l'annotation.
- lesions
- pleurisie
- cicatrice
- autre
- sain
- Background
Étapes à suivre :
- Assurez-vous que la section
classesde votre fichier YAML contient la liste complète des 80 noms de classes, dans l'ordre exact où le modèle les a apprises. - Ajoutez la section
filter_classesà votre fichier YAML. - Dans
filter_classes, listez uniquement les 6 noms de classes que vous souhaitez utiliser pour l'annotation. Ces noms doivent correspondre exactement à ceux utilisés dans la liste principaleclasses. - Chargez le modèle avec cette configuration dans X-AnyLabeling. L'outil ne devrait alors afficher et permettre l'annotation que pour ces 6 classes filtrées.
J'espère que cela vous aidera ! Merci.
Merci, tout est classé dans le bon ordre, maintenant on va avoir 86 classe au lieux de 80 classe initiale, du modèle,( 80 classe du model + 6 classe de ma part.). que je dois faire ?
En revanche, j'ai pas entrainé le model sur les 6 nouveaux classe, c'est normal? ca va fonctionné quant même s'il vous plait ?
Merci
Rebonjour @Ghazi53,
Merci pour votre retour. Il semble y avoir une petite confusion sur la manière dont classes et filter_classes fonctionnent ensemble. Vous ne devez pas ajouter vos 6 classes aux 80 classes existantes pour obtenir une liste de 86 classes.
Voici comment cela fonctionne :
-
Section
classes:: Cette liste doit contenir exactement les 80 noms de classes sur lesquels votre modèle ONNX a été entraîné, dans l'ordre précis où le modèle les a apprises. Cette liste est la "vérité" du modèle, elle doit correspondre parfaitement à ce que le modèle produit en sortie. Elle doit donc comporter exactement 80 éléments. -
Section
filter_classes:: Cette liste sert ensuite à sélectionner parmi ces 80 classes existantes (définies dansclasses:) celles que vous voulez effectivement voir et utiliser dans l'interface de X-AnyLabeling. Les 6 noms que vous mettez dansfilter_classes:doivent donc être des noms qui existent déjà dans votre liste principale de 80 classes.
Concernant votre question sur l'entraînement :
Vous avez tout à fait raison de le souligner : si le modèle n'a pas été entraîné sur vos 6 classes spécifiques (lesions, pleurisie, etc.), il ne pourra pas les prédire. Un modèle ne peut identifier et prédire que les catégories qu'il a apprises lors de sa phase d'entraînement. Il ne peut pas "inventer" ou détecter des objets appartenant à des classes qu'il n'a jamais vues.
Le mécanisme filter_classes ne sert pas à apprendre de nouvelles classes au modèle. Il sert uniquement à masquer les prédictions des classes (parmi les 80 que le modèle peut prédire) que vous ne souhaitez pas voir ou annoter.
Donc, que devez-vous faire ? Deux scénarios possibles :
-
Scénario 1 (Si vos 6 classes FONT PARTIE des 80 classes d'origine) : Si les concepts que vous appelez
lesions,pleurisie,cicatrice,autre,sain,Backgroundcorrespondent à 6 des 80 classes sur lesquelles le modèle a déjà été entraîné (même si les noms étaient légèrement différents lors de l'entraînement), alors la procédure est correcte :- Listez les 80 noms de classes originaux du modèle dans la section
classes:. - Listez les 6 noms correspondants (tels qu'ils apparaissent dans la liste des 80) dans la section
filter_classes:.
- Le logiciel utilisera le modèle pour prédire parmi les 80 classes, puis n'affichera que les résultats correspondant aux 6 classes filtrées.
- Listez les 80 noms de classes originaux du modèle dans la section
-
Scénario 2 (Si vos 6 classes sont NOUVELLES pour le modèle) : Si
lesions,pleurisie, etc., sont des concepts totalement nouveaux que le modèle n'a jamais appris lors de son entraînement (ils ne font pas partie des 80 classes d'origine), alors ce modèle ne pourra pas les détecter ou les prédire. Dans ce cas :- Utiliser
filter_classesne fonctionnera pas pour ces 6 classes car le modèle ne les identifiera jamais. - Vous auriez besoin soit de ré-entraîner ce modèle (ou un autre) avec des données incluant spécifiquement vos 6 classes, soit de trouver un autre modèle qui a déjà été entraîné pour reconnaître ces 6 classes.
- Utiliser
Question pour clarifier : Est-ce que vos 6 classes (lesions, pleurisie, cicatrice, autre, sain, Background) sont des noms qui correspondent à 6 des 80 classes sur lesquelles le modèle a été initialement entraîné, ou sont-elles des catégories entièrement nouvelles pour ce modèle ?
Merci.