Confidence
置信度分数是模型对预测正确性的 0 到 1 估计值。了解检测器如何计算置信度分数、阈值如何发挥作用,以及校准为何重要。
置信度分数是模型附加到预测结果上的一个 0 到 1 之间的数值,用来表示该预测正确的可能性。分类器会为每个类别标签附加置信度分数;目标检测模型会为每个边界框附加置信度分数,表示一个更具体的问题:这个边界框中包含该类别对象的可能性有多大?应用会利用置信度决定保留哪些预测、按什么顺序排序,以及哪些预测需要交由人工审核。
模型如何生成置信度#
置信度来自网络的最后一层。单标签分类器会将原始输出(称为 logits)输入 softmax,使各类别分数之和为 1,并报告最高分。检测器通常会分别对每个类别应用 sigmoid,因此一个边界框对两个相关类别都可能得分较高,而且各分数之和不一定为 1。带有单独 objectness 输出的检测器(例如 YOLOv5)会将其与类别概率相乘。许多无锚框检测器(包括较新的 YOLO 模型)会省去 objectness,并将最高类别分数用作边界框的置信度。
置信度阈值#
置信度阈值将分数转化为决策:高于阈值的预测会被保留,其余则会被丢弃。提高阈值会减少误报并提高精确率。降低阈值则能找回微弱、小尺寸或部分被遮挡的目标,并提高召回率,代价是误报会增多。F1 分数曲线达到峰值时对应的阈值能平衡这两者。YOLO26默认会在预测时保留得分高于 0.25 的框,而验证会将阈值降至 0.001,使其精确率-召回率曲线覆盖几乎所有可能的工作点。
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
image = "https://ultralytics.com/images/bus.jpg"
# Run the same image at a low and a high confidence threshold
for threshold in (0.1, 0.6):
results = model(image, conf=threshold)
scores = results[0].boxes.conf.tolist()
print(f"conf={threshold}: {len(scores)} boxes, scores {[round(s, 2) for s in scores]}")0.1 阈值的运行结果会包含 0.6 阈值运行结果中的所有框,以及任何得分更低的候选框,因此提高阈值只会移除检测结果,并且会从置信度最低的结果开始移除。
在应用中使用置信度#
许多系统会使用两个阈值。低于低阈值的预测会被丢弃,高于高阈值的预测会触发自动操作,而介于两者之间的结果则交由人工、第二个模型或另一个传感器处理。医学筛查工具可以立即标记高置信度的发现,并将不确定的结果排入队列,交由放射科医生处理;而主动学习循环会将不确定区间的样本发送给标注人员,这种策略称为不确定性采样。
置信度与校准#
只有模型经过校准时,0.9 分数才可以作为可用概率;这意味着在所有得分为 0.9 的预测中,约有 90% 是正确的。现代深度网络往往会过度自信,给出的分数高于实际命中率。温度缩放会用在留出数据上拟合的单个常数除以 logits,从而校正其中大部分偏差;scikit-learn 的校准工具则会拟合 Platt(sigmoid)或保序映射,并绘制可靠性曲线。只要分数被当作概率解读(例如用于风险阈值),校准就很重要。像平均精度均值 (mAP)这样的排序指标只取决于分数的顺序。










