背景
- 最近在做图像识别的项目, 需要评估图像识别模型的好坏
图像搜索指标
○ 召回率(recall):表示预测为正例且标签为正例的个数 / 标签为正例的个数
- recall@k:检索的 top-k 结果中预测为正例且标签为正例的个数 / 标签为正例的个数
○ 平均检索精度(mAP)
- AP: AP 指的是不同召回率上的正确率的平均值
- mAP: 测试集中所有图片对应的 AP 的平均值
指标理解
- 召回率(recall):表示预测为正例且标签为正例的个数 / 标签为正例的个数
- 基本定义
召回率表示预测为正例且标签为正例的个数与标签为正例的个数的比值,反映了模型能够正确识别出的正例在所有实际正例中所占的比例。 - 计算方式
假设在一个疾病检测模型中,有 100 个实际患病(标签为正例)的患者,模型检测出其中 80 个患病,那么召回率就是 80÷100=0.8,即 80%。 - 实际意义
- 在信息检索领域,比如在搜索引擎中搜索 “人工智能发展现状”,召回率反映了搜索引擎能够将与 “人工智能发展现状” 相关的网页真正找出来的能力。召回率越高,说明搜索引擎越能全面地找到用户需要的信息。
- 在医疗诊断领域,召回率体现了诊断模型检测出真正患病个体的能力。如果召回率低,可能会导致很多患者漏诊,错过最佳治疗时机。
- 在图像识别领域,如识别图片中的动物,召回率表示模型能正确识别出的动物图片在所有包含动物的图片中所占的比例。召回率高意味着模型能更全面地识别出目标动物图片,减少漏判情况。
- recall@k:检索的 top-k 结果中预测为正例且标签为正例的个数 / 标签为正例的个数
-
在图像识别领域,“检索的 top - k 结果中预测为正例且标签为正例的个数 / 标签为正例的个数” 是评估图像识别模型检索性能的重要指标,以下通过具体例子来帮助理解:
-
概念解释
- 检索的 top - k 结果:指的是模型在对图像进行识别检索时,按照某种相似度或置信度等指标,返回的最有可能符合要求的前 k 个图像结果。
- 预测为正例且标签为正例的个数:在检索出的 top - k 个图像中,模型预测这些图像属于某一特定类别(正例),同时这些图像的真实标签也确实属于该特定类别的图像数量。
- 标签为正例的个数:在整个数据集中,真实标签属于该特定类别的图像的总数量。
-
举例说明
假设要识别包含猫的图像,数据集中共有 100 张包含猫的图像(标签为正例的个数 = 100)。
当 k = 5 时,即检索的 top - 5 结果:- 模型对一批图像进行检索后,返回的 top - 5 图像中有 3 张确实是包含猫的图像,即预测为正例且标签为正例的个数为 3。那么此时的该指标值为 3÷100 = 0.03。
- 若返回的 top - 5 图像中,有 4 张是包含猫的图像,则该指标值为 4÷100 = 0.04,这说明模型在 top - 5 的检索结果中,能更准确地找到包含猫的图像。
当 k = 10 时,即检索的 top - 10 结果:
- 若模型返回的 top - 10 图像中,有 7 张是包含猫的图像,此时该指标值为 7÷100 = 0.07。说明当扩大检索结果数量到 10 个时,模型找到的包含猫的图像数量有所增加,该指标值也相应提高,反映出模型在更多的检索结果中能够找到更多真正符合要求的正例图像。
这个指标能帮助评估模型在不同检索结果数量下,对正例图像的检索能力,指标值越高,说明模型在检索正例图像方面的性能越好。
- AP: AP 指的是不同召回率上的正确率的平均值
- AP(平均精度)理解及举例
理解:AP 衡量的是在不同召回率水平下的平均正确率。在图像识别检索中,对于一个特定类别的图像检索任务,随着检索结果的增加(召回率提高),模型的正确率可能会波动。AP 通过对不同召回率下的正确率进行平均,来综合评估模型在检索该类别图像时的性能。 - 举例:假设我们要检索数据集中所有的猫的图像,总共有 10 张猫的图像(正例)。模型检索时,按照置信度从高到低返回结果。
- 当检索到第 1 张图像时,这张图像是猫的图像(预测正确),此时召回率为 1/10 = 0.1,正确率为 1/1 = 1。
- 当检索到第 2 张图像时,这张图像也是猫的图像,此时召回率为 2/10 = 0.2,正确率为 2/2 = 1。
- 当检索到第 3 张图像时,这张图像不是猫的图像(预测错误),此时召回率仍为 2/10 = 0.2,正确率为 2/3 ≈ 0.67。
- 当检索到第 4 张图像时,这张图像是猫的图像,此时召回率为 3/10 = 0.3,正确率为 3/4 = 0.75。
- 以此类推,直到检索完所有相关图像。AP 就是对这些不同召回率下的正确率进行平均得到的值。
- mAP: 测试集中所有图片对应的 AP 的平均值
- mAP(平均平均精度)举例说明
- 假设我们有一个图像检索系统,测试集包含 3 类图像:猫、狗和汽车,每类各有一些图像。
- 对于 “猫” 类图像的检索任务,系统对该类所有图像进行检索,计算得到 AP 值为 0.8。
- 对于 “狗” 类图像的检索任务,计算得到 AP 值为 0.7。
- 对于 “汽车” 类图像的检索任务,计算得到 AP 值为 0.9。
- 那么 mAP 就是这 3 个 AP 值的平均值,即 (0.8 + 0.7 + 0.9) / 3 = 0.8。mAP 综合反映了系统在多个不同类别图像检索任务中的平均性能。
指标函数封装
def calculate_recall_at_k(predictions_list, labels_list, k):
total_positives = len(labels_list)
correct_count = 0
for predictions, label in zip(predictions_list, labels_list):
top_k_predictions = predictions[:k]
if label in top_k_predictions:
correct_count += 1
return correct_count / total_positives if total_positives > 0 else 0
def calculate_ap_single(predictions, label):
relevant_count = 0
precision_values = []
recall_values = []
for i, pred in enumerate(predictions, 1):
if pred == label:
relevant_count += 1
precision = relevant_count / i
recall = relevant_count / 1 if label in predictions else 0
precision_values.append(precision)
recall_values.append(recall)
unique_recall = sorted(list(set(recall_values)), reverse=True)
ap = 0
for r in unique_recall:
p_at_r = max([p for p, rec in zip(precision_values, recall_values) if rec >= r])
ap += p_at_r
ap /= len(unique_recall) if unique_recall else 1
return ap
def calculate_map(predictions_list, labels_list):
aps = []
for predictions, label in zip(predictions_list, labels_list):
ap = calculate_ap_single(predictions, label)
aps.append(ap)
return sum(aps) / len(aps) if aps else 0
测试
predictions_list = [
[1, 0, 1, 2, 6],
[7, 4, 3, 2, 1],
[4, 3, 6, 5, 2]
]
labels_list = [1, 2, 3]
k = 3
recall_at_k = calculate_recall_at_k(predictions_list, labels_list, k)
map_value = calculate_map(predictions_list, labels_list)
print(f"recall@{k}的值为: {recall_at_k}")
print(f"mAP的值为: {map_value}")
说明: 场景: 一张图片输入之后, 在向量数据库中, 每张图片的结果会返回最可能得top5结果图片, 然后判断其模型的召回率和准确率