DeepFace模型阈值选择技术咨询:默认依据与场景适配
DeepFace阈值相关问题解答
1. 各模型默认阈值的选取依据
DeepFace里的这些默认阈值不是随便定的,核心依据是标准人脸基准数据集的调优结果,同时结合模型原论文的推荐值:
- 从代码注释能看到,VGG-Face的4096d版本阈值是在LFW(Labeled Faces in the Wild)数据集上调优得到的。这类通用数据集包含大量自然场景下的人脸样本,调优目标是平衡误识率(FAR)和拒识率(FRR),通常会选等错误率(EER)对应的阈值,或者在业务可接受的FAR范围内取FRR最低的阈值。
- 其他模型比如Facenet、ArcFace、Dlib等的阈值,主要参考各自原论文中在LFW、CFP-FP、AgeDB-30这类基准数据集上的验证结果,DeepFace维护者再通过统一测试流程验证后确定默认值,确保在通用场景下有稳定表现。
对应的阈值获取代码如下:
def find_threshold(model_name: str, distance_metric: str) -> float: base_threshold = {"cosine": 0.40, "euclidean": 0.55, "euclidean_l2": 0.75} thresholds = { # "VGG-Face": {"cosine": 0.40, "euclidean": 0.60, "euclidean_l2": 0.86}, # 2622d "VGG-Face": { "cosine": 0.68, "euclidean": 1.17, "euclidean_l2": 1.17, }, # 4096d - tuned with LFW "Facenet": {"cosine": 0.40, "euclidean": 10, "euclidean_l2": 0.80}, "Facenet512": {"cosine": 0.30, "euclidean": 23.56, "euclidean_l2": 1.04}, "ArcFace": {"cosine": 0.68, "euclidean": 4.15, "euclidean_l2": 1.13}, "Dlib": {"cosine": 0.07, "euclidean": 0.6, "euclidean_l2": 0.4}, "SFace": {"cosine": 0.593, "euclidean": 10.734, "euclidean_l2": 1.055}, "OpenFace": {"cosine": 0.10, "euclidean": 0.55, "euclidean_l2": 0.55}, "DeepFace": {"cosine": 0.23, "euclidean": 64, "euclidean_l2": 0.64}, "DeepID": {"cosine": 0.015, "euclidean": 45, "euclidean_l2": 0.17}, "GhostFaceNet": {"cosine": 0.65, "euclidean": 35.71, "euclidean_l2": 1.10}, } threshold = thresholds.get(model_name, base_threshold).get(distance_metric, 0.4) return threshold
2. 不同场景下的理想阈值选择方法(并非完全依赖经验)
选阈值有明确的流程,不用全靠经验:
- 先明确业务优先级:比如门禁场景要严控误识(不能放陌生人进),就调高阈值;考勤场景要减少拒识(不能漏打卡),就调低阈值。
- 用自有场景数据集做量化评估:收集场景内的正负样本(同一人的不同拍摄状态、不同人的样本),计算不同阈值下的FAR和FRR,画出ROC曲线,根据业务要求的指标(比如要求FAR≤0.1%)选对应阈值。
- 参考同场景行业规范:比如金融级人脸验证要求FAR低于1e-6,对应的阈值就要更严格。
- 迭代优化:上线后持续收集错误案例(误识/拒识),定期重新评估阈值,适配场景变化。
3. 测试时识别错误的解决思路
先定位错误类型,再针对性处理:
- 第一步:分析错误特征
统计是误识(不同人脸被判为同一人)还是拒识(同一人被判为不同人),同时看错误样本的共性:比如光线过暗、侧脸角度大、戴口罩/眼镜、表情夸张等。 - 针对拒识问题
- 检查预处理流程:确认人脸对齐、归一化是否正确,很多拒识是因为人脸定位不准导致特征提取错误。
- 适当降低对应模型的阈值:通用场景下的拒识,微调阈值能提升通过率。
- 换鲁棒性更强的模型:比如ArcFace、GhostFaceNet对姿态、遮挡的容忍度更高。
- 针对误识问题
- 调高阈值:增加判定的严格度。
- 换高维特征模型:比如用Facenet512代替Facenet,更高维度的特征区分度更强。
- 多模型融合:同时用两个不同模型做验证,只有两者都通过才判定为同一人,降低误识概率。
- 补充场景数据优化
如果错误样本是场景特有的(比如工地戴安全帽、医护戴口罩),收集这类数据对模型做微调,或者用数据增强生成类似样本,提升模型泛化能力。 - 检查代码逻辑
确认阈值是否正确加载,距离计算方式是否和模型匹配(比如部分模型要求特征先做L2归一化再计算欧氏距离)。
内容的提问来源于stack exchange,提问作者Bernardo Bevilaqua
相关产品推荐
相关产品推荐

