feat: 重构数据库schema分离空间与业务配置 - 新增algorithm_registry和roi_algo_bind表 - roi_configs简化为纯空间配置 - 新增AlgorithmInfo/ROIAlgoBind数据模型

This commit is contained in:
2026-02-03 14:26:52 +08:00
parent 1caba41625
commit fa0304aa47
5 changed files with 942 additions and 185 deletions

55
main.py
View File

@@ -182,19 +182,26 @@ class EdgeInferenceService:
def _process_frame(self, camera_id: str, frame: VideoFrame):
"""处理视频帧 - 批量处理多 ROI"""
try:
roi_configs = self._config_manager.get_roi_configs(camera_id)
roi_configs = self._config_manager.get_roi_configs_with_bindings(camera_id)
roi_items = []
for roi in roi_configs:
if not roi.enabled:
continue
try:
cropped, scale_info = self._preprocessor.preprocess_single(
frame.image, roi
)
roi_items.append((camera_id, roi, frame, cropped, scale_info))
except Exception as e:
self._logger.error(f"预处理 ROI 失败 {roi.roi_id}: {e}")
if not roi.bindings:
continue
for bind in roi.bindings:
if not bind.enabled:
continue
try:
cropped, scale_info = self._preprocessor.preprocess_single(
frame.image, roi
)
roi_items.append((camera_id, roi, bind, frame, cropped, scale_info))
except Exception as e:
self._logger.error(f"预处理 ROI 失败 {roi.roi_id}: {e}")
if not roi_items:
return
@@ -222,8 +229,8 @@ class EdgeInferenceService:
batch_size = len(roi_items)
try:
images = [item[3] for item in roi_items]
scale_infos = [item[4] for item in roi_items]
images = [item[4] for item in roi_items]
scale_infos = [item[5] for item in roi_items]
batch_data, _ = self._preprocessor._batch_preprocessor.preprocess_batch(
images
@@ -241,12 +248,12 @@ class EdgeInferenceService:
conf_threshold=self._settings.inference.conf_threshold
)
for idx, (camera_id, roi, frame, _, scale_info) in enumerate(roi_items):
for idx, (camera_id, roi, bind, frame, _, scale_info) in enumerate(roi_items):
boxes, scores, class_ids = batch_results[idx]
if len(boxes) > 0:
self._handle_detections(
camera_id, roi, frame,
camera_id, roi, bind, frame,
boxes, scores, class_ids,
scale_info
)
@@ -287,6 +294,7 @@ class EdgeInferenceService:
self,
camera_id: str,
roi,
bind,
frame: VideoFrame,
boxes: any,
scores: any,
@@ -300,19 +308,14 @@ class EdgeInferenceService:
return
roi_id = roi.roi_id
algorithm_type = roi.algorithm_type
algo_type_str = algorithm_type.value if hasattr(algorithm_type, 'value') else algorithm_type
algo_code = bind.algo_code
algo_params = bind.params or {}
self._algorithm_manager.register_algorithm(
roi_id=roi_id,
algorithm_type=algo_type_str,
params={
"working_hours": roi.working_hours,
"confirm_on_duty_sec": roi.confirm_on_duty_sec,
"confirm_leave_sec": roi.confirm_leave_sec,
"cooldown_sec": roi.cooldown_sec,
"target_class": roi.target_class,
}
bind_id=bind.bind_id,
algorithm_type=algo_code,
params=algo_params
)
tracks = self._build_tracks(roi, boxes, scores, class_ids, scale_info)
@@ -322,8 +325,9 @@ class EdgeInferenceService:
alerts = self._algorithm_manager.process(
roi_id=roi_id,
bind_id=bind.bind_id,
camera_id=camera_id,
algorithm_type=algo_type_str,
algorithm_type=algo_code,
tracks=tracks,
current_time=frame.timestamp
)
@@ -333,11 +337,12 @@ class EdgeInferenceService:
from core.result_reporter import AlertInfo
alert_info = AlertInfo(
alert_id=f"{roi_id}_{int(frame.timestamp.timestamp())}",
alert_id=f"{roi_id}_{bind.bind_id}_{int(frame.timestamp.timestamp())}",
camera_id=camera_id,
roi_id=roi_id,
bind_id=bind.bind_id,
alert_type=alert.get("alert_type", "detection"),
target_class=alert.get("class", "unknown"),
target_class=alert.get("class", bind.target_class or "unknown"),
confidence=alert.get("confidence", 1.0),
bbox=alert.get("bbox", []),
message=alert.get("message", ""),