首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用分割图像数据集从classification_report输出中执行predict_generator和confusion_matrix?( Keras Tensorflow)

如何使用分割图像数据集从classification_report输出中执行predict_generator和confusion_matrix?( Keras Tensorflow)
EN

Stack Overflow用户
提问于 2019-05-06 15:16:10
回答 1查看 1.1K关注 0票数 1

我为ImageDataGenerator创建了一个分类器,它使用flow_from_directory来加载数据集,然后执行模型和预测的训练。

我的问题是如何从classifier.predict_generator?的输出中获取度量(即acc、recall、FPR等)。

如果我没有错的话,使用confusion_matrix和classification_report方法会有很大帮助。图像(.tif文件)在

代码语言:javascript
运行
复制
/data/test/image ---> RGB images 
/data/test/label ---> Binary mask images
/data/train/image ---> RGB images 
/data/train/label ---> Binary mask images

这些图像如下所示:RGB图像 掩模图像。predict_generator方法返回如下所示的图像:预测图像

我已经尝试过像下面这样的代码来生成混淆矩阵,但没有正常工作:

代码语言:javascript
运行
复制
predicted_classes_indices = np.argmax(results,axis=1)
labels = (image_generator.class_indices)
labels = dict((v, k) for k, v in labels.items())
predictions = [labels[k] for k in predicted_classes_indices]
cm = confusion_matrix(labels, predicted_classes_indices)

所有代码:

代码语言:javascript
运行
复制
from redeUnet import get_unet
import matplotlib.pyplot as plt
import numpy as np
import os
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.python.keras.models import model_from_json
from tensorflow.python.keras.callbacks import EarlyStopping
from tensorflow.python.keras.callbacks import ModelCheckpoint

PATH_TRAIN = "..\\data\\train\\"

btSize = 4
alt = 256 # image row
larg = 256 # image col
image_folder = 'image'
mask_folder = 'label'
image_color_mode = 'rgb'
mask_color_mode = 'grayscale'
clMode =  'None' #'binary'
epocas = 5 
qtdPatience = 60

'''
Data augmentation
'''
data_gen_args = dict(featurewise_center=False,
                     samplewise_center=False,  # set each sample mean to 0
                     featurewise_std_normalization=False,  # divide inputs by std of the dataset
                     samplewise_std_normalization=False,  # divide each input by its std
                     zca_whitening=False,  # apply ZCA whitening
                     rotation_range=40,  # randomly rotate images in the range (degrees, 0 to 180)
                     zoom_range = 0.2, # Randomly zoom image 
                     width_shift_range=0.2,  # randomly shift images horizontally (fraction of total width)
                     height_shift_range=0.2,  # randomly shift images vertically (fraction of total height)
                     horizontal_flip=True,  # randomly flip images
                     vertical_flip=False,
                     rescale=1./255,
                     validation_split = 0.2)  # randomly flip images
train_image_datagen = ImageDataGenerator(**data_gen_args)
train_mask_datagen = ImageDataGenerator(**data_gen_args)

'''
DATASET prepare and load (20% Validation)
'''
# Load RGB images TRAINING
image_generator = train_image_datagen.flow_from_directory(PATH_TRAIN, 
                                                          classes = [image_folder],
                                                          class_mode = None,
                                                          color_mode = image_color_mode,
                                                          target_size = (larg, alt),
                                                          batch_size = btSize,
                                                          save_to_dir = None,
                                                          shuffle = False,
                                                          subset = 'training',
                                                          seed = 1)
# Load BINARY (Mask) images TRAINING
mask_generator = train_mask_datagen.flow_from_directory(PATH_TRAIN, 
                                                          classes = [mask_folder],
                                                          class_mode = None,
                                                          color_mode = mask_color_mode,
                                                          target_size = (larg, alt),
                                                          batch_size = btSize,
                                                          save_to_dir = None,
                                                          shuffle = False,
                                                          subset = 'training',
                                                          seed = 1)

train_generator = zip(image_generator, mask_generator)

#-------------------------------------------------
# VALIDATION images RGB
valid_image_generator = train_image_datagen.flow_from_directory(PATH_TRAIN, 
                                                          classes = [image_folder],
                                                          class_mode = None,
                                                          color_mode = image_color_mode,
                                                          target_size = (larg, alt),
                                                          batch_size = btSize,
                                                          save_to_dir = None,
                                                          shuffle = False,
                                                          subset = 'validation',
                                                          seed = 1)

# VALIDATION images BINARY (Mask)
valid_mask_generator = train_mask_datagen.flow_from_directory(PATH_TRAIN, 
                                                          classes = [mask_folder],
                                                          class_mode = None,
                                                          color_mode = mask_color_mode,
                                                          target_size = (larg, alt),
                                                          batch_size = btSize,
                                                          save_to_dir = None,
                                                          shuffle = False,
                                                          subset = 'validation',
                                                          seed = 1)
valid_generator = zip(valid_image_generator, valid_mask_generator)
#-------------------------------------------------

'''
RUN TRAINING
'''
# Get UNET
classificador = get_unet(larg, alt, 3)
classificador.compile(optimizer = Adam(lr = 1e-4), loss = 'binary_crossentropy', metrics = ['accuracy']) #metrics = ['accuracy', minhaMetrica])

# Salvando o Modelo e Pesos (Best Model, StopEarly)
es = EarlyStopping(monitor = 'val_loss', mode = 'min', verbose = 1, patience = qtdPatience)
mc = ModelCheckpoint('best_polyp_unet_model.h5', monitor = 'val_loss', verbose = 1, save_best_only = True)


history = classificador.fit_generator(train_generator, 
                            steps_per_epoch = image_generator.n // btSize,
                            validation_data = valid_generator,
                            validation_steps = valid_image_generator.n // btSize,
                            epochs = epocas, callbacks=[es, mc])

resultados = classificador.predict_generator(valid_generator, 
                                           steps = valid_image_generator.n,
                                           verbose = 1)
#-------------------------------------------------

#HOW TO GET THE METRICS?

predicted_classes_indices = np.argmax(resultados,axis=1)
labels = (image_generator.class_indices)
labels = dict((v, k) for k, v in labels.items())
predictions = [labels[k] for k in predicted_classes_indices]
cm = confusion_matrix(ground_truth, predicted_classes)

#-------------------------------------------------

在这一行中我收到了一条错误消息:predictions = [labels[k] for k in predicted_classes_indices]

错误:无法使用的类型:“numpy.ndarray”

当我通过运行以下命令检查预测的输出变量("resultados")时:resultados.shape.Shows:

代码语言:javascript
运行
复制
(480, 256, 256, 1)

有480张来自U网预测的图像。

但是,我如何将这些信息转换为与"confusion_matrix“或"classification_report”匹配的信息呢?我认为这更困难,因为这是一个分割问题。

如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-01-24 19:25:10

你需要平平你的预言和基本真理(y):

代码语言:javascript
运行
复制
import numpy as np
predictions_flat = predictions.flatten()
y_flat = y.flatten()

然后,可以在扁平矩阵上运行分类报告和混淆矩阵。

代码语言:javascript
运行
复制
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix


print('Train report', classification_report(y_flat, predictions_flat))
print('Train conf matrix', confusion_matrix(y_flat, predictions_flat))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56008022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档