ОШИБКА: root: ошибка при обработке изображения во время обучения Mask-RCNN - PullRequest
0 голосов
/ 11 июня 2019

Мне нужно тренировать MASK-RCNN. Но когда я начинаю тренировку, я получаю следующее сообщение об ошибке:

ОШИБКА: корень: Ошибка при обработке изображения {'id': 'ISIC_0010064.jpg', 'source': 'lesion', 'path': '/home/mine/Desktop/ISIC2018/ISIC2018_inputs/ISIC_0010064.jpg'}

Traceback (последний последний вызов):

Файл "/home/mine/.virtualenvs/cv/lib/python3.6/site-packages/mask_rcnn-2.1-py3.6.egg/mrcnn/model.py", строка 1709, в data_generator use_mini_mask = config.USE_MINI_MASK)

Файл "/home/mine/.virtualenvs/cv/lib/python3.6/site-packages/mask_rcnn-2.1-py3.6.egg/mrcnn/model.py", строка 1265, в load_image_gt

class_ids = class_ids [_idx]

IndexError: недопустимый индекс для скалярной переменной.

Я уже изменил количество классов, изменил больше параметров в конфигурации, но ошибка сохраняется.

Вот мой код:

DATASET_PATH = "/home/enacom/Desktop/ISIC2018"
IMAGES_PATH =  os.path.join(DATASET_PATH, "ISIC2018_inputs")
MASKS_PATH = os.path.join(DATASET_PATH, "ISIC2018_ground_truth")

IMAGES_PATH = sorted(list(paths.list_images(IMAGES_PATH)))
idxs = list(range(0, len(IMAGES_PATH)))
random.seed(42)
random.shuffle(idxs)
i = int(len(idxs) * 0.8)
trainIdxs = idxs[:i]
valIdxs = idxs[i:]

CLASS_NAMES = {1: "lesion"}
COCO_PATH = "mask_rcnn_coco.h5"
LOGS_AND_MODEL_DIR = "lesion_logs"

class LesionBoundaryConfig(Config):
    NAME = "lesion"
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1
    STEPS_PER_EPOCH = len(trainIdxs)
    VALIDATION_STEPS = len(valIdxs) # doesnt suport low values
    NUM_CLASSES = len(CLASS_NAMES) + 1
    DETECTION_MIN_CONFIDENCE = 0.75
    IMAGE_MIN_DIM = 128
    IMAGE_MAX_DIM = 1024


class LesionBoundaryDataset(Dataset):
    def __init__(self, imagePaths, classNames, width = 1024):
        super().__init__(self)
        self.imagePaths = imagePaths
        self.classNames = classNames
        self.width = width

    def load_lesions(self, idxs):
        for (classID, label) in self.classNames.items():
            self.add_class("lesion", classID, label)

        for i in idxs:
            imagePath = self.imagePaths[i]
            filename = imagePath.split(os.path.sep)[-1]
            self.add_image("lesion", image_id=filename, path = imagePath)

    def load_image(self, image_ID):
        p = self.image_info[image_ID]["path"]
        image = cv2.imread(p)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        image = imutils.resize(image, width=self.width, height=self.width)

        return image

    def load_mask(self, image_id):
        info = self.image_info[image_id]
        filename = info["id"].split(".")[0]
        annot_path = os.path.sep.join([MASKS_PATH, "{}_segmentation.png".format(filename)])
        annot_mask = cv2.imread(annot_path)
        annot_mask = cv2.split(annot_mask)[0]
        annot_mask = imutils.resize(annot_mask, width=self.width, inter = cv2.INTER_NEAREST)
        annot_mask[annot_mask > 0] = 1
        # function to take unique ids
        class_ids = np.unique(annot_mask)
        # remove the id 0 because we should ignore the background
        class_ids = np.delete(class_ids, [0])
        masks = np.zeros((annot_mask.shape[0], annot_mask.shape[1], 1),
                     dtype="uint8")

        for (i, class_ids) in enumerate(class_ids):
            class_mask = np.zeros(annot_mask.shape, dtype="uint8")
            class_mask[annot_mask == class_ids] = 1
            masks[:, :, i] = class_mask

        return (masks.astype("bool"), class_ids.astype("int32"))

mode = "training"

train_dataset = LesionBoundaryDataset(IMAGES_PATH, CLASS_NAMES)
train_dataset.load_lesions(trainIdxs)
train_dataset.prepare()

val_dataset = LesionBoundaryDataset(IMAGES_PATH, CLASS_NAMES)
val_dataset.load_lesions(valIdxs)
val_dataset.prepare()

config = LesionBoundaryConfig()
config.display()

aug = iaa.SomeOf((0, 2), [
iaa.Fliplr(0.5),
iaa.Fliplr(0.5),
iaa.Affine(rotate=(-10, 10))
])

model = MaskRCNN(mode, config = config, model_dir=LOGS_AND_MODEL_DIR)
model.load_weights(COCO_PATH, by_name=True, exclude=["mrcnn_class_logits", "mrcnn_bbox_fc","mrcnn_bbox", "mrcnn_mask"])

model.train(train_dataset, val_dataset, epochs=20,
        layers="heads", learning_rate=config.LEARNING_RATE /10, augmentation=aug)

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

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