J'essaie d'adopter le code d'origine MASK_RCNN à mon jeu de données.Le code d'origine prend des fichiers XML et je viens de modifier mon code pour accepter le format JSON. Voici le code
def load_mask(self, image_id, xml=False): # get details of image info = self.image_info[image_id] if xml: # define anntation file location path = info['annotation'] # load XML boxes, w, h = self.extract_boxes(path, xml=True) else: with open('D:\Mask_RCNN\Mask_RCNN\dataset\\annots\\annotations.json', 'r') as f: annots = json.load(f) found = False for value in annots.values(): if 'image' in value and value['instance_list']: if value['image']['original_filename'][:-3] == info['id']: boxes, w, h = self.extract_boxes(value) found = True break if found: # create one array for all masks, each on a different channel masks = zeros([h, w, len(boxes)], dtype='uint8') else: stop = "here" if found: # create one array for all masks, each on a different channel masks = zeros([h, w, len(boxes)], dtype='uint8') else: stop = "here" # create masks class_ids = list() for i in range(len(boxes)): box = boxes[i] row_s, row_e = box[1], box[3] col_s, col_e = box[0], box[2] masks[row_s:row_e, col_s:col_e, i] = 1 class_ids.append(self.class_names.index('Penquins')) return masks, asarray(class_ids, dtype='int32') # load an image reference #"""Return the path of the image.""" def image_reference(self, image_id): info = self.image_info[image_id] print(info) return info['path']
4 Réponses :
Seulement si XML code> est vrai, il est garanti, que les cases obtiennent une valeur. Sinon, des conditions supplémentaires doivent être remplies, ce qui ne semble pas être le cas. P>
des cases code> est initialisé dans certains em> des scénarios dans
load_mask code> s premier
si sinon code> bloc, ce qui signifie Il peut ne pas exister lorsque vous atteignez
si trouvé: code>. Il suffit de le déclarer au début
Cela signifie que vous essayez d'itérer sur le nombre de cases code> code>, mais de vos instructions ci-dessus sont construites de manière à ce que Essayez cet exemple simple: p> Ceci entraînera la même erreur que vous voyez. Votre problème est que ces deux instructions doivent passer avant que les cases cases code> pourrait ne pas quitter l'heure Cette déclaration est exécutée.
code> sont définies: p>
if 'image' in value and value['instance_list']:
if value['image']['original_filename'][:-3] == info['id']:
Le problème est que les cases ne sont pas déclarées en ligne de ceci pour la boucle, de sorte que définir des cases comme une liste vide dans la première partie de la fonction puis lorsque vous faites la boucle Il faut maintenant être déclaré (à moins que l'une des fonctions ne renvoie pas les cases et vous donne autre chose) p> Conseil rapide Lorsque vous faites la boucle, vous pouvez faire P> for i, box in enumerate(boxes):
...
Où avez-vous déclaré
cases code>?
@Guy: déclarer i> devrait lire: Attribuer à i> ou initialiser i>.
@Guidot "commençant par Python 3.6, vous pouvez déclarer des types de variables et fonctions" docs.python .org / 3 / bibliothèque / Typing.html
@Guy je pense qu'il voulait dire qu'il n'y a pas de tel que déclarant en python. Cependant, comme dit dans mon autre commentaire, il y a.
@Guy, désolé j'ai posté à nouveau avec quelques lignes de code supplémentaires
Si l'erreur est référencée avant l'affectation i> Cela signifie que la variable n'a pas encore reçu de valeur et que l'interprète n'en sait pas.
Dans votre définition de la fonction, écrivez ces cases d'instruction = Aucune comme première ligne.
@WIMANICESIR TYPE-TYPE-ITS ne sont pas des déclarations variables. Python ne a des déclarations variables i>.
@ Juanpa.arrivillaga, lisez les docs .. Ils utilisent même "déclarer" plusieurs fois dans les documents eux-mêmes. Une définition trouvée ailleurs est "La déclaration donne un nom et un type de données pour la variable".
@ Juanpa.arrivillaga aussi Ceci -> geeksforgeeks.org/difence-beween-definition -et-déclare ion
@WimaniceSir pendant que vous êtes techniquement correct, pourrais-je suggérer d'arrêter cette discussion ici? Il est entièrement hors sujet et sert probablement à confondre seulement l'affiche originale