EagleEye实操手册:如何修改默认Confidence阈值并持久化保存配置
1. 为什么需要修改默认置信度阈值?
你刚启动EagleEye,上传一张街景图,发现检测框密密麻麻——红绿灯、行人、自行车全被标出来了,但其中不少框的标签旁边写着“0.23”“0.18”这样的小数字。你拖动侧边栏的“Sensitivity”滑块,画面立刻清爽许多:低分框消失了,剩下的是真正靠谱的目标。
但关掉浏览器、重启服务后,滑块又回到了默认位置,所有设置“清零”了。
这不是Bug,而是设计使然:前端滑块只影响本次会话的实时推理,不触碰后端配置文件。
如果你希望系统每次启动都默认用“0.45”作为检测门槛(比如在安防场景中兼顾人形识别的召回率与误报率),就必须修改它的持久化配置源——也就是config.yaml。
这本手册不讲YOLO原理,也不跑NAS搜索流程。它只解决一个工程师最常问的问题:
“我调好了阈值,怎么让它下次还生效?”
答案就在这份实操指南里。
2. 配置文件在哪?结构长什么样?
EagleEye 的核心配置由config.yaml文件统一管理,它位于项目根目录下,路径为:
eagleeye/ ├── config.yaml ← 我们要改的就是它 ├── app.py ├── models/ ├── static/ └── requirements.txt打开config.yaml,你会看到类似这样的内容(已精简关键字段):
# config.yaml - EagleEye 全局配置 model: name: "damo_yolo_tinynas_s" weights: "models/damo_yolo_tinynas_s.pth" input_size: [640, 640] device: "cuda" inference: confidence_threshold: 0.3 iou_threshold: 0.45 max_det: 100 frontend: port: 8501 host: "0.0.0.0"注意这一行:
confidence_threshold: 0.3这就是当前生效的默认置信度阈值——也是你在前端滑块归零时实际看到的“基准线”。
它不是写死在代码里的魔法数字,而是一个可读、可写、可版本管理的YAML字段。
关键认知:
- 前端滑块 = 运行时覆盖(runtime override)
confidence_threshold字段 = 启动时加载的默认值(persistent default)- 二者互不干扰,但后者决定“冷启动”行为
3. 修改阈值的三种方式(按推荐顺序)
3.1 方式一:直接编辑 config.yaml(最稳妥,推荐新手)
这是最直观、最不易出错的方式,适合首次配置或生产环境固化参数。
操作步骤:
进入项目根目录
cd /path/to/eagleeye用文本编辑器打开配置文件(如 VS Code、nano 或 vim)
nano config.yaml找到
inference:下的confidence_threshold行,将0.3改为你需要的值
推荐值参考:0.25:高召回场景(如人流统计、缺陷初筛)0.40:平衡型通用设置(推荐日常使用)0.55:高精度严控(如工业质检、车牌识别后置过滤)
修改后保存:
inference: confidence_threshold: 0.40 # ← 已改为 0.40 iou_threshold: 0.45 max_det: 100重启服务(必须!否则新配置不加载)
# 如果是用 streamlit 启动 streamlit run app.py --server.port=8501 # 或者你用的是自定义启动脚本 python app.py
效果验证:
- 刷新浏览器,不拖动滑块,直接上传图片
- 观察右侧结果图中第一个检测框的 Confidence Score —— 它应 ≥ 0.40
- 若仍有低于 0.40 的框出现,请检查是否误改了
iou_threshold或缓存未清(见第5节)
3.2 方式二:启动时通过命令行参数覆盖(适合调试与CI/CD)
不想改文件?可以用-c参数临时指定配置路径,或用--conf-thresh直接传值。
示例:跳过 config.yaml,强制用 0.35 作为本次启动的阈值
streamlit run app.py --server.port=8501 -- --conf-thresh 0.35注意:
--是 streamlit 传递参数给app.py的分隔符,不可省略。
此时app.py会捕获该参数,并在初始化模型时优先使用它,完全绕过config.yaml中的值。
优势:
- 无需修改源文件,避免污染 Git 仓库
- 可写入 Jenkins/GitLab CI 脚本,实现“不同环境不同阈值”
- 快速验证多个阈值对 Recall/Precision 的影响
❌ 局限:
- 每次启动都要加参数,无法“永久生效”
- 不适用于 Docker 容器化部署(除非封装进 entrypoint)
3.3 方式三:Docker 环境下挂载自定义配置(生产级推荐)
如果你用 Docker 部署 EagleEye(例如docker run -p 8501:8501 eagleeye:latest),最佳实践是将修改好的config.yaml挂载进容器,而非修改镜像。
操作流程:
在宿主机准备一份定制配置(如
/opt/eagleeye/conf/custom.yaml)
内容同上,仅修改confidence_threshold启动容器时挂载该文件(覆盖容器内默认路径)
docker run -d \ --gpus all \ -p 8501:8501 \ -v /opt/eagleeye/conf/custom.yaml:/app/config.yaml \ --name eagleeye-prod \ eagleeye:latest
优势:
- 配置与镜像彻底分离,符合 12-Factor App 原则
- 多实例可共享同一份配置,也可按需挂载不同版本
- 升级镜像时,配置自动保留,零迁移成本
小技巧:把custom.yaml加入 Ansible playbook 或 K8s ConfigMap,即可实现配置即代码(GitOps)。
4. 验证修改是否真正生效
改完不验证 = 白改。别只看前端滑块位置,要确认三点:
4.1 检查服务日志中的加载信息
启动时,EagleEye 会在控制台打印配置加载详情。成功加载后你会看到:
INFO:root:Loaded inference config: confidence_threshold = 0.40 iou_threshold = 0.45 max_det = 100如果仍显示0.30,说明:
- 文件没保存成功
- 你改的是错误路径下的
config.yaml(比如子目录或备份文件) - 启动命令中用了
--conf-thresh参数,覆盖了文件值
4.2 查看前端右上角的“当前阈值”提示
EagleEye 前端在顶部状态栏明确显示:
Current Confidence Threshold:0.40(default)
这个数字来自后端 API 实时返回的config.inference.confidence_threshold,不是滑块当前位置。它是你修改后最权威的生效证明。
4.3 用 Python 脚本直连后端校验(高级验证)
EagleEye 提供/api/config接口,返回完整 JSON 配置。用 curl 或 requests 快速验证:
curl http://localhost:8501/api/config | jq '.inference.confidence_threshold' # 输出:0.40或用 Python:
import requests r = requests.get("http://localhost:8501/api/config") print(r.json()["inference"]["confidence_threshold"]) # → 0.40三项全部吻合,说明你的修改已 100% 持久化落地。
5. 常见问题与避坑指南
5.1 “改了 config.yaml,重启后还是 0.3?”
最常见原因有三个:
| 原因 | 检查方法 | 解决方案 |
|---|---|---|
| 配置文件路径错误 | ls -l config.yaml看是否在app.py同级目录 | 确保app.py执行时工作目录就是项目根目录;或在代码中用os.path.dirname(__file__)定位配置路径 |
| 编辑器保存失败 | cat config.yaml | grep confidence看终端输出是否更新 | 用nano/vim确保按Ctrl+O → Enter → Ctrl+X正确保存;避免用记事本等编码异常编辑器 |
| 前端缓存未刷新 | 强制刷新(Ctrl+F5)或用隐身窗口访问 | 浏览器可能缓存了旧 JS,清除http://localhost:8501/_stcore/下的缓存 |
5.2 “调高阈值后,目标全没了?是不是模型坏了?”
不是模型问题,是阈值过高导致“过滤过猛”。DAMO-YOLO TinyNAS 的输出置信度分布本身偏保守(尤其对小目标),建议:
- 先用
0.25测试,观察原始检测数量 - 再逐步上调至
0.35 → 0.40,记录每档的 Recall(检出率)变化 - 若
0.40下关键目标(如人脸、车辆)大量消失,说明该模型在此数据集上置信度校准不足,需考虑后处理重标定(见延伸阅读)
5.3 “能同时改多个阈值吗?比如不同类别用不同阈值?”
当前 EagleEye 默认不支持 per-class threshold(类别级阈值),但可通过以下方式扩展:
- 轻量方案:在
postprocess.py中添加规则,例如
if class_name == "person" and conf < 0.35: continue if class_name == "car" and conf < 0.50: continue- 进阶方案:修改
config.yaml结构,支持嵌套阈值映射,再在推理逻辑中动态读取
(本手册不展开,但源码中inference.py的filter_detections()函数是唯一修改点)
提示:EagleEye 的设计哲学是“简单可靠优先”。90% 的业务场景,一个全局阈值 + 前端微调,已足够应对。
6. 总结:让配置真正属于你
修改 Confidence 阈值,从来不只是拖动一个滑块。
它是一次从“临时体验”走向“工程可控”的关键跃迁。
你现在已经掌握:
- 定位:
config.yaml是持久化配置的唯一真相源 - 修改:三种方式覆盖本地开发、调试验证、生产部署全场景
- 验证:三重校验法确保修改真实生效,拒绝“我以为改好了”
- 避坑:直击新手最易踩的三个配置陷阱
下一步,你可以:
- 把
config.yaml加入 Git 版本管理,和团队共享标准阈值 - 为不同客户部署编写
conf/client_a.yaml/conf/client_b.yaml - 在 CI 流程中加入
yamllint检查,防止格式错误导致服务启动失败
配置不是终点,而是你掌控 EagleEye 的第一把钥匙。
现在,去把它拧紧吧。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。