我训练了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)
处理后系统的输出仅是对象的类,而没有显示任何置信度百分比,我的问题是在测试过程中如何也显示置信度百分比?

最佳答案

model.predict为您提供每个类(class)的信心。在此之上使用np.argmax只会使您只有最高的信心。
因此,只需执行以下操作:

confidences = np.squeeze(model.predict(img))
我添加了 np.squeeze 来删除任何单例尺寸,因为我们只是在查看单个图像,因此批处理大小为1。因此,第一维的尺寸只有1,因此我将np.squeeze放入其中以删除单例。尺寸。
此外,您可以通过执行以下操作获得该图像的最佳分类以及置信度:
class = np.argmax(confidences)
name = class_names[class]
top_conf = confidences[class]
如果您想走得更远,并说出预测中的前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}%')
您可以修改代码以显示所需数量。我已经简化了这一过程,因此,如果您只想要最自信的类(class),请设置k = 1

关于python - 如何在Resnet 50分类中输出置信度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62558246/

10-13 09:06