如何解决如何评估 Python 中的对象检测?
我有以下形式的给定图片的真实情况列表和对象检测的相应预测列表:
ground_truth = [[0,6,234,45,362],[1,1,156,103,336],36,111,198,416],91,42,338,500]]
prediction = [[0,39,128],[0,3,244,128]
[1,102,180],162,305]]
其中单个对象被描述为每个识别对象的边界框的 class,min_x,min_y,max_x,max_y
值的(子)列表。
现在,我想根据真实情况评估预测的正确性。我知道联合和 F1 的交集,但仅适用于一个类和一个对象。我想知道如何将其概括为多个可能类的多个可能对象?
我是否应该遍历每个真实对象并遍历所有预测对象并查看哪个预测最接近?但是,如果预测部分重叠了两个地面实况对象呢?有点乱……
解决方法
您可以使用内置 SequenceMatcher
模块中的 difflib
类来比较两个数组。您的嵌套列表需要展平才能工作,这可以通过嵌套的简单列表推导来完成:
from difflib import SequenceMatcher
ground_truth = [[0,6,234,45,362],[1,1,156,103,336],36,111,198,416],91,42,338,500]]
prediction = [[0,39,128],[0,3,244,102,180],162,305]]
lst1 = [a for b in ground_truth for a in b]
lst2 = [a for b in prediction for a in b]
print(SequenceMatcher(None,lst1,lst2).ratio())
输出:
0.45
如您所见,两个列表之间的相似度为 45%。
,看看
sklearn.metrics.f1_score(y_true,y_pred,*,labels=None,pos_label=1,average='binary',sample_weight=None,zero_division='warn')
F-1 分数是准确率和召回率的调和平均值。
参数 average
将帮助您有效地处理多类/多标签情况:在多类/多标签目标的上下文中使用宏/微/样本/加权/二进制。如果没有,则返回每个班级的分数。否则,这决定了对数据执行平均的类型:
binary
:只报告 pos_label 指定的类的结果。这仅适用于目标 (y_{true,pred}) 是二进制的。
micro
:通过计算真阳性、假阴性和假阳性的总数来全局计算指标。
macro
:计算每个标签的指标,并找到它们的未加权平均值。这没有考虑标签不平衡。
weighted
:计算每个标签的指标,并通过支持度(每个标签的真实实例数)找到它们的平均权重。这会改变“宏”以解释标签不平衡;它可能导致 F-score 不在精确率和召回率之间。
samples
:计算每个实例的指标,并找到它们的平均值(仅对与accuracy_score不同的多标签分类有意义)
示例:
from sklearn.metrics import f1_score
y_true = [0,2,2]
y_pred = [0,1]
f1_score(y_true,average='macro')
0.26...
f1_score(y_true,average='micro')
0.33...
f1_score(y_true,average='weighted')
0.26...
f1_score(y_true,average=None)
array([0.8,0.,0. ])
y_true = [0,0]
y_pred = [0,0]
f1_score(y_true,zero_division=1)
1.0...
详细的学术论文:A Survey on Performance Metrics for Object-Detection Algorithms
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。