在计算机视觉项目的评估环节,我们常常会看到准确率(Accuracy)被作为首要指标。但当我处理过一个医疗影像分割项目后,深刻体会到单一指标的危险性——当正负样本比例达到1:9时,模型即使全部预测为负样本也能获得90%准确率。这正是F1分数在类别不平衡场景下不可替代的原因。
F1分数本质上是精确率(Precision)和召回率(Recall)的调和平均数。在计算机视觉任务中:
以目标检测为例,假设我们在监控视频中检测危险物品:
计算机视觉中最标准的计算流程是从混淆矩阵(Confusion Matrix)出发:
code复制 预测为正 预测为负
实际为正 TP FN
实际为负 FP TN
具体计算步骤:
在PyTorch中实现时,建议先计算整个batch的TP/FP/FN再聚合:
python复制def calculate_f1(outputs, targets):
# outputs和targets是模型输出和真实标签
preds = torch.argmax(outputs, dim=1)
tp = ((preds == 1) & (targets == 1)).sum().item()
fp = ((preds == 1) & (targets == 0)).sum().item()
fn = ((preds == 0) & (targets == 1)).sum().item()
precision = tp / (tp + fp + 1e-9)
recall = tp / (tp + fn + 1e-9)
return 2 * (precision * recall) / (precision + recall + 1e-9)
注意:添加1e-9防止除零错误是工业级代码的必备技巧
当处理ImageNet等多分类问题时,常用的两种策略:
宏平均(Macro-F1):
微平均(Micro-F1):
在语义分割任务中,我推荐采用逐类计算再宏平均的方式,特别是当某些物体类别(如交通标志)虽然像素占比小但至关重要时。
在YOLO或Faster R-CNN等模型中,F1分数与置信度阈值的选择密切相关。通过绘制P-R曲线(Precision-Recall Curve),我们可以找到最佳平衡点:
实际项目中,还需要考虑:
对于UNet等分割网络,F1的计算需要稍作调整:
在遥感图像分析中,道路像素可能只占5%,此时Dice/F1比单纯像素准确率更有参考价值。
基于我的项目经验,这些方法往往有效:
数据层面:
模型层面:
后处理技巧:
当项目进入深水区时,我们需要建立更立体的评估维度:
在最近的工业缺陷检测项目中,我们最终采用如下评估方案:
这种多指标体系既保持了F1的核心地位,又兼顾了实际业务需求。