python - 如何为图像分割任务创建混淆矩阵?
问题描述
我正在处理二进制图像分割问题。我已经成功编译并训练了模型。现在我正在努力实现两个目标:
- 获取测试集的总混淆矩阵(原因:了解误报和误报的比例)
- 为测试集中的每个图像获取一个单独的混淆矩阵(原因:查找并分析拖累模型性能的图像)
据我了解,confusion_matrix
来自scikit-learn包可以帮助处理完全混淆矩阵,但我无法使其与我的自定义数据生成器一起使用。根据文档,这是一个代码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 = ???
至于个人混淆矩阵,根本没有想法......任何帮助表示赞赏。
解决方案
我想对你来说为时已晚,但也许这可以帮助其他人:
我确实通过使用混淆矩阵的定义,通过计算真阳性、真阴性、假阳性、假阴性来实现这一点。
此代码仅适用于二进制分割,假设“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()
推荐阅读
- c# - 从共享点文件打开文件流
- c# - 使用实体框架自动增加主键
- amazon-web-services - AWS 应用程序负载均衡器 - 在执行运行状况检查之前等待一段时间
- php - PHP 7.4 数据库操作上的 typeError
- android - 在 Android Kotlin 中关闭 Activity 后是否可以执行操作?
- c# - 查询在 mysql 中工作,但不是来自 c# 代码
- c - C/Linux:如何找到要使用的完美线程数,以最大限度地减少执行时间?
- agora.io - 为什么UE4找不到createAgoraRtcEngine的实现?
- android - 如何在 ConstraintLayout 中添加障碍
- c++ - 使用纯虚类和引用的 C++ 多态性