FiftyOne 在图像和视频数据集的基础上提供了多种内置方法来评估您的模型 预测,包括回归regressions、分类classifications、检测detections、多边形polygons、 实例和语义分割instance and semantic segmentations。
1. 概述和基本工作流程
FiftyOne 的评估方法可以在 Dataset 和 DatasetView 对象上使用,这意味着您可以用相同的语法评估整个数据集或其特定视图。
图解
基本示例:
import fiftyone as fo
import fiftyone.zoo as foz
# 加载快速入门数据集
dataset = foz.load_zoo_dataset("quickstart")
# 评估 predictions 字段中的目标检测
# 相对于 ground_truth 字段中的真实标注
results = dataset.evaluate_detections(
"predictions",
gt_field="ground_truth",
eval_key="eval",
)
# 启动可视化应用
session = fo.launch_app(dataset)
关键参数:
- “predictions”: 包含模型预测的字段名
- gt_field: 包含真实标注的字段名
- eval_key: 评估标识符,用于存储评估结果
2. 每类指标(Per-class metrics)
评估返回一个特定任务的 EvaluationResults 子类实例,提供了生成聚合统计信息的方法。
示例:生成分类报告
# 获取数据集中最常见的10个类别
counts = dataset.count_values("ground_truth.detections.label")
classes = sorted(counts, key=counts.get, reverse=True)[:10]
# 打印前10个类别的分类报告
results.print_report(classes=classes)
输出包含:
- precision(精确率): 预测为正确的样本中真正正确的比例
- recall(召回率): 所有真实正样本中被正确预测的比例
- f1-score: 精确率和召回率的调和平均数
- support: 每个类别的真实样本数量
三种平均方式:
- micro avg: 全局计算TP、FP、FN后再计算指标
- macro avg: 每个类别单独计算指标后取平均
- weighted avg: 按类别样本数量加权平均
3. 每样本指标(Per-sample metrics)
当传递 eval_key 参数时,FiftyOne 会在每个样本上填充有用的任务特定信息:
假阴性/假阳性计数
每个样本的准确率
查找假阳性最多的样本:
from fiftyone import ViewField as F
# 创建视图:按假阳性数量降序排列,只显示假阳性框
view = (
dataset
.sort_by("eval_fp", reverse=True) # 按假阳性数量降序
.filter_labels("predictions", F("eval") == "fp") # 只保留假阳性
)
session = fo.launch_app(view=view)
文档中提到的例子发现了一个标注错误:整盘胡萝卜被标注为单个目标,但模型预测了单个胡萝卜,这是因为 COCO 格式中的 iscrowd 属性设置错误。
4. 混淆矩阵(Confusion matrices)
混淆矩阵可以通过 Model Evaluation 面板或编程方式使用:
# 绘制混淆矩阵
plot = results.plot_confusion_matrix(classes=classes)
plot.show()
# 将图表连接到会话
session.plots.attach(plot)
交互特性:
- 点击混淆矩阵的单元格可在应用中选择相应的对象
- 点击对角线单元格查看真阳性样本
- 修改视图时,混淆矩阵会自动更新
5. 场景分析(Analyzing scenarios)
使用 use_subset() 方法可以评估模型在特定场景下的性能:
# 创建数据集的不同子集
four.random_split(dataset, {"sunny": 0.7, "cloudy": 0.2, "rainy": 0.1})
# 保存一个视图
dataset.save_view("take100", dataset.take(100))
# 在子集上分析性能
subset_def = dict(type="view", view="take100")
with results.use_subset(subset_def):
results.print_report(classes=classes)
这允许您:
- 分析模型在不同条件下的表现
- 比较不同数据子集的性能
- 识别模型在特定场景下的弱点
核心区别图解
7. 评估管理
FiftyOne 提供了完整的评估管理功能:
# 列出所有评估
dataset.list_evaluations()
# 获取评估信息
print(dataset.get_evaluation_info("eval"))
# 加载已有的评估结果
results = dataset.load_evaluation_results("eval")
# 重命名评估
dataset.rename_evaluation("eval", "still_eval")
# 删除评估(包括所有相关的数据)
dataset.delete_evaluation("still_eval")
主要方法:
- list_evaluations(): 列出所有评估
- get_evaluation_info(): 获取评估详情
- load_evaluation_results(): 加载评估结果
- load_evaluation_view(): 加载评估时使用的视图
- rename_evaluation(): 重命名评估
- delete_evaluation(): 删除评估及其数据
图解
总结
FiftyOne 的评估功能提供了:
- 灵活的评估接口:可以评估整个数据集或特定视图
- 详细的指标:从聚合统计到每个样本的详细信息
- 交互式可视化:通过混淆矩阵和应用界面探索结果
- 场景分析:评估模型在不同条件下的表现
- 完整的管理功能:保存、加载、重命名和删除评估
- 这些功能使得模型评估变得更加直观和高效,帮助您快速识别模型的优缺点并进行改进。