cli to control zed camera start and stop. 2. measure now use every svo2 file for 1 fish, give intermideate result and final result with confidecne level(*).

This commit is contained in:
kevin
2026-04-16 11:38:30 +08:00
parent 9dce487c79
commit cc6cef0f73
57 changed files with 1877 additions and 386 deletions

View File

@@ -1,6 +1,7 @@
from __future__ import annotations
import asyncio
import threading
from dataclasses import dataclass, field
from datetime import datetime
from typing import List, Optional
@@ -15,7 +16,7 @@ class MeasureSnapshot:
error: Optional[str] = None
raw_prediction_path: Optional[str] = None
pred: Optional[float] = None # 最终预测的体重值
star: bool = False # 置信度标记True 表示计算可信
star: bool = False # DB 是唯一真相源segment/batch 恒 Falsefinal 行按参与聚合段的 dgcnn_summary 规则判定
#: 与 FishMeasure ``test_dgcnn_weight_estimator.py`` 终端输出一致的体重推算过程文本
calculation_log: Optional[str] = None
@@ -32,11 +33,21 @@ class HealthSnapshot:
@dataclass
class AppState:
measure_lock: asyncio.Lock = field(default_factory=asyncio.Lock)
#: 与 ``run_full_measure`` 子进程串行化(跨 ``measure_watch`` / ingest 线程)
measure_thread_lock: threading.Lock = field(default_factory=threading.Lock)
action_lock: asyncio.Lock = field(default_factory=asyncio.Lock)
# job status for optional polling业务结果见 SQLite
measure_status: str = "idle"
action_status: str = "idle"
#: ZED 分段录制线程与协作停止事件(由 ``zed_recording_control`` 管理)
zed_recording_lock: threading.Lock = field(default_factory=threading.Lock)
zed_recording_stop_event: Optional[threading.Event] = None
zed_recording_thread: Optional[threading.Thread] = None
#: 当前会话(与 ``zed_recording_sessions`` 表对应)
zed_recording_session_row_id: Optional[int] = None
zed_recording_fish_id: Optional[int] = None
app_state = AppState()