pring换为logger
This commit is contained in:
@@ -17,22 +17,18 @@ from dataclasses import dataclass
|
|||||||
from typing import Dict, Any, Tuple
|
from typing import Dict, Any, Tuple
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
from utils.logger import setup_logger
|
||||||
|
|
||||||
|
logger = setup_logger(__name__)
|
||||||
|
|
||||||
# 导入人脸识别算法
|
# 导入人脸识别算法
|
||||||
try:
|
try:
|
||||||
from api.routes.algorithm_router import video_face_prison_biz
|
from api.routes.algorithm_router import video_face_prison_biz
|
||||||
|
|
||||||
print("[INFO] 成功导入人脸识别算法")
|
logger.info("[INFO] 成功导入人脸识别算法")
|
||||||
except Exception as e:
|
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 检测相关导入 --------------------------
|
# -------------------------- Kadian 检测相关导入 --------------------------
|
||||||
from npu_yolo_onnx_person_car_phone import YOLOv8_ONNX # 主检测模型(人/车/后备箱/手机)
|
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_thresh_prisoner = int(self.TIME_THRESHOLD_PRISONER * self.fps)
|
||||||
self.frame_buffer_prisoner = int(self.TIME_TOLERANCE_PRISONER * self.fps)
|
self.frame_buffer_prisoner = int(self.TIME_TOLERANCE_PRISONER * self.fps)
|
||||||
|
|
||||||
print(f"\n超参数设置:")
|
logger.info(f"\n超参数设置:")
|
||||||
print(f" FPS: {self.fps:.2f}")
|
logger.info(f" FPS: {self.fps:.2f}")
|
||||||
# print(f" 判定 'Nobody' 需连续: {self.frame_thresh_nobody} 帧")
|
# logger.info(f" 判定 'Nobody' 需连续: {self.frame_thresh_nobody} 帧")
|
||||||
print(f" 判定 'police Detected' 需累计检测: {self.frame_thresh_police} 帧")
|
logger.info(f" 判定 'police Detected' 需累计检测: {self.frame_thresh_police} 帧")
|
||||||
print(f" 警察丢失缓冲帧数: {self.frame_buffer_police} 帧")
|
logger.info(f" 警察丢失缓冲帧数: {self.frame_buffer_police} 帧")
|
||||||
print(f" 判定 'prisoner Detected' 需累计检测: {self.frame_thresh_prisoner} 帧")
|
logger.info(f" 判定 'prisoner Detected' 需累计检测: {self.frame_thresh_prisoner} 帧")
|
||||||
print(f" 犯人丢失缓冲帧数: {self.frame_buffer_prisoner} 帧")
|
logger.info(f" 犯人丢失缓冲帧数: {self.frame_buffer_prisoner} 帧")
|
||||||
|
|
||||||
# ==========================================
|
# ==========================================
|
||||||
# 状态变量初始化
|
# 状态变量初始化
|
||||||
@@ -221,7 +217,7 @@ class KadianDetector:
|
|||||||
|
|
||||||
# ========= 警察和犯人检测 =========
|
# ========= 警察和犯人检测 =========
|
||||||
for t in police_prisoner_dets_tracks:
|
for t in police_prisoner_dets_tracks:
|
||||||
# print("t: {}".format(t))
|
# logger.info("t: {}".format(t))
|
||||||
tid = t.track_id
|
tid = t.track_id
|
||||||
# cls_id = -1
|
# cls_id = -1
|
||||||
|
|
||||||
@@ -249,7 +245,7 @@ class KadianDetector:
|
|||||||
cls_id = 0
|
cls_id = 0
|
||||||
elif role == "prisoner":
|
elif role == "prisoner":
|
||||||
cls_id = 1
|
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)
|
x1, y1, x2, y2 = map(int, t.tlbr)
|
||||||
|
|
||||||
@@ -407,7 +403,7 @@ class WebSocketSender(threading.Thread):
|
|||||||
|
|
||||||
async def _run_async(self):
|
async def _run_async(self):
|
||||||
async with websockets.serve(self._ws_handler, WS_HOST, WS_PORT):
|
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()
|
await self._broadcaster()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
@@ -449,12 +445,12 @@ class RTSPCaptureWorker(threading.Thread):
|
|||||||
# cap.set(cv2.CAP_PROP_HW_ACCELERATION, cv2.VIDEO_ACCELERATION_ANY)
|
# cap.set(cv2.CAP_PROP_HW_ACCELERATION, cv2.VIDEO_ACCELERATION_ANY)
|
||||||
|
|
||||||
if not cap.isOpened():
|
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)
|
time.sleep(2)
|
||||||
self.reconnect_count += 1
|
self.reconnect_count += 1
|
||||||
continue
|
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 # 重置重连计数
|
self.reconnect_count = 0 # 重置重连计数
|
||||||
|
|
||||||
# # 设置帧率(可选)
|
# # 设置帧率(可选)
|
||||||
@@ -464,7 +460,7 @@ class RTSPCaptureWorker(threading.Thread):
|
|||||||
ret, frame = cap.read()
|
ret, frame = cap.read()
|
||||||
if not ret:
|
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)
|
time.sleep(0.1)
|
||||||
@@ -490,7 +486,7 @@ class RTSPCaptureWorker(threading.Thread):
|
|||||||
|
|
||||||
self.raw_queue.put(item, timeout=0.5)
|
self.raw_queue.put(item, timeout=0.5)
|
||||||
except queue.Full:
|
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
|
continue
|
||||||
|
|
||||||
# 控制读取速度,避免过快
|
# 控制读取速度,避免过快
|
||||||
@@ -499,12 +495,12 @@ class RTSPCaptureWorker(threading.Thread):
|
|||||||
cap.release()
|
cap.release()
|
||||||
|
|
||||||
except Exception as e:
|
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)
|
time.sleep(2)
|
||||||
self.reconnect_count += 1
|
self.reconnect_count += 1
|
||||||
|
|
||||||
if self.reconnect_count >= self.max_reconnects:
|
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_writers[camera_id] = writer
|
||||||
self.video_files[camera_id] = filepath
|
self.video_files[camera_id] = filepath
|
||||||
self.video_counts[camera_id] = 0
|
self.video_counts[camera_id] = 0
|
||||||
print(f"[INFO] New segment: {filepath}")
|
logger.info(f"[INFO] New segment: {filepath}")
|
||||||
return writer, filepath
|
return writer, filepath
|
||||||
|
|
||||||
def _close_segment_if_needed(self, camera_id: int):
|
def _close_segment_if_needed(self, camera_id: int):
|
||||||
@@ -550,7 +546,7 @@ class FrameProcessorWorker(threading.Thread):
|
|||||||
writer = self.video_writers.get(camera_id)
|
writer = self.video_writers.get(camera_id)
|
||||||
if writer is not None:
|
if writer is not None:
|
||||||
writer.release()
|
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_writers.pop(camera_id, None)
|
||||||
self.video_counts.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
|
# last_processed_time[cam_id] = current_time
|
||||||
#
|
#
|
||||||
# if time_since_last > 0:
|
# 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) 进行人脸识别(如果启用)
|
# 2) 进行人脸识别(如果启用)
|
||||||
current_face_alert = None
|
current_face_alert = None
|
||||||
@@ -609,20 +605,7 @@ class FrameProcessorWorker(threading.Thread):
|
|||||||
|
|
||||||
for result in face_results:
|
for result in face_results:
|
||||||
if result['has_passed']:
|
if result['has_passed']:
|
||||||
print(f"[INFO] 犯人带出: {result['passed_person_id']}")
|
logger.info(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}")
|
|
||||||
|
|
||||||
# 记录当前帧人脸告警信息
|
# 记录当前帧人脸告警信息
|
||||||
current_face_alert = {
|
current_face_alert = {
|
||||||
@@ -631,7 +614,7 @@ class FrameProcessorWorker(threading.Thread):
|
|||||||
}
|
}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[WARN] 人脸识别处理失败: {e}")
|
logger.error(f"[WARN] 人脸识别处理失败: {e}")
|
||||||
|
|
||||||
# 执行检测
|
# 执行检测
|
||||||
result = detector.process_frame(frame.copy(), cam_id, ts)
|
result = detector.process_frame(frame.copy(), cam_id, ts)
|
||||||
@@ -658,7 +641,7 @@ class FrameProcessorWorker(threading.Thread):
|
|||||||
try:
|
try:
|
||||||
img_b64 = self._encode_image_to_base64(result_img)
|
img_b64 = self._encode_image_to_base64(result_img)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[ERROR] Encode image failed: {e}")
|
logger.error(f"[ERROR] Encode image failed: {e}")
|
||||||
img_b64 = None
|
img_b64 = None
|
||||||
|
|
||||||
if img_b64 is not None:
|
if img_b64 is not None:
|
||||||
@@ -678,7 +661,7 @@ class FrameProcessorWorker(threading.Thread):
|
|||||||
try:
|
try:
|
||||||
self.ws_queue.put(msg, timeout=1.0)
|
self.ws_queue.put(msg, timeout=1.0)
|
||||||
except queue.Full:
|
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 = RTSPCaptureWorker(cam, self.raw_queue, self.stop_event)
|
||||||
w.start()
|
w.start()
|
||||||
self.capture_workers.append(w)
|
self.capture_workers.append(w)
|
||||||
print("[INFO] Kadian RTSP Service started")
|
logger.info("[INFO] Kadian RTSP Service started")
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
self.stop_event.set()
|
self.stop_event.set()
|
||||||
@@ -725,7 +708,7 @@ class RTSPService:
|
|||||||
w.join(timeout=2.0)
|
w.join(timeout=2.0)
|
||||||
self.processor.join(timeout=2.0)
|
self.processor.join(timeout=2.0)
|
||||||
self.ws_sender.join(timeout=2.0)
|
self.ws_sender.join(timeout=2.0)
|
||||||
print("[INFO] Service stopped")
|
logger.info("[INFO] Service stopped")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user