feat: 重构数据库schema分离空间与业务配置 - 新增algorithm_registry和roi_algo_bind表 - roi_configs简化为纯空间配置 - 新增AlgorithmInfo/ROIAlgoBind数据模型
This commit is contained in:
55
main.py
55
main.py
@@ -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", ""),
|
||||
|
||||
Reference in New Issue
Block a user