Recalculate Everything:
CLEAR_SQLITE_DATABASE=1 CLEAR_MEASURE_OUTPUT=1 CLEAR_ACTION_OUTPUT=1 CLEAR_MEDIA=1 CLEAR_STREAM_TMP=1 bash scripts/start_fresh.sh
配置(环境变量)
| 变量 | 说明 | 默认 |
|---|---|---|
PUBLIC_BASE_URL |
返回 JSON 中 video_left / video_right 的前缀(勿带末尾 /) |
http://127.0.0.1:8000 |
INGEST_API_KEY |
非空时,/api/v1/ingest/* 需请求头 X-API-Key |
空(不校验) |
STREAM_TMP_DIR |
分块上传临时目录 | <repo>/fish_api/.data/ingest |
MEDIA_ROOT |
对外托管每次测量生成的 *_left.mp4 / *_right.mp4 |
<repo>/fish_api/.data/media |
FISH_MEASURE_ROOT |
FishMeasure 根目录 |
自动相对仓库 |
FISH_ACTION_ROOT |
FishAction 根目录 |
自动相对仓库 |
MEASURE_OUTPUT_ROOT |
传给 --save-output 的目录 |
<repo>/fish_api/.data/measure_output |
YOLO_MODEL / WEIGHT_CHECKPOINT / ACTION_CHECKPOINT |
模型路径 | 与仓库内脚本默认一致 |
SAM_DEVICE |
cuda 或 cpu |
cuda |
可在 fish_api/.env 中填写上述变量(pydantic-settings 会读取)。 |
安装与启动
cd fish_api
uv sync
# 可选:包含 httpx,便于本地用 FastAPI TestClient 做冒烟测试
# uv sync --group dev
./scripts/start_fresh.sh # 默认仅重置 client_id 投递进度,保留 SQLite 历史与快照
# CLEAR_SQLITE_DATABASE=1 bash start_fresh.sh # 需要时才彻底清 SQLite
# 或:uv run uvicorn app.main:app --host 0.0.0.0 --port 8000(需自行 prestart)
Weight Rule (Current)
最终体重 pred_weight_g 由以下规则链决定(按优先级从高到低):
- 440g 全池均值保护(规则 B):若
avg_g_filtered(所有 candidates 均值)>--mean-pool-fallback-max-if-over-g(默认 440g),则pred_weight_g = max_predicted_weight_g_after_filter,pred_weight_rule = "max_after_filter_high_mean_pool_over_g"。 - 400g mean-all fallback(规则 A,仅
--average-all-after-filter开启时):若全池 mean >--average-all-fallback-max-if-mean-over-g(默认 400g),则pred_weight_g = max_predicted_weight_g_after_filter,pred_weight_rule = "max_after_filter_high_mean_all"。 --average-all-after-filter(默认关):全部 candidates 均值作为最终值,pred_weight_rule = "mean_all_filtered"。- Top-K 聚合(默认路径):按
--top-by-length(默认开)选 top-K 帧,对选中帧的预测重量取算术平均(与日志中top{k}_avg一致),pred_weight_rule = "top_k_aggregate"。
DGCNN 明细中同时输出 mean_all_pred_g_after_filters、avg_topk_mean_pred_g 等供对比参考。
Debug:单条鱼测量(与 fish_api 同逻辑)
不启动 uvicorn、不写 SQLite、不发布 MEDIA_ROOT(与 run_full_measure_batch 相比仅少快照与媒体发布;FishMeasure 子进程与 measure_output/fish{N} 与线上一致)。
调用 app/services/measure.py 中的 run_measure_batch_subprocess,配置与 fish_api/.env 相同(get_settings())。
必须在 fish_api 下执行 python -m app...,或从仓库根用下面脚本;若在仓库根直接运行 python -m app.measure_debug_cli,会因找不到 app 包报错(ModuleNotFoundError: No module named 'app')。
# 方式 A:仓库根(推荐)
bash scripts/measure_debug.sh --fish-id 14
# 方式 B:先进入 fish_api
cd fish_api
uv sync
# 默认:MEASURE_WATCH_DIR/fish{N}/ 下所有 .svo2 → 输出到 MEASURE_OUTPUT_ROOT/fish{N}(默认 fish_api/.data/measure_output/fish{N})
uv run python -m app.measure_debug_cli --fish-id 1
# 或等价入口(须在 fish_api 目录)
uv run fish-measure-debug --fish-id 1
# 指定 SVO 目录或输出目录(在 fish_api 目录下)
uv run python -m app.measure_debug_cli --batch-folder /path/to/fish1 --fish-id 1 --output-root /path/to/out
结束后会在终端打印 weight_prediction.json 中的 pred_weight_g、pred_weight_rule 等摘要。
演进建议
- RTSP:用
ffmpeg切段写入 MP4 后调用现有finalize逻辑 - 任务状态:
finalize返回job_id,增加GET /jobs/{id}查询进度