diff --git a/rtsp_service_ws_0108.py b/rtsp_service_ws_0108.py index 759c902..393fb5b 100644 --- a/rtsp_service_ws_0108.py +++ b/rtsp_service_ws_0108.py @@ -17,22 +17,18 @@ from dataclasses import dataclass from typing import Dict, Any, Tuple from datetime import datetime +from utils.logger import setup_logger + +logger = setup_logger(__name__) + # 导入人脸识别算法 try: from api.routes.algorithm_router import video_face_prison_biz - print("[INFO] 成功导入人脸识别算法") + logger.info("[INFO] 成功导入人脸识别算法") except Exception as e: - print(f"[WARN] 无法导入人脸识别算法: {e}") + logger.error(f"[WARN] 无法导入人脸识别算法: {e}") -# 导入数据库相关模块 -try: - from services.sur_alert_record_service import SurAlertRecordService - from database.connection import db_manager - from models.sur_alert_record import AlertType - print("[INFO] 成功导入数据库模块") -except Exception as e: - print(f"[WARN] 无法导入数据库模块: {e}") # -------------------------- Kadian 检测相关导入 -------------------------- from npu_yolo_onnx_person_car_phone import YOLOv8_ONNX # 主检测模型(人/车/后备箱/手机) @@ -115,13 +111,13 @@ class KadianDetector: self.frame_thresh_prisoner = int(self.TIME_THRESHOLD_PRISONER * self.fps) self.frame_buffer_prisoner = int(self.TIME_TOLERANCE_PRISONER * self.fps) - print(f"\n超参数设置:") - print(f" FPS: {self.fps:.2f}") - # print(f" 判定 'Nobody' 需连续: {self.frame_thresh_nobody} 帧") - print(f" 判定 'police Detected' 需累计检测: {self.frame_thresh_police} 帧") - print(f" 警察丢失缓冲帧数: {self.frame_buffer_police} 帧") - print(f" 判定 'prisoner Detected' 需累计检测: {self.frame_thresh_prisoner} 帧") - print(f" 犯人丢失缓冲帧数: {self.frame_buffer_prisoner} 帧") + logger.info(f"\n超参数设置:") + logger.info(f" FPS: {self.fps:.2f}") + # logger.info(f" 判定 'Nobody' 需连续: {self.frame_thresh_nobody} 帧") + logger.info(f" 判定 'police Detected' 需累计检测: {self.frame_thresh_police} 帧") + logger.info(f" 警察丢失缓冲帧数: {self.frame_buffer_police} 帧") + logger.info(f" 判定 'prisoner Detected' 需累计检测: {self.frame_thresh_prisoner} 帧") + logger.info(f" 犯人丢失缓冲帧数: {self.frame_buffer_prisoner} 帧") # ========================================== # 状态变量初始化 @@ -221,7 +217,7 @@ class KadianDetector: # ========= 警察和犯人检测 ========= for t in police_prisoner_dets_tracks: - # print("t: {}".format(t)) + # logger.info("t: {}".format(t)) tid = t.track_id # cls_id = -1 @@ -249,7 +245,7 @@ class KadianDetector: cls_id = 0 elif role == "prisoner": cls_id = 1 - # print("tid: {}, role: {}, cls: {}".format(tid, role,cls_id)) + # logger.info("tid: {}, role: {}, cls: {}".format(tid, role,cls_id)) x1, y1, x2, y2 = map(int, t.tlbr) @@ -407,7 +403,7 @@ class WebSocketSender(threading.Thread): async def _run_async(self): async with websockets.serve(self._ws_handler, WS_HOST, WS_PORT): - print(f"[INFO] WebSocket server started at ws://{WS_HOST}:{WS_PORT}") + logger.info(f"[INFO] WebSocket server started at ws://{WS_HOST}:{WS_PORT}") await self._broadcaster() def run(self): @@ -449,12 +445,12 @@ class RTSPCaptureWorker(threading.Thread): # cap.set(cv2.CAP_PROP_HW_ACCELERATION, cv2.VIDEO_ACCELERATION_ANY) if not cap.isOpened(): - print(f"[ERROR] Cannot open RTSP: {self.camera_cfg.rtsp_url}") + logger.error(f"[ERROR] Cannot open RTSP: {self.camera_cfg.rtsp_url}") time.sleep(2) self.reconnect_count += 1 continue - print(f"[INFO] Successfully opened RTSP: {self.camera_cfg.name}") + logger.info(f"[INFO] Successfully opened RTSP: {self.camera_cfg.name}") self.reconnect_count = 0 # 重置重连计数 # # 设置帧率(可选) @@ -464,7 +460,7 @@ class RTSPCaptureWorker(threading.Thread): ret, frame = cap.read() if not ret: # 检查流是否结束 - print(f"[WARN] Failed to read frame from {self.camera_cfg.name}") + logger.warning(f"[WARN] Failed to read frame from {self.camera_cfg.name}") # 检查是否还有数据 time.sleep(0.1) @@ -490,7 +486,7 @@ class RTSPCaptureWorker(threading.Thread): self.raw_queue.put(item, timeout=0.5) except queue.Full: - print(f"[WARN] Queue full, dropping frame from {self.camera_cfg.name}") + logger.warning(f"[WARN] Queue full, dropping frame from {self.camera_cfg.name}") continue # 控制读取速度,避免过快 @@ -499,12 +495,12 @@ class RTSPCaptureWorker(threading.Thread): cap.release() except Exception as e: - print(f"[ERROR] Error in RTSP capture for {self.camera_cfg.name}: {e}") + logger.error(f"[ERROR] Error in RTSP capture for {self.camera_cfg.name}: {e}") time.sleep(2) self.reconnect_count += 1 if self.reconnect_count >= self.max_reconnects: - print(f"[ERROR] Max reconnects reached for {self.camera_cfg.name}, stopping.") + logger.error(f"[ERROR] Max reconnects reached for {self.camera_cfg.name}, stopping.") # ========================= 帧处理线程 ========================= @@ -541,7 +537,7 @@ class FrameProcessorWorker(threading.Thread): self.video_writers[camera_id] = writer self.video_files[camera_id] = filepath self.video_counts[camera_id] = 0 - print(f"[INFO] New segment: {filepath}") + logger.info(f"[INFO] New segment: {filepath}") return writer, filepath def _close_segment_if_needed(self, camera_id: int): @@ -550,7 +546,7 @@ class FrameProcessorWorker(threading.Thread): writer = self.video_writers.get(camera_id) if writer is not None: writer.release() - print(f"[INFO] Close segment: camera={camera_id}, file={self.video_files[camera_id]}") + logger.info(f"[INFO] Close segment: camera={camera_id}, file={self.video_files[camera_id]}") self.video_writers.pop(camera_id, None) self.video_counts.pop(camera_id, None) @@ -595,7 +591,7 @@ class FrameProcessorWorker(threading.Thread): # last_processed_time[cam_id] = current_time # # if time_since_last > 0: - # print(f"[DEBUG] 摄像头{cam_id} - 距离上次处理间隔: {time_since_last:.1f}ms") + # logger.info(f"[DEBUG] 摄像头{cam_id} - 距离上次处理间隔: {time_since_last:.1f}ms") # 2) 进行人脸识别(如果启用) current_face_alert = None @@ -609,20 +605,7 @@ class FrameProcessorWorker(threading.Thread): for result in face_results: if result['has_passed']: - print(f"[INFO] 犯人带出: {result['passed_person_id']}") - - # 插入数据库告警记录 - try: - with db_manager.get_session() as db: - alert_service = SurAlertRecordService(db) - alert_service.create_alert_record( - alert_type=AlertType.PRISONER_OUT, - person_id=int(result['passed_person_id']), - camera_id=cam_id - ) - # print(f"[INFO] 告警记录已插入数据库: person_id={result['passed_person_id']}") - except Exception as e: - print(f"[ERROR] 插入告警记录失败: {e}") + logger.info(f"[INFO] 犯人带出: {result['passed_person_id']}") # 记录当前帧人脸告警信息 current_face_alert = { @@ -631,7 +614,7 @@ class FrameProcessorWorker(threading.Thread): } except Exception as e: - print(f"[WARN] 人脸识别处理失败: {e}") + logger.error(f"[WARN] 人脸识别处理失败: {e}") # 执行检测 result = detector.process_frame(frame.copy(), cam_id, ts) @@ -658,7 +641,7 @@ class FrameProcessorWorker(threading.Thread): try: img_b64 = self._encode_image_to_base64(result_img) except Exception as e: - print(f"[ERROR] Encode image failed: {e}") + logger.error(f"[ERROR] Encode image failed: {e}") img_b64 = None if img_b64 is not None: @@ -678,7 +661,7 @@ class FrameProcessorWorker(threading.Thread): try: self.ws_queue.put(msg, timeout=1.0) except queue.Full: - print("[WARN] ws_send_queue full, drop frame message") + logger.warning("[WARN] ws_send_queue full, drop frame message") @@ -715,7 +698,7 @@ class RTSPService: w = RTSPCaptureWorker(cam, self.raw_queue, self.stop_event) w.start() self.capture_workers.append(w) - print("[INFO] Kadian RTSP Service started") + logger.info("[INFO] Kadian RTSP Service started") def stop(self): self.stop_event.set() @@ -725,7 +708,7 @@ class RTSPService: w.join(timeout=2.0) self.processor.join(timeout=2.0) self.ws_sender.join(timeout=2.0) - print("[INFO] Service stopped") + logger.info("[INFO] Service stopped") if __name__ == "__main__":