Python - локальная переменная, на которую ссылаются до ошибки присваивания - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь добавить оригинальный код mask_rcnn в мой набор данных. Исходный код принимает файлы xml, и я только что изменил свой код, чтобы принять формат json. Вот код


   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']

Это дает мне ошибку

Файл "C: / PycharmProjects / Mask_RCNN / Mask_RCNN / objects.py", строка 197, в load_mask
для i в диапазоне (len (boxes)): UnboundLocalError: локальная переменная 'boxes' ссылается до назначения

Я пытался отладить код, он выдает ошибку перед созданием масок, но я не в состоянии понять, что не так. Есть идеи?

Ответы [ 4 ]

0 голосов
/ 22 января 2020

Проблема в том, что ящики не объявляются в строке этого для l oop, поэтому задайте ящики как пустой список в первой части функции

def load_mask(self, image_id, xml=False):
    boxes = []
    #do all the other stuff here

Затем, когда вы делаете для l oop теперь он должен быть объявлен (если только одна из функций не возвращает поля и не дает вам что-то еще)

Быстрый совет при выполнении для l oop, вы можете сделать

for i, box in enumerate(boxes):
    ...

, который не заставит вас определять поле внутри l oop (я буду от 0 до len (боксы) -1, а поле будет прямоугольником с этим индексом)

0 голосов
/ 22 января 2020

boxes инициализируется в некоторых сценария ios в первом if else блоке load_mask, что означает, что он может не существовать при достижении if found:. Просто объявите это в начале

def load_mask(self, image_id, xml=False):
    # get details of image
    info = self.image_info[image_id]
    boxes = []
0 голосов
/ 22 января 2020

Это означает, что вы пытаетесь выполнить итерацию по числу boxes, но ваши операторы if выше построены таким образом, что boxes может не завершиться к моменту выполнения этого оператора.

попробуйте этот простой пример:

user_input = "no"

if user_input =="yes":
    boxes = [1,2,3,4]
else:
    pass

print(boxes)

Это приведет к той же ошибке, что и вы. Ваша проблема заключается в том, что оба этих оператора if должны пройти до того, как будет определено boxes:

           if 'image' in value and value['instance_list']:
                if value['image']['original_filename'][:-3] == info['id']:

Скорее всего, вам либо понадобится дополнительный лог c, который гарантирует, что итерация будет выполняться только при соблюдении определенных условий. Или, если boxes является списком, вы можете начать свой код с определения boxes=[]. В этом случае итерация просто пройдет, ничего не делая, поскольку длина boxes равна нулю в этом случае

0 голосов
/ 22 января 2020

Только если xml истинно, гарантируется, что ящики получат значение. В противном случае должны быть выполнены дополнительные условия, что, по-видимому, не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...