如何在Resnet 50分类中输出置信度水平?

4

我训练了一个Resnet-50分类网络来对我的物体进行分类,我使用以下代码来评估这个网络。

from tensorflow.keras.models import load_model
import cv2
import numpy as np
import os

class_names = ["x", "y", "b","g", "xx", "yy", "bb","gg", "xyz","xzy","yy"]


model = load_model('transfer_resnet.h5')


model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

imgg = cv2.imread('/path to image/a1.jpg')


img = cv2.resize(imgg,(224,224))
img = np.reshape(img,[1,224,224,3])


classes = np.argmax(model.predict(img), axis = -1)

print(classes)

for i in classes:
    names = class_names[i]
print(names)



cv2.imshow("id",imgg)
key = cv2.waitKey(0)

处理后系统输出的仅为对象类别,未显示置信度百分比。我的问题是如何在测试期间同时显示置信度百分比?
1个回答

3

model.predict会为每个类别提供置信度。在此基础上使用np.argmax,可以获取具有最高置信度的类别。

因此,只需执行以下操作:

confidences = np.squeeze(model.predict(img))

我已经添加了np.squeeze来移除任何单例维度,因为我们只看一个图像,所以批量大小为1。因此,第一维仅有大小为1,所以我用np.squeeze去掉单例维度。 另外,你可以通过以下方式获得此图像的最佳分类及置信度:

cls = np.argmax(confidences)
name = class_names[cls]
top_conf = confidences[cls]

如果你想进一步展示预测结果中前5类别,可以使用 np.argsort 进行排序,然后找到相应类别的索引,并显示这些置信度。请注意,我将按照负数进行排序,以便按降序获得置信度,因此排序的第一个索引对应置信度最高的类别。另外,我还将概率乘以100,以给出您所需的百分比置信度:
k = 5
confidences = np.squeeze(model.predict(img))
inds = np.argsort(-confidences)
top_k = inds[:k]
top_confidences = confidences[inds]

for i, (conf, ind) in enumerate(zip(top_confidences, top_k)):
    print(f'Class #{i + 1} - {class_names[ind]} - Confidence: {100 * conf}%')

你可以根据需要更改代码以显示所需的数量。我已经为您提供了方便,因此如果您只想要最有信心的类,则将k = 1设置即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接