如何为图像分割任务创建混淆矩阵?

时间:2020-07-06 11:51:17

标签: python keras image-segmentation

我正在处理二进制图像分割问题。我已经成功编译并训练了模型。现在,我正在尝试实现两个目标:

  1. 获取测试集的总混淆矩阵(原因:了解假阳性和假阴性的比例)
  2. 为测试集中的每个图像获取一个单独的混淆矩阵(原因:查找并分析会降低模型性能的图像)

据我了解, scikit-learn 软件包中的confusion_matrix可以帮助解决总的混淆矩阵,但是我无法使其与自定义数据生成器一起使用。根据文档,这是confusion_matrix的代码:

sklearn.metrics.confusion_matrix(y_true, y_pred, *, labels=None, sample_weight=None, normalize=None)

我不了解如何使用自定义数据生成器检索y_true

def learn_generator(templates_folder, masks_folder, image_width, batch_size, shuffle=True):
    """Generate individual batches form dataset"""
    counter = 0
    images_list = os.listdir(templates_folder)
    if shuffle:
        random.shuffle(images_list)
    while True:
        templates_pack = np.zeros((batch_size, image_width, image_width, 3)).astype('float')
        masks_pack = np.zeros((batch_size, image_width, image_width, 1)).astype('float')
        for i in range(counter, counter + batch_size):
            template = cv2.imread(templates_folder + '/' + images_list[i]) / 255.
            templates_pack[i - counter] = template
            mask = cv2.imread(masks_folder + '/' + images_list[i], cv2.IMREAD_GRAYSCALE) / 255.
            mask = np.expand_dims(mask, axis=2)
            masks_pack[i - counter] = mask
        counter += batch_size
        if counter + batch_size >= len(images_list):
            counter = 0
            if shuffle:
                random.shuffle(images_list)
        yield templates_pack, masks_pack

test_templates_path = "E:/Project/images/all_templates/test"
test_masks_path = "E:/Project/images/all_masks/test"
TEST_SET_SIZE = len(os.listdir(test_templates_path))
IMAGE_WIDTH = 512
BATCH_SIZE = 4
TEST_STEPS = TEST_SET_SIZE / BATCH_SIZE

test_generator = learn_generator(test_templates_path, test_masks_path, IMAGE_WIDTH, batch_size=BATCH_SIZE)
Y_pred = model.predict_generator(test_generator, steps=TEST_STEPS)
y_pred = np.argmax(Y_pred, axis=1)

y_true = ???

对于单个混乱矩阵,根本没有想法... 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

我想对你来说太晚了,但也许这可以帮助其他人:

我确实通过使用混淆矩阵的定义,通过计算真阳性,真阴性,假阳性,假阴性来实现这一点。

此代码仅适用于二进制分段,假设“1”是“正”的输出,“0”是“负”的输出...

    import seaborn as sns

    FP = len(np.where(Y_pred - Y_val  == -1)[0])
    FN = len(np.where(Y_pred - Y_val  == 1)[0])
    TP = len(np.where(Y_pred + Y_val ==2)[0])
    TN = len(np.where(Y_pred + Y_val == 0)[0])
    cmat = [[TP, FN], [FP, TN]]

    plt.figure(figsize = (6,6))
    sns.heatmap(cmat/np.sum(cmat), cmap="Reds", annot=True, fmt = '.2%', square=1,   linewidth=2.)
    plt.xlabel("predictions")
    plt.ylabel("real values")
    plt.show()

confusion_matrix

答案 1 :(得分:0)

https://www.kite.com/blog/python/image-segmentation-tutorial/

我认为您可以从该网站更改两个类的代码,并将其应用于您的用例。

此外,我认为此答案确实提供了sklearn混淆矩阵方法Faster method of computing confusion matrix?

的实现