ERROR:root:训练Mask-RCNN

时间:2019-06-11 20:54:31

标签: machine-learning keras computer-vision

我需要训练MASK-RCNN。但是当我开始训练时,出现以下错误信息:

  

ERROR:root:处理图像时出错{'id':'ISIC_0010064.jpg','source':'病变','path':'/home/mine/Desktop/ISIC2018/ISIC2018_inputs/ISIC_0010064.jpg'}

     

回溯(最近通话最近一次):

     

文件“ /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:标量变量的索引无效。

我已经更改了类数,在config中更改了更多参数,但是错误仍然存​​在。

有我的代码:

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)

我只想要一个解决方案,以使我的培训工作正常。在发布之前,我已经进行过搜索,但是找不到任何解决方案。

0 个答案:

没有答案